3.code提交
authorp15692025051 <846603105@qq.com>
Tue, 21 Mar 2023 10:09:59 +0000 (18:09 +0800)
committerp15692025051 <846603105@qq.com>
Tue, 21 Mar 2023 10:09:59 +0000 (18:09 +0800)
142 files changed:
3.code/1.watch/1.doc/ALIPAY_API.xlsx [new file with mode: 0644]
3.code/1.watch/1.doc/Quecpython_EC800M外置flash烧录指导.pdf [new file with mode: 0644]
3.code/1.watch/1.doc/Quectel_ALIPAY_API说明_2023_01_31.pdf [new file with mode: 0644]
3.code/1.watch/1.doc/云芯科技IOT协议V6.9-All(1).pdf [new file with mode: 0644]
3.code/1.watch/1.doc/云芯科技硬件开放平台20221116.pdf [new file with mode: 0644]
3.code/1.watch/1.doc/研强物联云平台业务接口规范_V1.0-已转档.pdf [new file with mode: 0644]
3.code/1.watch/2.code/EventMesh.py [new file with mode: 0644]
3.code/1.watch/2.code/appAlipay.py [new file with mode: 0644]
3.code/1.watch/2.code/btn_device_ec800m.py [new file with mode: 0644]
3.code/1.watch/2.code/capacitive_hynitron_cst816d_update.py [new file with mode: 0644]
3.code/1.watch/2.code/common.py [new file with mode: 0644]
3.code/1.watch/2.code/constants.py [new file with mode: 0644]
3.code/1.watch/2.code/initTP.py [new file with mode: 0644]
3.code/1.watch/2.code/lcd.py [new file with mode: 0644]
3.code/1.watch/2.code/location.py [new file with mode: 0644]
3.code/1.watch/2.code/main_1.py [new file with mode: 0644]
3.code/1.watch/2.code/main_4.py [new file with mode: 0644]
3.code/1.watch/2.code/main_t.py [new file with mode: 0644]
3.code/1.watch/2.code/mgr.py [new file with mode: 0644]
3.code/1.watch/2.code/protocol.py [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_11.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_11_1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_12.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_12_1_1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_13.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_13_1_1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_1_1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_2.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_2_1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/1_2_2.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/APP/alipay/loading.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_APP_QR_CODE.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_BUTTON_DELKEY.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL_CONTACT.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_REDETECT.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_TEST_DONE.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NOTICE_CALL.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NOTICE_NONE.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY0_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY1_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY2_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY3_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY4_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY5_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY6_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY7_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY8_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY9_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYHASH_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYSTAR_ICON.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_SECMENU_ALARM.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_SECMENU_COUNTDOWN.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_SECMENU_STEP.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_SECMENU_STOPWATCH.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_SECMENU_WEATHER.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_REDETECT.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMAGE_STEP.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/IMG_CC_HUNGUP1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/add_btn.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/answer.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/audio_audio_haixiu.mp3 [new file with mode: 0644]
3.code/1.watch/2.code/static/cancel_icon.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/charge_in.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/cloudy.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/degree.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/fine.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/hang_up.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/lightrain.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu1/4-1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu1/4-2.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu1/4-3.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu1/4-4.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu1/4-5.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu1/IMAGE_MAINMENU_WECHAT.png [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/main_menu/main_menu2/alipay_.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_app_qrcode.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_bright.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_connect_device.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_imei_qrcode.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_language.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_poweroff.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_restore.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_theme_switch.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_time.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_upgrade.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_version.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_volume.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/menu_watch_switch.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/mpsignal1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/mpsignal2.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/mpsignal3.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/mpsignal4.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/mpsignal5.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/off_icon.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/poweroff_icon.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/reduce_btn.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/snow.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/stopwatch_play.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/stopwatch_reset.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/stopwatch_stop.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/sunny.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/temp_bg.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/time_down.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/time_finish.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/time_up.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/update.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/vbat_0.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/vbat_100.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/vbat_20.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/vbat_40.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/vbat_60.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/vbat_80.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/bg.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/blood.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/heart.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/step.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/0.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/1.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/2.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/3.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/4.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/5.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/6.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/7.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/8.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/9.jpg [new file with mode: 0644]
3.code/1.watch/2.code/static/watch_plate/style_1/time/colon.jpg [new file with mode: 0644]
3.code/1.watch/2.code/ui.py [new file with mode: 0644]
3.code/1.watch/2.code/ui_WatchFaceScreen.py [new file with mode: 0644]
3.code/1.watch/2.code/ui_main_menu.py [new file with mode: 0644]

diff --git a/3.code/1.watch/1.doc/ALIPAY_API.xlsx b/3.code/1.watch/1.doc/ALIPAY_API.xlsx
new file mode 100644 (file)
index 0000000..606aa8e
Binary files /dev/null and b/3.code/1.watch/1.doc/ALIPAY_API.xlsx differ
diff --git a/3.code/1.watch/1.doc/Quecpython_EC800M外置flash烧录指导.pdf b/3.code/1.watch/1.doc/Quecpython_EC800M外置flash烧录指导.pdf
new file mode 100644 (file)
index 0000000..4c76c93
Binary files /dev/null and "b/3.code/1.watch/1.doc/Quecpython_EC800M\345\244\226\347\275\256flash\347\203\247\345\275\225\346\214\207\345\257\274.pdf" differ
diff --git a/3.code/1.watch/1.doc/Quectel_ALIPAY_API说明_2023_01_31.pdf b/3.code/1.watch/1.doc/Quectel_ALIPAY_API说明_2023_01_31.pdf
new file mode 100644 (file)
index 0000000..ce2bd79
Binary files /dev/null and "b/3.code/1.watch/1.doc/Quectel_ALIPAY_API\350\257\264\346\230\216_2023_01_31.pdf" differ
diff --git a/3.code/1.watch/1.doc/云芯科技IOT协议V6.9-All(1).pdf b/3.code/1.watch/1.doc/云芯科技IOT协议V6.9-All(1).pdf
new file mode 100644 (file)
index 0000000..ef25a0c
Binary files /dev/null and "b/3.code/1.watch/1.doc/\344\272\221\350\212\257\347\247\221\346\212\200IOT\345\215\217\350\256\256V6.9-All(1).pdf" differ
diff --git a/3.code/1.watch/1.doc/云芯科技硬件开放平台20221116.pdf b/3.code/1.watch/1.doc/云芯科技硬件开放平台20221116.pdf
new file mode 100644 (file)
index 0000000..29c6bff
Binary files /dev/null and "b/3.code/1.watch/1.doc/\344\272\221\350\212\257\347\247\221\346\212\200\347\241\254\344\273\266\345\274\200\346\224\276\345\271\263\345\217\26020221116.pdf" differ
diff --git a/3.code/1.watch/1.doc/研强物联云平台业务接口规范_V1.0-已转档.pdf b/3.code/1.watch/1.doc/研强物联云平台业务接口规范_V1.0-已转档.pdf
new file mode 100644 (file)
index 0000000..8587777
Binary files /dev/null and "b/3.code/1.watch/1.doc/\347\240\224\345\274\272\347\211\251\350\201\224\344\272\221\345\271\263\345\217\260\344\270\232\345\212\241\346\216\245\345\217\243\350\247\204\350\214\203_V1.0-\345\267\262\350\275\254\346\241\243.pdf" differ
diff --git a/3.code/1.watch/2.code/EventMesh.py b/3.code/1.watch/2.code/EventMesh.py
new file mode 100644 (file)
index 0000000..1b32fbd
--- /dev/null
@@ -0,0 +1,74 @@
+import _thread
+import usys
+
+
+class EventStore(object):
+    def __init__(self):
+        self.map = dict()
+        self.log = None
+        self.__filters = []
+
+    def add_filter(self, flt):
+        self.__filters.append(flt)
+
+    def append(self, event, cb):
+        self.map[event] = cb
+
+    def fire_async(self, event, msg):
+        if event in self.map:
+            _thread.start_new_thread(self.map[event], (event, msg))
+            if self.log:
+                self.log.info("ASYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, None))
+
+    def fire_sync(self, event, msg):
+        res = None
+        try:
+            if event in self.map:
+                res = self.map[event](event, msg)
+        except Exception as e:
+            usys.print_exception(e)
+            if self.log:
+                self.log.info("ERROR executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))
+        if event not in self.__filters:
+            if self.log:
+                self.log.info("SYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))
+        return res
+
+
+event_store = EventStore()
+
+
+def subscribe(event, cb):
+    """
+    subscribe event and cb
+    """
+    return event_store.append(event, cb)
+
+
+def publish(event, msg=None):
+    """
+    publish event and msg
+    """
+    return publish_sync(event, msg)
+
+
+def publish_async(event, msg=None):
+    """
+    异步发送
+    """
+    return event_store.fire_async(event, msg)
+
+
+def publish_sync(event, msg=None):
+    """
+    同步发送
+    """
+    return event_store.fire_sync(event, msg)
+
+
+def set_log(log_adapter):
+    event_store.log = log_adapter
+
+
+def add_filter(flt):
+    event_store.add_filter(flt)
diff --git a/3.code/1.watch/2.code/appAlipay.py b/3.code/1.watch/2.code/appAlipay.py
new file mode 100644 (file)
index 0000000..cf513d8
--- /dev/null
@@ -0,0 +1,876 @@
+import modem
+import sim
+import osTimer
+import ALIPAY
+from ext.common import Lock, Abstract, LogAdapter
+import utime
+import lvgl as lv
+from ext import EventMesh
+from machine import Timer
+from ext import constants
+from misc import Power
+import pm
+from ext.ui import Screen
+
+style_font_youyuan_20 = lv.style_t()
+style_font_youyuan_20.init()
+style_font_youyuan_20.set_text_color(lv.color_make(0xff, 0xff, 0xff))
+style_font_youyuan_20.set_text_font_v2("font.bin",0)
+
+style_btn_alipay = lv.style_t()
+style_btn_alipay.init()
+style_btn_alipay.set_radius(20)
+style_btn_alipay.set_bg_opa(lv.OPA.COVER)
+style_btn_alipay.set_bg_color(lv.palette_main(lv.PALETTE.BLUE))
+style_btn_alipay.set_bg_grad_color(lv.palette_darken(lv.PALETTE.BLUE, 2))
+style_btn_alipay.set_bg_grad_dir(lv.GRAD_DIR.VER)
+
+style_cont_alipay = lv.style_t()
+style_cont_alipay.init()
+style_cont_alipay.set_radius(20)
+style_cont_alipay.set_bg_opa(lv.OPA.COVER)
+style_cont_alipay.set_bg_color(lv.color_make(0xff, 0xff, 0xff))
+
+
+class Alipay(Abstract):
+    """
+        支付宝
+    """
+    def __init__(self):
+        self.imei = modem.getDevImei()
+        if self.imei == None :
+            self.imei = "1111"
+        self.iccid = sim.getIccid()
+        if self.iccid == -1 :
+            self.iccid = "1111"
+        self.imsi = sim.getImsi()
+        if self.imsi == -1:
+            self.imsi = "1111"
+        self.mac = "123456"
+        self.sn = modem.getDevSN()
+        self.vendor = "ZHSX"
+        self.product_name = "ZHSX"
+        self. product_model = modem.getDevModel()
+        self.pk_alipay = "uHTfYqOlGlA"
+        self.pk_aliyun = "a15PcyZ3IHA"
+        self.ps_aliyun = "kOGGPhtXAg1Lz1vg"
+        self.product_type = 0
+        self.timer_Alipay = osTimer()
+        self.timer_Alipay_check = osTimer()
+        self.alipay = None
+        self.is_simcard_identify = 255
+        self.is_init = 255
+        self.upay_bound = 0 #绑定结果
+    def post_processor_after_instantiation(self):
+        print("post_processor_after_instantiation")
+        self.timer_Alipay.start(20000, 1, self.timeout_Alipay)
+        
+        
+        self.alipay = ALIPAY(self.imei, self.iccid,self.imsi, self.mac, self.sn,self.vendor, self.product_name, self. product_model, self.pk_alipay , self.pk_aliyun, self.ps_aliyun,0)
+        #self.alipay = ALIPAY("867387060319491", "898604293619F0549750","460044917509047", "123456", "P1Q22I80C0007530P","ZHIHUISHIXUN", "ZHIHUISHIXUN", "EC800M", "uHTfYqOlGlA" , "a15PcyZ3IHA", "kOGGPhtXAg1Lz1vg",0)
+        self.alipay.register_print()
+        self.alipay.set_log_limit(0)
+        EventMesh.subscribe("alipay_1", self.alipay_1)
+        EventMesh.subscribe("get_payment_code", self.get_payment_code)
+        EventMesh.subscribe("get_collect_code", self.get_collect_code)
+        EventMesh.subscribe("get_parent_code", self.get_parent_code)
+         
+    def timeout_Alipay(self, *args, **kwargs):
+        #print("timeout_Alipay1:{}".format(EventMesh.publish(constants.EVENT.GET_CONNECT)))
+        time = utime.localtime()
+
+        #if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and self.alipay != None and (self.is_simcard_identify != 0 or time[3] == 0 or time[3] == 12):
+        if self.alipay != None and (self.is_simcard_identify != 0 or time[3] == 0 or time[3] == 12):
+            self.is_simcard_identify = self.alipay.start_simcard_identify()
+            print("is_simcard_identify:%d"%self.is_simcard_identify)
+        
+        #if self.is_simcard_identify == 0 and EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and self.is_init != 0:
+        if self.is_simcard_identify == 0  and self.is_init != 0:
+            id2_st = bytearray([0])
+            id2_ret = self.alipay.id2_init()
+            print("id2_ret:%d"%id2_ret)
+            self.alipay.id2_check_status(id2_st)
+            print("id2_st:",str(id2_st))
+            if id2_st[0] != 1:
+                return
+            self.is_init = self.alipay.pay_init(90000, 90000,\
+                                                2000, 2000, \
+                                                200, 40*1024, \
+                                                self.upay_display_notify_cb, 0) 
+            #alipay.pay_init(90000, 90000,2000, 2000,200, 40*1024,upay_display_notify_cb, 0)                                    
+            print("self.is_pay_init:%d"%self.is_init)
+            if self.is_init == 0 :
+                self.alipay.enable_collectioncode(1)
+        
+    def upay_display_notify_cb(self,arg):
+        #print("upay_display_notify_cb!!!!!!!!!!!!!!!!!!!!")
+        cmd = arg[0]
+        rsp_code = arg[1]
+        result = arg[2]
+        result_len = arg[3]
+        userdata = arg[4]
+        print("upay_display_notify_cb:\r\ncmd:{}\r\nrsp_code:{}".format(cmd,rsp_code))
+
+        if rsp_code == 4 :
+            # 打印获取到的绑定码 
+            print("bindcode[%d]: %s\n"%(result_len, result))
+            #查询绑定结果 
+            utime.sleep_ms(5000);              
+            cmd_t = 2 #UPAY_MSG_GET_BINDING_RESULT;
+            userdata_t = None
+            args = None
+            ret = self.alipay.msg_send(cmd_t,args,userdata_t)
+            #EventMesh.subscribe("get_binding_code", self.get_binding_code)
+            #EventMesh.publish("load_screen", {"screen": "alipay_invite","meta":{"result":result,"result_len":result_len}})
+            EventMesh.publish("load_screen", {"screen": "alipay_invite","meta":str(result)})
+
+        #case UPAY_RSP_PROCESSING:
+        elif rsp_code == 1:
+            #轮询绑定结果
+            if cmd == 2 :
+                print("upay_display_notify_cb: bind processing\n")
+
+        elif rsp_code == 5:
+            #获取付款码回调 
+            print("upay_display_notify_cb: paycode[%d]: %s\n"%( result_len, result))
+            EventMesh.publish("load_screen", {"screen": "alipay_paycode","meta":str(result)})
+
+            # 查询付款结果 
+            print("upay_display_notify_cb:  get payment result\n")
+            utime.sleep_ms(5000)
+            cmd_t = 4
+            userdata_t = None
+            args = None
+            ret = self.alipay.msg_send(cmd_t,args,userdata_t)
+
+        elif rsp_code == 6:
+            #打印获取到的收款码 
+            print("upay_display_notify_cb: collectioncode[%d]: %s\n"%(result_len, result))
+            EventMesh.publish("load_screen", {"screen": "alipay_collect","meta":str(result)})
+            utime.sleep_ms(5000)
+
+        elif rsp_code == 7:
+            #打印家长控制码 
+            print("upay_display_notify_cb: parentctrlcode[%d]: %s\n"%(result_len, result) )
+            EventMesh.publish("load_screen", {"screen": "alipay_parent","meta":str(result)})
+
+            
+        elif rsp_code == 8:
+            #付款结果
+            print("upay_display_notify_cb: order result, bitmap size %d\n"%(result_len))
+            EventMesh.publish("load_screen", {"screen": "alipay_pay_success","meta":str(result)})
+            
+        elif rsp_code == 3:
+            #绑定成功 
+            print("upay_display_notify_cb: bind complete\n")
+            EventMesh.publish("load_screen", {"screen": "alipay_success"})
+
+            self.upay_bound = 1
+
+        elif rsp_code == 2:
+            # 绑定进度 
+            print("upay_display_notify_cb: bind progress %s\n"%(str(result)))
+            EventMesh.publish("load_screen", {"screen": "alipay_inviting"})
+            
+        elif rsp_code == 11:
+            # 解绑成功
+            print("upay_display_notify_cb: unbind complete\n")
+            
+
+        elif rsp_code == 9:
+            #主扫码解析结果 
+            print("%s: recv scancode info\n")
+            #upay_scancode_info_t *scancode_info = (upay_scancode_info_t *)result
+            seller_name = result[10]#未验证
+            amount = result[20]#未验证
+            print("upay_display_notify_cb: seller name %s, amount %s\n"%(seller_name, amount))
+
+            #发起主扫支付
+            cmd_t = 7 #UPAY_MSG_POST_SCAN_PAYMENT;
+            args = amount
+            userdata_t = None
+            print("upay_display_notify_cb: ---------------------------- post scan payment\n")
+            ret = self.alipay.msg_send(cmd_t,args,userdata_t)
+            
+        elif rsp_code == 20:
+            if cmd == 6 :
+                print("TODO:show 网络异常,请重试")
+                
+        elif rsp_code == 21:
+            if cmd == 6 :
+                print("TODO:show 二维码无法识别")
+            
+        elif rsp_code == 46:
+            if cmd == 6 :
+                print("TODO:show 网络异常,请重试")
+          
+        elif rsp_code == 48:
+            if cmd == 6 :
+                print("TODO:show 网络异常,请重试")
+            
+        elif rsp_code == 37:
+            if cmd == 6 :
+                print("TODO:show 网络异常,请重试")
+           
+        elif rsp_code == 49:
+            if cmd == 6:
+                print("TODO:show 网络异常,请重试")
+
+        elif rsp_code == 50:
+            if cmd == 6:
+                print("TODO:show 网络异常,请重试")
+                       
+        elif rsp_code == 10:
+            #发起主扫支付结果
+            print("upay_display_notify_cb: post scan payment complete\n")
+            
+        elif rsp_code == 18:
+            # 发起主扫支付结果
+            print("upay_display_notify_cb: post scan payment failed\n")
+
+        elif rsp_code == 19:
+            # 发起主扫支付结果
+            print("upay_display_notify_cb: post scan payment failed\n")
+               
+        elif rsp_code == 42:
+            #发起主扫支付结果
+            print("upay_display_notify_cb: post scan payment failed\n")
+            
+        elif rsp_code == 43:
+            # 发起主扫支付结果
+            print("upay_display_notify_cb: post scan payment failed\n")
+                                                                       
+        elif rsp_code == 44:
+           # 服务端已解绑 
+            print("upay_display_notify_cb: not bind !\n")
+       
+    def get_binding_code(self, event, msg):
+        return self.result
+
+    def get_payment_code(self, event, msg):
+        if self.is_init == 0 : 
+            args = ""
+            userdata = ""
+            ret = self.alipay.msg_send(3,args,userdata)
+    
+    def get_collect_code(self, event, msg):
+        if self.is_init == 0 : 
+            args = ""
+            userdata = ""
+            ret = self.alipay.msg_send(5,args,userdata)
+
+    def get_parent_code(self, event, msg):
+        if self.is_init == 0 : 
+            args = ""
+            userdata = ""
+            ret = self.alipay.msg_send(8,args,userdata)
+
+
+    def alipay_1(self, event, msg):
+        #本地判断是否绑定
+        check_bind = self.alipay.check_bind_status()
+        check_bind_online = self.alipay.check_bind_status()
+        print("check_bind:{} check_bind_online:{}".format(check_bind,check_bind_online))
+        if check_bind == 4: #已绑定
+           EventMesh.publish("load_screen", {"screen": "alipay_1_1"})
+            # if self.is_init == 0 : 
+            #     args = ""
+            #     userdata = ""
+                # ret = self.alipay.msg_send(3,args,userdata) #发送获取付款码消息
+                # ret = self.alipay.msg_send(5,args,userdata) #发送获取收款码消息
+        elif check_bind == 5: #未绑定
+            #EventMesh.publish("load_screen", {"screen": "alipay_invite"})
+            if self.is_init == 0 :   
+                # bindcode = bytearray(500)
+                # bindcode_len = bytearray([500])
+                # self.alipay.get_bindcode(bindcode,bindcode_len)
+                # print("len:{} qrcode:{}".format(bindcode_len,bindcode))
+                # self.timer_Alipay_check.start(2000, 1, self.timeout_Alipay_check_cb)
+                args = ""
+                userdata = ""
+                print("--000--")
+                ret = self.alipay.msg_send(1,args,userdata) #发送获取绑定码消息
+                print("alipay_1 send msg:HELIOS_PAY_MSG_GET_BIND_CODE:{}".format(ret))
+        else :
+            print("check bind error!!!")
+
+    def timeout_Alipay_check_cb(self, *args, **kwargs):
+        
+        ret = self.alipay.query_bind_result()
+        print("query_bind_result:{}".format(ret))
+
+style_alipay_screen_default = lv.style_t()
+style_alipay_screen_default.init()
+style_alipay_screen_default.set_radius(0)
+style_alipay_screen_default.set_bg_color(lv.color_make(0x00, 0x00, 0x00))
+style_alipay_screen_default.set_bg_opa(255)
+style_alipay_screen_default.set_border_width(0)
+style_alipay_screen_default.set_pad_left(0)
+style_alipay_screen_default.set_pad_right(0)
+style_alipay_screen_default.set_pad_top(0)
+style_alipay_screen_default.set_pad_bottom(0)
+
+style_alipay_img_default = lv.style_t()
+style_alipay_img_default.init()
+style_alipay_img_default.set_img_opa(255)
+style_alipay_img_default.set_img_recolor_opa(0)
+style_alipay_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff))
+
+class AlipayOpenScreen(Screen):
+    NAME = "alipay_open"
+    #打开支付宝
+    def __init__(self):
+        super().__init__()
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #进入图片
+        self.watchface_mpsignal_img = lv.img(self.meta)
+        self.watchface_mpsignal_img.set_pos(int(70),int(80))
+        self.watchface_mpsignal_img.set_size(100,100)
+        self.watchface_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface_mpsignal_img.set_src("E:/static/APP/alipay/1.jpg")
+        self.watchface_mpsignal_img.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+    def initialization(self):
+        
+        pass
+   
+    def post_processor_after_initialization(self):
+        print("----init----")
+        EventMesh.publish("alipay_1")
+        pass
+
+    def Close(self):
+        pass
+        
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class Alipay_1_1(Screen):
+    NAME = "alipay_1_1"
+    #已绑定,显示功能列表
+    def __init__(self):
+        super().__init__()
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #付款码
+        self.alipay_imgbtn_3 = lv.imgbtn(self.meta)
+        self.alipay_imgbtn_3.set_size(224, 68)
+        self.alipay_imgbtn_3.set_pos(8, 10)
+        self.alipay_imgbtn_3.set_src(lv.imgbtn.STATE.RELEASED, "E:/static/APP/alipay/1_13.png", None, None)
+        self.alipay_imgbtn_3.add_event_cb(lambda e: self.alipay_paycode(e),
+                                     lv.EVENT.PRESSED, None)
+
+        self.alipay_imgbtn_3.set_src(lv.imgbtn.STATE.PRESSED, "E:/static/APP/alipay/1_13.png", None, None)
+        self.alipay_imgbtn_3.set_src(lv.imgbtn.STATE.CHECKED_RELEASED, "E:/static/APP/alipay/1_13.png", None, None)
+        self.alipay_imgbtn_3.set_src(lv.imgbtn.STATE.CHECKED_PRESSED, "E:/static/APP/alipay/1_13.png", None, None)
+        self.alipay_imgbtn_3.add_flag(lv.obj.FLAG.CHECKABLE)
+        self.alipay_imgbtn_3.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.alipay_imgbtn_3.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.PRESSED)
+        self.alipay_imgbtn_3.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.CHECKED)
+        
+        #收钱
+        self.alipay_imgbtn_2 = lv.imgbtn(self.meta)
+        self.alipay_imgbtn_2.set_size(224, 69)
+        self.alipay_imgbtn_2.set_pos(8, 86)
+        self.alipay_imgbtn_2.set_src(lv.imgbtn.STATE.RELEASED, "E:/static/APP/alipay/1_12.png", None, None)
+        self.alipay_imgbtn_2.add_event_cb(lambda e: self.alipay_collect(e),
+                                     lv.EVENT.PRESSED, None)
+
+        self.alipay_imgbtn_2.set_src(lv.imgbtn.STATE.PRESSED, "E:/static/APP/alipay/1_12.png", None, None)
+        self.alipay_imgbtn_2.set_src(lv.imgbtn.STATE.CHECKED_RELEASED, "E:/static/APP/alipay/1_12.png", None, None)
+        self.alipay_imgbtn_2.set_src(lv.imgbtn.STATE.CHECKED_PRESSED, "E:/static/APP/alipay/1_12.png", None, None)
+        self.alipay_imgbtn_2.add_flag(lv.obj.FLAG.CHECKABLE)
+        self.alipay_imgbtn_2.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.alipay_imgbtn_2.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.PRESSED)
+        self.alipay_imgbtn_2.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.CHECKED)
+
+        #家长设置
+        self.alipay_imgbtn_1 = lv.imgbtn(self.meta)
+        self.alipay_imgbtn_1.set_size(224, 69)
+        self.alipay_imgbtn_1.set_pos(8, 168)
+
+        self.alipay_imgbtn_1.set_src(lv.imgbtn.STATE.RELEASED, "E:/static/APP/alipay/1_11.png", None, None)
+        self.alipay_imgbtn_1.add_event_cb(lambda e: self.alipay_parent(e),
+                                     lv.EVENT.PRESSED, None)
+        self.alipay_imgbtn_1.set_src(lv.imgbtn.STATE.PRESSED, "E:/static/APP/alipay/1_11.png", None, None)
+        self.alipay_imgbtn_1.set_src(lv.imgbtn.STATE.CHECKED_RELEASED, "E:/static/APP/alipay/1_11.png", None, None)
+        self.alipay_imgbtn_1.set_src(lv.imgbtn.STATE.CHECKED_PRESSED, "E:/static/APP/alipay/1_11.png", None, None)
+        self.alipay_imgbtn_1.add_flag(lv.obj.FLAG.CHECKABLE)
+        self.alipay_imgbtn_1.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.alipay_imgbtn_1.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.PRESSED)
+        self.alipay_imgbtn_1.add_style(style_alipay_img_default, lv.PART.MAIN | lv.STATE.CHECKED)
+    
+    def initialization(self):
+        pass
+   
+    def post_processor_after_initialization(self):
+        pass
+    
+    def Close(self):
+        pass
+        
+    def alipay_paycode(self,e):
+        # Alipay.alipay.msg_send(3,"","") #发送获取付款码消息
+
+        EventMesh.publish("get_payment_code")
+
+    def alipay_collect(self,e):
+        EventMesh.publish("get_collect_code")
+        # EventMesh.publish("load_screen", {"screen": "alipay_collect"})
+
+    def alipay_parent(self,e):
+        EventMesh.publish("get_parent_code")
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class Alipay_invite(Screen):
+    NAME = "alipay_invite"
+    #未绑定,获取二维码显示
+    def __init__(self):
+        super().__init__()
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #背景
+        self.bg = lv.img(self.meta)
+        self.bg.center()
+        self.bg.set_size(240,240)
+        self.bg.set_src("E:/static/APP/alipay/1_2.jpg")
+        self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #提示词
+        self.label = lv.label(self.bg)
+        self.label.set_pos(6, 8)
+        self.label.set_size(228, 48)
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_text("请家长用手机支付宝扫一扫")
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #二维码
+        self.bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5)
+        self.fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4)
+
+        self.alipay_qr = lv.qrcode(self.bg, 150, self.fg_color, self.bg_color)
+        self.alipay_qr.set_pos(41,67)
+        # Add a border with bg_color
+        self.alipay_qr.set_style_border_color(self.bg_color, 0)
+        self.alipay_qr.set_style_border_width(5, 0)
+        
+
+                
+    def initialization(self):
+        pass
+   
+    def post_processor_after_initialization(self):
+        # 二维码数据
+        self.alipay_qr_data = str(self.meta_info)
+        print("alipay_invite:",str(self.meta_info))
+        self.alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data))
+
+    
+    def Close(self):
+        pass
+               
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class Alipay_inviting(Screen):
+    NAME = "alipay_inviting"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        # self.bg = lv.img(self.meta)
+        # self.bg.set_pos(80,54)
+        # self.bg.set_size(80,80)
+        # self.bg.set_src("E:/static/APP/alipay/loading.jpg")
+        # self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #提示词
+        self.label = lv.label(self.meta)
+        self.label.set_pos(30, 158)
+        self.label.set_size(180, 24)
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_text("绑定中,不要走开")
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+   
+    def initialization(self):
+        pass
+   
+    def post_processor_after_initialization(self):
+        pass
+    
+    def Close(self):
+        pass
+                
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+# class Alipay_default(Screen):
+#     NAME = "alipay_default"
+
+#     def __init__(self):
+#         super().__init__()
+#         self.meta = lv.obj()
+#         self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+#         # add style for watchface
+#         self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+#         #背景
+#         self.bg = lv.img(self.meta)
+#         self.bg.set_pos(56,30)
+#         self.bg.set_size(240,240)
+#         self.bg.set_src("E:/static/APP/alipay/1_2_2.png")
+#         self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+#         #提示词
+#         self.label = lv.label(self.meta)
+#         self.label.set_pos(68, 168)
+#         self.label.set_size(104, 29)
+#         self.label.set_long_mode(lv.label.LONG.WRAP)
+#         self.label.set_text("绑定失败")
+#         self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+#         self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+   
+#     def initialization(self):
+#         pass
+       
+#     def Close(self):
+#         pass
+                
+#     def btn1_release(self):
+#         EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+#     def btn8_press(self):
+#         EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class Alipay_success(Screen):
+    NAME = "alipay_success"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #背景
+        self.bg = lv.img(self.meta)
+        self.bg.set_pos(56,30)
+        self.bg.set_size(128,127)
+        self.bg.set_src("E:/static/APP/alipay/1_2_1.png")
+        self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #提示词
+        self.label = lv.label(self.meta)
+        self.label.set_pos(68, 168)
+        self.label.set_size(104, 29)
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_text("绑定成功")
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+   
+    def initialization(self):
+        pass
+   
+    def post_processor_after_initialization(self):
+        pass
+
+
+    def Close(self):
+        pass
+                
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class Alipay_paycode(Screen):
+    NAME = "alipay_paycode"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.alipay_paycode = lv.tileview(self.meta)
+        self.alipay_paycode.center()
+        self.alipay_paycode.set_size(240, 320)
+        self.alipay_paycode.add_style(style_alipay_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        # 1 - 条形码界面
+        self.alipay_barcode = self.alipay_paycode.add_tile(0, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+
+        #椭圆背景
+        self.cont = lv.obj(self.alipay_barcode)
+        self.cont.set_size(240,220)
+        self.cont.set_pos(0,21)
+        self.cont.add_style(style_cont_alipay, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+        #提示词
+        self.label = lv.label(self.alipay_barcode)
+        self.label.set_pos(10, 33)
+        self.label.set_size(220, 24)
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_text("收银员扫一扫,完成付款")
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+        #条形码
+        self.bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5)
+        self.fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4)
+        self.alipay_bar = lv.qrcode(self.alipay_barcode, 150, self.fg_color, self.bg_color)
+        self.alipay_bar.set_pos(33,61)
+        self.alipay_bar.set_style_border_color(self.bg_color, 0)
+        self.alipay_bar.set_style_border_width(5, 0)
+
+        #编号
+
+        # 2 - 二维码界面
+        self.alipay_qrcode = self.alipay_paycode.add_tile(1, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+
+        #白色背景
+
+        #提示词
+        self.label1 = lv.label(self.alipay_qrcode)
+        self.label1.set_pos(10, 33)
+        self.label1.set_size(220, 24)
+        self.label1.set_long_mode(lv.label.LONG.WRAP)
+        self.label1.set_text("收银员扫一扫,完成付款")
+        self.label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+        #二维码
+
+        self.alipay_qr = lv.qrcode(self.alipay_qrcode, 150, self.fg_color, self.bg_color)
+        self.alipay_qr.set_pos(33,61)
+        self.alipay_qr.set_style_border_color(self.bg_color, 0)
+        self.alipay_qr.set_style_border_width(5, 0)
+
+  
+    def post_processor_after_initialization(self):
+        self.alipay_qr_data = str(self.meta_info)
+        print("alipay_paycode:",str(self.meta_info))
+        self.alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data))
+        self.alipay_bar.update(self.alipay_qr_data,len(self.alipay_qr_data))
+    
+    def Close(self):
+        pass
+                
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class Alipay_pay_success(Screen):
+    NAME = "alipay_pay_success"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #支付成功LOGO
+        self.bg = lv.img(self.meta)
+        self.bg.center()
+        self.bg.set_size(240,240)
+        self.bg.set_src("E:/static/APP/alipay/1_13_1_1.png")
+        self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #付款金额
+        self.label = lv.label(self.meta)
+        self.label.set_pos(78, 114)
+        self.label.set_size(84, 43)
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #完成按钮
+        self.btn = lv.btn(self.meta)
+        self.btn.set_size(224,58)
+        self.btn.set_pos(8,174)
+        self.btn.remove_style_all()
+        self.btn.add_style(style_btn_alipay,0)
+
+        self.label_btn = lv.label(self.btn)
+        self.label_btn.set_text("支付完成")
+        self.label_btn.center()
+        self.label_btn.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+    def post_processor_after_initialization(self):
+        print("money:",str(self.meta_info))
+        self.label.set_text(str(self.meta_info))
+
+   
+    def initialization(self):
+        pass
+      
+    def Close(self):
+        pass
+                
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class Alipay_collect(Screen):
+    NAME = "alipay_collect"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #二维码
+        self.bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5)
+        self.fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4)
+
+        self.alipay_qr = lv.qrcode(self.meta, 150, self.fg_color, self.bg_color)
+        self.alipay_qr.set_pos(33,22)
+        # Add a border with bg_color
+        self.alipay_qr.set_style_border_color(self.bg_color, 0)
+        self.alipay_qr.set_style_border_width(5, 0)
+
+        #提示词
+        self.label = lv.label(self.meta)
+        self.label.set_pos(20, 204)
+        self.label.set_size(200, 24)
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_text("请对方使用支付宝扫码")
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+  
+    def initialization(self):
+        pass
+   
+    def post_processor_after_initialization(self):
+        self.alipay_qr_data = str(self.meta_info)
+        print("alipay_collect:",str(self.meta_info))
+        self.alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data))
+    
+    def Close(self):
+        pass
+                
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class Alipay_parent(Screen):
+    NAME = "alipay_parent"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_alipay_screen_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #家长头像
+        self.bg = lv.img(self.meta)
+        self.bg.set_pos(8,12)
+        self.bg.set_size(81,81)
+        self.bg.set_src("E:/static/APP/alipay/1_11_1.png")
+        self.bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #提示词
+        self.label = lv.label(self.meta)
+        self.label.set_pos(104, 12)
+        self.label.set_size(96, 29)
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_text("家长设置")
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        self.label1 = lv.label(self.meta)
+        self.label1.set_pos(100, 43)
+        self.label1.set_size(120, 29)
+        self.label1.set_long_mode(lv.label.LONG.WRAP)
+        self.label1.set_text("零花钱管理")
+        self.label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        self.label2 = lv.label(self.meta)
+        self.label2.set_pos(100, 71)
+        self.label2.set_size(120, 29)
+        self.label2.set_long_mode(lv.label.LONG.WRAP)
+        self.label2.set_text("解绑退钱")
+        self.label2.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #家长码
+        self.bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5)
+        self.fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4)
+
+        self.alipay_qr = lv.qrcode(self.meta, 150, self.fg_color, self.bg_color)
+        self.alipay_qr.set_pos(8,171)
+        # Add a border with bg_color
+        self.alipay_qr.set_style_border_color(self.bg_color, 0)
+        self.alipay_qr.set_style_border_width(5, 0)
+
+   
+    def initialization(self):
+        pass
+   
+    def post_processor_after_initialization(self):
+        self.alipay_qr_data = str(self.meta_info)
+        print("alipay_parent:",str(self.meta_info))
+        self.alipay_qr.update(self.alipay_qr_data,len(self.alipay_qr_data))
+    
+    def Close(self):
+        pass
+                
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
\ No newline at end of file
diff --git a/3.code/1.watch/2.code/btn_device_ec800m.py b/3.code/1.watch/2.code/btn_device_ec800m.py
new file mode 100644 (file)
index 0000000..e893a9f
--- /dev/null
@@ -0,0 +1,76 @@
+from ext.common import Abstract
+import machine
+import osTimer
+from misc import PowerKey
+from ext import EventMesh
+from machine import Pin
+
+
+class BtnDevice(Abstract):
+
+    def __init__(self, tp=None):
+        self.pk = PowerKey()
+        self.__pwk_timer = osTimer()
+        self.keypad = machine.KeyPad(1, 1)
+        self.__PowerDownTimeOut = 2000
+        self.__tp = tp
+
+    def post_processor_after_instantiation(self):
+        self.keypad.init()
+        self.keypad.set_callback(self.key_callback)
+        self.pk.powerKeyEventRegister(self.pwk_callback)
+        if self.__tp:
+            self.__tp.set_callback(self.__ui_callback)
+
+    def __ui_callback(self, para):
+        print("para = {}".format(para))
+        if para == 0:
+            EventMesh.publish("done_left_to_right")
+            print("<-")
+        elif para == 1:
+            EventMesh.publish("done_right_to_left")
+            print("->")
+        elif para == 2:
+            EventMesh.publish("done_bottom_to_top")
+            print("^")
+        elif para == 3:
+            EventMesh.publish("done_top_to_bottom")
+            print("V")
+        elif para == 4:
+            EventMesh.publish("done_return")
+            print("return")
+        elif para == 5:
+            EventMesh.publish("done_click")
+            print("CLICK")
+        elif (para == 6):
+            EventMesh.publish("done_error")
+            print("error")
+
+    def key_callback(self, l_list):
+        #print("key_callback:",str(l_list))
+        if l_list[0] == 1:
+            # 马达震动预留
+            pass
+        if (l_list[1] == 1) and (l_list[2] == 0):
+            if l_list[0] == 1:
+                EventMesh.publish("btn1_press")
+            else:
+                EventMesh.publish("btn1_release")
+
+        
+
+    def pwk_callback(self, status):
+        print('==pwr:', status)
+        if status == 1:
+            self.__pwk_timer.start(self.__PowerDownTimeOut, 0, self.__pwk_long_press_cb)
+        elif status == 0:
+            self.__pwk_timer.stop()
+            # print("btn_back:{}".format(mdls.screen_size_style[mdls.models][1]))
+            EventMesh.publish("btn8_press")
+
+    def __pwk_long_press_cb(self, *args):
+        '''KEY2:联动屏幕右下角或返回键长按关机'''
+        EventMesh.publish("btn8_long_press")
+
+    def start(self):
+        self.post_processor_after_instantiation()
diff --git a/3.code/1.watch/2.code/capacitive_hynitron_cst816d_update.py b/3.code/1.watch/2.code/capacitive_hynitron_cst816d_update.py
new file mode 100644 (file)
index 0000000..b99420f
--- /dev/null
@@ -0,0 +1,977 @@
+"""
+*Name        : capacitive_hynitron_cst816d_update.h
+*Author      : gary
+*Version     : V1.0
+*Copyright   : Hynitron
+*ProjectName : CSW_2211527_CST816D_COB_ZT_YAT_K5_G1_JL_55028.hex       Modify at 2022-11-21 17:57:42
+"""
+
+app_bin_816d = [
+0x00, 0x00, 0x00, 0x3c, 0x78, 0xa8,
+0x02, 0x1f, 0xc9, 0x7f, 0x00, 0x22, 0x02, 0x34, 0x9c, 0x22, 0x00, 0x00, 0x02, 0x33, 0xd2, 0x02, 
+0x33, 0x5f, 0x85, 0x5b, 0x82, 0x85, 0x5a, 0x83, 0x75, 0xf0, 0x05, 0xe5, 0x21, 0x02, 0x0c, 0xa0, 
+0x00, 0x02, 0x28, 0xf5, 0x8f, 0x22, 0xe5, 0x09, 0x24, 0x05, 0x12, 0x12, 0x63, 0xe0, 0x70, 0x03, 
+0x02, 0x07, 0x77, 0x12, 0x12, 0x89, 0x74, 0x20, 0x93, 0xff, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 
+0x63, 0xe0, 0xc3, 0x9f, 0x50, 0x58, 0xe5, 0x09, 0x24, 0x07, 0x12, 0x12, 0x63, 0xe0, 0x54, 0xfe, 
+0xf0, 0xe5, 0x09, 0x24, 0x11, 0x12, 0x12, 0x63, 0xe4, 0xf0, 0xa3, 0xf0, 0xe5, 0x09, 0x24, 0x13, 
+0x12, 0x12, 0x63, 0xe4, 0xf0, 0x12, 0x12, 0x6e, 0x12, 0x13, 0x2c, 0x24, 0x1b, 0x12, 0x12, 0x63, 
+0x12, 0x12, 0x6b, 0x12, 0x13, 0x2a, 0x24, 0x1d, 0x12, 0x12, 0x29, 0x12, 0x12, 0x6b, 0x12, 0x13, 
+0x2c, 0x24, 0x15, 0x12, 0x12, 0x63, 0x12, 0x12, 0x6b, 0x12, 0x13, 0x2a, 0x24, 0x17, 0x12, 0x12, 
+0x63, 0x12, 0x14, 0x46, 0x24, 0x05, 0x12, 0x12, 0x63, 0xe4, 0xf0, 0x02, 0x01, 0xe1, 0xe5, 0x09, 
+0x24, 0x07, 0x12, 0x12, 0x63, 0xe0, 0x30, 0xe0, 0x03, 0x02, 0x01, 0x3f, 0xe5, 0x09, 0x24, 0x1b, 
+0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x12, 0x70, 0x12, 0x13, 0xe9, 0xf5, 0x28, 
+0xec, 0x9e, 0xf5, 0x27, 0xe5, 0x09, 0x24, 0x1d, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 
+0x12, 0x12, 0x70, 0x12, 0x13, 0xe7, 0xf5, 0x2a, 0xec, 0x9e, 0xf5, 0x29, 0x12, 0x12, 0x89, 0x74, 
+0x19, 0x93, 0xff, 0xe4, 0x8f, 0x36, 0xf5, 0x35, 0xf5, 0x34, 0xf5, 0x33, 0x12, 0x13, 0x62, 0x90, 
+0x02, 0xb8, 0xe0, 0x24, 0x01, 0xff, 0xe4, 0x33, 0xfe, 0x12, 0x13, 0xc6, 0x8f, 0x36, 0x8e, 0x35, 
+0x8d, 0x34, 0x8c, 0x33, 0xaf, 0x2a, 0xae, 0x29, 0x12, 0x2b, 0x6f, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 
+0x28, 0xae, 0x27, 0x12, 0x2b, 0x6f, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x12, 0x13, 
+0x5d, 0xc3, 0x12, 0x0c, 0x2e, 0x50, 0x0d, 0xe5, 0x09, 0x24, 0x07, 0x12, 0x12, 0x63, 0xe0, 0x44, 
+0x01, 0xf0, 0x80, 0x37, 0xe4, 0xf5, 0x27, 0xf5, 0x28, 0xf5, 0x29, 0xf5, 0x2a, 0x80, 0x2c, 0xe5, 
+0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x12, 0x70, 0x12, 0x13, 
+0xe9, 0xf5, 0x28, 0xec, 0x9e, 0xf5, 0x27, 0x12, 0x12, 0x5f, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 
+0x12, 0x70, 0x12, 0x13, 0xe7, 0xf5, 0x2a, 0xec, 0x9e, 0xf5, 0x29, 0xe5, 0x09, 0x24, 0x11, 0x12, 
+0x12, 0x63, 0x12, 0x13, 0x56, 0xe5, 0x28, 0x9f, 0xfd, 0xe5, 0x27, 0x9e, 0xfc, 0xef, 0x78, 0x02, 
+0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0x2d, 0xff, 0xec, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0x12, 
+0x14, 0x01, 0xd8, 0xfb, 0xf5, 0x28, 0x8e, 0x27, 0xe5, 0x09, 0x24, 0x13, 0x12, 0x12, 0x63, 0x12, 
+0x13, 0x56, 0xe5, 0x2a, 0x9f, 0xfd, 0xe5, 0x29, 0x9e, 0xfc, 0xef, 0x78, 0x02, 0xc3, 0x33, 0xce, 
+0x33, 0xce, 0xd8, 0xf9, 0x2d, 0xff, 0xec, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0x12, 0x14, 0x01, 0xd8, 
+0xfb, 0xf5, 0x2a, 0x8e, 0x29, 0xe5, 0x09, 0x24, 0x11, 0x12, 0x12, 0x63, 0xe5, 0x27, 0xf0, 0xa3, 
+0xe5, 0x28, 0xf0, 0xe5, 0x09, 0x24, 0x13, 0x12, 0x12, 0x63, 0xe5, 0x29, 0xf0, 0xa3, 0xe5, 0x2a, 
+0xf0, 0x12, 0x12, 0x89, 0x74, 0x20, 0x93, 0xff, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, 
+0xc3, 0x9f, 0x50, 0x03, 0x02, 0x07, 0x35, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0xe0, 0xfe, 
+0xa3, 0xe0, 0x25, 0x28, 0xff, 0xe5, 0x27, 0x3e, 0xfe, 0x12, 0x13, 0x7c, 0x12, 0x12, 0x70, 0x12, 
+0x14, 0x08, 0x12, 0x14, 0x01, 0xd8, 0xfb, 0xf5, 0x24, 0x8e, 0x23, 0x12, 0x12, 0x5f, 0xe0, 0xfe, 
+0xa3, 0xe0, 0x25, 0x2a, 0xff, 0xe5, 0x29, 0x3e, 0xfe, 0x12, 0x13, 0x7c, 0x12, 0x12, 0x70, 0xa3, 
+0xa3, 0x12, 0x14, 0x08, 0x12, 0x14, 0x01, 0xd8, 0xfb, 0xf5, 0x26, 0x8e, 0x25, 0xc3, 0xe5, 0x24, 
+0x94, 0x01, 0xe5, 0x23, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x75, 0x23, 0x00, 0x75, 0x24, 0x01, 
+0x80, 0x1d, 0x12, 0x12, 0x89, 0x74, 0x01, 0x93, 0xfe, 0x74, 0x02, 0x93, 0xff, 0xd3, 0x95, 0x24, 
+0xee, 0x95, 0x23, 0x50, 0x0a, 0xef, 0x24, 0xff, 0xf5, 0x24, 0xee, 0x34, 0xff, 0xf5, 0x23, 0xc3, 
+0xe5, 0x26, 0x94, 0x01, 0xe5, 0x25, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x75, 0x25, 0x00, 0x75, 
+0x26, 0x01, 0x80, 0x1d, 0x12, 0x12, 0x89, 0x74, 0x03, 0x93, 0xfe, 0x74, 0x04, 0x93, 0xff, 0xd3, 
+0x95, 0x26, 0xee, 0x95, 0x25, 0x50, 0x0a, 0xef, 0x24, 0xff, 0xf5, 0x26, 0xee, 0x34, 0xff, 0xf5, 
+0x25, 0x12, 0x12, 0x89, 0x74, 0x20, 0x93, 0x24, 0x0a, 0xff, 0xe4, 0x33, 0xfe, 0xe5, 0x09, 0x24, 
+0x09, 0x12, 0x12, 0x63, 0xe0, 0xc3, 0x9f, 0xee, 0x64, 0x80, 0xf8, 0x74, 0x80, 0x98, 0x50, 0x5d, 
+0xe5, 0x09, 0x24, 0x11, 0x12, 0x12, 0x63, 0x12, 0x07, 0xc9, 0x12, 0x12, 0x89, 0x74, 0x20, 0x93, 
+0xfd, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, 0xc3, 0x9d, 0xfd, 0xe4, 0x94, 0x00, 0xfc, 
+0x12, 0x13, 0xd7, 0x12, 0x14, 0x15, 0xe5, 0x09, 0x24, 0x13, 0x12, 0x12, 0x63, 0x12, 0x07, 0xc9, 
+0x12, 0x12, 0x89, 0x74, 0x20, 0x93, 0xfd, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, 0xc3, 
+0x9d, 0xfd, 0xe4, 0x94, 0x00, 0xfc, 0x12, 0x12, 0xf4, 0xf5, 0x83, 0x12, 0x14, 0x15, 0x75, 0x3b, 
+0x00, 0x75, 0x3c, 0x5a, 0x75, 0x3d, 0x00, 0x75, 0x3e, 0x5a, 0x02, 0x05, 0x45, 0xe5, 0x09, 0x24, 
+0x11, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x2b, 0x6f, 0x8e, 0x46, 0x8f, 0x47, 
+0xe5, 0x09, 0x24, 0x13, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x2b, 0x6f, 0x8e, 
+0x48, 0x8f, 0x49, 0xd3, 0xe5, 0x47, 0x94, 0xff, 0xe5, 0x46, 0x94, 0x00, 0x40, 0x06, 0x75, 0x46, 
+0x00, 0x75, 0x47, 0xff, 0xd3, 0xe5, 0x49, 0x94, 0xff, 0xe5, 0x48, 0x94, 0x00, 0x40, 0x06, 0x75, 
+0x48, 0x00, 0x75, 0x49, 0xff, 0x85, 0x46, 0x3f, 0x85, 0x47, 0x40, 0x85, 0x48, 0x41, 0x85, 0x49, 
+0x42, 0x75, 0x45, 0x09, 0x12, 0x12, 0xa5, 0xe0, 0x25, 0x40, 0xf5, 0x40, 0xe4, 0x35, 0x3f, 0xf5, 
+0x3f, 0x12, 0x12, 0xf4, 0x12, 0x12, 0xb2, 0xe0, 0x25, 0x42, 0xf5, 0x42, 0xe4, 0x35, 0x41, 0xf5, 
+0x41, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xbe, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0x12, 0x12, 
+0xb2, 0xe0, 0xff, 0x12, 0x12, 0xa5, 0xef, 0xf0, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xd2, 
+0xf5, 0x82, 0xe4, 0x34, 0x02, 0x12, 0x12, 0xb2, 0xe0, 0xff, 0x12, 0x12, 0xf4, 0x12, 0x12, 0xb2, 
+0xef, 0xf0, 0x15, 0x45, 0xe5, 0x45, 0x70, 0xac, 0x12, 0x13, 0xd7, 0xe5, 0x47, 0xf0, 0x12, 0x12, 
+0xf4, 0xf5, 0x83, 0xe5, 0x49, 0xf0, 0xd3, 0xe5, 0x40, 0x95, 0x42, 0xe5, 0x3f, 0x95, 0x41, 0x40, 
+0x26, 0x75, 0x4a, 0x00, 0x75, 0x4b, 0x00, 0x75, 0x4c, 0x41, 0x75, 0x4d, 0x00, 0x75, 0x4e, 0x00, 
+0x75, 0x4f, 0x3f, 0x75, 0x50, 0x00, 0x75, 0x51, 0x00, 0x75, 0x52, 0x3b, 0x75, 0x53, 0x00, 0x75, 
+0x54, 0x00, 0x75, 0x55, 0x3d, 0x80, 0x24, 0x75, 0x4a, 0x00, 0x75, 0x4b, 0x00, 0x75, 0x4c, 0x3f, 
+0x75, 0x4d, 0x00, 0x75, 0x4e, 0x00, 0x75, 0x4f, 0x41, 0x75, 0x50, 0x00, 0x75, 0x51, 0x00, 0x75, 
+0x52, 0x3d, 0x75, 0x53, 0x00, 0x75, 0x54, 0x00, 0x75, 0x55, 0x3b, 0x12, 0x14, 0x64, 0x45, 0xf0, 
+0x70, 0x06, 0x75, 0xf0, 0x01, 0x12, 0x0a, 0xc5, 0xab, 0x4d, 0xaa, 0x4e, 0xa9, 0x4f, 0x12, 0x0a, 
+0x15, 0xae, 0xf0, 0x78, 0x03, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0x12, 0x14, 0x64, 
+0xfd, 0xac, 0xf0, 0x12, 0x09, 0x74, 0x8e, 0x43, 0x8f, 0x44, 0xe5, 0x09, 0x24, 0x0b, 0x12, 0x12, 
+0x63, 0x12, 0x13, 0x77, 0xe5, 0x44, 0x2f, 0xff, 0xe5, 0x43, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 
+0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xf5, 0x44, 0x8e, 0x43, 0xc3, 0x94, 0x28, 0xe5, 0x43, 0x94, 
+0x00, 0x50, 0x08, 0x75, 0x43, 0x00, 0x75, 0x44, 0x28, 0x80, 0x11, 0xd3, 0xe5, 0x44, 0x94, 0x46, 
+0xe5, 0x43, 0x94, 0x00, 0x40, 0x06, 0x75, 0x43, 0x00, 0x75, 0x44, 0x46, 0xae, 0x43, 0xaf, 0x44, 
+0x7c, 0x00, 0x7d, 0x0a, 0x12, 0x09, 0x62, 0xef, 0x24, 0xca, 0xff, 0xee, 0x34, 0xfe, 0xab, 0x53, 
+0xaa, 0x54, 0xa9, 0x55, 0x8f, 0xf0, 0x12, 0x0a, 0xc5, 0xe5, 0x44, 0x25, 0xe0, 0xff, 0xe5, 0x43, 
+0x33, 0xfe, 0xc3, 0x74, 0xaa, 0x9f, 0xff, 0xe4, 0x9e, 0xab, 0x50, 0xaa, 0x51, 0xa9, 0x52, 0x8f, 
+0xf0, 0x12, 0x0a, 0xc5, 0xe5, 0x09, 0x24, 0x0b, 0x12, 0x12, 0x63, 0xe5, 0x43, 0xf0, 0xa3, 0xe5, 
+0x44, 0xf0, 0xe5, 0x09, 0x24, 0x0d, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7d, 0x03, 
+0x12, 0x09, 0x62, 0xe5, 0x3c, 0x2f, 0xff, 0xe5, 0x3b, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, 
+0x13, 0xce, 0x13, 0xd8, 0xf9, 0xf5, 0x3c, 0x8e, 0x3b, 0xe5, 0x09, 0x24, 0x0f, 0x12, 0x12, 0x63, 
+0x12, 0x13, 0x77, 0xe5, 0x3e, 0x2f, 0xff, 0xe5, 0x3d, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, 
+0x13, 0xce, 0x13, 0xd8, 0xf9, 0xf5, 0x3e, 0x8e, 0x3d, 0xe5, 0x09, 0x24, 0x0d, 0x12, 0x12, 0x63, 
+0xe5, 0x3b, 0xf0, 0xa3, 0xe5, 0x3c, 0xf0, 0xe5, 0x09, 0x24, 0x0f, 0x12, 0x12, 0x63, 0xe5, 0x3d, 
+0xf0, 0xa3, 0xe5, 0x3e, 0xf0, 0x12, 0x12, 0x5f, 0x12, 0x07, 0xd2, 0x7c, 0x00, 0x7d, 0x02, 0x12, 
+0x09, 0xc9, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0x12, 0x07, 0xe2, 
+0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x33, 0x95, 0xe0, 0x8f, 0x36, 0x8e, 0x35, 0xf5, 
+0x34, 0xf5, 0x33, 0xad, 0x34, 0xac, 0x33, 0x12, 0x12, 0x78, 0x12, 0x14, 0x2f, 0xe5, 0x36, 0x2f, 
+0xf5, 0x36, 0xe5, 0x35, 0x3e, 0xf5, 0x35, 0xe5, 0x34, 0x3d, 0xf5, 0x34, 0xe5, 0x33, 0x3c, 0xf5, 
+0x33, 0xae, 0x3b, 0xaf, 0x3c, 0xe4, 0xfc, 0xfd, 0x12, 0x13, 0x62, 0xd3, 0x12, 0x0c, 0x2e, 0x40, 
+0x0b, 0xe4, 0x85, 0x3c, 0x36, 0x85, 0x3b, 0x35, 0xf5, 0x34, 0xf5, 0x33, 0xc3, 0xe5, 0x3c, 0x95, 
+0x36, 0xfb, 0xe5, 0x3b, 0x95, 0x35, 0xfa, 0xe4, 0x95, 0x34, 0xf9, 0xe4, 0x95, 0x33, 0xf8, 0xe5, 
+0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0x12, 0x13, 0xc1, 0x8f, 0x2e, 0x8e, 0x2d, 0x8d, 0x2c, 0x8c, 
+0x2b, 0xae, 0x23, 0xaf, 0x24, 0xee, 0x12, 0x13, 0x5d, 0x12, 0x0b, 0x11, 0xef, 0x25, 0x2e, 0xff, 
+0xee, 0x35, 0x2d, 0xfe, 0xed, 0x35, 0x2c, 0xfd, 0xec, 0x35, 0x2b, 0xfc, 0x12, 0x13, 0x6e, 0xe5, 
+0x3b, 0xc3, 0x13, 0xfe, 0xe5, 0x3c, 0x12, 0x13, 0x34, 0xc0, 0x06, 0xc0, 0x07, 0xae, 0x3b, 0xaf, 
+0x3c, 0xab, 0x07, 0xaa, 0x06, 0xe4, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0b, 0x9c, 0x8f, 
+0x2e, 0x8e, 0x2d, 0x8d, 0x2c, 0x8c, 0x2b, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0x12, 0x07, 
+0xe2, 0x7c, 0x00, 0x7d, 0x02, 0x12, 0x09, 0xc9, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x12, 0x5f, 0x12, 
+0x07, 0xd2, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x33, 0x95, 0xe0, 0x8f, 0x3a, 0x8e, 
+0x39, 0xf5, 0x38, 0xf5, 0x37, 0xad, 0x38, 0xac, 0x37, 0x12, 0x12, 0x78, 0x12, 0x14, 0x2f, 0xe5, 
+0x3a, 0x2f, 0xf5, 0x3a, 0xe5, 0x39, 0x3e, 0xf5, 0x39, 0xe5, 0x38, 0x3d, 0xf5, 0x38, 0xe5, 0x37, 
+0x3c, 0xf5, 0x37, 0xae, 0x3d, 0xaf, 0x3e, 0xe4, 0xfc, 0xfd, 0xab, 0x3a, 0xaa, 0x39, 0xa9, 0x38, 
+0xa8, 0x37, 0xd3, 0x12, 0x0c, 0x2e, 0x40, 0x0b, 0xe4, 0x85, 0x3e, 0x3a, 0x85, 0x3d, 0x39, 0xf5, 
+0x38, 0xf5, 0x37, 0xc3, 0xe5, 0x3e, 0x95, 0x3a, 0xfb, 0xe5, 0x3d, 0x95, 0x39, 0xfa, 0xe4, 0x95, 
+0x38, 0xf9, 0xe4, 0x95, 0x37, 0xf8, 0x12, 0x12, 0x5f, 0x12, 0x13, 0xc1, 0x8f, 0x32, 0x8e, 0x31, 
+0x8d, 0x30, 0x8c, 0x2f, 0xae, 0x25, 0xaf, 0x26, 0xee, 0x33, 0x95, 0xe0, 0xfd, 0xfc, 0xab, 0x3a, 
+0xaa, 0x39, 0xa9, 0x38, 0xa8, 0x37, 0x12, 0x0b, 0x11, 0xef, 0x25, 0x32, 0xff, 0xee, 0x35, 0x31, 
+0xfe, 0xed, 0x35, 0x30, 0xfd, 0xec, 0x35, 0x2f, 0xfc, 0x12, 0x13, 0x6e, 0xe5, 0x3d, 0xc3, 0x13, 
+0xfe, 0xe5, 0x3e, 0x12, 0x13, 0x34, 0xc0, 0x06, 0xc0, 0x07, 0xae, 0x3d, 0xaf, 0x3e, 0xab, 0x07, 
+0xaa, 0x06, 0xe4, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0b, 0x9c, 0x8f, 0x32, 0x8e, 0x31, 
+0x8d, 0x30, 0x8c, 0x2f, 0xe5, 0x09, 0x24, 0x07, 0x12, 0x12, 0x63, 0xe0, 0x30, 0xe0, 0x11, 0x12, 
+0x12, 0x70, 0xe5, 0x2d, 0xf0, 0xa3, 0xe5, 0x2e, 0x12, 0x12, 0x6f, 0xa3, 0xa3, 0xee, 0x80, 0x21, 
+0xe5, 0x09, 0x24, 0x1b, 0x12, 0x12, 0x63, 0xe0, 0xff, 0xa3, 0xe0, 0x12, 0x12, 0x70, 0xcf, 0x12, 
+0x14, 0x47, 0x24, 0x1d, 0x12, 0x12, 0x63, 0xe0, 0xff, 0xa3, 0xe0, 0x12, 0x12, 0x70, 0xa3, 0xa3, 
+0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, 0x63, 0x12, 0x13, 0x2c, 0x24, 
+0x15, 0x12, 0x12, 0x63, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x12, 0x5f, 0x12, 0x13, 0x2c, 0x24, 
+0x17, 0x12, 0x12, 0x29, 0x12, 0x14, 0x46, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, 0xc3, 0x94, 0x14, 
+0x50, 0x0a, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe0, 0x04, 0xf0, 0xe5, 0x09, 0x24, 0x0a, 
+0x12, 0x12, 0x63, 0x74, 0x01, 0xf0, 0x22, 0xe5, 0x09, 0x24, 0x0a, 0x12, 0x12, 0x63, 0xe0, 0xd3, 
+0x94, 0x00, 0x40, 0x0a, 0xe5, 0x09, 0x24, 0x0a, 0x12, 0x12, 0x63, 0xe0, 0x14, 0xf0, 0xe5, 0x09, 
+0x24, 0x0a, 0x12, 0x12, 0x63, 0xe0, 0x70, 0x30, 0xe5, 0x09, 0x24, 0x09, 0x12, 0x12, 0x63, 0xe4, 
+0xf0, 0xe5, 0x09, 0x24, 0x0d, 0x12, 0x12, 0x63, 0xe4, 0xf0, 0xa3, 0x74, 0x5a, 0xf0, 0xe5, 0x09, 
+0x24, 0x0f, 0x12, 0x12, 0x63, 0xe4, 0xf0, 0xa3, 0x74, 0x5a, 0xf0, 0xe5, 0x09, 0x24, 0x0b, 0x12, 
+0x12, 0x63, 0xe4, 0xf0, 0xa3, 0x74, 0x28, 0xf0, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x2b, 
+0x6f, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x95, 0x26, 0xff, 0xee, 0x95, 0x25, 0xfe, 0x12, 0x2b, 
+0x6f, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x95, 0x24, 0xff, 0xee, 0x95, 0x23, 0xfe, 0x12, 0x2b, 
+0x6f, 0x22, 0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 
+0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 
+0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x78, 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 
+0x8c, 0x83, 0xe3, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 
+0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x58, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 
+0x80, 0x4c, 0x80, 0xd2, 0x80, 0xfa, 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 
+0x80, 0x10, 0x80, 0xa6, 0x80, 0xea, 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 
+0x80, 0x33, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 
+0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 
+0xe7, 0x80, 0x0d, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 
+0xa9, 0xf0, 0xed, 0xfb, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 
+0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 
+0xea, 0xde, 0xe8, 0x80, 0xdb, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 
+0x80, 0xcc, 0x88, 0xf0, 0xef, 0x60, 0x01, 0x0e, 0x4e, 0x60, 0xc3, 0x88, 0xf0, 0xed, 0x24, 0x02, 
+0xb4, 0x04, 0x00, 0x50, 0xb9, 0xf5, 0x82, 0xeb, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xaf, 0x23, 
+0x23, 0x45, 0x82, 0x23, 0x90, 0x08, 0x42, 0x73, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 
+0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 
+0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 
+0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 
+0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 
+0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 
+0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 
+0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8, 
+0xf2, 0x22, 0xef, 0x8d, 0xf0, 0xa4, 0xa8, 0xf0, 0xcf, 0x8c, 0xf0, 0xa4, 0x28, 0xce, 0x8d, 0xf0, 
+0xa4, 0x2e, 0xfe, 0x22, 0xbc, 0x00, 0x0b, 0xbe, 0x00, 0x29, 0xef, 0x8d, 0xf0, 0x84, 0xff, 0xad, 
+0xf0, 0x22, 0xe4, 0xcc, 0xf8, 0x75, 0xf0, 0x08, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xec, 0x33, 
+0xfc, 0xee, 0x9d, 0xec, 0x98, 0x40, 0x05, 0xfc, 0xee, 0x9d, 0xfe, 0x0f, 0xd5, 0xf0, 0xe9, 0xe4, 
+0xce, 0xfd, 0x22, 0xed, 0xf8, 0xf5, 0xf0, 0xee, 0x84, 0x20, 0xd2, 0x1c, 0xfe, 0xad, 0xf0, 0x75, 
+0xf0, 0x08, 0xef, 0x2f, 0xff, 0xed, 0x33, 0xfd, 0x40, 0x07, 0x98, 0x50, 0x06, 0xd5, 0xf0, 0xf2, 
+0x22, 0xc3, 0x98, 0xfd, 0x0f, 0xd5, 0xf0, 0xea, 0x22, 0xc2, 0xd5, 0xec, 0x30, 0xe7, 0x09, 0xb2, 
+0xd5, 0xe4, 0xc3, 0x9d, 0xfd, 0xe4, 0x9c, 0xfc, 0xee, 0x30, 0xe7, 0x15, 0xb2, 0xd5, 0xe4, 0xc3, 
+0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x12, 0x09, 0x74, 0xc3, 0xe4, 0x9d, 0xfd, 0xe4, 0x9c, 0xfc, 0x80, 
+0x03, 0x12, 0x09, 0x74, 0x30, 0xd5, 0x07, 0xc3, 0xe4, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x22, 0xc5, 
+0xf0, 0xf8, 0xa3, 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 
+0x83, 0xe0, 0x38, 0xf0, 0x22, 0xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 
+0xe0, 0x22, 0x50, 0x06, 0x87, 0xf0, 0x09, 0xe7, 0x19, 0x22, 0xbb, 0xfe, 0x07, 0xe3, 0xf5, 0xf0, 
+0x09, 0xe3, 0x19, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xf5, 0xf0, 0x74, 0x01, 0x93, 0x22, 
+0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 
+0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe, 
+0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 
+0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22, 0xbb, 0x01, 0x0d, 0xc5, 0x82, 0x29, 0xc5, 0x82, 
+0xc5, 0x83, 0x3a, 0xc5, 0x83, 0x02, 0x09, 0xff, 0x50, 0x11, 0xc5, 0x82, 0x29, 0xf8, 0x08, 0xe5, 
+0xf0, 0x26, 0xf6, 0x18, 0xf5, 0xf0, 0xe5, 0x82, 0x36, 0xf6, 0x22, 0xbb, 0xfe, 0x11, 0xc5, 0x82, 
+0x29, 0xf8, 0x08, 0xe2, 0x25, 0xf0, 0xf5, 0xf0, 0xf2, 0x18, 0xe2, 0x35, 0x82, 0xf2, 0x22, 0xf8, 
+0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 0x74, 0x01, 0x93, 0x25, 0xf0, 0xf5, 
+0xf0, 0xe4, 0x93, 0x38, 0x22, 0xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xe5, 0xf0, 0xa3, 
+0xf0, 0x22, 0x50, 0x06, 0xf7, 0x09, 0xa7, 0xf0, 0x19, 0x22, 0xbb, 0xfe, 0x06, 0xf3, 0xe5, 0xf0, 
+0x09, 0xf3, 0x19, 0x22, 0xf8, 0xbb, 0x01, 0x11, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 
+0xf5, 0x83, 0xe8, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 
+0x08, 0xa6, 0xf0, 0x22, 0xbb, 0xfe, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0xe5, 0xf0, 0x08, 0xf2, 
+0x22, 0xe8, 0x8f, 0xf0, 0xa4, 0xcc, 0x8b, 0xf0, 0xa4, 0x2c, 0xfc, 0xe9, 0x8e, 0xf0, 0xa4, 0x2c, 
+0xfc, 0x8a, 0xf0, 0xed, 0xa4, 0x2c, 0xfc, 0xea, 0x8e, 0xf0, 0xa4, 0xcd, 0xa8, 0xf0, 0x8b, 0xf0, 
+0xa4, 0x2d, 0xcc, 0x38, 0x25, 0xf0, 0xfd, 0xe9, 0x8f, 0xf0, 0xa4, 0x2c, 0xcd, 0x35, 0xf0, 0xfc, 
+0xeb, 0x8e, 0xf0, 0xa4, 0xfe, 0xa9, 0xf0, 0xeb, 0x8f, 0xf0, 0xa4, 0xcf, 0xc5, 0xf0, 0x2e, 0xcd, 
+0x39, 0xfe, 0xe4, 0x3c, 0xfc, 0xea, 0xa4, 0x2d, 0xce, 0x35, 0xf0, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, 
+0x75, 0xf0, 0x08, 0x75, 0x82, 0x00, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xcd, 0x33, 0xcd, 0xcc, 
+0x33, 0xcc, 0xc5, 0x82, 0x33, 0xc5, 0x82, 0x9b, 0xed, 0x9a, 0xec, 0x99, 0xe5, 0x82, 0x98, 0x40, 
+0x0c, 0xf5, 0x82, 0xee, 0x9b, 0xfe, 0xed, 0x9a, 0xfd, 0xec, 0x99, 0xfc, 0x0f, 0xd5, 0xf0, 0xd6, 
+0xe4, 0xce, 0xfb, 0xe4, 0xcd, 0xfa, 0xe4, 0xcc, 0xf9, 0xa8, 0x82, 0x22, 0xb8, 0x00, 0xc1, 0xb9, 
+0x00, 0x59, 0xba, 0x00, 0x2d, 0xec, 0x8b, 0xf0, 0x84, 0xcf, 0xce, 0xcd, 0xfc, 0xe5, 0xf0, 0xcb, 
+0xf9, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xeb, 
+0x33, 0xfb, 0x10, 0xd7, 0x03, 0x99, 0x40, 0x04, 0xeb, 0x99, 0xfb, 0x0f, 0xd8, 0xe5, 0xe4, 0xf9, 
+0xfa, 0x22, 0x78, 0x18, 0xef, 0x2f, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 
+0xc9, 0x33, 0xc9, 0x10, 0xd7, 0x05, 0x9b, 0xe9, 0x9a, 0x40, 0x07, 0xec, 0x9b, 0xfc, 0xe9, 0x9a, 
+0xf9, 0x0f, 0xd8, 0xe0, 0xe4, 0xc9, 0xfa, 0xe4, 0xcc, 0xfb, 0x22, 0x75, 0xf0, 0x10, 0xef, 0x2f, 
+0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xcc, 0x33, 0xcc, 0xc8, 0x33, 0xc8, 0x10, 0xd7, 0x07, 
+0x9b, 0xec, 0x9a, 0xe8, 0x99, 0x40, 0x0a, 0xed, 0x9b, 0xfd, 0xec, 0x9a, 0xfc, 0xe8, 0x99, 0xf8, 
+0x0f, 0xd5, 0xf0, 0xda, 0xe4, 0xcd, 0xfb, 0xe4, 0xcc, 0xfa, 0xe4, 0xc8, 0xf9, 0x22, 0xeb, 0x9f, 
+0xf5, 0xf0, 0xea, 0x9e, 0x42, 0xf0, 0xe9, 0x9d, 0x42, 0xf0, 0xe8, 0x9c, 0x45, 0xf0, 0x22, 0xe8, 
+0x60, 0x0f, 0xef, 0xc3, 0x33, 0xff, 0xee, 0x33, 0xfe, 0xed, 0x33, 0xfd, 0xec, 0x33, 0xfc, 0xd8, 
+0xf1, 0x22, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x22, 0xe4, 0x93, 
+0xfc, 0x74, 0x01, 0x93, 0xfd, 0x74, 0x02, 0x93, 0xfe, 0x74, 0x03, 0x93, 0xff, 0x22, 0xe6, 0xfb, 
+0x08, 0xe6, 0xf9, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xcb, 0xf8, 0x22, 0xec, 0xf6, 0x08, 0xed, 0xf6, 
+0x08, 0xee, 0xf6, 0x08, 0xef, 0xf6, 0x22, 0xd0, 0x83, 0xd0, 0x82, 0xe4, 0x93, 0xf6, 0x08, 0x74, 
+0x01, 0x93, 0xf6, 0x08, 0x74, 0x02, 0x93, 0xf6, 0x08, 0x74, 0x03, 0x93, 0xf6, 0x74, 0x04, 0x73, 
+0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0x22, 0xec, 0x8e, 0xf0, 0xa4, 
+0xcc, 0xc5, 0xf0, 0xcc, 0xcd, 0xf8, 0xef, 0xa4, 0xce, 0xc5, 0xf0, 0x2d, 0xfd, 0xe4, 0x3c, 0xfc, 
+0xe8, 0xa4, 0x2e, 0xc8, 0xc5, 0xf0, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0xef, 0xa4, 0xff, 0xe5, 0xf0, 
+0x28, 0xfe, 0xe4, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, 0xef, 0x4e, 0x60, 0x12, 0xef, 0x60, 0x01, 
+0x0e, 0xed, 0xbb, 0x01, 0x0b, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 0xfa, 0x22, 
+0x89, 0xf0, 0x50, 0x07, 0xf7, 0x09, 0xdf, 0xfc, 0xa9, 0xf0, 0x22, 0xbb, 0xfe, 0xfc, 0xf3, 0x09, 
+0xdf, 0xfc, 0xa9, 0xf0, 0x22, 0xe4, 0xf5, 0x23, 0xe5, 0x1e, 0x60, 0x07, 0xe5, 0x1f, 0x70, 0x03, 
+0x02, 0x0f, 0x70, 0xe5, 0x1f, 0x60, 0x07, 0xe5, 0x1e, 0x70, 0x03, 0x02, 0x0f, 0x70, 0xe5, 0x1e, 
+0x70, 0x03, 0x02, 0x0e, 0xd8, 0xe5, 0x1f, 0x70, 0x03, 0x02, 0x0e, 0xd8, 0xe5, 0x20, 0xd3, 0x94, 
+0x01, 0x40, 0x0a, 0x78, 0xa2, 0xe6, 0x94, 0x64, 0x50, 0x0c, 0x06, 0x80, 0x09, 0x78, 0xa1, 0xe6, 
+0xc3, 0x94, 0x64, 0x50, 0x01, 0x06, 0x78, 0x9e, 0xe6, 0x65, 0x20, 0x60, 0x12, 0xe4, 0x78, 0x9c, 
+0xf6, 0x78, 0x92, 0x12, 0x27, 0x98, 0x78, 0x90, 0xf6, 0x08, 0xf6, 0x78, 0x9e, 0xa6, 0x20, 0x78, 
+0x90, 0xe6, 0xff, 0x60, 0x13, 0xe5, 0x1e, 0x12, 0x0f, 0x82, 0x50, 0x0c, 0x78, 0x90, 0xe6, 0xff, 
+0xc3, 0xe5, 0x1e, 0x78, 0x93, 0x12, 0x27, 0xb4, 0x78, 0x90, 0xa6, 0x1e, 0x08, 0xe6, 0xff, 0x60, 
+0x13, 0xe5, 0x1f, 0x12, 0x0f, 0x82, 0x50, 0x0c, 0x78, 0x91, 0xe6, 0xff, 0xc3, 0xe5, 0x1f, 0x78, 
+0x95, 0x12, 0x27, 0xb4, 0x78, 0x91, 0xa6, 0x1f, 0x78, 0x96, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x12, 
+0x2b, 0x6f, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x0f, 0x77, 0xd0, 0x05, 0xd0, 0x04, 0x12, 0x27, 0xd7, 
+0x40, 0x04, 0x78, 0x92, 0x80, 0x02, 0x78, 0x96, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x78, 0x96, 0xa6, 
+0x06, 0x08, 0xa6, 0x07, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x12, 0x2b, 0x6f, 0xc0, 0x06, 0xc0, 
+0x07, 0x12, 0x0f, 0xa4, 0xd0, 0x05, 0xd0, 0x04, 0x12, 0x27, 0xd7, 0x40, 0x04, 0x78, 0x94, 0x80, 
+0x02, 0x78, 0x98, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x78, 0x98, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0xe4, 
+0x78, 0x9d, 0xf6, 0x78, 0xa3, 0xe6, 0x54, 0x3c, 0x60, 0x79, 0x12, 0x0f, 0x77, 0x12, 0x27, 0xee, 
+0x50, 0x08, 0x12, 0x0f, 0xa4, 0x12, 0x27, 0xee, 0x40, 0x69, 0x78, 0x90, 0xe6, 0x78, 0x94, 0x60, 
+0x0f, 0x12, 0x27, 0xcb, 0x78, 0x92, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x12, 0x09, 0xc9, 0x80, 0x03, 
+0x12, 0x27, 0xcb, 0x8e, 0x24, 0x8f, 0x25, 0xaf, 0x25, 0xae, 0x24, 0x12, 0x2b, 0x6f, 0xd3, 0xef, 
+0x95, 0x21, 0x74, 0x80, 0xf8, 0x6e, 0x98, 0x40, 0x1c, 0x78, 0xa3, 0xe6, 0x54, 0x0c, 0x60, 0x33, 
+0x78, 0x95, 0x12, 0x27, 0xe3, 0x7f, 0x02, 0x40, 0x02, 0x7f, 0x01, 0x12, 0x27, 0xa0, 0x30, 0xe1, 
+0x02, 0x7f, 0x0c, 0x80, 0x1a, 0x78, 0xa3, 0xe6, 0x54, 0x30, 0x60, 0x17, 0x78, 0x93, 0x12, 0x27, 
+0xe3, 0x7f, 0x03, 0x40, 0x02, 0x7f, 0x04, 0x12, 0x27, 0xa0, 0x30, 0xe2, 0x02, 0x7f, 0x30, 0x78, 
+0xa3, 0xa6, 0x07, 0x78, 0xa3, 0xe6, 0x30, 0xe1, 0x52, 0x90, 0x01, 0x9b, 0xe0, 0x60, 0x4c, 0x78, 
+0x92, 0x12, 0x0f, 0xaf, 0x50, 0x45, 0x78, 0x94, 0x12, 0x0f, 0xaf, 0x50, 0x3e, 0xe5, 0x20, 0x64, 
+0x01, 0x70, 0x18, 0x12, 0x27, 0xc2, 0x9f, 0x40, 0x12, 0x75, 0x23, 0x0c, 0x90, 0x01, 0xaa, 0xe0, 
+0x7f, 0x02, 0x30, 0xe0, 0x02, 0x7f, 0x00, 0x78, 0xa3, 0xa6, 0x07, 0xe5, 0x20, 0xd3, 0x94, 0x01, 
+0x40, 0x19, 0x12, 0x27, 0xc2, 0xd3, 0x9f, 0x40, 0x12, 0x75, 0x23, 0x1c, 0x90, 0x01, 0xaa, 0xe0, 
+0x7f, 0x02, 0x30, 0xe0, 0x02, 0x7f, 0x00, 0x78, 0xa3, 0xa6, 0x07, 0x78, 0x9c, 0xe6, 0x60, 0x03, 
+0x02, 0x0f, 0x70, 0x76, 0x01, 0x02, 0x0f, 0x70, 0x78, 0x9c, 0xe6, 0xff, 0x60, 0x4c, 0x78, 0xa3, 
+0xe6, 0x30, 0xe0, 0x22, 0xef, 0xd3, 0x94, 0x01, 0x40, 0x1c, 0x12, 0x27, 0xc2, 0x9f, 0x50, 0x16, 
+0x79, 0xa1, 0xe7, 0x78, 0xa2, 0x96, 0x40, 0x08, 0xe4, 0x78, 0xa0, 0xf6, 0x18, 0x06, 0x80, 0x06, 
+0xe4, 0x78, 0x9f, 0xf6, 0x08, 0x06, 0xe4, 0x78, 0x90, 0x12, 0x27, 0x98, 0x08, 0x12, 0x27, 0x98, 
+0x08, 0xf6, 0x08, 0xf6, 0x78, 0x9c, 0xf6, 0x78, 0xa1, 0xf6, 0x08, 0xf6, 0x78, 0x9e, 0xf6, 0x18, 
+0x76, 0x01, 0x78, 0xa3, 0xe6, 0x44, 0x3e, 0xf6, 0x80, 0x46, 0x90, 0x01, 0x9c, 0xe0, 0x7f, 0x01, 
+0x30, 0xe0, 0x02, 0x7f, 0x14, 0x78, 0x9d, 0xe6, 0xfe, 0xd3, 0x9f, 0x40, 0x33, 0xee, 0x94, 0x1e, 
+0x50, 0x2e, 0x78, 0xa3, 0xe6, 0x30, 0xe0, 0x1e, 0x78, 0x9f, 0xe6, 0xff, 0xb4, 0x01, 0x05, 0x75, 
+0x23, 0x05, 0x80, 0x12, 0xef, 0xb4, 0x02, 0x05, 0x75, 0x23, 0x0b, 0x80, 0x09, 0x78, 0xa0, 0xe6, 
+0xb4, 0x01, 0x03, 0x75, 0x23, 0x15, 0x78, 0xa3, 0x76, 0xff, 0xe4, 0x78, 0x9f, 0xf6, 0x08, 0xf6, 
+0x78, 0xa4, 0xa6, 0x23, 0xaf, 0x23, 0x22, 0x78, 0x92, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x12, 0x2b, 
+0x6f, 0x22, 0xc3, 0x9f, 0xff, 0xe4, 0x94, 0x00, 0xfe, 0x12, 0x2b, 0x6f, 0xac, 0x06, 0xad, 0x07, 
+0xe5, 0x22, 0x75, 0xf0, 0x04, 0xa4, 0xff, 0xc3, 0xed, 0x9f, 0xe5, 0xf0, 0x64, 0x80, 0xf8, 0xec, 
+0x64, 0x80, 0x98, 0x22, 0x78, 0x94, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x12, 0x2b, 0x6f, 0x22, 0xe6, 
+0xfe, 0x08, 0xe6, 0xff, 0x12, 0x2b, 0x6f, 0xc3, 0xef, 0x95, 0x22, 0x74, 0x80, 0xf8, 0x6e, 0x98, 
+0x22, 0xef, 0x12, 0x12, 0xc2, 0xe0, 0xf5, 0x2f, 0x12, 0x12, 0x89, 0xe4, 0x93, 0xfd, 0x7c, 0x00, 
+0x74, 0x03, 0x93, 0xfe, 0x74, 0x04, 0x93, 0xff, 0x12, 0x09, 0x74, 0x8e, 0x30, 0x8f, 0x31, 0xe5, 
+0x2f, 0x70, 0x58, 0x75, 0x22, 0x01, 0x12, 0x13, 0x04, 0xe4, 0xf5, 0x27, 0xf5, 0x28, 0x78, 0x02, 
+0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x01, 0x12, 0x13, 0x49, 0x78, 0x06, 0xe2, 0xfe, 0x08, 0xe2, 
+0xff, 0x78, 0x05, 0x12, 0x13, 0xcd, 0x74, 0x09, 0x93, 0xfc, 0x74, 0x0a, 0x93, 0xfd, 0xc3, 0xec, 
+0x94, 0x00, 0x50, 0x05, 0x12, 0x14, 0x3a, 0x80, 0x04, 0xae, 0x25, 0xaf, 0x26, 0x12, 0x12, 0xd0, 
+0x40, 0x06, 0xae, 0x29, 0xaf, 0x2a, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x01, 0x8e, 0x25, 0x8f, 0x26, 
+0x78, 0x0a, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x09, 0x80, 0x62, 0x78, 0xaa, 0xe6, 0x14, 0x65, 
+0x2f, 0x70, 0x6a, 0xf5, 0x22, 0x12, 0x13, 0x04, 0x12, 0x12, 0x89, 0x74, 0x03, 0x93, 0xf5, 0x27, 
+0x74, 0x04, 0x93, 0xf5, 0x28, 0x12, 0x12, 0x90, 0x12, 0x13, 0x46, 0x12, 0x12, 0x9e, 0x24, 0xfe, 
+0x12, 0x12, 0x98, 0x24, 0xfd, 0x12, 0x13, 0xcc, 0x74, 0x0b, 0x93, 0xfc, 0x74, 0x0c, 0x93, 0xfd, 
+0xc3, 0xec, 0x94, 0x00, 0x50, 0x05, 0x12, 0x14, 0x3a, 0x80, 0x04, 0xae, 0x25, 0xaf, 0x26, 0x12, 
+0x12, 0xd0, 0x40, 0x06, 0xae, 0x29, 0xaf, 0x2a, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x01, 0x8e, 0x25, 
+0x8f, 0x26, 0x12, 0x12, 0x9e, 0x24, 0xfa, 0x12, 0x12, 0x98, 0x24, 0xf9, 0xf8, 0x12, 0x13, 0x15, 
+0xfe, 0xe4, 0x8f, 0x2e, 0x8e, 0x2d, 0xf5, 0x2c, 0xf5, 0x2b, 0x02, 0x11, 0x5d, 0x12, 0x13, 0x9e, 
+0xac, 0x06, 0xad, 0x07, 0xe5, 0x30, 0xc3, 0x13, 0xfe, 0xe5, 0x31, 0x13, 0x2d, 0xf5, 0x28, 0xec, 
+0x3e, 0xf5, 0x27, 0x12, 0x12, 0x9e, 0x24, 0xfe, 0x12, 0x12, 0x98, 0x24, 0xfd, 0x12, 0x13, 0x48, 
+0x12, 0x12, 0x9e, 0x24, 0x06, 0x12, 0x12, 0x98, 0x24, 0x05, 0x12, 0x13, 0xcc, 0xd3, 0xe5, 0x24, 
+0x95, 0x26, 0xe5, 0x23, 0x95, 0x25, 0x40, 0x38, 0xe5, 0x2f, 0xb4, 0x01, 0x25, 0xe5, 0x31, 0xae, 
+0x30, 0x78, 0x02, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0x7c, 0x00, 0x7d, 0x05, 0x12, 
+0x09, 0x74, 0xaa, 0x06, 0xab, 0x07, 0x12, 0x13, 0x9e, 0xef, 0x2b, 0xf5, 0x28, 0xee, 0x3a, 0x12, 
+0x13, 0x02, 0xe4, 0xf5, 0x22, 0x12, 0x14, 0x59, 0x85, 0x23, 0x25, 0x85, 0x24, 0x26, 0x80, 0x37, 
+0x78, 0xaa, 0xe6, 0x24, 0xfe, 0xb5, 0x2f, 0x1b, 0x12, 0x13, 0x9e, 0xaa, 0x06, 0xab, 0x07, 0xae, 
+0x30, 0xaf, 0x31, 0x7c, 0x00, 0x7d, 0x05, 0x12, 0x09, 0x74, 0xeb, 0x2f, 0xf5, 0x28, 0xea, 0x3e, 
+0x12, 0x13, 0x02, 0x75, 0x22, 0x01, 0xe4, 0x85, 0x24, 0x2e, 0x85, 0x23, 0x2d, 0xf5, 0x2c, 0xf5, 
+0x2b, 0x85, 0x25, 0x25, 0x85, 0x26, 0x26, 0x12, 0x12, 0x90, 0x12, 0x13, 0x46, 0xae, 0x23, 0xaf, 
+0x24, 0xe4, 0xfc, 0xfd, 0xab, 0x2e, 0xaa, 0x2d, 0xa9, 0x2c, 0xa8, 0x2b, 0xc3, 0x12, 0x0c, 0x2e, 
+0x50, 0x29, 0xae, 0x25, 0xaf, 0x26, 0xe4, 0xfc, 0xfd, 0xa8, 0x2b, 0xc3, 0x12, 0x0c, 0x2e, 0x50, 
+0x1a, 0xae, 0x2d, 0xaf, 0x2e, 0xc3, 0xe5, 0x24, 0x9f, 0xf5, 0x24, 0xe5, 0x23, 0x9e, 0xf5, 0x23, 
+0xc3, 0xe5, 0x26, 0x9f, 0xf5, 0x26, 0xe5, 0x25, 0x9e, 0xf5, 0x25, 0xe4, 0x12, 0x14, 0x59, 0x7f, 
+0x80, 0xfe, 0xfd, 0xfc, 0xab, 0x2e, 0xaa, 0x2d, 0xa9, 0x2c, 0xa8, 0x2b, 0x12, 0x13, 0x6b, 0xae, 
+0x30, 0xaf, 0x31, 0x12, 0x13, 0xc6, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x24, 0x25, 0x26, 0xff, 0xe5, 
+0x23, 0x35, 0x25, 0xab, 0x07, 0xfa, 0xe4, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0b, 0x9c, 
+0xef, 0x24, 0x40, 0xff, 0xe4, 0x3e, 0xfe, 0xe4, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0xe4, 0x7b, 0x80, 
+0xfa, 0xf9, 0xf8, 0x12, 0x0b, 0x9c, 0x8f, 0x2e, 0x8e, 0x2d, 0x8d, 0x2c, 0x8c, 0x2b, 0xe5, 0x22, 
+0x60, 0x1b, 0xe4, 0xfc, 0xfd, 0xe5, 0x2e, 0x25, 0x28, 0xf5, 0x2e, 0xe5, 0x2d, 0x35, 0x27, 0xf5, 
+0x2d, 0xed, 0x35, 0x2c, 0xf5, 0x2c, 0xec, 0x35, 0x2b, 0xf5, 0x2b, 0x80, 0x17, 0xc3, 0xe5, 0x28, 
+0x95, 0x2e, 0xf5, 0x2e, 0xe5, 0x27, 0x95, 0x2d, 0xf5, 0x2d, 0xe4, 0x95, 0x2c, 0xf5, 0x2c, 0xe4, 
+0x95, 0x2b, 0xf5, 0x2b, 0xae, 0x2d, 0xaf, 0x2e, 0x22, 0xf5, 0x82, 0xe4, 0x35, 0x08, 0xf5, 0x83, 
+0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x85, 0x09, 0x82, 0x85, 0x08, 0x83, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 
+0xff, 0xe5, 0x09, 0x24, 0x21, 0xf5, 0x82, 0xe4, 0x35, 0x08, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, 
+0xf0, 0x85, 0x09, 0x82, 0x85, 0x08, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 
+0x09, 0x24, 0x23, 0xf5, 0x82, 0xe4, 0x35, 0x08, 0xf5, 0x83, 0x22, 0xee, 0xf0, 0xef, 0xa3, 0xf0, 
+0x85, 0x09, 0x82, 0x85, 0x08, 0x83, 0xa3, 0x22, 0xe4, 0x7b, 0x0a, 0xfa, 0xf9, 0xf8, 0x12, 0x0b, 
+0x9c, 0xa8, 0x04, 0xa9, 0x05, 0xaa, 0x06, 0xab, 0x07, 0x85, 0x0b, 0x82, 0x85, 0x0a, 0x83, 0x22, 
+0xe5, 0x2f, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x02, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0xe5, 0x2f, 
+0x25, 0xe0, 0x25, 0xe0, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xbf, 0xf5, 0x82, 0xe4, 
+0x34, 0x02, 0xf5, 0x83, 0xe5, 0x82, 0x25, 0x45, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0x22, 
+0xe5, 0x21, 0x75, 0xf0, 0x27, 0xa4, 0x24, 0x69, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 
+0x8e, 0x29, 0x8f, 0x2a, 0x12, 0x09, 0x62, 0x7c, 0x00, 0x7d, 0x32, 0x12, 0x09, 0x74, 0xef, 0x25, 
+0x26, 0xf5, 0x2a, 0xee, 0x35, 0x25, 0xf5, 0x29, 0xd3, 0xe5, 0x2a, 0x94, 0x00, 0xe5, 0x29, 0x64, 
+0x80, 0x94, 0x80, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xd3, 0xf5, 0x82, 0xe4, 0x34, 
+0x02, 0x22, 0xf5, 0x27, 0xe5, 0x31, 0x25, 0x31, 0xf5, 0x31, 0xe5, 0x30, 0x33, 0xf5, 0x30, 0x22, 
+0x25, 0xe0, 0x24, 0x01, 0xf8, 0xe2, 0x2f, 0xff, 0x18, 0xe2, 0x3e, 0x22, 0x74, 0x01, 0x93, 0xfe, 
+0x74, 0x02, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0x02, 0x0c, 0x6e, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 
+0xff, 0xe5, 0x09, 0x22, 0x13, 0xff, 0xe4, 0xfc, 0xfd, 0xeb, 0x2f, 0xff, 0xea, 0x3e, 0xfe, 0xed, 
+0x39, 0xfd, 0xec, 0x38, 0xfc, 0x22, 0x24, 0x01, 0xf8, 0xe2, 0x2f, 0xf5, 0x24, 0x18, 0xe2, 0x3e, 
+0xf5, 0x23, 0x22, 0x90, 0x02, 0x8c, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x22, 0x33, 0x95, 0xe0, 
+0xfd, 0xfc, 0xab, 0x36, 0xaa, 0x35, 0xa9, 0x34, 0xa8, 0x33, 0x22, 0x12, 0x0b, 0x11, 0xa8, 0x04, 
+0xa9, 0x05, 0xaa, 0x06, 0xab, 0x07, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x7c, 0x00, 0x7d, 0x03, 
+0x02, 0x09, 0x62, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0x12, 0x0c, 0x6e, 0x12, 0x0b, 0x11, 0xe4, 0x7b, 
+0x02, 0xfa, 0xf9, 0xf8, 0x22, 0x7b, 0x01, 0x7e, 0x00, 0x7f, 0x07, 0x02, 0x08, 0xc2, 0xaf, 0x2f, 
+0x7e, 0x00, 0xac, 0x30, 0xad, 0x31, 0x02, 0x09, 0x62, 0x3e, 0xf5, 0x25, 0xd3, 0xe5, 0x24, 0x95, 
+0x26, 0xe5, 0x23, 0x95, 0x25, 0x22, 0x7e, 0x00, 0x7f, 0x06, 0x7d, 0x00, 0x7b, 0x01, 0x02, 0x0c, 
+0xd9, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe4, 0xfc, 0xfd, 0x02, 0x0b, 0x11, 0xf8, 0xe2, 0x2f, 0xf5, 
+0x26, 0x18, 0xe2, 0x3e, 0xf5, 0x25, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xbf, 0xf5, 
+0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xc3, 0x9f, 0x22, 
+0x78, 0x6e, 0xfe, 0xe4, 0xfc, 0xfd, 0x02, 0x0c, 0x7b, 0xf0, 0xe5, 0x21, 0x75, 0xf0, 0x27, 0xa4, 
+0x22, 0xce, 0xa2, 0xe7, 0x13, 0xce, 0x13, 0x22, 0xe0, 0xfc, 0xa3, 0xe0, 0x2f, 0xff, 0xee, 0x3c, 
+0xfe, 0xef, 0x78, 0x02, 0x22, 0xe5, 0x82, 0x2d, 0xf5, 0x82, 0xe5, 0x83, 0x3c, 0xf5, 0x83, 0xef, 
+0xf0, 0x22, 0x78, 0x72, 0x12, 0x0c, 0x52, 0x78, 0x6e, 0x12, 0x0c, 0x6e, 0xeb, 0x2f, 0x22, 0x74, 
+0x1a, 0x93, 0xff, 0xe4, 0xfc, 0xfd, 0xfe, 0x02, 0x0b, 0x11, 0xc3, 0xe5, 0x24, 0x95, 0x26, 0xff, 
+0xe5, 0x23, 0x95, 0x25, 0xfe, 0x22, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0xe5, 0x09, 0x22, 0x74, 0x24, 
+0x25, 0x23, 0xf8, 0xa6, 0x06, 0x78, 0x74, 0xe6, 0x22, 0x85, 0x26, 0x2e, 0x85, 0x25, 0x2d, 0xf5, 
+0x2c, 0xf5, 0x2b, 0x22, 0xab, 0x4a, 0xaa, 0x4b, 0xa9, 0x4c, 0x02, 0x0a, 0x15, 0xf8, 0xe2, 0xfe, 
+0x08, 0xe2, 0xff, 0x22, 0x90, 0x02, 0x6e, 0xe0, 0x60, 0x0e, 0x90, 0x02, 0x95, 0xe0, 0x7f, 0x01, 
+0x60, 0x02, 0x7f, 0x02, 0x8f, 0x27, 0x80, 0x0c, 0x90, 0x02, 0x95, 0xe0, 0x7f, 0x00, 0x60, 0x02, 
+0x7f, 0x01, 0x8f, 0x27, 0x90, 0x02, 0x8e, 0xe0, 0xff, 0x60, 0x0e, 0x90, 0x02, 0xb5, 0xe0, 0x7e, 
+0x01, 0x60, 0x02, 0x7e, 0x02, 0x8e, 0x28, 0x80, 0x0c, 0x90, 0x02, 0xb5, 0xe0, 0x7e, 0x00, 0x60, 
+0x02, 0x7e, 0x01, 0x8e, 0x28, 0xe4, 0xf5, 0x22, 0xe5, 0x27, 0x64, 0x01, 0x70, 0x54, 0xe5, 0x28, 
+0x70, 0x03, 0x02, 0x15, 0xe2, 0xe5, 0x28, 0xb4, 0x01, 0x12, 0xef, 0x60, 0x03, 0x02, 0x15, 0xe2, 
+0x90, 0x02, 0xb5, 0xe0, 0x70, 0x03, 0x02, 0x15, 0xe2, 0x02, 0x15, 0xdf, 0xe5, 0x28, 0x64, 0x02, 
+0x60, 0x03, 0x02, 0x15, 0xe2, 0x12, 0x16, 0x77, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x16, 0x10, 0xd0, 
+0xe0, 0x2f, 0xf5, 0x24, 0xd0, 0xe0, 0x12, 0x16, 0x29, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x16, 0x45, 
+0xd0, 0xe0, 0x2f, 0xf5, 0x26, 0xd0, 0xe0, 0x12, 0x13, 0xa9, 0x50, 0x03, 0x02, 0x15, 0xe2, 0x02, 
+0x15, 0xdf, 0xe5, 0x27, 0x64, 0x02, 0x60, 0x03, 0x02, 0x15, 0xe2, 0xe5, 0x28, 0x70, 0x03, 0x02, 
+0x15, 0xe2, 0xe5, 0x28, 0x64, 0x01, 0x70, 0x73, 0x90, 0x02, 0x8e, 0xe0, 0x60, 0x2c, 0x12, 0x16, 
+0x77, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x16, 0x10, 0xd0, 0xe0, 0x2f, 0xf5, 0x24, 0xd0, 0xe0, 0x3e, 
+0xf5, 0x23, 0x90, 0x02, 0x8a, 0x12, 0x16, 0x90, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x13, 0x53, 0x90, 
+0x02, 0x94, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x93, 0x80, 0x2a, 0x90, 0x02, 0xb1, 0x12, 0x16, 0x90, 
+0xc0, 0x06, 0xc0, 0x07, 0x12, 0x16, 0x5e, 0xd0, 0xe0, 0x2f, 0xf5, 0x24, 0xd0, 0xe0, 0x12, 0x16, 
+0x29, 0xc0, 0x06, 0xc0, 0x07, 0x90, 0x02, 0xb3, 0x12, 0x13, 0x56, 0x90, 0x02, 0x6d, 0xe0, 0x9f, 
+0xff, 0x90, 0x02, 0x6c, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0xd0, 0xe0, 0x2f, 0xf5, 0x26, 0xd0, 
+0xe0, 0x3e, 0xf5, 0x25, 0x12, 0x13, 0xac, 0x40, 0x49, 0x80, 0x44, 0xe5, 0x28, 0x64, 0x02, 0x70, 
+0x41, 0x12, 0x16, 0x5e, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x13, 0x53, 0x90, 0x02, 0x6d, 0xe0, 0x90, 
+0x02, 0x6c, 0x12, 0x16, 0xa6, 0xd0, 0xe0, 0x2f, 0xf5, 0x24, 0xd0, 0xe0, 0x3e, 0xf5, 0x23, 0x12, 
+0x13, 0x53, 0x90, 0x02, 0x94, 0xe0, 0x90, 0x02, 0x93, 0x12, 0x16, 0xa6, 0xc0, 0x06, 0xc0, 0x07, 
+0x12, 0x16, 0x45, 0xd0, 0xe0, 0x2f, 0xf5, 0x26, 0xd0, 0xe0, 0x12, 0x13, 0xa9, 0x40, 0x03, 0x75, 
+0x22, 0x01, 0xe5, 0x22, 0x60, 0x29, 0x78, 0x6e, 0x7c, 0x00, 0x7d, 0x00, 0x7a, 0x02, 0x79, 0x69, 
+0x12, 0x13, 0x95, 0x78, 0x69, 0x7c, 0x02, 0x7d, 0x01, 0x7a, 0x02, 0x79, 0x90, 0x12, 0x13, 0x95, 
+0x78, 0x90, 0x7c, 0x02, 0x7d, 0x01, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x6e, 0x12, 0x13, 0x97, 0x22, 
+0x90, 0x02, 0x8c, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, 0x6d, 0xe0, 0x9f, 0xff, 0x90, 
+0x02, 0x6c, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x3e, 0xf5, 0x23, 0x90, 0x02, 0xb1, 0xe0, 
+0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, 0x6b, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x6a, 0xe0, 0x9e, 
+0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x90, 0x02, 0xb3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, 
+0x6d, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x6c, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x90, 0x02, 
+0xb3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, 0x94, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x93, 
+0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x90, 0x02, 0x8a, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 
+0x90, 0x02, 0x6b, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x6a, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 
+0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x90, 0x02, 0x92, 0xe0, 0x9f, 0xff, 0x90, 0x02, 0x91, 0xe0, 
+0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x9f, 0xff, 0xe0, 0x9e, 0xfe, 0x12, 0x2b, 0x6f, 0x22, 0x15, 
+0x0f, 0x15, 0x0f, 0x12, 0x25, 0x8a, 0x78, 0x8c, 0xe6, 0xa8, 0x0f, 0xf6, 0x78, 0x8a, 0xe6, 0x60, 
+0x33, 0xa8, 0x0f, 0x08, 0xe4, 0xf6, 0xa8, 0x0f, 0x08, 0xe6, 0xff, 0xc3, 0x78, 0x8f, 0x96, 0x50, 
+0x58, 0x12, 0x24, 0x95, 0xa8, 0x0f, 0xe6, 0xfd, 0x12, 0x27, 0xf8, 0xa8, 0x0f, 0x08, 0x12, 0x24, 
+0x93, 0xa8, 0x0f, 0xe6, 0x7d, 0x01, 0xb4, 0x08, 0x02, 0x7d, 0x00, 0x12, 0x29, 0xd6, 0xa8, 0x0f, 
+0x08, 0x06, 0x80, 0xd2, 0x78, 0x7d, 0x12, 0x24, 0x93, 0xa8, 0x0f, 0xe6, 0xfd, 0x12, 0x27, 0xf8, 
+0x78, 0x7d, 0x12, 0x24, 0x93, 0xa8, 0x0f, 0xe6, 0x7d, 0x01, 0xb4, 0x08, 0x02, 0x7d, 0x00, 0x12, 
+0x29, 0xd6, 0x12, 0x24, 0x91, 0xa8, 0x0f, 0xe6, 0xfd, 0x12, 0x24, 0x8e, 0xa8, 0x0f, 0xe6, 0x7d, 
+0x01, 0xb4, 0x08, 0x02, 0x7d, 0x00, 0x12, 0x29, 0xd6, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, 
+0xff, 0x78, 0x7d, 0xe6, 0xfd, 0x12, 0x24, 0xe0, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xff, 0x5a, 
+0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x18, 0xe6, 0x12, 0x24, 0xe0, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x74, 
+0x55, 0x2d, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x70, 0x79, 0x08, 0xe6, 0xff, 0x24, 
+0x55, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x74, 0x01, 0xf0, 0xef, 0x12, 0x24, 0xb8, 0xe0, 
+0xfe, 0xa3, 0xe0, 0xff, 0xe6, 0x12, 0x24, 0xe0, 0x12, 0x25, 0x74, 0x12, 0x2b, 0x6f, 0x90, 0x02, 
+0x51, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x78, 0x7c, 0xe6, 0xff, 0x12, 0x24, 0xb8, 0xe0, 0xfc, 0xa3, 
+0xe0, 0xfd, 0xef, 0x12, 0x24, 0xe0, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x9d, 0xff, 0xee, 0x9c, 0xfe, 
+0x12, 0x2b, 0x6f, 0x90, 0x02, 0x53, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x24, 0xee, 0x74, 0x07, 
+0x93, 0xfe, 0x74, 0x08, 0x93, 0xff, 0xc3, 0x90, 0x02, 0x52, 0xe0, 0x9f, 0x90, 0x02, 0x51, 0xe0, 
+0x9e, 0x50, 0x61, 0xc3, 0x90, 0x02, 0x54, 0xe0, 0x9f, 0x90, 0x02, 0x53, 0xe0, 0x9e, 0x50, 0x54, 
+0x12, 0x25, 0x7f, 0x80, 0x4f, 0x12, 0x25, 0x7f, 0x12, 0x24, 0xee, 0x78, 0x7d, 0x12, 0x24, 0xae, 
+0x12, 0x24, 0xd6, 0x12, 0x25, 0x1d, 0x40, 0x16, 0xe6, 0x12, 0x24, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 
+0x90, 0x02, 0x51, 0x12, 0x25, 0x0e, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x24, 
+0xee, 0x78, 0x7c, 0x12, 0x24, 0xae, 0x12, 0x24, 0xd6, 0x12, 0x25, 0x1d, 0x40, 0x16, 0xe6, 0x12, 
+0x24, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0x90, 0x02, 0x53, 0x12, 0x25, 0x0e, 0xd0, 0x82, 0xd0, 0x83, 
+0xf0, 0xa3, 0xef, 0xf0, 0x78, 0x8d, 0xe6, 0x70, 0x0a, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, 
+0xf0, 0x80, 0x03, 0x12, 0x28, 0xa7, 0x05, 0x0f, 0x05, 0x0f, 0x22, 0x8b, 0x1e, 0x8a, 0x1f, 0x89, 
+0x20, 0x7e, 0x00, 0x7f, 0x0c, 0x7d, 0x00, 0x12, 0x0c, 0xd9, 0x7a, 0x02, 0x79, 0x6a, 0x12, 0x13, 
+0xb6, 0x7a, 0x02, 0x79, 0x91, 0x12, 0x13, 0xb6, 0x78, 0xae, 0xe6, 0x14, 0x60, 0x34, 0x04, 0x60, 
+0x03, 0x02, 0x19, 0xb1, 0xe4, 0x78, 0xad, 0xf6, 0xff, 0x12, 0x2b, 0x57, 0x12, 0x1d, 0xe7, 0x78, 
+0x30, 0xe2, 0x30, 0xe2, 0x09, 0x78, 0x89, 0xe6, 0x30, 0xe4, 0x03, 0x02, 0x19, 0xb5, 0x7e, 0x00, 
+0x7f, 0x4e, 0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0x69, 0x12, 0x0c, 0xd9, 0x78, 0xae, 0x76, 
+0x01, 0x22, 0x12, 0x1d, 0xe7, 0x78, 0x30, 0xe2, 0x30, 0xe2, 0x09, 0x78, 0x89, 0xe6, 0x30, 0xe4, 
+0x03, 0x02, 0x19, 0xb1, 0x78, 0x89, 0xe6, 0x20, 0xe3, 0x03, 0x02, 0x19, 0x4e, 0x12, 0x22, 0x5f, 
+0x78, 0xab, 0xe6, 0xff, 0x12, 0x27, 0x22, 0x78, 0xab, 0xa6, 0x07, 0x08, 0xe6, 0xff, 0x12, 0x27, 
+0x22, 0x78, 0xac, 0xa6, 0x07, 0x75, 0x25, 0xfe, 0x75, 0x26, 0x00, 0x75, 0x27, 0x00, 0x7b, 0x00, 
+0x7a, 0x00, 0x79, 0xab, 0x12, 0x33, 0xea, 0xe4, 0xf5, 0x21, 0x74, 0xab, 0x25, 0x21, 0xf8, 0xe6, 
+0xff, 0x12, 0x12, 0xc0, 0xef, 0xf0, 0x12, 0x12, 0xc0, 0xe0, 0xf4, 0x60, 0x49, 0xaf, 0x21, 0x12, 
+0x1c, 0x8e, 0x12, 0x13, 0xfa, 0x24, 0x6a, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xee, 0xf0, 
+0xa3, 0xef, 0xf0, 0xaf, 0x21, 0x12, 0x0f, 0xc1, 0x12, 0x13, 0xfa, 0x24, 0x6c, 0xf5, 0x82, 0xe4, 
+0x34, 0x02, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0x12, 0x13, 0xf9, 0x24, 0x6e, 0xf5, 0x82, 0xe4, 
+0x34, 0x02, 0xf5, 0x83, 0x74, 0x01, 0x12, 0x13, 0xf9, 0x24, 0x6a, 0xf9, 0x74, 0x02, 0x35, 0xf0, 
+0xfa, 0x7b, 0x01, 0x12, 0x00, 0x09, 0x05, 0x21, 0xe5, 0x21, 0xc3, 0x94, 0x02, 0x40, 0x9b, 0x12, 
+0x14, 0x74, 0x78, 0x89, 0xe6, 0x30, 0xe5, 0x15, 0x78, 0xad, 0x76, 0x01, 0x80, 0x0f, 0x90, 0x02, 
+0xb7, 0x74, 0xff, 0xf0, 0xe4, 0xa3, 0xf0, 0x90, 0x02, 0xbd, 0xf0, 0xa3, 0xf0, 0x75, 0x08, 0x02, 
+0x75, 0x09, 0x69, 0xe4, 0xf5, 0x21, 0xe5, 0x21, 0xc3, 0x94, 0x02, 0x50, 0x17, 0xaf, 0x21, 0x12, 
+0x00, 0x24, 0x12, 0x1f, 0x3e, 0x05, 0x21, 0x74, 0x27, 0x25, 0x09, 0xf5, 0x09, 0xe4, 0x35, 0x08, 
+0xf5, 0x08, 0x80, 0xe2, 0xa8, 0x20, 0xac, 0x1f, 0xad, 0x1e, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0x6a, 
+0x7e, 0x00, 0x7f, 0x06, 0x12, 0x08, 0xc2, 0xe5, 0x20, 0x24, 0x06, 0xf9, 0xe4, 0x35, 0x1f, 0xa8, 
+0x01, 0xfc, 0xad, 0x1e, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0x91, 0x7e, 0x00, 0x7f, 0x06, 0x02, 0x08, 
+0xc2, 0xe4, 0x78, 0xae, 0xf6, 0x22, 0x8b, 0x1e, 0x8a, 0x1f, 0x89, 0x20, 0x43, 0xad, 0x04, 0x90, 
+0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9, 0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x37, 0xf0, 0x90, 
+0xff, 0x49, 0x74, 0x0d, 0xf0, 0xe4, 0xf5, 0x27, 0xf5, 0x27, 0x12, 0x2a, 0x55, 0xe5, 0x27, 0xc3, 
+0x9f, 0x50, 0x22, 0xe9, 0x24, 0x0c, 0xf9, 0xe4, 0x3a, 0x12, 0x2a, 0x46, 0xe4, 0xfd, 0x12, 0x2a, 
+0x0a, 0x12, 0x2a, 0x3c, 0x7d, 0x08, 0x12, 0x28, 0x53, 0x12, 0x2a, 0x3c, 0xe4, 0xfd, 0x12, 0x29, 
+0xd6, 0x05, 0x27, 0x80, 0xd5, 0xe4, 0x90, 0xff, 0x4a, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 
+0xe4, 0x90, 0xff, 0x58, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x08, 0xf0, 0x90, 0xff, 0x43, 0x74, 0x9f, 
+0xf0, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x12, 0x08, 0xe8, 0x90, 0xff, 0x48, 0xf0, 0x90, 0x00, 
+0x01, 0x12, 0x09, 0x01, 0x90, 0xff, 0x42, 0xf0, 0x90, 0x00, 0x02, 0x12, 0x09, 0x01, 0x90, 0xff, 
+0x55, 0xf0, 0xe4, 0x90, 0xff, 0x5d, 0xf0, 0x90, 0x00, 0x03, 0x12, 0x09, 0x01, 0x90, 0xff, 0x54, 
+0xf0, 0xe4, 0x90, 0xff, 0x5c, 0xf0, 0xf5, 0x27, 0x12, 0x2a, 0x55, 0xe5, 0x27, 0xc3, 0x9f, 0x50, 
+0x5b, 0xe4, 0xf5, 0x28, 0x75, 0x29, 0x64, 0x90, 0xff, 0x50, 0xe0, 0x20, 0xe7, 0x03, 0x43, 0x28, 
+0x01, 0xe5, 0x28, 0x64, 0x01, 0x60, 0x03, 0xd5, 0x29, 0xed, 0x12, 0x2a, 0x63, 0x12, 0x2a, 0x3c, 
+0x7d, 0x06, 0x12, 0x28, 0x53, 0x90, 0xff, 0x40, 0x74, 0x29, 0xf0, 0x90, 0xff, 0x40, 0xe0, 0x20, 
+0xe0, 0xf9, 0x12, 0x2a, 0x3c, 0x7d, 0x08, 0x12, 0x28, 0x53, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 
+0xe0, 0xff, 0xab, 0x21, 0xe5, 0x23, 0xf9, 0x24, 0x02, 0xf5, 0x23, 0xe5, 0x22, 0xfa, 0x34, 0x00, 
+0xf5, 0x22, 0xee, 0x8f, 0xf0, 0x12, 0x0a, 0xc5, 0x05, 0x27, 0x80, 0x9c, 0xe4, 0xf5, 0x27, 0x75, 
+0x28, 0x01, 0x12, 0x2a, 0x3c, 0x7d, 0x07, 0x12, 0x28, 0x53, 0xe5, 0x28, 0x24, 0x02, 0x90, 0xff, 
+0x55, 0xf0, 0xe4, 0xf5, 0x29, 0xf5, 0x2a, 0x05, 0x2a, 0xe5, 0x2a, 0x70, 0x02, 0x05, 0x29, 0xb4, 
+0x20, 0xf5, 0xe5, 0x29, 0xb4, 0x03, 0xf0, 0x90, 0xff, 0x50, 0xe0, 0x30, 0xe7, 0x0c, 0x12, 0x2a, 
+0x63, 0x05, 0x28, 0xe5, 0x28, 0xc3, 0x94, 0x64, 0x40, 0xd0, 0xab, 0x24, 0xaa, 0x25, 0xa9, 0x26, 
+0x85, 0x27, 0x82, 0x75, 0x83, 0x00, 0xe5, 0x28, 0x12, 0x09, 0x40, 0x12, 0x2a, 0x3c, 0x7d, 0x08, 
+0x12, 0x28, 0x53, 0x12, 0x2a, 0x63, 0x12, 0x2a, 0x55, 0x05, 0x27, 0xe5, 0x27, 0xc3, 0x9f, 0x40, 
+0x9e, 0xe4, 0x90, 0xff, 0x50, 0xf0, 0xff, 0x22, 0x8b, 0x1f, 0x8a, 0x20, 0x89, 0x21, 0x43, 0xad, 
+0x04, 0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x80, 0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 
+0xe4, 0x90, 0xff, 0x4a, 0xf0, 0x90, 0xff, 0x42, 0x04, 0xf0, 0x90, 0xff, 0x55, 0x74, 0x7d, 0xf0, 
+0x90, 0xff, 0x5d, 0xf0, 0xe4, 0x12, 0x2a, 0x8a, 0x74, 0x10, 0xf0, 0xe4, 0xf5, 0x26, 0xf5, 0x27, 
+0xf5, 0x28, 0xf5, 0x29, 0xf5, 0x25, 0xe4, 0x90, 0xff, 0x50, 0x12, 0x2a, 0x7a, 0xf4, 0x60, 0x0d, 
+0xe4, 0xfd, 0x12, 0x29, 0xd6, 0x12, 0x2a, 0x7f, 0x7d, 0x08, 0x12, 0x28, 0x53, 0x12, 0x2a, 0x6c, 
+0xf4, 0x60, 0x0d, 0xe4, 0xfd, 0x12, 0x29, 0xd6, 0x12, 0x2a, 0x6c, 0x7d, 0x08, 0x12, 0x28, 0x53, 
+0xe4, 0xff, 0x00, 0x0f, 0xbf, 0xc8, 0xfb, 0x90, 0xff, 0x50, 0x74, 0x03, 0x12, 0x2a, 0x7a, 0xf4, 
+0x60, 0x0d, 0xe4, 0xfd, 0x12, 0x2a, 0x0a, 0x12, 0x2a, 0x7f, 0x7d, 0x07, 0x12, 0x28, 0x53, 0x12, 
+0x2a, 0x6c, 0xf4, 0x60, 0x0d, 0x7d, 0x01, 0x12, 0x2a, 0x0a, 0x12, 0x2a, 0x6c, 0x7d, 0x07, 0x12, 
+0x28, 0x53, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x07, 0xf0, 0x90, 0xff, 
+0x58, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x09, 0xf0, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0x3a, 0xf0, 
+0x90, 0xff, 0x43, 0xe0, 0x30, 0xe4, 0xf9, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x52, 
+0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x27, 0xf5, 0x27, 0xee, 0x35, 0x26, 0xf5, 0x26, 0x90, 0xff, 0x5a, 
+0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x29, 0xf5, 0x29, 0xee, 0x35, 0x28, 0xf5, 0x28, 0x05, 0x25, 0xe5, 
+0x25, 0xc3, 0x94, 0x04, 0x50, 0x03, 0x02, 0x1b, 0x66, 0xe5, 0x27, 0xae, 0x26, 0x78, 0x02, 0xce, 
+0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0xee, 0x8f, 0xf0, 
+0x12, 0x0a, 0xc5, 0xe5, 0x29, 0xae, 0x28, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 
+0xff, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x90, 0x00, 0x02, 0xee, 0x8f, 0xf0, 0x12, 0x0a, 0xe4, 
+0x53, 0x95, 0x7f, 0xe4, 0x90, 0xff, 0x41, 0xf0, 0x90, 0xff, 0x49, 0xf0, 0x90, 0xff, 0x4a, 0xf0, 
+0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x90, 0xff, 0x42, 0xf0, 0x90, 0xff, 0x55, 0xf0, 
+0x90, 0xff, 0x5d, 0xf0, 0x12, 0x2a, 0x8a, 0x12, 0x2a, 0x7e, 0xf4, 0x60, 0x05, 0xe4, 0xfd, 0x12, 
+0x28, 0x53, 0x12, 0x2a, 0x6c, 0xf4, 0x60, 0x05, 0xe4, 0xfd, 0x12, 0x28, 0x53, 0x22, 0xef, 0x12, 
+0x12, 0xc2, 0xe0, 0xff, 0x70, 0x04, 0xf5, 0x22, 0x80, 0x18, 0x78, 0xaa, 0xe6, 0xfe, 0x14, 0xb5, 
+0x07, 0x09, 0xee, 0x25, 0xe0, 0x24, 0xfa, 0xf5, 0x22, 0x80, 0x07, 0xef, 0x25, 0xe0, 0x24, 0xfe, 
+0xf5, 0x22, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x04, 0x12, 0x14, 0x6d, 0xe5, 0x22, 0x12, 0x13, 0x10, 
+0xfe, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x09, 0x12, 0x13, 0x14, 0xfe, 0x90, 0x02, 0xbd, 0xe0, 0xfa, 
+0xa3, 0xe0, 0xfb, 0xc3, 0xef, 0x9b, 0xff, 0xee, 0x9a, 0x12, 0x13, 0xf0, 0xe5, 0x22, 0x25, 0xe0, 
+0x24, 0x06, 0x12, 0x14, 0x6d, 0xe5, 0x22, 0x25, 0xe0, 0x24, 0x03, 0x12, 0x13, 0x14, 0xfe, 0xe5, 
+0x22, 0x25, 0xe0, 0x24, 0x0b, 0x12, 0x13, 0x14, 0xcf, 0xc3, 0x9b, 0xcf, 0x9a, 0x78, 0x72, 0x12, 
+0x13, 0xf2, 0x12, 0x12, 0x89, 0x74, 0x07, 0x93, 0xfe, 0x74, 0x08, 0x78, 0x72, 0x12, 0x13, 0x83, 
+0x12, 0x0b, 0x11, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x12, 0x89, 0x78, 0x72, 
+0x12, 0x13, 0x1c, 0x12, 0x0b, 0x11, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xef, 0x2b, 
+0xff, 0xee, 0x3a, 0x12, 0x13, 0x3e, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x12, 
+0x89, 0x74, 0x05, 0x93, 0xfe, 0x74, 0x06, 0x78, 0x6e, 0x12, 0x13, 0x83, 0x12, 0x13, 0x6b, 0xd0, 
+0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xc3, 0xef, 0x9b, 0xff, 0xee, 0x9a, 0xfe, 0xed, 0x99, 
+0xfd, 0xec, 0x98, 0xfc, 0x78, 0x76, 0x12, 0x0c, 0x7b, 0x78, 0x76, 0x12, 0x0c, 0x52, 0xec, 0x33, 
+0x50, 0x0b, 0x78, 0x6e, 0x12, 0x0c, 0x87, 0x00, 0x00, 0x00, 0x01, 0x80, 0x64, 0x12, 0x14, 0x22, 
+0xff, 0xea, 0x3e, 0xfe, 0xe9, 0x3d, 0xfd, 0xe8, 0x3c, 0xfc, 0x12, 0x13, 0x8e, 0x12, 0x0b, 0x9c, 
+0x78, 0x76, 0x12, 0x0c, 0x6e, 0xef, 0x2b, 0xff, 0xee, 0x3a, 0x12, 0x13, 0x3e, 0xc0, 0x04, 0xc0, 
+0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x14, 0x22, 0xfb, 0xea, 0x3e, 0xfa, 0xe9, 0x3d, 0xf9, 0xe8, 
+0x3c, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0x12, 0x0b, 0x9c, 0x78, 0x6e, 0x12, 
+0x0c, 0x7b, 0x12, 0x12, 0x89, 0x78, 0x6e, 0x12, 0x13, 0x1c, 0xd3, 0x12, 0x0c, 0x2e, 0x40, 0x11, 
+0x12, 0x12, 0x89, 0x74, 0x02, 0x93, 0x24, 0xff, 0xff, 0x74, 0x01, 0x93, 0x34, 0xff, 0x12, 0x13, 
+0xf0, 0x78, 0x6e, 0x12, 0x0c, 0x52, 0x22, 0xe4, 0x78, 0x89, 0xf6, 0x18, 0xe6, 0x14, 0x70, 0x03, 
+0x02, 0x1e, 0xac, 0x14, 0x70, 0x03, 0x02, 0x1f, 0x15, 0x24, 0x02, 0x60, 0x03, 0x02, 0x1f, 0x39, 
+0xe4, 0x78, 0x8e, 0xf6, 0x78, 0x89, 0xf6, 0xfe, 0x7f, 0x8c, 0xfd, 0x12, 0x24, 0xf5, 0x7f, 0x1c, 
+0x7a, 0x00, 0x79, 0x00, 0x12, 0x25, 0x4b, 0x7f, 0x0e, 0x7a, 0x00, 0x79, 0x20, 0x12, 0x25, 0x4b, 
+0x12, 0x24, 0xee, 0x74, 0x02, 0x93, 0x78, 0x8f, 0xf6, 0x78, 0x84, 0xe6, 0x30, 0xe0, 0x08, 0x75, 
+0x23, 0x05, 0x75, 0x24, 0x01, 0x80, 0x06, 0x75, 0x23, 0x08, 0xe4, 0xf5, 0x24, 0xe4, 0xf5, 0x22, 
+0xe5, 0x22, 0xc3, 0x78, 0x8f, 0x96, 0x50, 0x60, 0xe5, 0x59, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, 
+0x58, 0xf5, 0x83, 0xe5, 0x82, 0x25, 0x22, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe4, 0x93, 
+0xf5, 0x25, 0xe5, 0x22, 0x24, 0x0a, 0xff, 0xe4, 0x33, 0xfe, 0xe5, 0x59, 0x2f, 0xf5, 0x82, 0xe5, 
+0x58, 0x3e, 0xf5, 0x83, 0xe4, 0x93, 0xf5, 0x26, 0xe4, 0xfd, 0xaf, 0x25, 0x12, 0x2a, 0x0a, 0x7d, 
+0x01, 0xaf, 0x26, 0x12, 0x2a, 0x0a, 0xad, 0x24, 0xaf, 0x25, 0x12, 0x29, 0xd6, 0xad, 0x24, 0xaf, 
+0x26, 0x12, 0x29, 0xd6, 0xad, 0x23, 0xaf, 0x25, 0x12, 0x28, 0x53, 0xad, 0x23, 0xaf, 0x26, 0x12, 
+0x28, 0x53, 0x05, 0x22, 0x05, 0x22, 0x80, 0x98, 0x78, 0x88, 0x76, 0x01, 0x12, 0x24, 0xee, 0x74, 
+0x08, 0x93, 0x25, 0xe0, 0xf5, 0x25, 0x74, 0x07, 0x93, 0x33, 0xf5, 0x24, 0x75, 0x23, 0x04, 0x12, 
+0x2a, 0xbe, 0x7f, 0xff, 0x12, 0x26, 0x5a, 0x12, 0x2a, 0xbe, 0xe4, 0xf5, 0x22, 0xe5, 0x22, 0xc3, 
+0x78, 0x8f, 0x96, 0x50, 0x36, 0xe5, 0x22, 0x12, 0x24, 0xb8, 0xe0, 0xfe, 0xa3, 0xe0, 0x78, 0x02, 
+0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xe5, 0x22, 0x12, 0x24, 0xc8, 0xee, 0x8f, 0xf0, 
+0x12, 0x09, 0xff, 0xe5, 0x22, 0x12, 0x24, 0xc8, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x22, 0x12, 
+0x25, 0x54, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x05, 0x22, 0x80, 0xc2, 0x15, 0x23, 0xe5, 0x23, 0x70, 
+0xb1, 0x78, 0x88, 0x76, 0x02, 0x12, 0x2a, 0xbe, 0x7f, 0xff, 0x12, 0x26, 0x5a, 0x78, 0x8f, 0xe6, 
+0xfd, 0xe4, 0xff, 0x12, 0x21, 0x29, 0x78, 0x89, 0xe6, 0x30, 0xe1, 0x04, 0x78, 0x8e, 0x76, 0x50, 
+0x78, 0x8f, 0xe6, 0xfd, 0xe4, 0xff, 0x02, 0x1f, 0xf2, 0xe4, 0x78, 0x88, 0xf6, 0x22, 0xe5, 0x09, 
+0x24, 0x05, 0x12, 0x12, 0x63, 0xe0, 0x60, 0x12, 0xe5, 0x09, 0x24, 0x25, 0x12, 0x12, 0x63, 0xe0, 
+0x7e, 0x01, 0x60, 0x02, 0x7e, 0x03, 0xaf, 0x06, 0x80, 0x1e, 0xe5, 0x09, 0x24, 0x25, 0x12, 0x12, 
+0x63, 0xe0, 0x60, 0x12, 0xe5, 0x09, 0x24, 0x0a, 0x12, 0x12, 0x63, 0xe0, 0x7e, 0x02, 0x60, 0x02, 
+0x7e, 0x03, 0xaf, 0x06, 0x80, 0x02, 0xe4, 0xff, 0xe5, 0x09, 0x24, 0x06, 0x12, 0x12, 0x63, 0xef, 
+0xf0, 0xe5, 0x09, 0x24, 0x05, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xe5, 0x09, 0x24, 0x25, 0x12, 0x12, 
+0x63, 0xee, 0x12, 0x12, 0x6f, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xe5, 0x09, 0x24, 0x21, 0x12, 0x12, 
+0x63, 0xec, 0xf0, 0xed, 0x12, 0x12, 0x6e, 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x12, 0x12, 
+0x5f, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xe5, 0x09, 0x24, 0x06, 0x12, 0x12, 0x63, 0xe0, 0xfe, 0xe5, 
+0x09, 0x24, 0x26, 0x12, 0x12, 0x63, 0xee, 0xf0, 0x22, 0x78, 0xff, 0xe4, 0xf6, 0xd8, 0xfd, 0x90, 
+0x00, 0x00, 0x7f, 0x00, 0x7e, 0x03, 0xe4, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 0xfa, 0x75, 0x81, 0xb0, 
+0x75, 0xa0, 0x00, 0x02, 0x2c, 0xb9, 0x12, 0x2b, 0x22, 0x22, 0x90, 0x00, 0x04, 0x02, 0x09, 0x01, 
+0x01, 0x06, 0x8f, 0x27, 0x8d, 0x28, 0x78, 0x8e, 0xe6, 0x60, 0x01, 0x16, 0x12, 0x24, 0xc6, 0xe0, 
+0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x27, 0x12, 0x24, 0xb8, 0xe0, 0xfc, 0xa3, 0xe0, 0xc3, 0x9f, 0xf5, 
+0x2a, 0xec, 0x9e, 0xf5, 0x29, 0x12, 0x25, 0x27, 0xe0, 0xf5, 0x2b, 0x78, 0x8e, 0xe6, 0x60, 0x09, 
+0xd3, 0x12, 0x25, 0x62, 0x40, 0x03, 0x02, 0x20, 0xe2, 0xaf, 0x2a, 0xae, 0x29, 0x12, 0x2b, 0x6f, 
+0x12, 0x24, 0xee, 0xc3, 0x74, 0x08, 0x93, 0x9f, 0x74, 0x07, 0x93, 0x9e, 0x50, 0x0d, 0x12, 0x25, 
+0x62, 0x40, 0x04, 0x05, 0x2b, 0x80, 0x57, 0x15, 0x2b, 0x80, 0x53, 0x12, 0x24, 0xfe, 0xe0, 0xff, 
+0x33, 0x95, 0xe0, 0xfe, 0xef, 0x25, 0x2a, 0xf5, 0x2a, 0xee, 0x35, 0x29, 0xf5, 0x29, 0xd3, 0xe5, 
+0x2a, 0x94, 0x78, 0x12, 0x25, 0x66, 0x40, 0x09, 0x12, 0x24, 0xc6, 0xe4, 0x75, 0xf0, 0x01, 0x80, 
+0x1a, 0xe5, 0x2a, 0x24, 0x78, 0xe4, 0x35, 0x29, 0xc3, 0x64, 0x80, 0x94, 0x80, 0xe5, 0x27, 0x75, 
+0xf0, 0x0a, 0x50, 0x11, 0x12, 0x24, 0xcb, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0x09, 0xff, 0x12, 0x24, 
+0xfe, 0xe4, 0xf0, 0x80, 0x06, 0x12, 0x25, 0x03, 0xe5, 0x2a, 0xf0, 0xe4, 0xf5, 0x2b, 0x12, 0x24, 
+0xee, 0x74, 0x04, 0x93, 0xff, 0xd3, 0x64, 0x80, 0xf8, 0xe5, 0x2b, 0x64, 0x80, 0x98, 0x50, 0x17, 
+0xef, 0x33, 0x95, 0xe0, 0xfe, 0xad, 0x2b, 0xed, 0x33, 0x95, 0xe0, 0xfc, 0xed, 0x2f, 0xec, 0x3e, 
+0xc3, 0x64, 0x80, 0x94, 0x80, 0x50, 0x15, 0xe4, 0xf5, 0x2b, 0xe5, 0x27, 0x12, 0x24, 0xb8, 0xe0, 
+0xfe, 0xa3, 0xe0, 0xff, 0x12, 0x24, 0xc6, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x25, 0x27, 0xe5, 
+0x2b, 0xf0, 0x78, 0x8e, 0xe6, 0x70, 0x36, 0x12, 0x24, 0xc6, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 
+0x27, 0x12, 0x25, 0x54, 0x12, 0x25, 0x74, 0x12, 0x2b, 0x6f, 0xaa, 0x06, 0xab, 0x07, 0x12, 0x24, 
+0xee, 0x74, 0x07, 0x93, 0xfe, 0x74, 0x08, 0x93, 0xff, 0x7c, 0x00, 0x7d, 0x03, 0x12, 0x09, 0x62, 
+0xd3, 0xeb, 0x9f, 0xea, 0x9e, 0x40, 0x06, 0x78, 0x89, 0xe6, 0x44, 0x10, 0xf6, 0x05, 0x27, 0x15, 
+0x28, 0xe5, 0x28, 0x60, 0x03, 0x02, 0x1f, 0xfc, 0x22, 0xab, 0x07, 0xaa, 0x05, 0xe4, 0x90, 0x01, 
+0xb0, 0xf0, 0xeb, 0x12, 0x24, 0xb8, 0xe0, 0xf5, 0x29, 0xa3, 0xe0, 0xf5, 0x2a, 0x78, 0x8f, 0xe6, 
+0xff, 0xeb, 0xc3, 0x9f, 0x40, 0x04, 0x78, 0x86, 0x80, 0x02, 0x78, 0x7e, 0xe6, 0x75, 0x27, 0x00, 
+0xf5, 0x28, 0xae, 0x27, 0xaf, 0x28, 0x7c, 0x00, 0x7d, 0xfc, 0x12, 0x09, 0x62, 0xd3, 0xe5, 0x2a, 
+0x9f, 0xe5, 0x29, 0x9e, 0x40, 0x0e, 0x78, 0x89, 0xe6, 0x44, 0x20, 0xf6, 0x74, 0x20, 0x2b, 0xf8, 
+0xe2, 0x44, 0x10, 0xf2, 0x12, 0x24, 0xee, 0x74, 0x08, 0x93, 0x25, 0xe0, 0xf5, 0x2a, 0x74, 0x07, 
+0x93, 0x33, 0xf5, 0x29, 0x74, 0x20, 0x2b, 0xf8, 0xe2, 0xf9, 0x30, 0xe0, 0x19, 0xe5, 0x2a, 0xae, 
+0x29, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xc3, 0xe5, 0x2a, 0x9f, 0xf5, 
+0x2a, 0xe5, 0x29, 0x9e, 0xf5, 0x29, 0xe5, 0x29, 0xc3, 0x13, 0xfe, 0xe5, 0x2a, 0x13, 0xff, 0xeb, 
+0x12, 0x24, 0xc8, 0xe0, 0xfc, 0xa3, 0xe0, 0x2f, 0xff, 0xec, 0x3e, 0xfe, 0xeb, 0x12, 0x24, 0xb8, 
+0xe0, 0xfc, 0xa3, 0xe0, 0xd3, 0x9f, 0xec, 0x9e, 0x40, 0x51, 0x74, 0x20, 0x2b, 0xf8, 0xe9, 0x44, 
+0x02, 0xf2, 0xeb, 0x12, 0x24, 0xc8, 0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x2a, 0xff, 0xe5, 0x29, 0x3e, 
+0xfe, 0xeb, 0x12, 0x24, 0xb8, 0xe0, 0xfc, 0xa3, 0xe0, 0xd3, 0x9f, 0xec, 0x9e, 0x40, 0x22, 0x78, 
+0x89, 0xe6, 0x44, 0x02, 0xf6, 0x44, 0x08, 0xf6, 0x74, 0x20, 0x2b, 0xf8, 0xe2, 0x44, 0x01, 0xf2, 
+0x78, 0x8f, 0xe6, 0xff, 0xeb, 0xc3, 0x9f, 0x50, 0x1a, 0x90, 0x01, 0xb0, 0xe0, 0x04, 0xf0, 0x80, 
+0x12, 0x74, 0x20, 0x2b, 0xf8, 0xe2, 0x54, 0xfe, 0xf2, 0x80, 0x08, 0x74, 0x20, 0x2b, 0xf8, 0xe9, 
+0x54, 0xfd, 0xf2, 0xeb, 0x12, 0x24, 0xc8, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xeb, 0x12, 0x24, 0xb8, 
+0x12, 0x25, 0x1d, 0xeb, 0x40, 0x17, 0x12, 0x24, 0xc8, 0xe0, 0xfe, 0xa3, 0xe0, 0x12, 0x25, 0x15, 
+0xf8, 0xeb, 0x25, 0xe0, 0x24, 0x00, 0xc8, 0xf2, 0x08, 0xef, 0xf2, 0x80, 0x09, 0x25, 0xe0, 0x24, 
+0x00, 0xf8, 0xe4, 0xf2, 0x08, 0xf2, 0x0b, 0x1a, 0xea, 0x60, 0x03, 0x02, 0x21, 0x32, 0x22, 0xe4, 
+0x78, 0x74, 0xf6, 0x08, 0xf6, 0x78, 0x6e, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 
+0x08, 0xf6, 0xf5, 0x22, 0xff, 0xf5, 0x23, 0x7e, 0xff, 0xe5, 0x22, 0xc3, 0x78, 0xaa, 0x96, 0x40, 
+0x03, 0x02, 0x23, 0x11, 0xe5, 0x22, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x02, 0xf8, 0xe2, 0xfc, 0x08, 
+0xe2, 0xfd, 0xe5, 0x22, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x01, 0xf8, 0xe2, 0x2d, 0xf5, 0x28, 0x18, 
+0xe2, 0x3c, 0xf5, 0x27, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0x78, 0x74, 0xe6, 0xfc, 0x08, 0xe6, 
+0xfd, 0x74, 0x08, 0x93, 0x2d, 0xfb, 0x74, 0x07, 0x93, 0x3c, 0xfa, 0xd3, 0xe5, 0x28, 0x9b, 0xe5, 
+0x27, 0x9a, 0x40, 0x05, 0x7f, 0x01, 0x18, 0x80, 0x3c, 0x85, 0x59, 0x82, 0x85, 0x58, 0x83, 0x74, 
+0x08, 0x93, 0x25, 0x28, 0xfb, 0x74, 0x07, 0x93, 0x35, 0x27, 0xfa, 0xd3, 0xed, 0x9b, 0xec, 0x9a, 
+0x40, 0x2a, 0xef, 0x60, 0x1e, 0xe4, 0xff, 0x12, 0x14, 0x4e, 0xfc, 0x08, 0xe6, 0xfd, 0xe5, 0x23, 
+0x25, 0xe0, 0x24, 0x6e, 0xf8, 0xa6, 0x04, 0x08, 0xa6, 0x05, 0x05, 0x23, 0xe5, 0x23, 0xc3, 0x94, 
+0x03, 0x50, 0x0e, 0x78, 0x74, 0xa6, 0x27, 0x08, 0xa6, 0x28, 0xae, 0x22, 0x05, 0x22, 0x02, 0x22, 
+0x79, 0xef, 0x60, 0x1c, 0xe5, 0x23, 0xc3, 0x94, 0x02, 0x50, 0x15, 0x12, 0x14, 0x4e, 0xfe, 0x08, 
+0xe6, 0xff, 0xe5, 0x23, 0x25, 0xe0, 0x24, 0x6e, 0xf8, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x05, 0x23, 
+0x7b, 0x00, 0x7a, 0x00, 0x79, 0x6e, 0x75, 0x2d, 0xff, 0x12, 0x23, 0x6d, 0xb4, 0xff, 0x04, 0x7f, 
+0xff, 0x80, 0x07, 0x74, 0x24, 0x25, 0x22, 0xf8, 0xe6, 0xff, 0x78, 0xab, 0xa6, 0x07, 0x7b, 0x00, 
+0x7a, 0x00, 0x79, 0x6e, 0x85, 0x22, 0x2d, 0x12, 0x23, 0x6d, 0xb4, 0xff, 0x04, 0x7f, 0xff, 0x80, 
+0x07, 0x74, 0x24, 0x25, 0x22, 0xf8, 0xe6, 0xff, 0x78, 0xac, 0xa6, 0x07, 0x22, 0xad, 0x23, 0x12, 
+0x29, 0x30, 0x8f, 0x22, 0xe5, 0x22, 0x22, 0x8b, 0x1e, 0x8a, 0x1f, 0x89, 0x20, 0xe4, 0xf5, 0x21, 
+0xf5, 0x22, 0xf5, 0x23, 0x85, 0x5b, 0x82, 0x85, 0x5a, 0x83, 0xe4, 0x93, 0xff, 0xe5, 0x21, 0xc3, 
+0x9f, 0x40, 0x03, 0x02, 0x24, 0x58, 0x12, 0x00, 0x18, 0x74, 0x01, 0x93, 0xf5, 0x24, 0x12, 0x00, 
+0x12, 0x74, 0x02, 0x93, 0xf5, 0x25, 0x12, 0x00, 0x12, 0x74, 0x04, 0x93, 0xfc, 0x74, 0x05, 0x93, 
+0xfd, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x00, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0xd3, 0x9d, 0xee, 
+0x9c, 0x40, 0x6f, 0x7c, 0x00, 0x7d, 0x05, 0x12, 0x09, 0x62, 0xe5, 0x25, 0x25, 0xe0, 0x24, 0x01, 
+0xf8, 0xe2, 0x24, 0x01, 0xfd, 0x18, 0xe2, 0x34, 0x00, 0xfc, 0x12, 0x09, 0x74, 0x8e, 0x26, 0x8f, 
+0x27, 0x12, 0x00, 0x12, 0x74, 0x03, 0x93, 0x30, 0xe7, 0x2b, 0x54, 0x7f, 0xc3, 0x95, 0x27, 0xff, 
+0xe4, 0x95, 0x26, 0xfe, 0x12, 0x2b, 0x6f, 0xc3, 0x74, 0x03, 0x9f, 0xee, 0x64, 0x80, 0xf8, 0x74, 
+0x80, 0x98, 0x40, 0x2e, 0xaf, 0x21, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 
+0xfc, 0x42, 0x22, 0x80, 0x1d, 0x12, 0x00, 0x12, 0x74, 0x03, 0x93, 0xc3, 0x95, 0x27, 0xe4, 0x95, 
+0x26, 0x50, 0x0f, 0xaf, 0x21, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 
+0x42, 0x22, 0x12, 0x00, 0x12, 0x74, 0x01, 0x93, 0x24, 0x20, 0xf8, 0xe2, 0xc3, 0x13, 0x20, 0xe0, 
+0x0f, 0x12, 0x00, 0x12, 0x74, 0x02, 0x93, 0x24, 0x20, 0xf8, 0xe2, 0xc3, 0x13, 0x30, 0xe0, 0x03, 
+0x75, 0x23, 0x01, 0x05, 0x21, 0x02, 0x23, 0x84, 0x90, 0x00, 0x36, 0xe0, 0x65, 0x22, 0x60, 0x0a, 
+0xe5, 0x22, 0xf0, 0xe4, 0x90, 0x00, 0x35, 0xf0, 0x80, 0x14, 0x90, 0x00, 0x35, 0xe0, 0x04, 0xf0, 
+0xc3, 0x94, 0x03, 0x40, 0x09, 0xe0, 0x14, 0xf0, 0x90, 0x00, 0x37, 0xe5, 0x22, 0xf0, 0x90, 0x00, 
+0x37, 0xe0, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x12, 0x09, 0x2e, 0xaf, 0x23, 0x22, 0x12, 0x27, 
+0xf8, 0x78, 0x7c, 0xe6, 0xff, 0xe5, 0x59, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x58, 0xf5, 0x83, 
+0xe5, 0x82, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe4, 0x93, 0xff, 0x22, 0x74, 0x07, 
+0x93, 0xfe, 0x74, 0x08, 0x93, 0xff, 0xe6, 0xfd, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb1, 0xf5, 0x82, 
+0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0xe5, 0x27, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb3, 0xf5, 0x82, 
+0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0xe0, 0xfa, 0xa3, 0xe0, 0x2f, 0xff, 0xea, 0x3e, 0xfe, 0xed, 
+0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb7, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0x85, 0x59, 
+0x82, 0x85, 0x58, 0x83, 0x22, 0x7b, 0x01, 0x7a, 0x01, 0x79, 0xb1, 0x02, 0x0c, 0xd9, 0xe5, 0x27, 
+0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0xe0, 0xc3, 
+0x13, 0xfe, 0xa3, 0xe0, 0x13, 0xff, 0xc3, 0xed, 0x9f, 0xff, 0xec, 0x9e, 0x22, 0xe0, 0xfc, 0xa3, 
+0xe0, 0xfd, 0xd3, 0x9f, 0xec, 0x9e, 0x22, 0xe5, 0x27, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb6, 0xf5, 
+0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 0x22, 0xe6, 0x90, 0xff, 0x55, 0xf0, 0x90, 0xff, 0x5d, 0xf0, 
+0x22, 0x43, 0xad, 0x04, 0x90, 0xff, 0x40, 0x74, 0x29, 0xf0, 0x22, 0x7e, 0x00, 0x7d, 0x00, 0x7b, 
+0xfe, 0x02, 0x0c, 0xd9, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb9, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 
+0x83, 0x22, 0xe5, 0x2a, 0x94, 0x00, 0xe5, 0x29, 0x64, 0x80, 0x94, 0x80, 0x22, 0x85, 0x1f, 0x82, 
+0x85, 0x1e, 0x83, 0x22, 0xe0, 0xfc, 0xa3, 0xe0, 0xc3, 0x9f, 0xff, 0xec, 0x9e, 0xfe, 0x22, 0x78, 
+0x7d, 0x06, 0x06, 0x18, 0x06, 0x06, 0x78, 0x8d, 0x16, 0x22, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 
+0x22, 0x8e, 0x1e, 0x8f, 0x1f, 0xe4, 0x78, 0x88, 0xf6, 0x78, 0x8b, 0xf6, 0x85, 0x1e, 0x58, 0x85, 
+0x1f, 0x59, 0xe5, 0x1f, 0x24, 0x31, 0xff, 0xe4, 0x35, 0x1e, 0xfa, 0xa9, 0x07, 0x7b, 0xff, 0x78, 
+0x7e, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x0a, 0x12, 0x08, 0xc2, 0x7e, 0x00, 0x7f, 0xa0, 
+0x7d, 0x00, 0x12, 0x24, 0xf5, 0x12, 0x25, 0x6d, 0x74, 0x31, 0x93, 0x78, 0x7e, 0xf6, 0x12, 0x25, 
+0x6d, 0x74, 0x39, 0x93, 0x78, 0x86, 0xf6, 0x12, 0x24, 0xee, 0x74, 0x05, 0x93, 0xff, 0x7e, 0x00, 
+0x7c, 0x10, 0x7d, 0x00, 0x12, 0x0c, 0xac, 0xe4, 0x7b, 0xc8, 0xfa, 0xf9, 0xf8, 0x12, 0x0b, 0x9c, 
+0x78, 0x7a, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0xe4, 0x78, 0x8d, 0xf6, 0x43, 0x95, 0x80, 0x90, 0xff, 
+0x41, 0x74, 0x77, 0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 0x12, 0x25, 0x6d, 0xe4, 0x93, 0xf5, 
+0x20, 0xf4, 0x60, 0x0c, 0xe4, 0xfd, 0xaf, 0x20, 0x12, 0x29, 0xd6, 0xe4, 0xfd, 0x12, 0x26, 0x46, 
+0x12, 0x25, 0x6d, 0x74, 0x01, 0x93, 0xf5, 0x20, 0xf4, 0x60, 0x0c, 0xe4, 0xfd, 0xaf, 0x20, 0x12, 
+0x29, 0xd6, 0x7d, 0x01, 0x12, 0x26, 0x46, 0x78, 0x84, 0xe6, 0x7f, 0x08, 0x30, 0xe0, 0x02, 0x7f, 
+0x05, 0x78, 0x8c, 0xa6, 0x07, 0x22, 0xaf, 0x20, 0x12, 0x2a, 0x0a, 0x7d, 0x08, 0xaf, 0x20, 0x12, 
+0x28, 0x53, 0x7d, 0x07, 0xaf, 0x20, 0x12, 0x28, 0x53, 0x22, 0x90, 0xff, 0x4a, 0x74, 0x71, 0xf0, 
+0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0xe4, 0x90, 0xff, 0x40, 0xf0, 0x12, 
+0x25, 0x8a, 0x78, 0x81, 0xe6, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, 0x5c, 0xf0, 0x78, 0x7f, 0xe6, 
+0x90, 0xff, 0x42, 0xf0, 0x78, 0x83, 0x12, 0x25, 0x37, 0x90, 0xff, 0x48, 0x74, 0x02, 0xf0, 0x12, 
+0x25, 0x41, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4, 0x08, 0x75, 0x91, 0xc1, 0xe4, 0xf5, 0x91, 0x80, 
+0xf1, 0x12, 0x25, 0x8a, 0xe4, 0x78, 0x8a, 0xf6, 0x78, 0x7d, 0xbf, 0xff, 0x1b, 0xf6, 0x18, 0x76, 
+0x01, 0x78, 0x8f, 0xe6, 0xc3, 0x13, 0x78, 0x8d, 0xf6, 0x78, 0x7f, 0xe6, 0x90, 0xff, 0x42, 0xf0, 
+0x08, 0x12, 0x25, 0x37, 0x78, 0x7e, 0x80, 0x1b, 0xa6, 0x07, 0xef, 0x04, 0x18, 0xf6, 0x78, 0x8d, 
+0x76, 0x01, 0x78, 0x8a, 0x76, 0x01, 0x78, 0x85, 0xe6, 0x90, 0xff, 0x42, 0xf0, 0x78, 0x87, 0x12, 
+0x25, 0x37, 0x18, 0xe6, 0x90, 0xff, 0x48, 0xf0, 0x7e, 0x00, 0x7f, 0x14, 0x7d, 0x00, 0x7b, 0x01, 
+0x7a, 0x02, 0x79, 0x55, 0x12, 0x0c, 0xd9, 0x12, 0x28, 0xa7, 0x78, 0x82, 0xe6, 0x30, 0xe7, 0x1b, 
+0x12, 0x25, 0x41, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4, 0x08, 0x75, 0x91, 0xc1, 0xe4, 0xf5, 0x91, 
+0x80, 0xf1, 0x12, 0x16, 0xaf, 0x78, 0x8d, 0xe6, 0x70, 0xe9, 0x22, 0x53, 0xad, 0xfb, 0x12, 0x25, 
+0x44, 0x22, 0xab, 0x07, 0xbb, 0xff, 0x03, 0x7f, 0xff, 0x22, 0xeb, 0x70, 0x0c, 0x12, 0x12, 0x89, 
+0x74, 0x11, 0x93, 0xf5, 0x22, 0x74, 0x12, 0x80, 0x1d, 0x78, 0xaa, 0xe6, 0x14, 0xb5, 0x03, 0x0c, 
+0x12, 0x12, 0x89, 0x74, 0x13, 0x93, 0xf5, 0x22, 0x74, 0x14, 0x80, 0x0a, 0x12, 0x12, 0x89, 0x74, 
+0x0f, 0x93, 0xf5, 0x22, 0x74, 0x10, 0x93, 0xf5, 0x23, 0x90, 0x02, 0x8f, 0xe0, 0x70, 0x06, 0x90, 
+0x02, 0xb6, 0xe0, 0x60, 0x14, 0xe5, 0x23, 0x25, 0xe0, 0xff, 0xe5, 0x22, 0x33, 0xfe, 0x7c, 0x00, 
+0x7d, 0x03, 0x12, 0x09, 0x74, 0x8e, 0x22, 0x8f, 0x23, 0xeb, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x02, 
+0x12, 0x14, 0x6d, 0xeb, 0x25, 0xe0, 0x12, 0x13, 0x10, 0xfe, 0xc3, 0xef, 0x95, 0x23, 0xee, 0x95, 
+0x22, 0xaf, 0x03, 0x50, 0x02, 0x7f, 0xff, 0x22, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 0x22, 
+0x8f, 0x23, 0xe4, 0x78, 0x94, 0xf6, 0x08, 0xf6, 0x78, 0x92, 0xf6, 0x08, 0xf6, 0x90, 0x01, 0x9c, 
+0xe0, 0x7f, 0x00, 0x22, 0x9f, 0xff, 0xe4, 0x94, 0x00, 0xfe, 0xef, 0x26, 0xf6, 0x18, 0xee, 0x36, 
+0xf6, 0x22, 0x90, 0x01, 0x9b, 0xe0, 0xff, 0x78, 0x9c, 0xe6, 0x22, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 
+0x7c, 0x00, 0x7d, 0x0a, 0x02, 0x09, 0x62, 0xd3, 0xef, 0x9d, 0xec, 0x64, 0x80, 0xf8, 0xee, 0x64, 
+0x80, 0x98, 0x22, 0xd3, 0xe6, 0x94, 0x00, 0x18, 0xe6, 0x64, 0x80, 0x94, 0x80, 0x22, 0xd3, 0xef, 
+0x95, 0x22, 0x74, 0x80, 0xf8, 0x6e, 0x98, 0x22, 0xef, 0x54, 0x07, 0x90, 0x2c, 0xa9, 0x93, 0xfe, 
+0xf4, 0xfc, 0xef, 0x54, 0xf0, 0xff, 0xc2, 0xaf, 0x75, 0xa0, 0xff, 0x64, 0x10, 0x70, 0x16, 0xbd, 
+0x08, 0x02, 0x7d, 0x02, 0x78, 0x12, 0xed, 0x30, 0xe2, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03, 0xe2, 
+0x5c, 0xf2, 0x18, 0x80, 0x08, 0xef, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xf8, 0xed, 0x24, 0xfb, 
+0x60, 0x0b, 0x14, 0x60, 0x11, 0x24, 0xfe, 0x70, 0x14, 0xe2, 0x5c, 0x80, 0x0b, 0xe2, 0x5c, 0xf2, 
+0x18, 0xe2, 0x4e, 0xf2, 0x80, 0x07, 0xe2, 0x4e, 0xf2, 0x18, 0xe2, 0x5c, 0xf2, 0xe4, 0xf5, 0xa0, 
+0xd2, 0xaf, 0x22, 0xef, 0x54, 0x07, 0x90, 0x2c, 0xb1, 0x93, 0xfe, 0xf4, 0xfc, 0xef, 0x54, 0xf0, 
+0xff, 0xc2, 0xaf, 0x75, 0xa0, 0xff, 0x64, 0x10, 0x70, 0x16, 0xbd, 0x08, 0x02, 0x7d, 0x02, 0x78, 
+0x12, 0xed, 0x30, 0xe2, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03, 0xe2, 0x5c, 0xf2, 0x18, 0x80, 0x08, 
+0xef, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xf8, 0xed, 0x30, 0xe1, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 
+0x03, 0xe2, 0x5c, 0xf2, 0x18, 0xed, 0x30, 0xe0, 0x05, 0xe2, 0x4e, 0xf2, 0x80, 0x03, 0xe2, 0x5c, 
+0xf2, 0xe4, 0xf5, 0xa0, 0xd2, 0xaf, 0x22, 0x15, 0x0f, 0xa8, 0x0f, 0x76, 0x64, 0x90, 0xff, 0x58, 
+0xe0, 0xff, 0x90, 0xff, 0x50, 0xe0, 0x4f, 0x30, 0xe7, 0x06, 0xa8, 0x0f, 0x16, 0xe6, 0x70, 0xed, 
+0x78, 0x8a, 0xe6, 0x60, 0x1b, 0xa8, 0x0f, 0xe4, 0xf6, 0xa8, 0x0f, 0xe6, 0xff, 0xc3, 0x78, 0x8f, 
+0x96, 0x50, 0x1c, 0x12, 0x24, 0x95, 0x7d, 0x06, 0x12, 0x28, 0x53, 0xa8, 0x0f, 0x06, 0x80, 0xe9, 
+0x78, 0x7d, 0x12, 0x24, 0x93, 0x7d, 0x06, 0x12, 0x24, 0x8e, 0x7d, 0x06, 0x12, 0x27, 0xf8, 0x12, 
+0x25, 0x44, 0x05, 0x0f, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 
+0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 
+0xc0, 0x07, 0x12, 0x16, 0xaf, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 
+0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 
+0x8d, 0x2c, 0xe4, 0xff, 0xf5, 0x2e, 0xf5, 0x2f, 0x7e, 0xff, 0xef, 0xc3, 0x95, 0x2c, 0x50, 0x28, 
+0xef, 0x65, 0x2d, 0x60, 0x19, 0x12, 0x0a, 0x15, 0xfd, 0xac, 0xf0, 0xd3, 0x95, 0x2f, 0xec, 0x95, 
+0x2e, 0x40, 0x0b, 0xed, 0x24, 0x20, 0xf5, 0x2f, 0xe4, 0x3c, 0xf5, 0x2e, 0xae, 0x07, 0x0f, 0x74, 
+0x02, 0x29, 0xf9, 0xe4, 0x3a, 0xfa, 0x80, 0xd2, 0xaf, 0x06, 0x22, 0xe4, 0x90, 0x00, 0x3a, 0xf0, 
+0xef, 0x70, 0x11, 0x75, 0x88, 0x08, 0xf5, 0x8d, 0xf5, 0x8c, 0xf5, 0x8f, 0xf5, 0x8e, 0xf5, 0x88, 
+0x43, 0xac, 0x02, 0x22, 0x75, 0x88, 0x08, 0xe4, 0xf5, 0x8d, 0xf5, 0x8c, 0xef, 0x75, 0xf0, 0x20, 
+0xa4, 0xff, 0xe5, 0xf0, 0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 0x75, 0x88, 0xa0, 0x53, 0xac, 0xfd, 
+0x22, 0xe4, 0x78, 0xae, 0xf6, 0x8f, 0x82, 0x8e, 0x83, 0x74, 0x64, 0x93, 0x78, 0xaa, 0xf6, 0xef, 
+0x24, 0x64, 0xf5, 0x0b, 0xe4, 0x3e, 0xf5, 0x0a, 0x78, 0x30, 0xe2, 0x54, 0xfe, 0xf2, 0x54, 0xfd, 
+0xf2, 0x54, 0xfb, 0xf2, 0xe4, 0x90, 0x02, 0x72, 0xf0, 0x90, 0x02, 0x99, 0xf0, 0x90, 0x02, 0x73, 
+0xf0, 0x90, 0x02, 0x9a, 0xf0, 0x22, 0x12, 0x2b, 0x4a, 0xfb, 0xef, 0xf4, 0x60, 0x2b, 0xc2, 0xaf, 
+0x75, 0xa0, 0xff, 0xbb, 0x01, 0x04, 0x7e, 0x18, 0x80, 0x08, 0xeb, 0x25, 0xe0, 0x25, 0xe0, 0x24, 
+0x12, 0xfe, 0xed, 0xa8, 0x06, 0x60, 0x05, 0xe2, 0x4c, 0xf2, 0x80, 0x08, 0xe2, 0xff, 0xec, 0xf4, 
+0xfd, 0xef, 0x5d, 0xf2, 0xe4, 0xf5, 0xa0, 0xd2, 0xaf, 0x22, 0x12, 0x2b, 0x4a, 0xfe, 0xef, 0xf4, 
+0x60, 0x29, 0x90, 0xff, 0x13, 0xee, 0xd3, 0x94, 0x03, 0x40, 0x11, 0xaf, 0x06, 0xef, 0x75, 0xf0, 
+0x04, 0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0xed, 0x60, 0x04, 0xe0, 
+0x4c, 0xf0, 0x22, 0xe0, 0xff, 0xec, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22, 0xab, 0x1e, 0xe5, 0x20, 
+0x24, 0x0c, 0xf9, 0xe4, 0x35, 0x1f, 0xfa, 0x7e, 0x00, 0xe9, 0x25, 0x27, 0xf9, 0xee, 0x3a, 0xfa, 
+0x12, 0x08, 0xe8, 0xff, 0x22, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x90, 0x00, 0x0b, 0x12, 0x09, 
+0x01, 0xff, 0x22, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0x3a, 0xf0, 0x22, 0xab, 0x1f, 0xaa, 0x20, 
+0xa9, 0x21, 0x90, 0x00, 0x01, 0x12, 0x09, 0x01, 0xff, 0x22, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0xab, 
+0x1f, 0xaa, 0x20, 0xa9, 0x21, 0x12, 0x08, 0xe8, 0xff, 0x22, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, 
+0x5c, 0xf0, 0x90, 0xff, 0x48, 0x22, 0x75, 0x9b, 0x5a, 0x75, 0x9a, 0xa5, 0x75, 0x99, 0xf0, 0x75, 
+0x98, 0x0f, 0x75, 0xac, 0xff, 0x75, 0xad, 0xff, 0x90, 0xff, 0x88, 0x74, 0x40, 0xf0, 0x74, 0xc0, 
+0xf0, 0x90, 0xff, 0x01, 0x74, 0x0f, 0xf0, 0x43, 0x95, 0x60, 0xe4, 0xf5, 0x96, 0x22, 0x78, 0x8d, 
+0xe6, 0x70, 0xfb, 0xff, 0xef, 0x12, 0x24, 0xe0, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xef, 0x12, 0x24, 
+0xb8, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 0x0f, 0xbf, 0x10, 0xea, 0x22, 0xef, 0x14, 0x60, 0x0a, 0x04, 
+0x70, 0x0e, 0x78, 0x30, 0xed, 0xf2, 0x7f, 0x00, 0x22, 0x78, 0xae, 0xa6, 0x05, 0x7f, 0x00, 0x22, 
+0x7f, 0x01, 0x22, 0xef, 0x24, 0x3b, 0xf5, 0x5b, 0xe4, 0x3e, 0xf5, 0x5a, 0x7e, 0x00, 0x7f, 0x03, 
+0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x00, 0x79, 0x35, 0x02, 0x0c, 0xd9, 0x78, 0x9c, 0xe6, 0x60, 0x06, 
+0xc3, 0x94, 0xff, 0x50, 0x01, 0x06, 0x78, 0x9d, 0xe6, 0x60, 0x06, 0xc3, 0x94, 0xff, 0x50, 0x01, 
+0x06, 0x22, 0xef, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0xb1, 0xf5, 0x82, 0xe4, 0x34, 0x01, 0xf5, 0x83, 
+0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x22, 0x7e, 0x00, 0x7f, 0x15, 0x7d, 0x00, 0x7b, 0x00, 0x7a, 0x00, 
+0x79, 0x90, 0x12, 0x0c, 0xd9, 0x78, 0xa3, 0x76, 0xff, 0x22, 0xef, 0x54, 0x07, 0x90, 0x2c, 0xb1, 
+0x93, 0xfc, 0xef, 0xc4, 0x54, 0x0f, 0x22, 0x78, 0x88, 0xa6, 0x07, 0xef, 0x70, 0x04, 0x78, 0x8b, 
+0xa6, 0x07, 0x22, 0xef, 0x25, 0xe0, 0x24, 0x00, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x22, 0xee, 
+0x30, 0xe7, 0x07, 0xc3, 0xe4, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x22, 0x11, 0x16, 0x0e, 0x01, 0x0f, 
+0x78, 0x0f, 0x00, 0x64, 0x10, 0x41, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x46, 0x45, 0x44, 0x43, 
+0x17, 0x54, 0x00, 0x00, 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, 0x40, 0x28, 0x00, 
+0x80, 0x64, 0x00, 0x40, 0x40, 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, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc8, 
+0x00, 0xc8, 0x00, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 
+0x00, 0x00, 0x00, 0x00, 0x11, 0x16, 0x0c, 0x02, 0x0f, 0x78, 0x14, 0x00, 0x3c, 0x41, 0x44, 0x51, 
+0x45, 0x52, 0x46, 0x53, 0x56, 0x54, 0x55, 0x43, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x2f, 0x28, 0x00, 0x80, 0x78, 0x00, 0x40, 0x0e, 0x14, 0x01, 
+0x0a, 0x08, 0x07, 0x00, 0x82, 0x1f, 0x1e, 0x32, 0x01, 0x2c, 0x1b, 0x1a, 0x32, 0x01, 0x2c, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xef, 0x01, 0x3f, 0x00, 0x28, 0x00, 
+0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xf0, 0x01, 0x00, 0x00, 
+0x00, 0x04, 0x01, 0x00, 0x01, 0x01, 0x05, 0x02, 0x02, 0x30, 0x03, 0x07, 0x28, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x18, 
+0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 
+0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xc2, 0xaf, 0x51, 0x96, 0xe5, 0x9b, 0xb4, 
+0x5a, 0x16, 0xe5, 0x9a, 0xb4, 0xa5, 0x11, 0xe5, 0x99, 0xb4, 0xf0, 0x0c, 0xe5, 0x98, 0xb4, 0x0f, 
+0x07, 0x90, 0xff, 0x85, 0xe0, 0x44, 0x20, 0xf0, 0x75, 0x8a, 0x0a, 0xd2, 0xaf, 0x7f, 0x0c, 0x31, 
+0x6b, 0x12, 0x33, 0xd9, 0x91, 0xea, 0xf1, 0x7e, 0x80, 0xfa, 0x75, 0x8f, 0x81, 0x75, 0x8e, 0x80, 
+0x75, 0x8a, 0xa0, 0x75, 0x8a, 0x0a, 0x90, 0x00, 0x38, 0xe0, 0x70, 0x02, 0xa1, 0xae, 0x14, 0x70, 
+0x02, 0xa1, 0xd6, 0x24, 0xfc, 0x70, 0x02, 0xc1, 0xb0, 0x04, 0x60, 0x02, 0xe1, 0x02, 0xe4, 0xf5, 
+0x1d, 0xf5, 0x1c, 0xf5, 0x1b, 0xf5, 0x1a, 0x75, 0x0d, 0x2b, 0x75, 0x0e, 0x7b, 0x12, 0x35, 0x0c, 
+0xe4, 0xfd, 0xff, 0x51, 0xdb, 0xf1, 0x87, 0x12, 0x18, 0x3b, 0xe4, 0xf5, 0x19, 0xf1, 0x67, 0x74, 
+0x02, 0x93, 0xff, 0xe5, 0x19, 0xc3, 0x9f, 0x50, 0x33, 0xaf, 0x19, 0x12, 0x1f, 0xe6, 0xd3, 0xef, 
+0x94, 0xb0, 0xee, 0x94, 0x36, 0x40, 0x21, 0xe4, 0x7f, 0x01, 0xfe, 0xfd, 0xfc, 0xa9, 0x19, 0xa8, 
+0x01, 0x12, 0x0c, 0x3f, 0xe5, 0x1d, 0x4f, 0xf5, 0x1d, 0xe5, 0x1c, 0x4e, 0xf5, 0x1c, 0xe5, 0x1b, 
+0x4d, 0xf5, 0x1b, 0xe5, 0x1a, 0x4c, 0xf5, 0x1a, 0x05, 0x19, 0x80, 0xc1, 0x75, 0x0c, 0x04, 0xe5, 
+0x0c, 0x70, 0x02, 0xe1, 0x02, 0xff, 0x12, 0x34, 0xef, 0x8e, 0x0d, 0x8f, 0x0e, 0xef, 0x4e, 0x60, 
+0x05, 0xe4, 0x90, 0x00, 0x38, 0xf0, 0x90, 0x01, 0x5a, 0xe5, 0x0c, 0xf1, 0x66, 0x74, 0x85, 0x93, 
+0x90, 0x01, 0xa5, 0xf1, 0x66, 0x74, 0x86, 0x93, 0x90, 0x01, 0xa6, 0xf1, 0x66, 0x74, 0x87, 0x93, 
+0x90, 0x01, 0xa7, 0xf1, 0x66, 0x74, 0x88, 0x93, 0x90, 0x01, 0xa8, 0xf0, 0xe1, 0x02, 0xe4, 0x78, 
+0xa5, 0xf6, 0xf1, 0x8e, 0xef, 0x64, 0x01, 0x60, 0xf9, 0x12, 0x35, 0x0c, 0xaf, 0x0e, 0xae, 0x0d, 
+0x51, 0xf3, 0xe4, 0xfd, 0xff, 0x51, 0xdb, 0x71, 0x36, 0xe4, 0x78, 0xa8, 0xf6, 0x08, 0xf6, 0x90, 
+0x00, 0x38, 0x04, 0xf0, 0xe1, 0x02, 0xe4, 0x78, 0x60, 0xf6, 0x08, 0xf6, 0x90, 0x01, 0xaf, 0xe0, 
+0xb4, 0x01, 0x08, 0x90, 0x00, 0x38, 0x74, 0x05, 0xf0, 0xe1, 0x02, 0x78, 0xa5, 0x76, 0x01, 0xf1, 
+0x87, 0x12, 0x18, 0x3b, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x61, 0x12, 0x23, 0x77, 0x78, 0x60, 0xa6, 
+0x07, 0x78, 0x66, 0xe6, 0x60, 0x07, 0x78, 0x6c, 0xe6, 0x60, 0x02, 0xc1, 0x9f, 0x78, 0x61, 0xe6, 
+0x30, 0xe0, 0x0f, 0x08, 0x76, 0x00, 0x08, 0x76, 0x64, 0x08, 0x76, 0x01, 0x08, 0x76, 0x90, 0x08, 
+0x76, 0x01, 0x78, 0x66, 0xe6, 0x60, 0x11, 0x78, 0x63, 0xe6, 0x78, 0x5c, 0xf6, 0x78, 0x65, 0xe6, 
+0x78, 0x5d, 0xf6, 0x08, 0x76, 0x01, 0x80, 0x08, 0xe4, 0x78, 0x5c, 0xf6, 0x08, 0xf6, 0x08, 0xf6, 
+0x78, 0x1e, 0x7c, 0x00, 0x7d, 0x00, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x5c, 0x7e, 0x00, 0x7f, 0x03, 
+0x12, 0x08, 0xc2, 0x90, 0x01, 0x9f, 0xe0, 0xf5, 0x21, 0x75, 0x22, 0x0f, 0x12, 0x0d, 0x05, 0x78, 
+0x5f, 0xa6, 0x07, 0x78, 0x66, 0xe6, 0x60, 0x3d, 0x90, 0x01, 0xab, 0xe0, 0xff, 0x60, 0x15, 0x78, 
+0x5f, 0xe6, 0x70, 0x10, 0x12, 0x34, 0xfd, 0x70, 0x01, 0x06, 0x86, 0x04, 0xd3, 0x9f, 0xec, 0x9e, 
+0x40, 0x23, 0x80, 0x1b, 0x90, 0x01, 0xac, 0xe0, 0xff, 0x60, 0x1a, 0x78, 0x5f, 0xe6, 0xb4, 0x0c, 
+0x14, 0x12, 0x34, 0xfd, 0x70, 0x01, 0x06, 0x86, 0x04, 0xd3, 0x9f, 0xec, 0x9e, 0x40, 0x06, 0xe4, 
+0x90, 0x00, 0x38, 0xf0, 0x22, 0xf1, 0x87, 0x78, 0x61, 0xe6, 0xfd, 0x12, 0x30, 0xac, 0x80, 0x52, 
+0xf1, 0x67, 0x74, 0x02, 0x93, 0xff, 0x90, 0x01, 0x7b, 0xf0, 0x7e, 0x00, 0xe5, 0x0e, 0x24, 0x09, 
+0xfd, 0xe4, 0x35, 0x0d, 0xfa, 0xa9, 0x05, 0x7b, 0xff, 0x78, 0x7c, 0x7c, 0x01, 0x7d, 0x01, 0x12, 
+0x08, 0xc2, 0x90, 0x01, 0xaf, 0xe0, 0xb4, 0x01, 0x29, 0x75, 0x21, 0x01, 0x75, 0x22, 0x00, 0x75, 
+0x23, 0xf0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x01, 0x75, 0x26, 0x30, 0x7b, 0x01, 0x7a, 0x01, 0x79, 
+0x70, 0x12, 0x19, 0xb6, 0xe4, 0x90, 0x01, 0xaf, 0xf0, 0x75, 0x8a, 0xa0, 0x90, 0x00, 0x3a, 0xf0, 
+0x80, 0xd0, 0x90, 0x01, 0x95, 0xe0, 0x64, 0x03, 0x70, 0x20, 0x7f, 0x01, 0x12, 0x32, 0xe8, 0x7f, 
+0x3c, 0x31, 0x6b, 0x75, 0x8d, 0x83, 0x75, 0x8c, 0xe8, 0xf1, 0x7e, 0x75, 0x8a, 0xa0, 0xf0, 0x75, 
+0x91, 0xc3, 0xf5, 0x91, 0xf1, 0xee, 0xf1, 0xee, 0x80, 0xef, 0xe4, 0x75, 0x1c, 0x88, 0x75, 0x1b, 
+0x13, 0xf5, 0x1a, 0xf5, 0x19, 0x78, 0xa5, 0xe6, 0x60, 0x2b, 0xaf, 0x1c, 0xae, 0x1b, 0xad, 0x1a, 
+0xac, 0x19, 0xec, 0x4d, 0x4e, 0x4f, 0x60, 0x1d, 0xf1, 0x7e, 0x75, 0x91, 0xc1, 0xf5, 0x91, 0xef, 
+0x24, 0xff, 0xf5, 0x1c, 0xee, 0x34, 0xff, 0xf5, 0x1b, 0xed, 0x34, 0xff, 0xf5, 0x1a, 0xec, 0x34, 
+0xff, 0xf5, 0x19, 0x80, 0xd0, 0x22, 0xf0, 0x85, 0x0e, 0x82, 0x85, 0x0d, 0x83, 0x22, 0x75, 0xf0, 
+0x20, 0xa4, 0x24, 0x08, 0xff, 0xe4, 0x35, 0xf0, 0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 0x75, 0x8a, 
+0xa0, 0xe4, 0x90, 0x00, 0x3a, 0xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x62, 0x22, 0xe4, 0xf5, 
+0x1e, 0xaa, 0x0d, 0xa9, 0x0e, 0x7b, 0xff, 0x75, 0x22, 0x01, 0x75, 0x23, 0x00, 0x75, 0x24, 0x31, 
+0x12, 0x1b, 0x28, 0xf1, 0x67, 0xe4, 0x93, 0xf4, 0x60, 0x0f, 0x90, 0x00, 0x31, 0x12, 0x35, 0x1a, 
+0x40, 0x04, 0xf1, 0xe6, 0x40, 0x03, 0x75, 0x1e, 0x01, 0xf1, 0x67, 0x74, 0x01, 0x93, 0xf4, 0x60, 
+0x0f, 0x90, 0x00, 0x33, 0x12, 0x35, 0x1a, 0x40, 0x04, 0xf1, 0xe6, 0x40, 0x03, 0x75, 0x1e, 0x01, 
+0x78, 0x60, 0x7c, 0x01, 0x7d, 0x01, 0x7b, 0x01, 0x7a, 0x00, 0x79, 0x31, 0x7e, 0x00, 0x7f, 0x04, 
+0x12, 0x08, 0xc2, 0xaf, 0x1e, 0x22, 0xd3, 0xef, 0x94, 0xb8, 0xee, 0x94, 0x0b, 0x22, 0x75, 0x8a, 
+0xa0, 0xf0, 0x75, 0x8a, 0xa0, 0xf0, 0x22, 0x7c, 0x00, 0x7d, 0xb0, 0x7f, 0x15, 0x12, 0x33, 0x18, 
+0x90, 0xff, 0x10, 0xe0, 0x44, 0x18, 0xf0, 0x7e, 0x01, 0x7f, 0x00, 0x7d, 0x00, 0x7b, 0x01, 0x7a, 
+0x00, 0x79, 0xb0, 0x12, 0x0c, 0xd9, 0x51, 0xd5, 0x7d, 0x03, 0x7f, 0x12, 0x12, 0x28, 0x53, 0x90, 
+0xff, 0x1b, 0xe0, 0x54, 0xfb, 0xf0, 0x90, 0xff, 0x14, 0xe0, 0x44, 0x04, 0xf0, 0x90, 0x01, 0x57, 
+0x74, 0xb6, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0x04, 0xf0, 0xe4, 0x90, 0x01, 0x9c, 0xf0, 0xa3, 0x04, 
+0xf0, 0xa3, 0xf0, 0xa3, 0x74, 0x06, 0xf0, 0x90, 0x01, 0xa4, 0x74, 0x04, 0xf0, 0x90, 0x01, 0xa9, 
+0x74, 0x02, 0xf0, 0xa3, 0x74, 0x60, 0xf0, 0xa3, 0x74, 0x2d, 0xf0, 0xa3, 0x74, 0x32, 0xf0, 0xa3, 
+0x74, 0x01, 0xf0, 0xa3, 0xf0, 0x90, 0x01, 0x9b, 0x74, 0x64, 0xf0, 0x90, 0x01, 0x9a, 0x74, 0x03, 
+0xf0, 0xe4, 0x78, 0xb0, 0xf6, 0x11, 0x81, 0x78, 0xaf, 0x76, 0x01, 0xe4, 0x90, 0x00, 0xaf, 0xf0, 
+0x22, 0x90, 0x01, 0xad, 0xe0, 0xff, 0x30, 0xe0, 0x05, 0x43, 0x90, 0x10, 0x80, 0x03, 0x53, 0x90, 
+0xef, 0xef, 0x90, 0xff, 0x10, 0x30, 0xe1, 0x06, 0xe0, 0x54, 0xe7, 0xf0, 0x80, 0x04, 0xe0, 0x44, 
+0x18, 0xf0, 0x90, 0x01, 0xad, 0xe0, 0x30, 0xe2, 0x02, 0x51, 0xdd, 0x22, 0x8b, 0x1e, 0x8a, 0x1f, 
+0x89, 0x20, 0x8d, 0x21, 0x90, 0x01, 0xaa, 0xe0, 0xf5, 0x22, 0xe4, 0xf5, 0x23, 0x85, 0x21, 0x21, 
+0x51, 0xd5, 0x12, 0x1f, 0xea, 0xff, 0x7e, 0x00, 0x60, 0x02, 0x7e, 0x01, 0x90, 0x00, 0xb2, 0xee, 
+0xf0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x00, 0x75, 0x26, 0xb3, 0xef, 0x60, 0x10, 0x51, 0x44, 0xab, 
+0x24, 0xaa, 0x25, 0xa9, 0x26, 0x74, 0x10, 0x75, 0xf0, 0x00, 0x12, 0x0a, 0xc5, 0x7e, 0x00, 0x7f, 
+0x17, 0x7d, 0xff, 0x7b, 0x01, 0x7a, 0x00, 0x79, 0xb9, 0x12, 0x0c, 0xd9, 0x90, 0x00, 0xb2, 0xe0, 
+0xff, 0x78, 0xb0, 0xe6, 0xfe, 0x6f, 0x60, 0x24, 0xa3, 0xe0, 0x54, 0x3f, 0xf0, 0xee, 0x60, 0x06, 
+0xe0, 0x44, 0x40, 0xf0, 0x80, 0x0a, 0x90, 0x00, 0xb3, 0xe0, 0xf0, 0xe4, 0x90, 0x00, 0xb1, 0xf0, 
+0x90, 0x00, 0xb2, 0xe0, 0x78, 0xb0, 0xf6, 0x75, 0x23, 0x01, 0x80, 0x0d, 0xee, 0x60, 0x0a, 0x90, 
+0x00, 0xb3, 0xe0, 0x54, 0x3f, 0xf0, 0x44, 0x80, 0xf0, 0xe5, 0x22, 0x20, 0xe7, 0x1c, 0x30, 0xe6, 
+0x07, 0x51, 0x3d, 0x12, 0x1f, 0xea, 0x70, 0x12, 0xe5, 0x22, 0x30, 0xe5, 0x04, 0xe5, 0x23, 0x70, 
+0x09, 0xe5, 0x22, 0x30, 0xe4, 0x0b, 0xe5, 0x21, 0x60, 0x07, 0x90, 0x01, 0x9d, 0xe0, 0xff, 0x51, 
+0x97, 0x90, 0x01, 0xad, 0xe0, 0x78, 0xaf, 0x66, 0x60, 0x07, 0x11, 0x81, 0x90, 0x01, 0xad, 0xe0, 
+0xf6, 0x90, 0x00, 0xaf, 0xe0, 0x70, 0x02, 0x41, 0x3c, 0xe5, 0x21, 0x60, 0x13, 0x51, 0x3d, 0xe4, 
+0xf5, 0xf0, 0x12, 0x0a, 0xc5, 0x51, 0x3d, 0x90, 0x00, 0x02, 0xe4, 0xf5, 0xf0, 0x12, 0x0a, 0xe4, 
+0x75, 0x2b, 0x30, 0xaf, 0x2b, 0x05, 0x2b, 0x74, 0xb0, 0x2f, 0x51, 0x8f, 0x74, 0x30, 0xf0, 0x51, 
+0x8b, 0xe5, 0x21, 0xf0, 0x05, 0x2b, 0x51, 0x3d, 0x12, 0x1f, 0xea, 0x7f, 0x00, 0x60, 0x02, 0x7f, 
+0x01, 0x51, 0x8b, 0xef, 0xf0, 0x90, 0x00, 0x0a, 0x12, 0x09, 0x01, 0x60, 0x05, 0x51, 0x8b, 0xe0, 
+0x04, 0xf0, 0x75, 0x24, 0x01, 0x75, 0x25, 0x00, 0x75, 0x26, 0xe3, 0x51, 0x44, 0x51, 0x3d, 0x90, 
+0x00, 0x06, 0x51, 0x6f, 0x51, 0x3d, 0x90, 0x00, 0x08, 0x51, 0x6f, 0x90, 0x00, 0xf0, 0x74, 0x40, 
+0xf0, 0x90, 0x01, 0x10, 0x74, 0x60, 0xf0, 0x90, 0x01, 0x30, 0x74, 0x80, 0xf0, 0x75, 0x24, 0x01, 
+0x75, 0x25, 0x00, 0x75, 0x26, 0xf1, 0x75, 0x27, 0x01, 0x75, 0x28, 0x01, 0x75, 0x29, 0x11, 0x75, 
+0x2b, 0x81, 0xe4, 0xf5, 0x2a, 0xaf, 0x2a, 0x12, 0x1f, 0xe6, 0x51, 0x75, 0xaf, 0x2a, 0x12, 0x2b, 
+0x63, 0xab, 0x27, 0xe5, 0x29, 0xf9, 0x24, 0x02, 0xf5, 0x29, 0xe5, 0x28, 0xfa, 0x34, 0x00, 0xf5, 
+0x28, 0x51, 0x85, 0xaf, 0x2a, 0x12, 0x00, 0x03, 0xae, 0x2b, 0x05, 0x2b, 0x74, 0xb0, 0x2e, 0x51, 
+0x8f, 0xef, 0xf0, 0x05, 0x2a, 0xe5, 0x2a, 0xc3, 0x94, 0x10, 0x40, 0xc9, 0x22, 0xab, 0x1e, 0xaa, 
+0x1f, 0xa9, 0x20, 0x22, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x12, 0x0a, 0x15, 0xff, 0xae, 0xf0, 
+0xab, 0x24, 0xe5, 0x26, 0xf9, 0x24, 0x02, 0xf5, 0x26, 0xe5, 0x25, 0xfa, 0x34, 0x00, 0xf5, 0x25, 
+0xee, 0x8f, 0xf0, 0x12, 0x0a, 0xc5, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x90, 0x00, 0x02, 0x12, 
+0x0a, 0x40, 0xff, 0xae, 0xf0, 0xab, 0x24, 0xe5, 0x26, 0xf9, 0x24, 0x02, 0xf5, 0x26, 0xe5, 0x25, 
+0xfa, 0x34, 0x00, 0xf5, 0x25, 0xee, 0x8f, 0xf0, 0x02, 0x0a, 0xc5, 0x74, 0xb0, 0x25, 0x2b, 0xf5, 
+0x82, 0xe4, 0x34, 0x00, 0xf5, 0x83, 0x22, 0xac, 0x07, 0x90, 0x01, 0xad, 0xe0, 0xfd, 0x30, 0xe2, 
+0x0a, 0x90, 0xff, 0x19, 0xe0, 0x54, 0xfb, 0xf0, 0x43, 0xac, 0x08, 0x90, 0xff, 0x18, 0xe0, 0x54, 
+0xfb, 0xf0, 0xec, 0x12, 0x2f, 0x6e, 0x75, 0x8a, 0x0a, 0x75, 0x91, 0xc1, 0xf5, 0x91, 0x51, 0xd5, 
+0x90, 0x01, 0x9e, 0xe0, 0x12, 0x2f, 0x6e, 0x75, 0x8a, 0x0a, 0x78, 0xa5, 0x76, 0x01, 0xed, 0x30, 
+0xe2, 0x02, 0x51, 0xdd, 0x22, 0x90, 0xff, 0x18, 0xe0, 0x44, 0x04, 0xf0, 0x22, 0x90, 0xff, 0x19, 
+0xe0, 0x44, 0x04, 0xf0, 0x53, 0xac, 0xf7, 0x22, 0xef, 0x60, 0x0e, 0x43, 0xac, 0x10, 0x71, 0x05, 
+0x44, 0x18, 0xf0, 0xe4, 0xf5, 0xa6, 0xf5, 0xa2, 0x22, 0x11, 0x81, 0x75, 0xa6, 0x68, 0x75, 0xa2, 
+0xc1, 0x53, 0xac, 0xef, 0x22, 0x90, 0xff, 0x12, 0xe0, 0x54, 0xe7, 0xf0, 0x90, 0xff, 0x11, 0xe0, 
+0x44, 0x18, 0xf0, 0x90, 0xff, 0x10, 0xe0, 0x22, 0xab, 0x07, 0x8c, 0x56, 0x8d, 0x57, 0x71, 0x05, 
+0x54, 0xe7, 0xf0, 0x90, 0xff, 0x14, 0xe0, 0x44, 0x18, 0xf0, 0x90, 0xff, 0x1b, 0xe0, 0x44, 0x18, 
+0xf0, 0xe4, 0x90, 0x00, 0x39, 0xf0, 0x53, 0xac, 0xef, 0xf5, 0xa3, 0xeb, 0x44, 0x80, 0xf5, 0xa1, 
+0x75, 0xa6, 0x68, 0x75, 0xa2, 0xc1, 0x71, 0x53, 0xf5, 0xd5, 0x8f, 0xd4, 0x75, 0xd2, 0xff, 0x75, 
+0xd1, 0x5a, 0x22, 0xe0, 0x25, 0x57, 0xff, 0xe4, 0x35, 0x56, 0xf5, 0xd7, 0x8f, 0xd6, 0x22, 0xc0, 
+0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x85, 0xa3, 0x18, 0xaf, 0xa6, 0x75, 
+0xa3, 0x08, 0xef, 0x30, 0xe4, 0x0b, 0x90, 0x00, 0x39, 0x71, 0x53, 0x75, 0xd2, 0xff, 0x75, 0xd1, 
+0x5a, 0xe5, 0x18, 0x30, 0xe3, 0x16, 0xe5, 0xa6, 0x20, 0xe0, 0x0c, 0x75, 0xd2, 0x01, 0x75, 0xd5, 
+0x00, 0x75, 0xd4, 0x39, 0x75, 0xd1, 0x55, 0x75, 0xa3, 0x00, 0x80, 0x2d, 0xe5, 0x18, 0x30, 0xe0, 
+0x28, 0x90, 0x00, 0x39, 0xe0, 0xff, 0x25, 0x57, 0xfd, 0xe4, 0x35, 0x56, 0xf5, 0xd5, 0x8d, 0xd4, 
+0x75, 0xd2, 0xff, 0xef, 0xc3, 0x94, 0xc0, 0x40, 0x10, 0x75, 0xd1, 0x55, 0x90, 0x00, 0x39, 0xe0, 
+0xb4, 0xfe, 0x06, 0x90, 0x00, 0xaf, 0x74, 0x01, 0xf0, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 
+0xe0, 0x32, 0x75, 0x91, 0xcc, 0x75, 0x91, 0x00, 0x32, 0x12, 0x2f, 0xf7, 0x78, 0xa6, 0x76, 0x00, 
+0x08, 0x76, 0x28, 0x90, 0x00, 0x38, 0x74, 0x04, 0xf0, 0x22, 0x8b, 0x22, 0x8a, 0x23, 0x89, 0x24, 
+0x90, 0x01, 0x9a, 0xe0, 0x30, 0xe1, 0x76, 0xe4, 0xf5, 0x28, 0xf5, 0x29, 0x12, 0x2f, 0x67, 0x74, 
+0x02, 0x93, 0xff, 0xe5, 0x29, 0xc3, 0x9f, 0x50, 0x36, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x75, 
+0xf0, 0x02, 0xe5, 0x29, 0xa4, 0xf5, 0x82, 0x85, 0xf0, 0x83, 0x12, 0x0a, 0x40, 0xfb, 0xaa, 0xf0, 
+0x12, 0x2f, 0x67, 0x74, 0x07, 0x93, 0xfe, 0x74, 0x08, 0x93, 0xff, 0x7c, 0x00, 0x7d, 0x03, 0x12, 
+0x09, 0x62, 0xd3, 0xeb, 0x9f, 0xea, 0x9e, 0x40, 0x02, 0x05, 0x28, 0x05, 0x29, 0x80, 0xbd, 0x12, 
+0x2f, 0x67, 0x74, 0x02, 0x93, 0x75, 0xf0, 0x04, 0xa4, 0xff, 0xae, 0xf0, 0x7c, 0x00, 0x7d, 0x05, 
+0x12, 0x09, 0x74, 0xe5, 0x28, 0xc3, 0x9f, 0x40, 0x14, 0x91, 0x95, 0x74, 0xff, 0x12, 0x09, 0x2e, 
+0x91, 0x95, 0x90, 0x00, 0x01, 0x12, 0x09, 0x40, 0xe4, 0x90, 0x00, 0x38, 0xf0, 0x91, 0x95, 0x12, 
+0x08, 0xe8, 0xb4, 0x04, 0x1f, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x90, 0x00, 0x10, 0x12, 0x0a, 
+0x40, 0xff, 0xae, 0xf0, 0x7c, 0x00, 0x7d, 0x06, 0x12, 0x09, 0x74, 0x90, 0x00, 0x10, 0xee, 0x8f, 
+0xf0, 0x12, 0x0a, 0x78, 0x22, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 
+0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 
+0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x75, 0x89, 0x80, 0x90, 0x00, 0x3a, 0xe0, 
+0xc3, 0x94, 0x0a, 0x50, 0x06, 0xe0, 0x04, 0xf0, 0x75, 0x8a, 0x0a, 0x78, 0xa5, 0xe6, 0x60, 0x01, 
+0x16, 0x12, 0x2b, 0x0b, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 
+0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xef, 
+0x24, 0xfc, 0x70, 0x05, 0x7e, 0x2c, 0x7f, 0x04, 0x22, 0xe4, 0xfe, 0xff, 0x22, 0xef, 0x75, 0xf0, 
+0x64, 0xa4, 0xff, 0xae, 0xf0, 0x78, 0xa8, 0x08, 0x06, 0xe6, 0x18, 0x22, 0xaf, 0x0e, 0xae, 0x0d, 
+0x12, 0x25, 0x91, 0xaf, 0x0e, 0xae, 0x0d, 0x02, 0x29, 0xa1, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 
+0x94, 0x78, 0xee, 0x94, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0xb6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xa8, 
+0x43, 0x53, 0x57, 0x5f, 0x32, 0x32, 0x31, 0x31, 0x35, 0x32, 0x37, 0x5f, 0x43, 0x53, 0x54, 0x38, 
+0x31, 0x36, 0x44, 0x5f, 0x43, 0x4f, 0x42, 0x5f, 0x5a, 0x54, 0x5f, 0x59, 0x41, 0x54, 0x5f, 0x4b, 
+0x35, 0x5f, 0x47, 0x31, 0x5f, 0x4a, 0x4c, 0x5f, 0x35, 0x35, 0x30, 0x32, 0x38, 0x2e, 0x68, 0x65, 
+0x78, 
+]
+
+#endif /*CAPACITIVE_HYNITRON_CST816D_UPDATE_H__*/
diff --git a/3.code/1.watch/2.code/common.py b/3.code/1.watch/2.code/common.py
new file mode 100644 (file)
index 0000000..04489e7
--- /dev/null
@@ -0,0 +1,145 @@
+import _thread
+import utime
+from event_message import Event, EventManager
+
+
+class Lock(object):
+
+    def __init__(self):
+        self.lock = _thread.allocate_lock()
+
+    def __enter__(self, *args, **kwargs):
+        self.lock.acquire()
+
+    def __exit__(self, *args, **kwargs):
+        self.lock.release()
+
+
+class LOG_LV(object):
+    """日志等级"""
+    DEBUG = "DEBUG"
+    INFO = "INFO"
+    WARNING = "WARNING"
+    ERROR = "ERROR"
+    CRITICAL = "CRITICAL"
+
+
+class Abstract(object):
+    def post_processor_after_instantiation(self, *args, **kwargs):
+        """实例化后调用"""
+        pass
+
+    def post_processor_before_initialization(self, *args, **kwargs):
+        """初始化之前调用"""
+        pass
+
+    def initialization(self, *args, **kwargs):
+        """初始化load"""
+        pass
+
+    def post_processor_after_initialization(self, *args, **kwargs):
+        """初始化之后调用"""
+        pass
+
+
+class AbstractOutput(object):
+    def open(self):
+        pass
+
+    def output(self, message, **kwargs):
+        pass
+
+    def close(self):
+        pass
+
+
+class PrintLogOutput(AbstractOutput):
+    def output(self, message, **kwargs):
+        fmt = "{} [ {} ] {} {}"
+        print(fmt.format(*message))
+
+
+class LogService(Abstract):
+    """
+        default log is async queue
+        you can set
+    """
+    INSTANCE = None
+    REPORTER = PrintLogOutput()
+    LEVEL = LOG_LV.DEBUG
+    MODE = 1
+    LEVEL_MAP = {
+        LOG_LV.DEBUG: 0,
+        LOG_LV.INFO: 1,
+        LOG_LV.WARNING: 2,
+        LOG_LV.ERROR: 3,
+        LOG_LV.CRITICAL: 4
+    }
+
+    def __init__(self):
+        self.__event = Event(__name__)
+        self.__em = EventManager()
+        self.__em.register_event(self.__event)
+
+    @classmethod
+    def create(cls):
+        if not cls.INSTANCE:
+            cls.INSTANCE = LogService()
+            cls.INSTANCE.start()
+        return cls.INSTANCE
+
+    def log_send(self, tag, level, msg, mode):
+        if self.MODE:
+            mode = self.MODE
+        if self.LEVEL_MAP[level] >= self.LEVEL_MAP.get(self.LEVEL, 0):
+            output_format = "{ascdate} {asctime}"
+            rt = utime.localtime()
+            d_f = "{0:02}"
+            send_msg = (output_format.format(
+                ascdate=str(rt[0]) + "-" + d_f.format(rt[1]) + "-" + d_f.format(rt[2])
+                , asctime=d_f.format(rt[3]) + ":" + d_f.format(rt[4]) + ":" + d_f.format(rt[5])
+            ), tag, level, msg)
+            # self.REPORTER.output(send_msg)
+            print("{} [ {} ] {} {}".format(*send_msg))
+            # self.__event.post(send_msg)
+
+    def output(self, *args, **kwargs):
+        emo = kwargs.get("event_message")
+        self.REPORTER.output(emo.msg)
+
+    def start(self):
+        self.__event.add_handler(self.output)
+        self.__em.start()
+
+
+class LogAdapter(object):
+    """
+        log adapter mode
+        mode used : adapter proxy single LogService
+    """
+
+    def __init__(self, tag, enable=1):
+        self.log_service = LogService.create()
+        self.tag = tag
+        self.enable = enable
+        self.mode = 1
+
+    def critical(self, msg):
+        if self.enable:
+            self.log_service.log_send(self.tag, LOG_LV.CRITICAL, msg, self.mode)
+
+    def debug(self, msg):
+        if self.enable:
+            self.log_service.log_send(self.tag, LOG_LV.DEBUG, msg, self.mode)
+
+    def info(self, msg):
+        if self.enable:
+            self.log_service.log_send(self.tag, LOG_LV.INFO, msg, self.mode)
+
+    def warning(self, msg):
+        if self.enable:
+            self.log_service.log_send(self.tag, LOG_LV.WARNING, msg, self.mode)
+
+    def error(self, msg):
+        if self.enable:
+            self.log_service.log_send(self.tag, LOG_LV.ERROR, msg, self.mode)
diff --git a/3.code/1.watch/2.code/constants.py b/3.code/1.watch/2.code/constants.py
new file mode 100644 (file)
index 0000000..1c7ca85
--- /dev/null
@@ -0,0 +1,71 @@
+class PROTOCOL:
+    LK_SEND = "LK_SEND"
+    LK_RECV = "LK_RECV"
+
+    PING_SEND = "PING_SEND"
+    PING_RECV = "PING_RECV"
+
+    KA_SEND = "KA_SEND"
+    KA_RECV = "KA_RECV"
+
+    UD_SEND = "UD_SEND"
+    UD_RECV = "UD_RECV"
+
+    CR_SEND = "CR_SEND"
+    CR_RECV = "CR_RECV"
+
+    FIND_SEND = "FIND_SEND"
+    FIND_RECV = "FIND_RECV"
+
+    POWEROFF_SEND = "POWEROFF_SEND"
+    POWEROFF_RECV = "POWEROFF_RECV"
+
+    H10_SEND = "H10_SEND"
+    H10_RECV = "H10_RECV"
+
+    H11_SEND = "H11_SEND"
+    H11_RECV = "H11_RECV"
+
+    H12_SEND = "H12_SEND"
+    H12_RECV = "H12_RECV"
+
+    H13_SEND = "H13_SEND"
+    H13_RECV = "H13_RECV"
+
+    H14_SEND = "H14_SEND"
+    H14_RECV = "H14_RECV"
+
+class EVENT:
+    CHANNEL_SOCKET_SEND = "CHANNEL_SOCKET_SEND"
+    START_LOCATION = "START_LOCATION" 
+    READ_LOCATION = "READ_LOCATION"  
+    CLOSE_LOCATION = "CLOSE_LOCATION"
+    GPSOPEN = "GPSOPEN"
+    GPSCLOSE = "GPSCLOSE"
+    GPSINFO = "GPSINFO"
+    WIFISCANOPEN = "WIFISCANOPEN"
+    WIFIINFO = "WIFIINFO"
+
+    GET_KEY = "GET_KEY"
+    SET_KEY = "SET_KEY"
+    GET_IMEI = "GET_IMEI"
+    GET_CID = "GET_CID"
+    SET_CID = "SET_CID"
+    GET_IMSI = "GET_IMSI"
+    GET_PASSWORD = "GET_PASSWORD"
+    SET_PASSWORD = "SET_PASSWORD"
+    GET_BATTERY = "GET_BATTERY"
+    PERSISTENT_CONFIG_GET = "PERSISTENT_CONFIG_GET"
+    PERSISTENT_CONFIG_STORE = "PERSISTENT_CONFIG_STORE"
+    SET_PING = "SET_PING"
+    GET_PING = "GET_PING"
+    SET_CONNECT = "SET_CONNECT"
+    GET_CONNECT = "GET_CONNECT"
+    GET_STEP = "GET_STEP"
+    PUSH_STEP = "PUSH_STEP"
+    SYSTEM_SLEEP = "SYSTEM_SLEEP"
+    SYSTEM_UP = "SYSTEM_UP"
+    START_HEART = "START_HEART" 
+    PUSH_HEART = "PUSH_HEART"
+    START_BLOOD_OXYGEN = "STARTT_BLOOD_OXYGEN" 
+    PUSHT_BLOOD_OXYGEN = "PUSHT_BLOOD_OXYGEN"
\ No newline at end of file
diff --git a/3.code/1.watch/2.code/initTP.py b/3.code/1.watch/2.code/initTP.py
new file mode 100644 (file)
index 0000000..da53030
--- /dev/null
@@ -0,0 +1,214 @@
+import log
+from machine import I2C
+import utime
+from machine import Pin
+import example
+import uos
+ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
+uos.mount(ldev,'/ext')
+from ext import capacitive_hynitron_cst816d_update
+
+TP_HYN_I2C_UPDATE_WRITE_ADDR = (0x6A<<1)  
+TP_HYN_I2C_UPDATE_READ_ADDR =  ((0x6A<<1)|1)
+PER_LEN = 512
+x = 0
+y = 0
+#---------------------------------------------------------------------
+# cst816d_read_checksum
+#---------------------------------------------------------------------
+def cst816d_read_checksum():
+
+    if -1 == cst816d_enter_bootmode():
+        return -1
+
+    i2c_obj = I2C(I2C.I2C2, I2C.STANDARD_MODE)
+    cmd = [0]
+
+    ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x03]), 2, bytearray(cmd), 1)
+    print("读取checksum写命令 ret:{} cmd[0]:{:#X} ".format(ret,cmd[0]))
+    utime.sleep_ms(500)
+
+    r_data = bytearray(1)
+    ret = i2c_obj.read(TP_HYN_I2C_UPDATE_READ_ADDR>>1, bytearray([0xa0,0x08]), 2, r_data, 1, 0)
+    print("读取checksum读命令 ret:{} cmd[0]:{:#X} ".format(ret,r_data[0]))
+
+    return r_data[0]    
+#---------------------------------------------------------------------
+# GPIO_ResetTP
+#---------------------------------------------------------------------
+def GPIO_ResetTP():
+
+    print("GPIO_ResetTP")
+    
+    gpio_power = Pin(Pin.GPIO18, Pin.OUT, Pin.PULL_PU, 0)
+    gpio_power.write(1)
+
+    gpio_reset = Pin(Pin.GPIO32, Pin.OUT, Pin.PULL_PU, 0)
+    gpio_reset.write(0)
+    utime.sleep_ms(10)
+    gpio_reset.write(1)
+    utime.sleep_ms(10)
+
+#---------------------------------------------------------------------
+# cst816d_update
+#---------------------------------------------------------------------
+def cst816d_update(startAddr, length, data):
+    print("cst816d_update")
+    sum_len = 0
+    cmd = [0,0]
+    global x
+    while 1:
+        x += 1
+        #print("烧录次数:",str(x))
+        if sum_len >= length:
+            print("sum_len >= length,退出循环")
+            return
+        a = startAddr&0xFF
+        #print('cmd[0]',a)
+        cmd[0]=a
+        b = startAddr>>8
+        #print('cmd[1]',b)
+        cmd[1]=b
+        i2c_obj = I2C(I2C.I2C2, I2C.STANDARD_MODE)
+
+        ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x14]), 2, bytearray(cmd), 2)
+        utime.sleep(1)
+        #print("烧写固件第一次写命令 ret:{} cmd[0]:{:#X} cmd[1]:{:#X}".format(ret,cmd[0],cmd[1]))
+
+        ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x18]), 2, bytearray(data), PER_LEN)
+        utime.sleep(1)
+        #print("烧写固件包 ret : ",ret)
+        #print("data[0]:{:#X} data[1]:{:#X} data[2]:{:#X} data[510]:{:#X} data[511]:{:#X}".format(data[0],data[1],data[2],data[510],data[511]))
+
+        cmd[0] = 0xEE
+        ret = i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x04]), 2, bytearray(cmd), 1)
+        #print("烧写固件第二次写命令 ret:{} cmd[0]:{:#X} ".format(ret,cmd[0]))
+        utime.sleep(1)
+
+        retrycnt = 51
+        for i in range (retrycnt):
+            r_data = bytearray(1)
+            ret = i2c_obj.read(TP_HYN_I2C_UPDATE_READ_ADDR>>1, bytearray([0xa0,0x05]), 2, r_data, 1, 0)
+            utime.sleep(1)
+            #print("烧写固件读数据 ret:{} r_data[0]:{:#X} ".format(ret,r_data[0]))
+            if r_data[0] == 0x55:
+                print("r_data[0] = 0x55,break")
+                break
+        
+        startAddr = startAddr + PER_LEN
+        del data[0:PER_LEN]
+        #data = data + PER_LEN
+        sum_len = sum_len + PER_LEN 
+        #print("PER_LEN:",PER_LEN)
+        #print('startAddr:',hex(startAddr))
+        #print("data[0]:{:#X} data[1]:{:#X} data[2]:{:#X} data[510]:{:#X} data[511]:{:#X}".format(data[0],data[1],data[2],data[510],data[511]))
+        #print('sum_len:',sum_len)
+
+#---------------------------------------------------------------------
+# cst816d_enter_bootmode
+#---------------------------------------------------------------------
+def cst816d_enter_bootmode():
+
+    print("cst816s_enter_bootmode")
+    GPIO_ResetTP()
+    i2c_obj = I2C(I2C.I2C2, I2C.STANDARD_MODE)
+
+    cmd = [0xAB]
+    #进入boot模式
+    retrycnt = 10
+    global y
+    for i in range (retrycnt):
+        y += 1
+        print("第{}次尝试进入boot模式".format(y))
+        if 0 == i2c_obj.write(TP_HYN_I2C_UPDATE_WRITE_ADDR>>1, bytearray([0xa0,0x01]), 2, bytearray(cmd), 1):
+            utime.sleep_ms(2)
+            print("boot模式写命令 cmd[0]:{:#X} ".format(cmd[0]))
+        else:
+            print("boot模式写命令失败")
+
+        r_data = bytearray(1)
+        if -1 == i2c_obj.read(TP_HYN_I2C_UPDATE_READ_ADDR>>1, bytearray([0xa0,0x03]), 2, r_data, 1, 0):
+            utime.sleep_ms(2)
+            print("boot模式读flag失败")
+        else:
+            if 0xc1 == r_data[0]:
+                print("成功进入boot模式 flag:{:#X} ".format(r_data[0]))
+                utime.sleep_ms(2)
+                return 0
+            else:
+                print("boot模式进入失败")
+    
+    return -1
+#---------------------------------------------------------------------
+# ctp_hynitron_update
+#---------------------------------------------------------------------
+def ctp_hynitron_update():
+
+    print("ctp_hynitron_update")
+    # 初始化固件数组和数组长度
+    p_app_bin = []
+    app_bin_len = 0
+
+    #进入boot模式
+    if -1 == cst816d_enter_bootmode():
+        return 
+
+    #  获取固件数组
+    p_app_bin = capacitive_hynitron_cst816d_update.app_bin_816d
+    #  获取固件数组的长度
+    app_bin_len = len(p_app_bin)
+    print("获取固件文件 length ",app_bin_len)
+
+    if app_bin_len > 10:
+        startAddr = p_app_bin[1]
+        length = p_app_bin[3]
+        checksum = p_app_bin[5]
+
+        startAddr <<= 8; startAddr |= p_app_bin[0]
+        length <<= 8; length |= p_app_bin[2]
+        checksum <<= 8; checksum |= p_app_bin[4] 
+        print("startAddr:%x"%startAddr)
+        print("length:%x"%length) 
+        print("checksum:%x"%checksum)   
+
+        del p_app_bin[0:6]
+        cst816d_update(startAddr, length, p_app_bin)         
+
+        # #检查checksum
+        # if cst816d_read_checksum() != checksum:
+
+        #     del p_app_bin[0:6]
+        #     cst816d_update(startAddr, length, p_app_bin)
+
+        #     #升级后再次确认checksum
+        #     if checksum == cst816d_read_checksum():
+        #         print("固件升级成功!")
+
+        # elif checksum == cst816d_read_checksum():
+        #     print("固件包checksum相同")
+
+        # else:
+        #     print("checksum读取失败")  
+#---------------------------------------------------------------------
+# HYN_Initial
+#---------------------------------------------------------------------
+def HYN_Initial():
+
+    print("HYN_Initial")
+    GPIO_ResetTP()
+
+    ctp_hynitron_update() 
+
+    GPIO_ResetTP()
+#---------------------------------------------------------------------
+# main
+#---------------------------------------------------------------------
+print("tpcst816d_test: tp start init!!")
+HYN_Initial()
+print("tpcst816d_test: tp start init end!!")
+
+
+
+
+
+
diff --git a/3.code/1.watch/2.code/lcd.py b/3.code/1.watch/2.code/lcd.py
new file mode 100644 (file)
index 0000000..2f83db9
--- /dev/null
@@ -0,0 +1,198 @@
+import lvgl as lv
+from machine import LCD, Pin
+from tp import cst816
+import _thread
+import utime
+from ext import EventMesh
+
+
+init_data = (
+
+    0, 0, 0x11,
+    2, 0, 120, 
+
+    0, 1, 0x36,
+    1, 1, 0x00,
+
+    0, 1, 0x35,
+    1, 1, 0x00,
+
+    0, 1, 0x3a,
+    1, 1, 0x05,
+
+    0, 5, 0xB2,
+    1, 1, 0x0c,
+    1, 1, 0x0c,
+    1, 1, 0x00,
+    1, 1, 0x33,
+    1, 1, 0x33,
+
+    0, 1, 0xB7,
+    1, 1, 0x77,
+
+    0, 1, 0xBB,
+    1, 1, 0x2c,
+    
+    0, 1, 0xC0,
+    1, 1, 0x2C,
+
+    0, 1, 0xC2,
+    1, 1, 0x01,
+    
+    0, 1, 0xC3,
+    1, 1, 0x21,
+
+    0, 1, 0xC4,
+    1, 1, 0x20,
+
+    0, 1, 0xC6,
+    1, 1, 0x10,
+
+    0, 2, 0xD0,
+    1, 1, 0xA4,
+    1, 1, 0xA1,
+
+    0, 14, 0xE0,
+    1, 1, 0xd0,
+    1, 1, 0x03,
+    1, 1, 0x08,            
+    1, 1, 0x0e,
+    1, 1, 0x12,
+    1, 1, 0x2d,
+    1, 1, 0x42,
+    1, 1, 0x45,
+    1, 1, 0x53,
+    1, 1, 0x29,
+    1, 1, 0x16,
+    1, 1, 0x15,
+    1, 1, 0x22,
+    1, 1, 0x24,
+
+    0, 14, 0xE1,
+    1, 1, 0xd0,
+    1, 1, 0x03,
+    1, 1, 0x08,
+    1, 1, 0x0e,
+    1, 1, 0x13,
+    1, 1, 0x2c,
+    1, 1, 0x42,
+    1, 1, 0x54,
+    1, 1, 0x50,
+    1, 1, 0x2c,
+    1, 1, 0x16,
+    1, 1, 0x16,
+    1, 1, 0x20,
+    1, 1, 0x27,
+    #0, 0, 0x11,
+    0, 0, 0x21,
+    0, 0, 0x29,
+    #0, 1, 0xe7,
+    #1, 1, 0x11,
+)
+
+XSTART_H = 0xf0
+XSTART_L = 0xf1
+YSTART_H = 0xf2
+YSTART_L = 0xf3
+XEND_H = 0xE0
+XEND_L = 0xE1
+YEND_H = 0xE2
+YEND_L = 0xE3
+
+XSTART = 0xD0
+XEND = 0xD1
+YSTART = 0xD2
+YEND = 0xD3
+
+lcd = LCD()
+
+init_buf = bytearray(init_data)
+
+init_data2 = (
+    0, 4, 0x2a,
+    1, 1, XSTART_H,
+    1, 1, XSTART_L,
+    1, 1, XEND_H,
+    1, 1, XEND_L,
+    0, 4, 0x2b,
+    1, 1, YSTART_H,
+    1, 1, YSTART_L,
+    1, 1, YEND_H,
+    1, 1, YEND_L,
+    0, 0, 0x2c,
+)
+invalid = bytearray(init_data2)
+
+init_data3 = (
+    0, 0, 0x28,
+    2, 0, 120,
+    0, 0, 0x10,
+)
+displayoff = bytearray(init_data3)
+
+init_data4 = (
+    0, 0, 0x11,
+    2, 0, 20,
+    0, 0, 0x29,
+)
+displayon = bytearray(init_data4)
+
+
+lcd_ctrl = Pin(Pin.GPIO18, Pin.OUT, Pin.PULL_DISABLE, 1)
+lcd.lcd_init(init_buf, 240, 320, 52000, 1, 4, 0, invalid, displayon, displayoff, None,TESel = True,TEPin = 7)
+gpio_backlight = Pin(Pin.GPIO17, Pin.OUT, Pin.PULL_PU, 0)
+gpio_backlight.write(1)
+
+LCD_SIZE_W = 240
+LCD_SIZE_H = 320
+
+# 初始化lvgl
+lv.init()
+
+# Register SDL display driver.
+disp_buf1 = lv.disp_draw_buf_t()
+buf1_1 = bytearray(LCD_SIZE_W * LCD_SIZE_H * 2)
+buf1_2= bytearray(LCD_SIZE_W * LCD_SIZE_H * 2)
+
+disp_buf1.init(buf1_1, buf1_2, len(buf1_1))
+disp_drv = lv.disp_drv_t()
+disp_drv.init()
+disp_drv.draw_buf = disp_buf1
+disp_drv.flush_cb = lcd.lcd_write
+disp_drv.hor_res = LCD_SIZE_W
+disp_drv.ver_res = LCD_SIZE_H
+disp_drv.register()
+
+# CST816初始化
+tp_cst816 = cst816(i2c_no = 2,irq=33, reset=32)
+tp_cst816.activate()
+tp_cst816.init()
+print("cst816 init...")
+# LVGL触摸注册
+indev_drv = lv.indev_drv_t()
+indev_drv.init()
+indev_drv.type = lv.INDEV_TYPE.POINTER
+indev_drv.read_cb = tp_cst816.read
+indev_drv.long_press_time = 300
+indev_drv.register()
+gpio4 = Pin(Pin.GPIO33, Pin.OUT, Pin.PULL_PU, 0)
+
+# def indev_task():
+#     while 1:
+#         pos_s = tp_cst816.read_xy()
+#         # import _thread
+#         # x = _thread.get_heap_size()
+#         # print('heap:',x)
+#         if pos_s:
+#             if 100 == pos_s[0] and 400 == pos_s[1]:
+#                 EventMesh.publish("done_return")
+#                 print("return")
+#                 utime.sleep_ms(200)
+#         else:
+#             utime.sleep_ms(200)
+
+# _thread.start_new_thread(indev_task,())
+
+# 启动lvgv线程
+lv.tick_inc(5)
+lv.task_handler()
diff --git a/3.code/1.watch/2.code/location.py b/3.code/1.watch/2.code/location.py
new file mode 100644 (file)
index 0000000..dad1490
--- /dev/null
@@ -0,0 +1,1024 @@
+# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import ure
+import net
+import math
+import utime
+import osTimer
+import _thread
+import wifiScan
+import cellLocator
+
+from queue import Queue
+from machine import UART, Pin
+
+try:
+    from wifilocator import wifilocator
+except:
+    wifilocator = None
+
+from log import getLogger
+
+try:
+    import quecgnss
+except ImportError:
+    quecgnss = None
+
+log = getLogger(__name__)
+
+_gps_read_lock = _thread.allocate_lock()
+_gps_data_set_lock = _thread.allocate_lock()
+
+EE = 0.00669342162296594323
+EARTH_RADIUS = 6378.137  # Approximate Earth Radius(km)
+M_PI = math.pi
+
+
+class _loc_method(object):
+    gps = 0x1
+    cell = 0x2
+    wifi = 0x4
+
+
+class _gps_mode(object):
+    none = 0x0
+    internal = 0x1
+    external = 0x2
+
+
+def transformLat(x, y):
+    ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * math.sqrt(math.fabs(x))
+    ret += (20.0 * math.sin(6.0 * x * M_PI) + 20.0 * math.sin(2.0 * x * M_PI)) * 2.0 / 3.0
+    ret += (20.0 * math.sin(y * M_PI) + 40.0 * math.sin(y / 3.0 * M_PI)) * 2.0 / 3.0
+    ret += (160.0 * math.sin(y / 12.0 * M_PI) + 320 * math.sin(y * M_PI / 30.0)) * 2.0 / 3.0
+    return ret
+
+
+def transformLon(x, y):
+    ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * math.sqrt(math.fabs(x))
+    ret += (20.0 * math.sin(6.0 * x * M_PI) + 20.0 * math.sin(2.0 * x * M_PI)) * 2.0 / 3.0
+    ret += (20.0 * math.sin(x * M_PI) + 40.0 * math.sin(x / 3.0 * M_PI)) * 2.0 / 3.0
+    ret += (150.0 * math.sin(x / 12.0 * M_PI) + 300.0 * math.sin(x / 30.0 * M_PI)) * 2.0 / 3.0
+    return ret
+
+
+def WGS84ToGCJ02(lon, lat):
+    dLat = transformLat(lon - 105.0, lat - 35.0)
+    dLon = transformLon(lon - 105.0, lat - 35.0)
+    radLat = lat / 180.0 * M_PI
+    magic = math.sin(radLat)
+    magic = 1 - magic * magic * EE
+    sqrtMagic = math.sqrt(magic)
+
+    dLat = (dLat * 180.0) / ((EARTH_RADIUS * 1000 * (1 - EE)) / (magic * sqrtMagic) * M_PI)
+    dLon = (dLon * 180.0) / (EARTH_RADIUS * 1000 / sqrtMagic * math.cos(radLat) * M_PI)
+    lon02 = lon + dLon
+    lat02 = lat + dLat
+
+    return lon02, lat02
+
+
+class GPSMatch(object):
+    """This class is match gps NEMA 0183"""
+
+    def GxRMC(self, gps_data):
+        """Match Recommended Minimum Specific GPS/TRANSIT Data(RMC)
+
+        Args:
+            gps_data(str): GPS NMEA string.
+
+        Returns:
+            str: RMC NMEA string.
+        """
+        if gps_data:
+            rmc_re = ure.search(
+                r"\$G[NP]RMC,\d*\.*\d*,*[AV],*\d*\.*\d*,*[NS],*\d*\.*\d*,*[EW],*\d*\.*\d*,*\d*\.*\d*,*\d*,*\d*\.*\d*,*[EW]*,*[ADEN]*,*[SCUV]*\**(\d|\w)*",
+                gps_data)
+            if rmc_re:
+                return rmc_re.group(0)
+        return ""
+
+    def GxGGA(self, gps_data):
+        """Match Global Positioning System Fix Data(GGA)
+
+        Args:
+            gps_data(str): GPS NMEA string.
+
+        Returns:
+            str: GGA NMEA string.
+        """
+        if gps_data:
+            gga_re = ure.search(
+                r"\$G[BLPN]GGA,\d*\.*\d*,*\d*\.*\d*,*[NS],*\d*\.*\d*,*[EW],*[0126],*\d*,*\d*\.*\d*,*-*\d*\.*\d*,*M,*-*\d*\.*\d*,*M,*\d*,*\**(\d|\w)*",
+                gps_data)
+            if gga_re:
+                return gga_re.group(0)
+        return ""
+
+    def GxVTG(self, gps_data):
+        """Match Track Made Good and Ground Speed(VTG)
+
+        Args:
+            gps_data(str): GPS NMEA string.
+
+        Returns:
+            str: VTG NMEA string.
+        """
+        if gps_data:
+            vtg_re = ure.search(r"\$G[NP]VTG,\d*\.*\d*,*T,*\d*\.*\d*,*M,*\d*\.*\d*,*N,*\d*\.*\d*,*K,*[ADEN]*\*(\d|\w)*",
+                                gps_data)
+            if vtg_re:
+                return vtg_re.group(0)
+        return ""
+
+    def GxGSV(self, gps_data):
+        """Mactch GPS Satellites in View(GSV)
+
+        Args:
+            gps_data(str): GPS NMEA string.
+
+        Returns:
+            str: GSV NMEA string.
+        """
+        if gps_data:
+            gsv_re = ure.search(
+                r"\$G[NP]GSV,\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*\**(\d|\w)*",
+                gps_data)
+            if gsv_re:
+                return gsv_re.group(0)
+        return ""
+
+    def GxGLL(self, gps_data):
+        """Geographic Position
+
+        Args:
+            gps_data(str): GPS NMEA string.
+
+        Returns:
+            str: GLL NMEA string.
+        """
+        if gps_data:
+            gll_re = ure.search(r"\$G[NP]GLL,\d*\.*\d*,*[NS]*,*\d*\.*\d*,*[EW]*,*\d*\.*\d*,*[AV]*,*[ADEN]*\**(\d|\w)*",
+                                gps_data)
+            if gll_re:
+                return gll_re.group(0)
+
+    def GxGSA(self, gps_data):
+        """GNSS DOP and Active Satellites
+
+        Args:
+            gps_data(str): GPS NMEA string.
+
+        Returns:
+            str: GSA NMEA string.
+        """
+        if gps_data:
+            gsa_re = ure.search(
+                r"\$G[NP]GSA,[MA]*,*[123]*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*,*\d*\.*\d*,*\d*\.*\d*,*\d*\.*\d*,*(\d|\w)*\**(\d|\w)*",
+                gps_data)
+            if gsa_re:
+                return gsa_re.group(0)
+
+
+class GPSParse(object):
+    """Parse details from gps data"""
+
+    def GxGGA_satellite_num(self, gga_data):
+        """Parse satellite num from GGA"""
+        if gga_data:
+            satellite_num_re = ure.search(r",[EW],[0126],\d+,", gga_data)
+            if satellite_num_re:
+                return satellite_num_re.group(0).split(",")[-2]
+        return ""
+
+    def GxGGA_latitude(self, gga_data):
+        """Parse latitude from GGA"""
+        if gga_data:
+            latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)
+            if latitude_re:
+                latitude = latitude_re.group(0)[1:-3]
+                return str(float(latitude[:2]) + float(latitude[2:]) / 60)
+        return ""
+
+    def GxGGA_longitude(self, gga_data):
+        """Parse longitude from GGA"""
+        if gga_data:
+            longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)
+            if longitude_re:
+                longitude = longitude_re.group(0)[1:-3]
+                return str(float(longitude[:3]) + float(longitude[3:]) / 60)
+        return ""
+
+    def GxGGA_altitude(self, gga_data):
+        """Parse altitude from GGA"""
+        if gga_data:
+            altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data)
+            if altitude_re:
+                return altitude_re.group(0)[1:-3]
+        return ""
+
+    def GxVTG_speed(self, vtg_data):
+        """Parse speed from VTG"""
+        if vtg_data:
+            speed_re = ure.search(r",N,\d+\.\d+,K,", vtg_data)
+            if speed_re:
+                return speed_re.group(0)[3:-3]
+        return ""
+
+    def GxGSV_satellite_num(self, gsv_data):
+        """Parse satellite num from GSV"""
+        if gsv_data:
+            satellite_num_re = ure.search(r"\$G[NP]GSV,\d+,\d+,\d+,", gsv_data)
+            if satellite_num_re:
+                return satellite_num_re.group(0).split(",")[-2]
+        return ""
+
+    def GxRMC_loc_status(self, rmc_data):
+        if rmc_data:
+            loc_status_re = ure.search(r"\$G[NP]RMC,\d*\.*\d*,[AV],", rmc_data)
+            if loc_status_re:
+                loc_status = loc_status_re.group(0).split(",")[-2]
+                return True if loc_status == "A" else False
+        return False
+
+    def __nmea_parse(self, nmea):
+        return tuple(nmea[1:].split("*")[0].split(",")) if nmea else ()
+
+    def GxRMC(self, rmc_data):
+        return self.__nmea_parse(rmc_data)
+
+    def GxGGA(self, gga_data):
+        return self.__nmea_parse(gga_data)
+
+    def GxGSV(self, gsv_data):
+        return self.__nmea_parse(gsv_data)
+
+    def GxGSA(self, gsa_data):
+        return self.__nmea_parse(gsa_data)
+
+    def GxVTG(self, vtg_data):
+        return self.__nmea_parse(vtg_data)
+
+    def GxGLL(self, gll_data):
+        return self.__nmea_parse(gll_data)
+
+
+class GPS(object):
+    """This class if for reading gps data.
+
+    Now support external gps and internal gps.
+
+    Sleep power consumption:
+        power off < backup < standby
+    """
+
+    __RMC = 0
+    __GGA = 1
+    __GSV = 2
+    __GSA = 3
+    __VTG = 4
+    __GLL = 5
+    __NMEA = 0b010111
+
+    def __init__(self, UARTn, buadrate, databits, parity, stopbits, flowctl, PowerPin, StandbyPin, BackupPin, gps_mode):
+        """Init GPS module
+
+        [description]
+
+        Args:
+            UARTn(int): UART No.
+            buadrate(int): baud rate
+            databits(int): data bits (5 ~ 8)
+            parity(int): parity (0 – NONE,1 – EVEN,2 - ODD)
+            stopbits(int): stop bit
+            flowctl(int): hardware control flow (0 – FC_NONE, 1 – FC_HW)
+            PowerPin(int): Power GIPO Pin
+            StandbyPin(int): Standby GPIO Pin
+            BackupPin(int): Back GPIO Pin
+            gps_mode(int): GPS mode
+                0 - None
+                1 - internal GPS
+                2 - external GPS
+        """
+        self.__UARTn = UARTn
+        self.__buadrate = buadrate
+        self.__databits = databits
+        self.__parity = parity
+        self.__stopbits = stopbits
+        self.__flowctl = flowctl
+        self.__PowerPin = PowerPin
+        self.__StandbyPin = StandbyPin
+        self.__BackupPin = BackupPin
+        self.__gps_mode = gps_mode
+
+        self.__external_obj = None
+        self.__internal_obj = quecgnss
+        self.__gps_match = GPSMatch()
+        self.__gps_parse = GPSParse()
+        self.__gps_power_gpio = None
+        self.__gps_standby_gpio = None
+        self.__gps_backup_gpio = None
+
+        self.__external_retrieve_queue = None
+        self.__queue_size = 2
+        self.__first_break = 0
+        self.__break = 0
+        self.__gps_data = ""
+        self.__rmc_data = ""
+        self.__gga_data = ""
+        self.__vtg_data = ""
+        self.__gsv_data = ""
+        self.__gps_timer = osTimer()
+        self.__gps_data_check_timer = osTimer()
+
+        if self.__gps_mode & _gps_mode.external:
+            self.__external_init()
+        elif self.__gps_mode & _gps_mode.internal:
+            self.__internal_init()
+        #print("GPS:__init__%d",self.__gps_mode)
+    def __gps_power_control(self, GPIOn, onoff, method):
+        if method == "power_switch":
+            if self.__gps_power_gpio is None:
+                self.__gps_power_gpio = Pin(GPIOn, Pin.OUT, Pin.PULL_DISABLE, onoff)
+            gpio_obj = self.__gps_power_gpio
+        elif method == "standby":
+            if self.__gps_standby_gpio is None:
+                self.__gps_standby_gpio = Pin(GPIOn, Pin.OUT, Pin.PULL_DISABLE, onoff)
+            gpio_obj = self.__gps_standby_gpio
+        elif method == "backup":
+            if self.__gps_backup_gpio is None:
+                self.__gps_backup_gpio = Pin(GPIOn, Pin.OUT, Pin.PULL_DISABLE, onoff)
+            gpio_obj = self.__gps_backup_gpio
+        else:
+            raise TypeError("Param method %s is not compare." % method)
+
+        if gpio_obj.read() != onoff:
+            gpio_obj.write(onoff)
+            if gpio_obj.read() != onoff:
+                return False
+        return True
+
+    def __reverse_gps_data(self, this_gps_data):
+        """Reverse GPS data for regular match get the latest data"""
+        log.debug("this_gps_data: \n%s" % this_gps_data)
+        delimiter = "\r\n"
+        if this_gps_data:
+            _gps_data = self.__get_gps_data()
+            if _gps_data:
+                _gps_data = delimiter.join(_gps_data.split(delimiter)[::-1])
+            _gps_data += this_gps_data.strip().replace("\r", "").replace("\n", "").replace("$", delimiter + "$")
+            _gps_data = delimiter.join(_gps_data.split(delimiter)[::-1])
+            self.__set_gps_data(_gps_data)
+
+    def __read_latitude(self, gps_data):
+        """Read latitude from gps data"""
+        return self.__gps_parse.GxGGA_latitude(self.__gps_match.GxGGA(gps_data))
+
+    def __read_longitude(self, gps_data):
+        """Read longitude from gps data"""
+        return self.__gps_parse.GxGGA_longitude(self.__gps_match.GxGGA(gps_data))
+
+    def __read_altitude(self, gps_data):
+        """Read altitude from gps data"""
+        return self.__gps_parse.GxGGA_altitude(self.__gps_match.GxGGA(gps_data))
+
+    def __set_gps_data(self, gps_data):
+        self.__gps_data = gps_data
+
+    def __get_gps_data(self):
+        return self.__gps_data
+
+    def __gps_timer_callback(self, args):
+        """GPS read timer callback
+        When over time to get uart data, break queue wait
+        """
+        self.__break = 1
+        if self.__external_retrieve_queue is not None:
+            self.__external_retrieve_queue.put(False)
+
+    def __gps_data_check_callback(self, args):
+        """GPS read old data clean timer callback
+        When GPS read over time, clean old gps data, wait to read new gps data.
+        """
+        clean = False
+        if "" in (self.__rmc_data, self.__gga_data, self.__gsv_data):
+            clean = True
+        else:
+            if self.__nmea_statement_exist(self.__GSA) and not self.__gsa_data:
+                clean = True
+            elif self.__nmea_statement_exist(self.__VTG) and not self.__vtg_data:
+                clean = True
+            elif self.__nmea_statement_exist(self.__GLL) and not self.__gll_data:
+                clean = True
+
+        if clean:
+            self.__gps_nmea_data_clean()
+
+    def __external_init(self):
+        """External GPS init"""
+        self.__external_retrieve_queue = Queue(maxsize=self.__queue_size)
+
+    def __external_open(self):
+        """External GPS start, UART init"""
+        self.power_switch(1)
+        self.__external_obj = UART(
+            self.__UARTn,
+            self.__buadrate,
+            self.__databits,
+            self.__parity,
+            self.__stopbits,
+            self.__flowctl
+        )
+        self.__external_obj.set_callback(self.__external_retrieve_cb)
+
+    def __external_close(self):
+        """External GPS close, UART close, NOT GPS stop"""
+        self.__external_obj.close()
+
+    def __external_retrieve_cb(self, args):
+        """
+        GPS data retrieve callback from UART
+        When data comes, send a message to queue of data length
+        """
+        # log.debug("GPS __external_retrieve_cb args: %s" % str(args))
+        if self.__external_retrieve_queue.size() >= self.__queue_size:
+            self.__external_retrieve_queue.get()
+        self.__external_retrieve_queue.put(True)
+
+    def __internal_init(self):
+        """Internal GPS init"""
+        if self.__internal_obj:
+            if self.__internal_obj.init() != 0:
+                self.__internal_open()
+                log.error("GNSS INIT Failed.")
+            else:
+                log.debug("GNSS INIT Success.")
+        else:
+            log.error("Module quecgnss Import Error.")
+
+    def __internal_open(self):
+        """Internal GPS enable"""
+        if self.__internal_obj.get_state() == 0:
+            return True if self.__internal_obj.gnssEnable(1) == 0 else False
+        else:
+            return True
+
+    def __internal_close(self):
+        """Internal GPS close"""
+        return True if self.__internal_obj.gnssEnable(0) == 0 else False
+
+    def __nmea_statement_exist(self, nmea_item):
+        return (self.__NMEA & (0b1 << nmea_item)) >> nmea_item
+
+    def __gps_nmea_data_clean(self):
+        self.__set_gps_data("")
+        self.__rmc_data = ""
+        self.__gga_data = ""
+        self.__gsv_data = ""
+        self.__gsa_data = ""
+        self.__vtg_data = ""
+        self.__gll_data = ""
+
+    def __check_gps_valid(self, gps_data):
+        self.__reverse_gps_data(gps_data)
+
+        if not self.__rmc_data:
+            self.__rmc_data = self.__gps_match.GxRMC(self.__get_gps_data())
+        loc_status = self.__gps_parse.GxRMC_loc_status(self.__rmc_data)
+
+        if self.__rmc_data and loc_status:
+            if self.__nmea_statement_exist(self.__GGA) and not self.__gga_data:
+                self.__gga_data = self.__gps_match.GxGGA(self.__get_gps_data())
+            if self.__nmea_statement_exist(self.__GSV) and not self.__gsv_data:
+                self.__gsv_data = self.__gps_match.GxGSV(self.__get_gps_data())
+            if self.__nmea_statement_exist(self.__GSA) and not self.__gsa_data:
+                self.__gsa_data = self.__gps_match.GxGSA(self.__get_gps_data())
+            if self.__nmea_statement_exist(self.__VTG) and not self.__vtg_data:
+                self.__vtg_data = self.__gps_match.GxVTG(self.__get_gps_data())
+            if self.__nmea_statement_exist(self.__GLL) and not self.__gll_data:
+                self.__gll_data = self.__gps_match.GxGLL(self.__get_gps_data())
+
+            if self.__nmea_statement_exist(self.__GGA) and not self.__gga_data:
+                return False
+            if self.__nmea_statement_exist(self.__GSV) and not self.__gsv_data:
+                return False
+            if self.__nmea_statement_exist(self.__GSA) and not self.__gsa_data:
+                return False
+            if self.__nmea_statement_exist(self.__VTG) and not self.__vtg_data:
+                return False
+            if self.__nmea_statement_exist(self.__GLL) and not self.__gll_data:
+                return False
+            return True
+
+        return False
+
+    def __external_read(self):
+        """Read external GPS data
+
+        Return:
+            $GPTXT,01,01,02,ANTSTATUS=OPEN*2B
+            $GNRMC,073144.000,A,3149.330773,N,11706.946971,E,0.00,337.47,150422,,,D,V*07
+            $GNVTG,337.47,T,,M,0.00,N,0.00,K,D*22
+            $GNGGA,073144.000,3149.330773,N,11706.946971,E,2,19,0.66,85.161,M,-0.335,M,,*56
+            $GNGSA,A,3,01,195,06,03,21,194,19,17,30,14,,,0.94,0.66,0.66,1*02
+            $GNGSA,A,3,13,26,07,10,24,25,08,03,22,,,,0.94,0.66,0.66,4*03
+            $GPGSV,3,1,12,14,84,210,31,195,67,057,46,17,52,328,28,50,51,161,33,1*54
+            $GPGSV,3,2,12,194,49,157,33,03,48,090,37,19,36,305,32,06,34,242,32,1*58
+            $GPGSV,3,3,12,01,32,041,35,30,17,204,22,21,07,051,13,07,03,183,,1*6B
+            $BDGSV,5,1,18,07,86,063,30,10,75,322,30,08,60,211,34,03,52,192,33,1*71
+            $BDGSV,5,2,18,24,44,276,33,13,43,215,33,01,43,135,30,26,40,208,37,1*71
+            $BDGSV,5,3,18,02,38,230,,04,32,119,,22,26,135,30,19,25,076,,1*70
+            $BDGSV,5,4,18,05,17,251,,25,06,322,27,09,02,211,22,21,02,179,,1*78
+            $BDGSV,5,5,18,29,02,075,,20,01,035,,1*72
+            $GNGLL,3149.330773,N,11706.946971,E,073144.000,A,D*4E
+        """
+        self.__external_open()
+        log.debug("__external_read start")
+
+        while self.__break == 0:
+            self.__gps_timer.start(50, 0, self.__gps_timer_callback)
+            signal = self.__external_retrieve_queue.get()
+            log.debug("[first] signal: %s" % signal)
+            if signal:
+                to_read = self.__external_obj.any()
+                log.debug("[first] to_read: %s" % to_read)
+                if to_read > 0:
+                    self.__set_gps_data(self.__external_obj.read(to_read).decode())
+            self.__gps_timer.stop()
+        self.__break = 0
+
+        self.__gps_nmea_data_clean()
+        self.__gps_data_check_timer.start(2000, 1, self.__gps_data_check_callback)
+        cycle = 0
+        while self.__break == 0:
+            self.__gps_timer.start(1500, 0, self.__gps_timer_callback)
+            signal = self.__external_retrieve_queue.get()
+            log.debug("[second] signal: %s" % signal)
+            if signal:
+                to_read = self.__external_obj.any()
+                log.debug("[second] to_read: %s" % to_read)
+                if to_read > 0:
+                    if self.__check_gps_valid(self.__external_obj.read(to_read).decode()):
+                        self.__break = 1
+
+            self.__gps_timer.stop()
+            cycle += 1
+            if cycle >= self.__retry:
+                self.__break = 1
+            if self.__break != 1:
+                utime.sleep(1)
+        self.__gps_data_check_timer.stop()
+        self.__break = 0
+
+        # To check GPS data is usable or not.
+        self.__gps_data_check_callback(None)
+        self.__external_close()
+        log.debug("__external_read data: %s" % self.__get_gps_data())
+        return self.__get_gps_data()
+
+    def __internal_read(self):
+        from ext import EventMesh
+        log.debug("__internal_read start.")
+        """Read internal GPS data
+
+        Return:
+            $GPTXT,01,01,02,ANTSTATUS=OPEN*2B
+            $GNRMC,073144.000,A,3149.330773,N,11706.946971,E,0.00,337.47,150422,,,D,V*07
+            $GNVTG,337.47,T,,M,0.00,N,0.00,K,D*22
+            $GNGGA,073144.000,3149.330773,N,11706.946971,E,2,19,0.66,85.161,M,-0.335,M,,*56
+            $GNGSA,A,3,01,195,06,03,21,194,19,17,30,14,,,0.94,0.66,0.66,1*02
+            $GNGSA,A,3,13,26,07,10,24,25,08,03,22,,,,0.94,0.66,0.66,4*03
+            $GPGSV,3,1,12,14,84,210,31,195,67,057,46,17,52,328,28,50,51,161,33,1*54
+            $GPGSV,3,2,12,194,49,157,33,03,48,090,37,19,36,305,32,06,34,242,32,1*58
+            $GPGSV,3,3,12,01,32,041,35,30,17,204,22,21,07,051,13,07,03,183,,1*6B
+            $BDGSV,5,1,18,07,86,063,30,10,75,322,30,08,60,211,34,03,52,192,33,1*71
+            $BDGSV,5,2,18,24,44,276,33,13,43,215,33,01,43,135,30,26,40,208,37,1*71
+            $BDGSV,5,3,18,02,38,230,,04,32,119,,22,26,135,30,19,25,076,,1*70
+            $BDGSV,5,4,18,05,17,251,,25,06,322,27,09,02,211,22,21,02,179,,1*78
+            $BDGSV,5,5,18,29,02,075,,20,01,035,,1*72
+            $GNGLL,3149.330773,N,11706.946971,E,073144.000,A,D*4E
+        """
+
+        #self.__gps_nmea_data_clean()
+
+        cycle = 0
+        #while self.__break == 0:
+        gnss_data = quecgnss.read(1024*3)
+        #print("__internal_read")
+        #print(gnss_data)
+        if gnss_data and gnss_data[1]:
+            this_gps_data = gnss_data[1].decode() if len(gnss_data) > 1 and gnss_data[1] else ""
+            _gps_valid = self.__check_gps_valid(this_gps_data)
+            log.debug("_gps_valid: %s" % _gps_valid)
+            
+            #print("_gps_valid:",_gps_valid)
+            #print(str(_gps_valid),self.__get_gps_data())
+            if _gps_valid == True :
+                #EventMesh.publish("time", [self.__get_gps_data(),"0",str(_gps_valid),"0"])
+                return self.__get_gps_data()
+            else :
+                EventMesh.publish("time", [self.__get_gps_data(),"0",str(_gps_valid),"0"])
+                return ""
+        
+    def read(self, retry=30):
+        """For user to read gps data
+
+        Return: (res_code, gps_data)
+            res_code:
+                -  0: Success
+                - -1: Failed
+            gps_data:
+                $GPTXT,01,01,02,ANTSTATUS=OPEN*2B
+                $GNRMC,073144.000,A,3149.330773,N,11706.946971,E,0.00,337.47,150422,,,D,V*07
+                $GNVTG,337.47,T,,M,0.00,N,0.00,K,D*22
+                $GNGGA,073144.000,3149.330773,N,11706.946971,E,2,19,0.66,85.161,M,-0.335,M,,*56
+                $GNGSA,A,3,01,195,06,03,21,194,19,17,30,14,,,0.94,0.66,0.66,1*02
+                $GNGSA,A,3,13,26,07,10,24,25,08,03,22,,,,0.94,0.66,0.66,4*03
+                $GPGSV,3,1,12,14,84,210,31,195,67,057,46,17,52,328,28,50,51,161,33,1*54
+                $GPGSV,3,2,12,194,49,157,33,03,48,090,37,19,36,305,32,06,34,242,32,1*58
+                $GPGSV,3,3,12,01,32,041,35,30,17,204,22,21,07,051,13,07,03,183,,1*6B
+                $BDGSV,5,1,18,07,86,063,30,10,75,322,30,08,60,211,34,03,52,192,33,1*71
+                $BDGSV,5,2,18,24,44,276,33,13,43,215,33,01,43,135,30,26,40,208,37,1*71
+                $BDGSV,5,3,18,02,38,230,,04,32,119,,22,26,135,30,19,25,076,,1*70
+                $BDGSV,5,4,18,05,17,251,,25,06,322,27,09,02,211,22,21,02,179,,1*78
+                $BDGSV,5,5,18,29,02,075,,20,01,035,,1*72
+                $GNGLL,3149.330773,N,11706.946971,E,073144.000,A,D*4E
+        """
+        self.__retry = retry
+        gps_data = ""
+        if self.__gps_mode & _gps_mode.external:
+            gps_data = self.__external_read()
+        elif self.__gps_mode & _gps_mode.internal:
+            gps_data = self.__internal_read()
+
+        res = 0 if gps_data else -1
+        return (res, gps_data)
+
+    def read_coordinates(self, gps_data):
+        """Read positioning coordinates.
+
+        Params:
+            gps_data: read gps data.
+            map_coordinate_system: `WGS84` or GCJ02
+
+        Return:
+            (longitude, latitude, altitude)
+        """
+        latitude = self.__read_latitude(gps_data)
+        latitude = float(latitude) if latitude else latitude
+        longitude = self.__read_longitude(gps_data)
+        longitude = float(longitude) if longitude else longitude
+        altitude = self.__read_altitude(gps_data)
+        altitude = float(altitude) if altitude else altitude
+        return (longitude, latitude, altitude)
+
+    def power_switch(self, onoff):
+        """GPS module power switch
+
+        Params:
+            onoff: 0 -- off, 1 -- on
+        """
+        if self.__gps_mode & _gps_mode.external:
+            if self.__PowerPin is not None:
+                return self.__gps_power_control(self.__PowerPin, onoff, "power_switch")
+            else:
+                return False
+        elif self.__gps_mode & _gps_mode.internal:
+            # TODO: Interal GNSS power down will not be used this api.
+            if onoff == 0:
+                return self.__internal_close()
+            else:
+                return self.__internal_open()
+
+    def backup(self, onoff):
+        """GPS module low enery mode backup
+
+        Params:
+            onoff: 0 -- off, 1 -- on
+        """
+        if self.__BackupPin is not None:
+            return self.__gps_power_control(self.__BackupPin, onoff, "backup")
+        else:
+            return False
+
+    def standby(self, onoff):
+        """GPS module low enery mode standby
+
+        Params:
+            onoff: 0 -- off, 1 -- on
+        """
+        if self.__StandbyPin is not None:
+            return self.__gps_power_control(self.__StandbyPin, onoff, "standby")
+        else:
+            return False
+
+    def set_nmea_statement(self, nmea_statement):
+        """Set NMEA statement to check gps info valid
+
+        RMC, GGA, GSV must be required.
+
+        Args:
+            nmea_statement(int):
+                RMC - 0b1 << 0 (bit0), 0 - off, 1 - on
+                GGA - 0b1 << 1 (bit1), 0 - off, 1 - on
+                GSV - 0b1 << 2 (bit2), 0 - off, 1 - on
+                GSA - 0b1 << 3 (bit3), 0 - off, 1 - on
+                VTG - 0b1 << 4 (bit4), 0 - off, 1 - on
+                GLL - 0b1 << 5 (bit5), 0 - off, 1 - on
+
+        Returns:
+            bool: True - success, False - falied.
+        """
+        if nmea_statement >= 0b111:
+            self.__NMEA = nmea_statement
+            return True
+        return False
+
+
+class CellLocator(object):
+    """This class is for reading cell location data"""
+
+    def __init__(self, serverAddr, port, token, timeout, profileIdx):
+        self.__serverAddr = serverAddr
+        self.__port = port
+        self.__token = token
+        self.__timeout = timeout
+        self.__profileIdx = profileIdx
+
+    def read(self):
+        read_loc_res = self.__read_loc()
+        read_cell_res = self.__read_cell()
+        res = 0 if read_loc_res[0] == 0 or read_cell_res[0] == 0 else -1
+        return (res, read_loc_res[1], read_cell_res[1])
+
+    def __read_loc(self):
+        """Read cell location data.
+
+        Return: (res_code, loc_data)
+            res_code:
+                -  0: Success
+                - -1: Initialization failed
+                - -2: The server address is too long (more than 255 bytes)
+                - -3: Wrong key length, must be 16 bytes
+                - -4: The timeout period is out of range, the supported range is (1 ~ 300) s
+                - -5: The specified PDP network is not connected, please confirm whether the PDP is correct
+                - -6: Error getting coordinates
+            loc_data:
+                (117.1138, 31.82279, 550)
+        """
+        res = -1
+        loc_data = cellLocator.getLocation(
+            self.__serverAddr,
+            self.__port,
+            self.__token,
+            self.__timeout,
+            self.__profileIdx
+        )
+        if isinstance(loc_data, tuple) and len(loc_data) == 3:
+            res = 0
+        else:
+            res = loc_data
+            loc_data = ()
+
+        return (res, loc_data)
+
+    def __read_cell(self):
+        res = -1
+        near_cell = []
+        server_cell = []
+
+        near_cells = net.getCi()
+        if near_cells != -1 and isinstance(near_cells, list):
+            near_cell = list(map(str, near_cells))
+
+        server_cells = net.getCellInfo()
+        if server_cells != -1 and isinstance(server_cells, tuple):
+            server_cell = server_cells
+
+        res = 0 if near_cell or server_cell else -1
+        return (res, {"near_cell": near_cell, "server_cell": server_cell})
+
+
+class WiFiLocator(object):
+    """This class is for reading wifi location data"""
+
+    def __init__(self, token):
+        self.__wifilocator_obj = wifilocator(token)
+
+    def read(self):
+        read_loc_res = self.__read_loc()
+        read_mac_res = self.__read_mac()
+        res = 0 if read_loc_res[0] == 0 or read_mac_res[0] == 0 else -1
+        return (res, read_loc_res[1], read_mac_res[1])
+
+    def __read_loc(self):
+        """Read wifi location data.
+
+        Return: (res_code, loc_data)
+            res_code:
+                -  0: Success
+                - -1: The current network is abnormal, please confirm whether the dial-up is normal
+                - -2: Wrong key length, must be 16 bytes
+                - -3: Error getting coordinates
+            loc_data:
+                (117.1138, 31.82279, 550)
+        """
+        res = -1
+        loc_data = self.__wifilocator_obj.getwifilocator()
+        if isinstance(loc_data, tuple) and len(loc_data) == 3:
+            res = 0
+        else:
+            res = loc_data
+            loc_data = ()
+
+        return (res, loc_data)
+
+    def __read_mac(self):
+        res = -1
+        macs = []
+        if wifiScan.support():
+            if wifiScan.control(1) == 0:
+                if wifiScan.getState():
+                    wifisacn_start = wifiScan.start()
+                    if wifisacn_start != -1 and wifisacn_start[0] > 0:
+                        macs = [i[0] for i in wifisacn_start[1]]
+                        res = 0
+            wifiScan.control(0)
+        return (res, macs)
+
+
+class Location(object):
+    """This class is for reading location data from gps, cell, wifi"""
+    gps = None
+    cellLoc = None
+    wifiLoc = None
+
+    def __init__(self, loc_method, locator_init_params):
+        """Init Location module
+
+        1. If loc_method include gps then init gps module;
+        2. If loc_method inculde cell then init cell module;
+        3. If loc_method Include wifi then init wifi module;
+
+        Args:
+            loc_method(int):
+                1 - gps
+                2 - cell
+                3 - cell & gps
+                4 - wifi
+                5 - wifi & gps
+                6 - wifi & cell
+                7 - wifi & cell & gps
+            locator_init_params(dict):
+                gps_cfg(dict):GPS module init args
+                cell_cfg(dict):CELL module init args
+                wifi_cfg(dict):WIFI module init args
+        """
+        self.__loc_method = loc_method
+        self.__locator_init_params = locator_init_params
+        self.__locater_init()
+
+    def __locater_init(self):
+        """Init gps, cell, wifi by loc_method"""
+
+        if self.__loc_method & _loc_method.gps:
+            if self.gps is None:
+                _gps_cfg = self.__locator_init_params.get("gps_cfg", {})
+                if _gps_cfg:
+                    self.gps = GPS(**_gps_cfg)
+                    if _gps_cfg.get("nmea_cfg") is not None:
+                        self.gps.set_nmea_statement(_gps_cfg.get("nmea_cfg"))
+                else:
+                    raise ValueError("Invalid gps init parameters.")
+        else:
+            self.gps = None
+
+        if self.__loc_method & _loc_method.cell:
+            if self.cellLoc is None:
+                _cell_cfg = self.__locator_init_params.get("cell_cfg")
+                if _cell_cfg:
+                    self.cellLoc = CellLocator(**_cell_cfg)
+                else:
+                    raise ValueError("Invalid cell-locator init parameters.")
+        else:
+            self.cellLoc = None
+
+        if self.__loc_method & _loc_method.wifi:
+            if self.wifiLoc is None:
+                _wifi_cfg = self.__locator_init_params.get("wifi_cfg")
+                if _wifi_cfg:
+                    self.wifiLoc = WiFiLocator(**_wifi_cfg)
+                else:
+                    raise ValueError("Invalid wifi-locator init parameters.")
+        else:
+            self.wifiLoc = None
+
+    def __read_gps(self, retry):
+        """Read loction data from gps module
+
+        Return:
+            $GPTXT,01,01,02,ANTSTATUS=OPEN*2B
+            $GNRMC,073144.000,A,3149.330773,N,11706.946971,E,0.00,337.47,150422,,,D,V*07
+            $GNVTG,337.47,T,,M,0.00,N,0.00,K,D*22
+            $GNGGA,073144.000,3149.330773,N,11706.946971,E,2,19,0.66,85.161,M,-0.335,M,,*56
+            $GNGSA,A,3,01,195,06,03,21,194,19,17,30,14,,,0.94,0.66,0.66,1*02
+            $GNGSA,A,3,13,26,07,10,24,25,08,03,22,,,,0.94,0.66,0.66,4*03
+            $GPGSV,3,1,12,14,84,210,31,195,67,057,46,17,52,328,28,50,51,161,33,1*54
+            $GPGSV,3,2,12,194,49,157,33,03,48,090,37,19,36,305,32,06,34,242,32,1*58
+            $GPGSV,3,3,12,01,32,041,35,30,17,204,22,21,07,051,13,07,03,183,,1*6B
+            $BDGSV,5,1,18,07,86,063,30,10,75,322,30,08,60,211,34,03,52,192,33,1*71
+            $BDGSV,5,2,18,24,44,276,33,13,43,215,33,01,43,135,30,26,40,208,37,1*71
+            $BDGSV,5,3,18,02,38,230,,04,32,119,,22,26,135,30,19,25,076,,1*70
+            $BDGSV,5,4,18,05,17,251,,25,06,322,27,09,02,211,22,21,02,179,,1*78
+            $BDGSV,5,5,18,29,02,075,,20,01,035,,1*72
+            $GNGLL,3149.330773,N,11706.946971,E,073144.000,A,D*4E
+        """
+        if self.gps:
+            return self.gps.read(retry)[1]
+        return ""
+
+    def __read_cell(self):
+        """Read loction data from cell module
+
+        Return:
+            (117.1138, 31.82279, 550) or ()
+        """
+        if self.cellLoc:
+            cell_loc_data = self.cellLoc.read()
+            return (cell_loc_data[1], cell_loc_data[2])
+        return ()
+
+    def __read_wifi(self):
+        """Read loction data from wifi module
+
+        Return:
+            (117.1138, 31.82279, 550) or ()
+        """
+        if self.wifiLoc:
+            wifi_loc_data = self.wifiLoc.read()
+            return (wifi_loc_data[1], wifi_loc_data[2])
+        return ()
+
+    def read(self, retry=30):
+        """Read location data
+
+        args:
+            retry(int): gps read uart data retry count.
+
+        Returns:
+            dict:
+                key:
+                    1 - GPS data
+                    2 - CELL data
+                    4 - WIFI data
+            .e.g:
+            {
+                1: "$GPGGA,XXX",
+                2: (0.00, 0.00, 0.00),
+                4: (0.00, 0.00, 0.00),
+            }
+        """
+        loc_data = {}
+
+        if self.__loc_method & _loc_method.gps:
+            loc_data[_loc_method.gps] = self.__read_gps(retry)
+
+        if self.__loc_method & _loc_method.cell:
+            loc_data[_loc_method.cell] = self.__read_cell()
+
+        if self.__loc_method & _loc_method.wifi:
+            loc_data[_loc_method.wifi] = self.__read_wifi()
+
+        return loc_data
+
+    def wgs84togcj02(self, Longitude, Latitude):
+        return WGS84ToGCJ02(Longitude, Latitude)
+
+
+if __name__ == '__main__':
+    _gps_cfg = {
+        "UARTn": UART.UART1,
+        "buadrate": 115200,
+        "databits": 8,
+        "parity": 0,
+        "stopbits": 1,
+        "flowctl": 0,
+        "PowerPin": Pin.GPIO2,
+        "StandbyPin": Pin.GPIO3,
+        "BackupPin": None,
+        "gps_mode": 0x01,
+    }
+    gps = GPS(**_gps_cfg)
+    print("read {}".format(gps.read(300)))
diff --git a/3.code/1.watch/2.code/main_1.py b/3.code/1.watch/2.code/main_1.py
new file mode 100644 (file)
index 0000000..525ff7d
--- /dev/null
@@ -0,0 +1,148 @@
+
+
+
+class App(object):
+    def __init__(self):
+        self.managers = []
+
+    def append_manager(self, manager):
+        if isinstance(manager, Abstract):
+            manager.post_processor_after_instantiation()
+            self.managers.append(manager)
+        return self
+
+    def start(self):
+        for manager in self.managers:
+            manager.post_processor_before_initialization()
+            manager.initialization()
+            manager.post_processor_after_initialization()
+
+
+class watchApp(App):
+    def __init__(self):
+        super(watchApp, self).__init__()
+        self.__ui = None
+
+    def set_ui(self, ui):
+        self.__ui = ui
+
+    def start(self):
+        if self.__ui is not None:
+            self.__ui.start()
+        super().start()
+
+
+
+if __name__ == '__main__':
+    import uos
+    ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
+    uos.mount(ldev,'/ext')
+    res = uos.statvfs("/ext")
+    res = list(res)
+    print('总ext空间:{} MB,剩余空间:{} MB'.format((((res[0] * res[2]) / 1024 / 1024)),((res[0] * res[3]) / 1024 / 1024)))
+
+    from ext import EventMesh
+    from ext.common import Abstract
+    from ext.lcd import gpio_backlight,tp_cst816
+    from ext.btn_device_ec800m import BtnDevice
+    from ext.protocol import LK_ProtoCol,PING_ProtoCol, CR_ProtoCol,UD_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,ProtoColResolver
+    import ext.mgr as mgr
+    import ext.ui as _ui
+    from ext.mgr import ConfigStoreManager, DeviceInfoManager, LocationManager, SockManager, \
+    NetManager, BatteryManager,AddrBookManager,MsgManager,MsgdetailManager,CallLogManager,PhoneCallingManager
+    from ext.appAlipay import Alipay ,AlipayOpenScreen,Alipay_1_1,Alipay_invite,Alipay_inviting,\
+    Alipay_success,Alipay_paycode,Alipay_pay_success,Alipay_collect,Alipay_parent
+    from ext.ui_WatchFaceScreen import WatchFaceScreen
+    from ext.ui_main_menu import MainMenuScreen
+
+    btn_device = BtnDevice(tp_cst816)
+    btn_device.start()
+
+    ui = _ui.UI(gpio_backlight)
+    ui.add_screen(WatchFaceScreen()) 
+    ui.add_screen(_ui.PopupScreen()) 
+    ui.add_screen(_ui.PhoneScreen()) 
+    ui.add_screen(MainMenuScreen()) 
+    ui.add_screen(_ui.HeartrateScreen()) 
+    ui.add_screen(_ui.SettingScreen()) 
+    ui.add_screen(_ui.ToolboxScreen()) 
+    ui.add_screen(_ui.StepScreen()) 
+    ui.add_screen(_ui.AlarmScreen()) 
+    ui.add_screen(_ui.CountdownScreen()) 
+    ui.add_screen(_ui.StopwatchScreen()) 
+    ui.add_screen(_ui.WeatherScreen()) 
+    ui.add_screen(_ui.Spo2Screen()) 
+    ui.add_screen(_ui.TemperatureScreen()) 
+    ui.add_screen(_ui.ContactsScreen()) 
+    ui.add_screen(_ui.WechatScreen()) 
+    ui.add_screen(_ui.CountdownScreen()) 
+    ui.add_screen(_ui.LanguageScreen()) 
+    ui.add_screen(_ui.DialswitchScreen()) 
+    ui.add_screen(_ui.ThemeswitchScreen()) 
+    ui.add_screen(_ui.ImeiScreen()) 
+    ui.add_screen(_ui.AppScreen()) 
+    ui.add_screen(_ui.BrightnessScreen()) 
+    ui.add_screen(_ui.VolumeScreen()) 
+    ui.add_screen(_ui.RestoreScreen()) 
+    ui.add_screen(_ui.PoweroffScreen()) 
+    ui.add_screen(_ui.VersionScreen()) 
+    ui.add_screen(_ui.UpdateScreen()) 
+    ui.add_screen(_ui.AlarmvolumeScreen()) 
+    ui.add_screen(_ui.MsgvolumeScreen()) 
+    ui.add_screen(_ui.PhoneringScreen()) 
+    ui.add_screen(_ui.DialingScreen()) 
+    ui.add_screen(_ui.CallLogScreen()) 
+    ui.add_screen(AlipayOpenScreen()) 
+    ui.add_screen(Alipay_1_1())
+    ui.add_screen(Alipay_invite())  
+    ui.add_screen(Alipay_inviting()) 
+    ui.add_screen(Alipay_success()) 
+    ui.add_screen(Alipay_paycode()) 
+    ui.add_screen(Alipay_pay_success()) 
+    ui.add_screen(Alipay_collect()) 
+    ui.add_screen(Alipay_parent()) 
+    ui.add_screen(_ui.UIFINDScreen())
+    ui.add_screen(_ui.MsgDetailScreen())
+    ui.add_screen(_ui.IncomingCallScreen())
+    ui.add_screen(_ui.OnCallScreen())
+    # ui.add_screen(_ui.Setting2Screen())
+    # ui.add_screen(_ui.Setting3Screen())  
+
+
+    app = watchApp()
+    app.set_ui(ui)
+    app.append_manager(mgr.BrightNessLevelManager()) \
+        .append_manager(mgr.AlarmVolumeLevelManager()) \
+        .append_manager(mgr.MsgVolumeLevelManager()) \
+        .append_manager(mgr.PhoneVolumeLevelManager()) \
+        .append_manager(mgr.DeviceInfoManager()) \
+        .append_manager(mgr.BatteryManager()) \
+           
+        # .append_manager(mgr.StopwatchManager()) \
+        # .append_manager(mgr.CountdownManager()) \
+
+    app.append_manager(Alipay()) 
+    app.append_manager(ConfigStoreManager())
+    app.append_manager(NetManager())
+    app.append_manager(LocationManager())
+    app.append_manager(AddrBookManager())
+    app.append_manager(MsgManager())
+    app.append_manager(MsgdetailManager())
+    app.append_manager(CallLogManager())
+    app.append_manager(PhoneCallingManager())
+        
+    pcr = ProtoColResolver()
+    pcr.add_support(LK_ProtoCol())
+    pcr.add_support(PING_ProtoCol())
+    pcr.add_support(KA_ProtoCol())
+    pcr.add_support(UD_ProtoCol())
+    pcr.add_support(CR_ProtoCol())
+    pcr.add_support(FIND_ProtoCol())
+    pcr.add_support(POWEROFF_ProtoCol())
+    sm = SockManager()
+    sm.add_support_resolver(pcr)
+    app.append_manager(sm)
+    app.start()
+
+    EventMesh.publish("load_screen", {"screen": "watchface"})
+
diff --git a/3.code/1.watch/2.code/main_4.py b/3.code/1.watch/2.code/main_4.py
new file mode 100644 (file)
index 0000000..2f872f8
--- /dev/null
@@ -0,0 +1,15 @@
+import example
+import uos
+ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
+uos.mount(ldev,'/ext')
+
+#from usr.Alipay import Alipay
+
+#alipay = Alipay()
+#alipay.post_processor_after_instantiation()
+
+example.exec('/ext/initTP.py')
+
+ 
+
+    
\ No newline at end of file
diff --git a/3.code/1.watch/2.code/main_t.py b/3.code/1.watch/2.code/main_t.py
new file mode 100644 (file)
index 0000000..7c7eec6
--- /dev/null
@@ -0,0 +1,131 @@
+from ext import EventMesh
+from ext.common import Abstract
+from ext.lcd import gpio_backlight,tp_cst816
+from ext.btn_device_ec800m import BtnDevice
+
+
+class App(object):
+    def __init__(self):
+        self.managers = []
+
+    def append_manager(self, manager):
+        if isinstance(manager, Abstract):
+            manager.post_processor_after_instantiation()
+            self.managers.append(manager)
+        return self
+
+    def start(self):
+        for manager in self.managers:
+            manager.post_processor_before_initialization()
+            manager.initialization()
+            manager.post_processor_after_initialization()
+
+
+class watchApp(App):
+    def __init__(self):
+        super(watchApp, self).__init__()
+        self.__ui = None
+
+    def set_ui(self, ui):
+        self.__ui = ui
+
+    def start(self):
+        if self.__ui is not None:
+            self.__ui.start()
+        super().start()
+
+
+
+if __name__ == '__main__':
+ 
+    # ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
+    # uos.mount(ldev,'/ext')
+    #import ext.ui as _ui
+    from ext.protocol import LK_ProtoCol,PING_ProtoCol, CR_ProtoCol,UD_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,ProtoColResolver
+    import ext.mgr as mgr
+    import ext.ui as _ui
+    from ext.mgr import ConfigStoreManager, DeviceInfoManager, LocationManager, SockManager, \
+    NetManager, BatteryManager
+    from ext.Alipay import Alipay
+    from ext.ui_WatchFaceScreen import WatchFaceScreen
+
+    btn_device = BtnDevice(tp_cst816)
+    btn_device.start()
+
+    ui = _ui.UI(gpio_backlight)
+    ui.add_screen(WatchFaceScreen()) \
+        .add_screen(_ui.PopupScreen()) \
+        .add_screen(_ui.PhoneScreen()) \
+        .add_screen(_ui.TilemenuScreen()) \
+        .add_screen(_ui.HeartrateScreen()) \
+        .add_screen(_ui.SettingScreen()) \
+        .add_screen(_ui.ToolboxScreen()) \
+        .add_screen(_ui.StepScreen()) \
+        .add_screen(_ui.AlarmScreen()) \
+        .add_screen(_ui.CountdownScreen()) \
+        .add_screen(_ui.StopwatchScreen()) \
+        .add_screen(_ui.WeatherScreen()) \
+        .add_screen(_ui.Spo2Screen()) \
+        .add_screen(_ui.TemperatureScreen()) \
+        .add_screen(_ui.ContactsScreen()) \
+        .add_screen(_ui.WechatScreen()) \
+        .add_screen(_ui.CountdownScreen()) \
+        .add_screen(_ui.LanguageScreen()) \
+        .add_screen(_ui.DialswitchScreen()) \
+        .add_screen(_ui.ThemeswitchScreen()) \
+        .add_screen(_ui.ImeiScreen()) \
+        .add_screen(_ui.AppScreen()) \
+        .add_screen(_ui.BrightnessScreen()) \
+        .add_screen(_ui.VolumeScreen()) \
+        .add_screen(_ui.RestoreScreen()) \
+        .add_screen(_ui.PoweroffScreen()) \
+        .add_screen(_ui.VersionScreen()) \
+        .add_screen(_ui.UpdateScreen()) \
+        .add_screen(_ui.AlarmvolumeScreen()) \
+        .add_screen(_ui.MsgvolumeScreen()) \
+        .add_screen(_ui.PhoneringScreen()) \
+        .add_screen(_ui.DialingScreen()) \
+        .add_screen(_ui.AlipayinviteScreen()) \
+        .add_screen(_ui.AlipayinvitedefaultScreen()) \
+        .add_screen(_ui.AlipayinvitewaitScreen()) \
+        .add_screen(_ui.AlipayinvitesuccessScreen()) \
+        .add_screen(_ui.AlipayMenuScreen()) \
+        .add_screen(_ui.AlipaySettingScreen()) \
+        .add_screen(_ui.AlipayPaycodeScreen()) \
+        .add_screen(_ui.AlipayCollectScreen()) \
+        .add_screen(_ui.PaymentSuccessScreen()) \
+        .add_screen(_ui.RedbagdetailScreen()) \
+        
+                
+    app = watchApp()
+    app.set_ui(ui)
+    app.append_manager(mgr.BrightNessLevelManager()) \
+        .append_manager(mgr.AlarmVolumeLevelManager()) \
+        .append_manager(mgr.MsgVolumeLevelManager()) \
+        .append_manager(mgr.PhoneVolumeLevelManager()) \
+        .append_manager(mgr.DeviceInfoManager()) \
+        .append_manager(mgr.BatteryManager()) \
+           
+        # .append_manager(mgr.StopwatchManager()) \
+        # .append_manager(mgr.CountdownManager()) \
+
+    app.append_manager(Alipay()) 
+    app.append_manager(ConfigStoreManager())
+    app.append_manager(NetManager())
+    app.append_manager(LocationManager())
+        
+    pcr = ProtoColResolver()
+    pcr.add_support(LK_ProtoCol())
+    pcr.add_support(PING_ProtoCol())
+    pcr.add_support(KA_ProtoCol())
+    pcr.add_support(UD_ProtoCol())
+    pcr.add_support(CR_ProtoCol())
+    pcr.add_support(FIND_ProtoCol())
+    pcr.add_support(POWEROFF_ProtoCol())
+    sm = SockManager()
+    sm.add_support_resolver(pcr)
+    app.append_manager(sm)
+    app.start()
+
+    EventMesh.publish("load_screen", {"screen": "watchface"})
+
diff --git a/3.code/1.watch/2.code/mgr.py b/3.code/1.watch/2.code/mgr.py
new file mode 100644 (file)
index 0000000..2ad1eab
--- /dev/null
@@ -0,0 +1,1225 @@
+from ext.common import Abstract, LogAdapter
+from ext import EventMesh
+import usocket
+import ql_fs
+import ujson
+import _thread
+import modem
+import utime
+import sim
+import net
+import dataCall
+import checkNet
+import osTimer
+from ext import constants
+
+from ext.common import Lock, Abstract, LogAdapter
+from ext.location import GPS, GPSMatch,CellLocator
+from misc import USB, Power, ADC
+from machine import ExtInt, Pin,Timer,RTC,UART
+from ext import EventMesh
+import audio
+from Gsensor import SC7A20
+from Hsensor import GH3018
+import quecgnss
+import wifiScan
+import math
+import voiceCall
+
+class BrightNessLevelManager(Abstract):
+    def __init__(self):
+        self.level = 0
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("push_add_brightness_level", self.add)
+        EventMesh.subscribe("push_reduce_brightness_level", self.reduce)
+        EventMesh.subscribe("get_brightness_level", self.get)
+
+    def add(self, event, msg):
+        if self.level < 7:
+            self.level = self.level + 1
+
+    def reduce(self, event, msg):
+        if self.level > 0:
+            self.level = self.level - 1
+
+    def get(self, event=None, msg=None):
+        return self.level
+
+class PhoneVolumeLevelManager(Abstract):
+    def __init__(self):
+        self.level = 0
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("push_add_phonering_level", self.add)
+        EventMesh.subscribe("push_reduce_phonering_level", self.reduce)
+        EventMesh.subscribe("get_phonering_level", self.get)
+
+    def add(self, event, msg):
+        if self.level < 7:
+            self.level = self.level + 1
+
+    def reduce(self, event, msg):
+        if self.level > 0:
+            self.level = self.level - 1
+
+    def get(self, event=None, msg=None):
+        return self.level
+
+class MsgVolumeLevelManager(Abstract):
+    def __init__(self):
+        self.level = 0
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("push_add_msgvolume_level", self.add)
+        EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce)
+        EventMesh.subscribe("get_msgvolume_level", self.get)
+
+    def add(self, event, msg):
+        if self.level < 7:
+            self.level = self.level + 1
+
+    def reduce(self, event, msg):
+        if self.level > 0:
+            self.level = self.level - 1
+
+    def get(self, event=None, msg=None):
+        return self.level
+
+class AlarmVolumeLevelManager(Abstract):
+    def __init__(self):
+        self.level = 0
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("push_add_alarmvolume_level", self.add)
+        EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce)
+        EventMesh.subscribe("get_alarmvolume_level", self.get)
+
+    def add(self, event, msg):
+        if self.level < 7:
+            self.level = self.level + 1
+
+    def reduce(self, event, msg):
+        if self.level > 0:
+            self.level = self.level - 1
+
+    def get(self, event=None, msg=None):
+        return self.level
+        
+class StopwatchManager(Abstract):
+    def __init__(self):
+        self.level = 0
+        self.ms_value = 0
+        self.sec_value = 0
+        self.min_value = 0
+        self.timer = Timer(Timer.Timer1)
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("stopwatch_start", self.start)
+        EventMesh.subscribe("stopwatch_stop", self.paused)
+        EventMesh.subscribe("stopwatch_reset", self.reset)
+        EventMesh.subscribe("get_stopwatch_ms", self.get_ms)
+        EventMesh.subscribe("get_stopwatch_sec", self.get_sec)
+        EventMesh.subscribe("get_stopwatch_min", self.get_min)
+
+    def start(self, event, msg):        
+        self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun)
+    
+    def paused(self, event, msg):        
+        self.timer.stop()
+    
+    def reset(self, event, msg):
+        self.timer.stop()
+        self.sec_value = 0
+        self.min_value = 0
+        self.ms_value = 0
+
+    def fun(self):
+        self.ms_value += 1
+        if self.ms_value > 9:
+            self.ms_value = 0   
+            self.sec_value += 1
+        if self.sec_value > 60:
+            self.sec_value = 0
+            self.min_value += 1
+        if self.min_value > 60:
+            self.timer.stop()
+
+    def get_ms(self, event=None, msg=None):
+        return self.ms_value
+
+    def get_min(self, event=None, msg=None):
+        return self.min_value
+
+    def get_sec(self, event=None, msg=None):
+        return self.sec_value
+
+class CountdownManager(Abstract):
+    def __init__(self):
+        self.level = 0
+        self.sec = 0
+        self.min = 0
+        self.hour = 0
+        self.timer = Timer(Timer.Timer3)
+        self.total = 0
+        
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("add_countdown_sec", self.add_sec)
+        EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec)
+        EventMesh.subscribe("add_countdown_min", self.add_min)
+        EventMesh.subscribe("reduce_countdown_min", self.reduce_min)
+        EventMesh.subscribe("add_countdown_hour", self.add_hour)
+        EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour)
+        EventMesh.subscribe("get_countdown_sec", self.get_sec)
+        EventMesh.subscribe("get_countdown_min", self.get_min)
+        EventMesh.subscribe("get_countdown_hour", self.get_hour)
+        EventMesh.subscribe("stopwatch_start", self.start)
+        EventMesh.subscribe("stopwatch_reset", self.reset)
+
+    
+
+
+
+    def add_sec(self, event, msg):
+        if self.sec < 59:
+            self.sec = self.sec + 1
+
+    def reduce_sec(self, event, msg):
+        if self.sec > 0:
+            self.sec = self.sec - 1
+
+    def add_min(self, event, msg):
+        if self.min < 59:
+            self.min = self.min + 1
+
+    def reduce_min(self, event, msg):
+        if self.min > 0:
+            self.min = self.min - 1
+
+    def add_hour(self, event, msg):
+        if self.hour < 23:
+            self.hour = self.hour + 1
+
+    def reduce_hour(self, event, msg):
+        if self.hour > 0:
+            self.hour = self.hour - 1
+
+    def get_sec(self, event=None, msg=None):
+        return self.sec
+
+    def get_min(self, event=None, msg=None):
+        return self.min
+
+    def get_hour(self, event=None, msg=None):
+        return self.hour
+    
+    def start(self, event=None, msg=None):
+        self.timer.start(period=1000, mode=self.timer.PERIODIC, callback=self.fun)
+
+    def fun(self):
+
+        self.total = self.get_hour()*60*60 + self.get_min()*60 + self.get_sec()
+        self.total = self.total - 1
+        self.hour = self.total/3600
+        self.min = (self.total - self.hour*3600) / 60
+        self.sec = self.total % 60
+
+        if self.total < 1:
+            self.timer.stop()
+    
+    def reset(self, event=None, msg=None):
+        self.hour = 0
+        self.min = 0
+        self.sec = 0
+        self.timer.stop()
+    
+    def pause(self, event=None, msg=None):
+        self.timer.stop()
+
+BATTERY_OCV_TABLE = {
+    "nix_coy_mnzo2": {
+        55: {
+            4152: 100, 4083: 95, 4023: 90, 3967: 85, 3915: 80, 3864: 75, 3816: 70, 3773: 65, 3737: 60, 3685: 55,
+            3656: 50, 3638: 45, 3625: 40, 3612: 35, 3596: 30, 3564: 25, 3534: 20, 3492: 15, 3457: 10, 3410: 5, 3380: 0,
+        },
+        20: {
+            4143: 100, 4079: 95, 4023: 90, 3972: 85, 3923: 80, 3876: 75, 3831: 70, 3790: 65, 3754: 60, 3720: 55,
+            3680: 50, 3652: 45, 3634: 40, 3621: 35, 3608: 30, 3595: 25, 3579: 20, 3548: 15, 3511: 10, 3468: 5, 3430: 0,
+        },
+        0: {
+            4147: 100, 4089: 95, 4038: 90, 3990: 85, 3944: 80, 3899: 75, 3853: 70, 3811: 65, 3774: 60, 3741: 55,
+            3708: 50, 3675: 45, 3651: 40, 3633: 35, 3620: 30, 3608: 25, 3597: 20, 3585: 15, 3571: 10, 3550: 5, 3500: 0,
+        },
+    },
+}
+
+
+
+class Battery(object):
+    """This class is for battery info.
+
+    This class can get battery voltage and energy.
+    if adc_args is not None, use cbc to read battery
+
+    adc_args: (adc_num, adc_period, factor)
+
+        adc_num: ADC channel num
+        adc_period: Cyclic read ADC cycle period
+        factor: calculation coefficient
+    """
+
+    def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None):
+        self.__energy = 100
+        self.__temp = 55
+
+        # ADC params
+        self.__adc = None
+        if adc_args:
+            self.__adc_num, self.__adc_period, self.__factor = adc_args
+            if not isinstance(self.__adc_num, int):
+                raise TypeError("adc_args adc_num is not int number.")
+            if not isinstance(self.__adc_period, int):
+                raise TypeError("adc_args adc_period is not int number.")
+            if not isinstance(self.__factor, float):
+                raise TypeError("adc_args factor is not int float.")
+            self.__adc = ADC()
+
+        # Charge params
+        self.__charge_callback = None
+        self.__charge_status = None
+        self.__chrg_gpion = chrg_gpion
+        self.__stdby_gpion = stdby_gpion
+        self.__chrg_gpio = None
+        self.__stdby_gpio = None
+        self.__chrg_exint = None
+        self.__stdby_exint = None
+        if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+            self.__init_charge()
+
+    def __chrg_callback(self, args):
+        self.__update_charge_status()
+        if self.__charge_callback is not None:
+            self.__charge_callback(self.__charge_status)
+
+    def __stdby_callback(self, args):
+        self.__update_charge_status()
+        if self.__charge_callback is not None:
+            self.__charge_callback(self.__charge_status)
+
+    def __update_charge_status(self):
+        if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1:
+            self.__charge_status = 0
+        elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1:
+            self.__charge_status = 1
+        elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0:
+            self.__charge_status = 2
+        else:
+            raise TypeError("CHRG and STDBY cannot be 0 at the same time!")
+
+    def __init_charge(self):
+        self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE)
+        self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE)
+        self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback)
+        self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU,
+                                    self.__stdby_callback)
+        self.__chrg_exint.enable()
+        self.__stdby_exint.enable()
+        self.__update_charge_status()
+
+    def __get_soc_from_dict(self, key, volt_arg):
+        """Get battery energy from map"""
+        if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]:
+            volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True)
+            pre_volt = 0
+            volt_not_under = 0  # Determine whether the voltage is lower than the minimum voltage value of soc.
+            for volt in volts:
+                if volt_arg > volt:
+                    volt_not_under = 1
+                    soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0)
+                    soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0)
+                    break
+                else:
+                    pre_volt = volt
+            if pre_volt == 0:  # Input Voltarg > Highest Voltarg
+                return soc1
+            elif volt_not_under == 0:
+                return 0
+            else:
+                return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)
+
+    def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"):
+        """Get battery energy by temperature and voltage"""
+        if bat_type == "nix_coy_mnzo2":
+            if temp > 30:
+                return self.__get_soc_from_dict(55, volt_arg)
+            elif temp < 10:
+                return self.__get_soc_from_dict(0, volt_arg)
+            else:
+                return self.__get_soc_from_dict(20, volt_arg)
+
+    def __get_power_vbatt(self):
+        return int(sum([Power.getVbatt() for i in range(100)]) / 100)
+
+    def __get_adc_vbatt(self):
+        self.__adc.open()
+        utime.sleep_ms(self.__adc_period)
+        adc_list = list()
+        for i in range(self.__adc_period):
+            adc_list.append(self.__adc.read(self.__adc_num))
+            utime.sleep_ms(self.__adc_period)
+        adc_list.remove(min(adc_list))
+        adc_list.remove(max(adc_list))
+        adc_value = int(sum(adc_list) / len(adc_list))
+        self.__adc.close()
+        vbatt_value = adc_value * (self.__factor + 1)
+        return vbatt_value
+
+    def set_temp(self, temp):
+        """Set now temperature."""
+        if isinstance(temp, int) or isinstance(temp, float):
+            self.__temp = temp
+            return True
+        return False
+
+    def get_voltage(self):
+        """Get battery voltage"""
+        if self.__adc is None:
+            return self.__get_power_vbatt()
+        else:
+            return self.__get_adc_vbatt()
+
+    def get_energy(self):
+        """Get battery energy"""
+        self.__energy = self.__get_soc(self.__temp, self.get_voltage())
+        return self.__energy
+
+    def set_charge_callback(self, charge_callback):
+        if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+            if callable(charge_callback):
+                self.__charge_callback = charge_callback
+                return True
+        return False
+
+    def get_charge_status(self):
+        return self.__charge_status
+
+
+class BatteryManager(Abstract):
+    def __init__(self):
+        """电池管理器"""
+        self.battery = Battery()
+        self.low_battery = False
+
+    def post_processor_after_instantiation(self):
+        """订阅此类所有的事件到 EventMesh中"""
+        EventMesh.subscribe("get_battery", self.get_battery)
+
+    def get_battery(self, event=None, msg=None):
+        battery = self.battery.get_energy()
+        return battery
+
+    def get_voltage(self, event=None, msg=None):
+        voltage = self.battery.get_voltage()
+        return voltage
+
+class ConfigStoreManager(Abstract):
+    """
+    持久化落盘存储
+    """
+
+    def __init__(self):
+        self.file_name = "/ext/conf_store.json"
+        self.lock = Lock()
+        self.map = dict()
+
+    def post_processor_after_instantiation(self):
+        if ql_fs.path_exists(self.file_name):
+            self.map = ql_fs.read_json(self.file_name)
+        else:
+            self.__store()
+        EventMesh.subscribe("persistent_config_get", self.__read)
+        EventMesh.subscribe("persistent_config_store", self.__store)
+
+    def __read(self, event, msg):
+        with self.lock:
+            return self.map.get(msg)
+
+    def __store(self, event=None, msg=None):
+        if msg is None:
+            msg = dict()
+        with self.lock:
+            self.map.update(msg)
+            ql_fs.touch(self.file_name, self.map)
+
+def voice_callback(args):
+   if args[0] == 10:
+        print('voicecall incoming call, PhoneNO.: ', args[6])
+        EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(args[6])})
+
+   elif args[0] == 11:
+        print('voicecall connected, PhoneNO.: ', args[6])
+        EventMesh.publish("load_screen", {"screen": "on_call","meta":str(args[6])})
+
+   elif args[0] == 12:
+        print('voicecall disconnect')
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+   elif args[0] == 13:
+        print('voicecall is waiting, PhoneNO.: ', args[6])
+   elif args[0] == 14:
+        print('voicecall dialing, PhoneNO.: ', args[6])
+   elif args[0] == 15:
+        print('voicecall alerting, PhoneNO.: ', args[6])
+   elif args[0] == 16:
+        print('voicecall holding, PhoneNO.: ', args[6])
+
+class DeviceInfoManager(Abstract):
+    
+    """
+        设备信息管理
+    """
+
+    def __init__(self):
+        self.key = ""
+        self.imei = ""
+        self.cid = "ETEST20221014010"
+        self.imsi = ""
+        self.password = "000000"
+        #self.__city = None
+        #self.__location = None
+        self.timer_push_schedule = osTimer()
+        self.usb = USB()
+        #self.battery_push_schedule = osTimer()
+        self.check_battery_list = []
+        self.__bat_num = 0
+        self.usb.setCallback(self.usb_event_cb)
+        self.log = LogAdapter(self.__class__.__name__)
+        self.rtc = RTC()
+        self.step = [0,0,0,0]
+        self.timer_push=0
+        self.timer_push_tmp=60
+        self.PING = "0" #绑定状态
+        self.connect = 0 #服务器连接状态
+        self.KA_time = 0
+        self.UD_time = 0
+        self.UD_timeout = 7*60
+        print("DeviceInfoManager:1")
+        self.gsensor = SC7A20()
+        print("DeviceInfoManager:1.0")
+        self.gsensor.activate()
+        print("DeviceInfoManager:1.1")
+        self.gsensor.init()
+        print("DeviceInfoManager:2")
+        # self.hsensor = GH3018()
+        # self.hsensor.activate()
+        # self.hsensor.init()
+        # self.hsensor.close()
+        # self.hsensor_time = osTimer()
+        # self.hsensor_time_count = 0
+        # #print("hsensor.open_heart:%d\r\n"%(self.hsensor.open_heart()))
+        print("DeviceInfoManager:3")
+        ret = quecgnss.init()
+        if ret == 0:
+            print('GNSS init ok.')
+        else:
+            print('GNSS init failed.')
+        
+    def post_processor_after_instantiation(self):
+        print("post_processor_after_instantiation:1")
+        """订阅此类所有的事件到 EventMesh中"""
+        EventMesh.subscribe("screen_get_ope", self.get_device_ope)
+        EventMesh.subscribe("screen_get_sig", self.get_signal)
+        EventMesh.subscribe("screen_get_time", self.get_time)
+        EventMesh.subscribe("about_get_imei", self.get_imei)
+        EventMesh.subscribe("about_get_iccid", self.get_ic_cid)
+        EventMesh.subscribe("about_get_phonenum", self.get_phone_num)
+        EventMesh.subscribe("screen_get_battery", self.get_battery)
+        EventMesh.subscribe("get_fw_version", self.get_device_fw_version)
+        EventMesh.subscribe("get_standby_time", self.get_standby_time)
+        EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count)
+        EventMesh.subscribe("sim_slot_get", self.sim_slot_get)
+        EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch)
+        EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key)
+        EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key)
+        EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei)
+        EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid)
+        EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid)
+        EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi)
+        EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password)
+        EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password)    
+        EventMesh.subscribe(constants.EVENT.READ_LOCATION, self.READ_LOCATION)  
+        EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping)
+        EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping)
+        EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect)
+        EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect)
+
+        
+        EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen)
+        EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart)
+        print("post_processor_after_instantiation:2")
+        self.timer_push_schedule.start(10000, 1, self.publish_event)
+        # self.battery_push_schedule.start(3000, 1, self.__check_battery)
+        self.log.debug("post_processor_after_instantiation finished")
+        #EventMesh.publish(constants.EVENT.START_HEART)
+        # 设备开机立刻更新一次参数
+        self.publish_event()
+        print("post_processor_after_instantiation:3")
+    
+
+    def publish_event(self, *args, **kwargs):
+        """
+        主动推送事件
+        :param args:
+        :param kwargs:
+        :return:
+        """
+
+        self.timer_push = self.timer_push+1
+        #if self.timer_push > 10 :
+        # EventMesh.publish("time", self.get_time())
+        # EventMesh.publish("battery", self.get_battery())
+        # EventMesh.publish("signal", self.get_signal())
+        self.timer_push = 0
+        date_tmp = utime.localtime()
+        time_tmp = utime.mktime(date_tmp)
+        if  math.fabs(time_tmp - self.KA_time) > 7*60: #7分钟一次心跳
+            self.KA_time = time_tmp
+            EventMesh.publish(constants.PROTOCOL.KA_SEND)
+        if  math.fabs(time_tmp - self.UD_time) > self.UD_timeout: #7分钟一次定位
+            self.UD_time = time_tmp
+            EventMesh.publish(constants.EVENT.START_LOCATION) #开始定位
+        EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())
+        #self.timer_push_tmp = self.timer_push_tmp+1
+        
+        voiceCall.setCallback(voice_callback)
+            
+        #quecgnss.gnssEnable(0)  
+    
+      
+    def READ_LOCATION(self, event, msg) :
+        #print("READ_LOCATIO",msg)
+        
+        EventMesh.publish(constants.PROTOCOL.UD_SEND,msg)
+
+    def get_device_ope(self, event, msg):
+        """
+        获取设备运营商信息
+        :param event:
+        :param msg:
+        :return: 运营商
+        """
+        net_ope_map = {
+            "UNICOM": "中国联通HD",
+            "CMCC": "中国移动HD",
+            "CT": "中国电信HD"
+        }
+        """获取运营商"""
+        try:
+            short_eons = net.operatorName()[1]
+        except Exception:
+            return "无"
+        return net_ope_map.get(short_eons, None)
+
+    def get_signal(self, event=None, msg=None):
+        """
+        获取信号事件
+        :param event:
+        :param msg:
+        :return: int 类型
+        """
+        return net.csqQueryPoll()
+
+    def get_time_bucket(self, time):
+        if time < 12:
+            return '上午'
+        else:
+            return '下午'
+
+    def get_week(self, week):
+        if week == 1:
+            return '一'
+        elif week == 2:
+            return '二'
+        elif week == 3:
+            return '三'
+        elif week == 4:
+            return '四'
+        elif week == 5:
+            return '五'
+        elif week == 6:
+            return '六'
+        elif week == 7 or week == 0:
+            return '日'
+
+    def get_time(self, event=None, msg=None):
+        """
+        获取时间事件
+        :param event:
+        :param msg:
+        :return: HH:MM 格式
+        """
+        rtc_time = self.rtc.datetime()
+        date = ("%d月%d日" % (rtc_time[1], rtc_time[2]))
+        week = ("星期%s"%(self.get_week(rtc_time[3])))
+        time = [rtc_time[4], rtc_time[5]]
+        time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4])))
+
+        result = [time, time_quantum, date , week]
+        #时分,上午下午,日期,星期
+        return result
+
+    def get_step_count(self, event=None, msg=None):
+        """
+        获取步数
+        """
+        XYZ = self.gsensor.get_x_y_z()
+        tmp = 0
+        #print("x:%d,y:%d,z:%d",XYZ[0],XYZ[1],XYZ[2])
+        tmp =  self.gsensor.get_step() 
+        self.step[0]= tmp 
+        self.step[1] = XYZ[0]
+        self.step[2] = XYZ[1]
+        self.step[3] = XYZ[2]
+        #print(self.step)
+        return self.step
+
+    def get_ic_cid(self, event, msg):
+        """
+        获取ic cid事件
+        :param event:
+        :param msg:
+        :return: str ic cid
+        """
+        return sim.getIccid()
+
+    def get_phone_num(self, event, msg):
+        """
+        获取电话号码事件
+        :param event:
+        :param msg:
+        :return: str number
+        """
+        return sim.getPhoneNumber()
+
+    def get_battery(self, event=None, msg=None):
+        """
+        获取电池事件,暂时没支持
+        :param event:
+        :param msg:
+        :return:
+        """
+
+        charge_state = '0'
+        if self.get_usb_state() == 1:
+            charge_state = '1'
+        else:
+            charge_state = '0'
+
+        vbat = 0
+        temp = Power.getVbatt()
+        if temp <= 3500:
+
+            vbat = 20 #"E:/vbat_20.png"
+        elif temp <= 3600:
+            vbat = 40 #"E:/vbat_40.png"
+        elif temp <= 3800:
+            vbat = 60 #"E:/vbat_60.png"
+        elif temp <= 4000:
+            vbat = 80 #"E:/vbat_80.png"
+        else:
+            vbat = 100 #"E:/vbat_100.png"
+
+        result = [charge_state, vbat]
+
+        return result
+
+    def get_device_fw_version(self, *args):
+        '''
+        获取设备固件版本号
+        '''
+        fw_version = modem.getDevFwVersion()
+        if isinstance(fw_version, str):
+            return fw_version
+        return "--"
+
+    def get_standby_time(self, *args):
+        '''
+        获取设备单次开机待机时间
+        '''
+        time_msg = utime.time()
+        d = int(
+            time_msg / 86400)  # The int call removes the decimals.  Conveniently, it always rounds down.  int(2.9) returns 2 instead of 3, for example.
+        time_msg -= (
+                d * 86400)  # This updates the value of x to show that the already counted seconds won't be double counted or anything.
+        h = int(time_msg / 3600)
+        time_msg -= (h * 3600)
+        m = int(time_msg / 60)
+        time_msg -= (m * 60)
+        s = time_msg
+        result = "{}天{}小时{}分".format(d, h, m)
+        return result
+
+    def set_key(self, topic, msg):
+        self.key = msg["value"]
+    def get_key(self, topic, msg):
+        return self.key
+
+    def get_imei(self, topic, msg):
+        if not self.imei:
+            self.imei = modem.getDevImei()
+        return self.imei
+
+    def get_cid(self, topic, msg):
+        return self.cid
+
+    def set_cid(self, topic, msg):
+        self.cid = msg["value"]
+
+    def get_imsi(self, topic, msg):
+        if not self.imei:
+            self.imei = sim.getImsi()
+        return self.imsi
+
+    def get_password(self, topic, msg):
+        return self.password
+
+    def set_password(self, topic, msg):
+        self.password = msg["value"]
+
+    def set_ping(self, topic, msg):
+        self.PING = msg
+    def get_ping(self, topic, msg):
+        return self.PING
+
+    def set_connect(self, topic, msg):
+        #print("set_connect:{}".format(msg))
+        self.connect = msg
+    def get_connect(self, topic, msg):
+        return self.connect
+
+    def start_blood_oxygen(self, topic, msg):
+        print("start_blood_oxygen!!!")
+        self.hsensor.open_blood_oxygen()
+        self.hsensor_time.start(1000, 1, self.hsensor_time_cb)
+        self.hsensor_time_count = 0
+
+    def start_heart(self, topic, msg):
+        print("start_heart!!!")
+        self.hsensor.open_heart()
+        self.hsensor_time.start(1000, 1, self.hsensor_time_cb)
+        self.hsensor_time_count = 0
+
+    def hsensor_time_cb(self, *args, **kwargs):
+        #data 心律、血氧、高压、低压、HRV、佩戴状态
+        data = self.hsensor.get_all_data()
+        self.hsensor_time_count += 1
+        print("hsensor_time_cb:",str(data))
+        if (data[0] != 0 and self.hsensor_time_count > 35) or self.hsensor_time_count > 45:
+            self.hsensor.close()
+            self.hsensor_time.stop()
+            EventMesh.publish(constants.EVENT.PUSH_HEART,[str(data[0]),str(data[2]),str(data[3])])
+        if (data[1] != 0 and self.hsensor_time_count > 35) or self.hsensor_time_count > 45:
+            self.hsensor.close()
+            self.hsensor_time.stop()
+            EventMesh.publish(constants.EVENT.PUSHT_BLOOD_OXYGEN,str(data[1]))
+            
+
+    def sim_slot_get(self, topic=None, msg=None):
+        return sim.getCurSimid()
+
+    def sim_slot_switch(self, topic=None, slot=None):
+        """
+        sim 卡槽切换
+        :param topic:
+        :param slot:
+        :return: 切换sim卡卡槽  0 切换成功, 1 无需切换, -1 切换失败
+        """
+        if self.sim_slot_get() == slot:
+            return 1
+        else:
+            return sim.switchCard(slot)
+
+    def usb_event_cb(self, state):
+        EventMesh.publish("battery", self.get_battery())
+
+    def get_usb_state(self):
+        state = self.usb.getStatus()
+        if state == -1:
+            state = 0
+        return state
+    
+class SockManager(Abstract):
+    #END = "]"
+
+    def __init__(self):
+        self.sock = None
+        self.resolver = None
+        self.run_flag = False
+        self.lost_conn_check_time = 5 * 60 * 30
+        self.monitor_timer = osTimer()
+        self.connect_tmp = 0
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe(constants.EVENT.CHANNEL_SOCKET_SEND, self.send)
+        self.monitor_timer.start(7 * 60 * 1000, 1, self.check)
+
+    def add_support_resolver(self, resolver):
+        self.resolver = resolver
+
+    def initialization(self, *args, **kwargs):
+        self.connect()
+
+    def connect(self):
+        print("tcp connect:api.xcloudtech.com")
+        try:
+            if(self.sock != None) :
+                self.sock.close()
+            self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
+            self.sock.connect(("api.xcloudtech.com", 9000))
+            _thread.start_new_thread(self.recv, ())
+            utime.sleep(1)
+            #  发送数据
+            EventMesh.publish(constants.PROTOCOL.LK_SEND)
+        except Exception as e:
+            print(e)
+            self.run_flag = False
+        else:
+            self.run_flag = True
+
+    def check(self, *args):
+        if (not self.run_flag) or (self.connect_tmp == 0) : #7分钟无数据读取,则认为是掉线了
+            print("tcp reconnect!!!!!!!!!!!!!!!!!!")
+            EventMesh.publish(constants.EVENT.SET_CONNECT,0) #标记断网
+            if(self.sock != None) :
+                    self.sock.close()
+            _thread.start_new_thread(self.reconnect, ()) #重连
+
+        self.connect_tmp = 0
+
+    def reconnect(self, *args):
+        self.connect()
+
+    def send(self, topic, msg):
+        self.sock.send(msg)
+
+    def recv(self):
+        data = b''
+        while True:
+            try:
+                r = self.sock.recv(512)
+            except Exception as e:
+                self.run_flag = False
+                if(self.sock != None) :
+                    self.sock.close()
+                _thread.start_new_thread(self.reconnect, ())
+                break
+            if not r:
+                self.run_flag = False
+                if(self.sock != None) :
+                    self.sock.close()
+                _thread.start_new_thread(self.reconnect, ())
+                break
+            data = data + r
+            if len(data) < 3:
+                continue
+            self.connect_tmp = 1 #有数据,就认为是连接状态
+            EventMesh.publish(constants.EVENT.SET_CONNECT, 1)
+            self.resolver.handler(data.decode('ascii'))
+            data = b''
+
+class NetManager(Abstract):
+    THRESHOLD = 10
+
+    def __init__(self):
+        self.__data_call = dataCall
+        self.__net = net
+        self.check_net = checkNet.CheckNetwork("QuecPython_Helios_Framework", "this latest version")
+        self.timer = osTimer()
+        self.check_net_timeout = 100 * 1000
+
+    def post_processor_after_instantiation(self, *args, **kwargs):
+        count = 0
+        while True:
+            count += 1
+            if count > 5 :
+                return
+            data = dataCall.getInfo(1, 0)
+            print("data call INFO {}".format(data))
+            if data[2][0]:
+                break
+            utime.sleep(1)
+        self.__data_call.start(2, 0, "", "", "", 0)
+        self.__data_call.setCallback(self.__datacall_cb)
+
+    def __datacall_cb(self, args):
+        pdp = args[0]
+        nw_sta = args[1]
+        if nw_sta == 1:
+            state = 2
+            print("*** network %d connected! ***" % pdp)
+            EventMesh.publish('network_state', state)
+        else:
+            state = 3
+            print("*** network %d not connected! ***" % pdp)
+            EventMesh.publish('network_state', state)
+
+def wifiScan_cb(args):
+        EventMesh.publish(constants.EVENT.WIFIINFO, args)
+
+class LocationManager(Abstract):
+
+    def __init__(self):
+        self.gps = None
+        self.match = GPSMatch()
+        self.timer_read_GPS_info = osTimer()
+        self.wifi_data = []
+        self.gps_data = []
+        self.cell_data = []
+        self.location_timer_count = 0
+        self.location_check_data_timer_count = 0
+    @staticmethod
+    def get_date():
+        return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+
+    @staticmethod
+    def get_time():
+        return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
+
+    def post_processor_after_instantiation(self):
+        _gps_cfg = {
+            "UARTn": UART.UART1,
+            "buadrate": 115200,
+            "databits": 8,
+            "parity": 0,
+            "stopbits": 1,
+            "flowctl": 0,
+            "PowerPin": Pin.GPIO2,
+            "StandbyPin": Pin.GPIO3,
+            "BackupPin": None,
+            "gps_mode": 0x01,
+        }
+        self.gps = GPS(**_gps_cfg)
+        self.gps.power_switch(0)#关闭GPS
+        EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open)
+        EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+        EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)
+        EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)
+        EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)
+        EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)
+        
+        #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+
+    def start_location(self, event, msg):
+        #self.gps_open(event, msg)
+        #print("start_location")
+        EventMesh.publish(constants.EVENT.GPSOPEN)
+        self.location_timer_count = 0
+        self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+        self.wifi_data = []
+        self.gps_data = []
+        self.cell_data = []
+        EventMesh.publish(constants.EVENT.WIFISCANOPEN)
+
+                    
+    def close_location(self, event, msg):
+        self.gps.power_switch(0)
+        wifiScan.control(0)
+        self.timer_read_GPS_info.stop()
+
+    def WIFI_INFO(self, event, msg):
+        self.wifi_data = msg
+        # print("WIFI_INFO:")
+        # print([msg[0],msg])
+
+    def WIFI_scan_open(self, event, msg):
+        #print("WIFI_scan_open")
+        self.wifi_data = []
+        if wifiScan.support():
+            if wifiScan.getState() == False :
+                wifiScan.control(1)
+            wifiScan.setConfig(4, 2, 5, 6, 0)  #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先
+            wifiScan.setCallback(wifiScan_cb) #注册回调函数
+            wifiScan.asyncStart()
+            #print("wifiScan.asyncStart")
+        else :
+            print("WIFI_scan_open:error1") 
+
+    
+
+    def gps_open(self, event, msg):
+        #print("publish:gps_open")
+        quecgnss.init()
+        self.gps.__gps_nmea_data_clean()
+        
+
+    def gps_close(self, event, msg):
+        quecgnss.gnssEnable(0)
+        
+
+    def location_timer(self, *args, **kwargs):
+        self.location_timer_count = self.location_timer_count +1
+        if self.location_timer_count > 60 : #1分钟定位超时,超时发送数据,停止定时器及关闭定位
+            #print("publish:CLOSE_LOCATION")
+            self.location_timer_count = 0
+            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+            EventMesh.publish(constants.EVENT.READ_LOCATION, [self.gps_data,self.wifi_data,self.cell_data])#发送数据
+            
+        
+        self.location_check_data_timer_count = self.location_check_data_timer_count+1
+        if self.location_check_data_timer_count > 5 :#5秒查一次
+            self.location_check_data_timer_count = 0
+            #print(self.location_timer_count)
+            #检查wifi数据
+            if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:
+                EventMesh.publish(constants.EVENT.WIFISCANOPEN)
+            #检查GNSS数据
+            if self.gps_data == [] and quecgnss.get_state() == 2:
+                self.gps.__gps_nmea_data_clean()
+                data = quecgnss.read(4096)
+                #print(data[1].decode())
+                if data[0] > 0 : #有数据
+                    if self.gps.__check_gps_valid(data[1].decode()): #数据齐全
+                        match_gmc_data = self.match.GxRMC(data[1]).split(",")
+                        match_vtg_data = self.match.GxVTG(data[1]).split(",")
+                        match_gga_data = self.match.GxGGA(data[1]).split(",")
+                        data = self.gps.read_coordinates(data[1])
+                        latitude_tmp = str(data[1]).split(".")
+                        if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5:
+                            latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6])
+                        latitude = "%s,%s"%(latitude,match_gmc_data[4] )
+                        longitude_tmp = str(data[0]).split(".")
+                        if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5:
+                            longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6])
+                        longitude = "%s,%s"%(longitude,match_gmc_data[6] ) #match_gmc_data[6] + str(data[1])
+                        high = str(data[2])
+                        self.gps_data = {
+                            "latitude": latitude,
+                            "longitude": longitude,
+                            "high": high,
+                            "direction": match_vtg_data[1],
+                            "speed": match_vtg_data[5],
+                            "number": match_gga_data[7],
+
+                            
+                        }
+            #检查基站数据
+            if self.cell_data == []:
+                
+                self.cell_data = net.getCellInfo()
+                for cell in self.cell_data:
+                    if cell and cell[0][0] == 0 :
+                        self.cell_data = cell
+                        break
+                
+        if self.gps_data  != [] : #or( self.wifi_data != [] and self.cell_data != []): 
+            #print("publish:READ_LOCATION")
+            EventMesh.publish(constants.EVENT.READ_LOCATION, [self.gps_data,self.wifi_data,self.cell_data])
+            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+
+
+class AddrBookManager(Abstract):
+    # 通讯录
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("get_addr_book_list", self.get)
+        # 可通过此push_addr_book_list主动推送
+
+    def get(self, event, msg):
+        return {
+            "张三": "15692025051",
+            "李四": "15692025051",
+            "崔崔": "15692025051",
+            "鱼鱼": "15692025051",
+            "坤坤": "15692025051",
+        }
+
+class MsgManager(Abstract):
+    # 短信
+    def __init__(self):
+        self.msg_nums = 0
+        self.msg_detail = ""
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("get_msg_nums", self.get_msg_nums)
+        # 可通过此push_addr_book_list主动推送
+        EventMesh.subscribe("get_msg_detail", self.get_msg_detail)
+
+    def get_msg_nums(self, event, msg):
+        self.msg_nums = sms.getMsgNums() 
+        return self.msg_nums
+    
+    def get_msg_detail(self, event, msg):
+        #self.msg_detail = sms.searchTextMsg(msg)
+        return{
+            "小明":"有内鬼,停止交易",
+            "小红":"今晚十点一起吃饭"
+        }
+
+class MsgdetailManager(Abstract):
+    def __init__(self):
+        self.level = 0
+        self.msg_name = ""
+        self.msg_content = ""
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("save_msg_name", self.save_msg_name)
+        EventMesh.subscribe("save_msg_content", self.save_msg_content)
+        EventMesh.subscribe("get_msg_name", self.get_msg_name)
+        EventMesh.subscribe("get_msg_content", self.get_msg_content)
+
+    def save_msg_name(self, event, msg): 
+        self.msg_name = str(msg)
+    
+    def save_msg_content(self, event, msg):
+        self.msg_content = str(msg)
+    
+    def get_msg_content(self, event, msg):
+        return self.msg_content
+
+    def get_msg_name(self, event, msg):
+        return self.msg_name
+
+class CallLogManager(Abstract):
+    # 通话记录
+    def __init__(self):
+        self.log = [
+            #电话 次数 时间 姓名
+            ["15692025051","2","12:59","哥"],
+            ["15692025051","3","12:49","爸"],
+            ["15692025051","4","12:39","妈"],
+        ]
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("get_call_log_list", self.get)
+
+    def get(self, event, msg):
+        return self.log
+    
+    def call_usr(self,event,msg):
+        content = self.log[msg]
+        # 参数1 姓名  参数2  电话   参数3 1/主动呼叫  0别人呼叫
+        EventMesh.publish("call_in", [content[-1], content[0], 1])
+
+class PhoneCallingManager(Abstract):
+    def __init__(self):
+        self.level = 0
+        self.phonenum = ""
+        self.phonename = ""
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("save_phonenum", self.save_phonenum)
+        EventMesh.subscribe("get_phonenum", self.get_phonenum)
+        EventMesh.subscribe("get_phonename", self.get_phonename)
+        EventMesh.subscribe("save_phonename", self.save_phonename)
+
+    def get_phonename(self, event, msg): 
+        self.phonename = str(msg)
+
+    def save_phonename(self, event, msg): 
+        self.phonename = str(msg)
+
+    def save_phonenum(self, event, msg): 
+        self.phonenum = str(msg)
+    
+    def get_phonenum(self, event, msg):
+        return self.phonenum
+
diff --git a/3.code/1.watch/2.code/protocol.py b/3.code/1.watch/2.code/protocol.py
new file mode 100644 (file)
index 0000000..d8df86b
--- /dev/null
@@ -0,0 +1,370 @@
+import ujson
+import utime
+from ext import EventMesh
+from ext import constants
+from ext.common import Abstract
+import uhashlib
+import ubinascii
+from misc import Power
+import audio
+from machine import Pin
+class ProtoCol(Abstract):
+    TYPE = ""
+    HEADER = "#@{}@#;"
+    SEPARATOR = ";"
+    END = ";" + chr(0x01)
+
+    def __init__(self):
+        self.content = None
+        self.check_sum = None
+        self.location_old_data = None
+        self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD)
+        self.imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+        self.cid = EventMesh.publish(constants.EVENT.GET_CID)
+        self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI)
+        self.key = EventMesh.publish(constants.EVENT.GET_KEY)
+        self.HEADER = self.HEADER.format(self.TYPE)
+
+    def initialization(self, *args, **kwargs):
+        EventMesh.subscribe(self.TYPE + "_SEND", self.handler)
+        EventMesh.subscribe(self.TYPE + "_RECV", self.handler)
+
+    def handler(self, event, msg):
+        self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD)
+        self.imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+        self.cid = EventMesh.publish(constants.EVENT.GET_CID)
+        self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI)
+        self.key = EventMesh.publish(constants.EVENT.GET_KEY)
+        if event.endswith("_SEND"):
+            self.send(event, msg)
+        else:
+            self.recv(event, msg)
+
+    def send(self, event, msg):
+        pass
+
+    def recv(self, event, msg):
+        pass
+
+    @staticmethod
+    def get_date():
+        return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+
+    @staticmethod
+    def get_time():
+        return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
+
+    def calc_crc(self):
+        data = self.content
+        if not isinstance(data, bytes):
+            data = data.encode()
+        count = 0
+        for x in data:
+            count += x
+        self.check_sum = 100 - count % 100
+
+    def pack(self):
+        self.calc_crc()
+        return self.HEADER.encode() + self.content.encode() + self.SEPARATOR.encode() + int(self.check_sum).to_bytes(1,'little') + self.END.encode()
+    
+    def pack_MD5_head(self,data):                                                                                                                 
+        key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP"
+        
+        MD5_head = ""
+        hash_obj = uhashlib.md5(data+key)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        MD5_head = ubinascii.hexlify(res)
+        MD5_head = MD5_head.decode('ascii')
+        #print("pack_MD5_head:")
+        #print(res)
+        #print(MD5_head)
+        return MD5_head
+
+class LK_ProtoCol(ProtoCol):
+    """链路保持"""
+    TYPE = "LK"
+
+    def send(self, event, msg):
+        #[SZKW*334588000000156*0002*LK]
+        #print('self.imei:%s'%(self.imei))
+        send_data = "SZKW*%s*0002*LK"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #print("LK_ProtoCol:send:%s"%(data))
+
+        
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: LK成功
+        @param msg: 接收到的下行数据
+        """
+        print("LK_ProtoCol:recv:%s"%(msg))
+        EventMesh.publish(constants.PROTOCOL.PING_SEND)
+        EventMesh.publish(constants.PROTOCOL.KA_SEND)
+        
+
+class PING_ProtoCol(ProtoCol):
+    """获取绑定状态"""
+    TYPE = "PING"
+
+    def send(self, event, msg):
+        #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING]
+        send_data = "SZKW*%s*0004*PING"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #print("PING_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #print("PING_ProtoCol:recv:%s"%(msg))       
+        data_tmp = msg.split(']')[0] #去掉]    
+        EventMesh.publish(constants.EVENT.SET_PING, data_tmp.split(',')[1])
+
+class KA_ProtoCol(ProtoCol):
+    """心跳"""
+    TYPE = "KA"
+
+    def send(self, event, msg):
+        #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+        #[XT*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数,车载里程数(km)] 实例:[XT*334588000000156*0014*KA,120414,50,100,100,100.12]
+        date = "{:04d}{:02d}{:02d}".format(*utime.localtime()[0:3])
+        date = date[2:]
+        #print("date:",date)
+        #步数
+        step = EventMesh.publish(constants.EVENT.GET_STEP)[0]
+        # 电池电量百分比 
+        bat_tmp = EventMesh.publish("screen_get_battery")
+        battery_caption =  bat_tmp[1]
+        send_data = "KA,%s,%d,%d,%d"%(date,step,0,battery_caption)
+        send_len = len(send_data)
+
+        send_data = "SZKW*%s*%04X*%s"%(self.imei,send_len,send_data)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #print("KA_ProtoCol:send:%s"%(data))
+
+        
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #print("KA_ProtoCol:recv:%s"%(msg))   
+        
+class UD_ProtoCol(ProtoCol):
+    """位置信息"""
+    TYPE = "UD"
+
+    def send(self, event, msg):
+        #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+        #[6f62cfc40fc50173f9a7b21e87be3424IS*861217001020120*00f6*UD,220726,211210,A,22.649529,N,114.119165,E,0.28,137.4,100.0,8,24,63,119,0,00000000,2,1,460,11,30472,125667122,24,30472,218944048,19,4,
+        # wifi0,34:93:44:01:28:b9,-74,wifi1,34:20:03:96:35:ad,-78,wifi2,ea:b5:7b:e8:56:54,-80,wifi3,c4:49:bb:d4:d9:78,-88]
+        date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])
+        date = date[2:]
+        GPS_type = "V"
+        latitude = "0.000000,N"
+        longitude = "0.000000,E"
+        speed = "0.00"
+        direction = "0.0"
+        high = "100.0"
+        number = "0"
+        if msg[0] != [] :#有GPS数据
+            GPS_type = "A"
+            # 纬度
+            latitude = msg[0]["latitude"]
+            # 经度
+            longitude = msg[0]["longitude"]
+            # 速度
+            speed = msg[0]["speed"]
+            # 方向
+            direction = "0"
+            if msg[0]["direction"] :
+                direction = msg[0]["direction"]
+            # 高度
+            high = msg[0]["high"]
+            high_tmp = high.split(".")
+            if len(high_tmp) >= 2 :
+                high = "%s"%(high_tmp[0])
+            # 讯号质量:搜索到的卫星数目
+            number = msg[0]["number"]
+        #gsm 信号强度
+        gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))
+        # 电池电量百分比 
+        bat_tmp = EventMesh.publish("screen_get_battery")
+        battery_caption =  str(bat_tmp[1])
+        #步数
+        step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])
+        #翻转次数
+        turn_count = "0"
+        #终端状态
+        state = "00000000"
+        #基站数据
+        CELL_num = len(msg[2])
+        CELL_data = "1," #时延
+        if msg[2] != []:
+            for CELL in msg[2] :
+                if CELL[0] == 0 :
+                    CELL_data += "%X,"%(int(CELL[2])) #MCC
+                    CELL_data += str(CELL[3]) +","#MNC
+                    CELL_data += str(CELL[5]) +","#tac,区域码
+                    CELL_data += str(CELL[1]) +","#基站编号 CID
+                    CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                else :
+                    CELL_data += str(CELL[5]) +","#tac,区域码
+                    CELL_data += str(CELL[1]) +","#基站编号 CID
+                    CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+            CELL_data = CELL_data[:(len(CELL_data)-1)]
+        #WIFI数据
+        WIFI_num = 0 
+        WIFI_data = ""
+        if msg[1] :
+            WIFI_num = msg[1][0]
+            i = 0
+            for MAC in msg[1][1] :
+                WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])
+                i += 1
+            WIFI_data = WIFI_data[:(len(WIFI_data)-1)]
+        WIFI_data = WIFI_data.lower()
+        #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\
+        #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)
+        send_data = "UD,%s,%s,%s"%(date,GPS_type,latitude)
+        send_data += ",%s,%s,%s"%(longitude,speed,direction)
+        send_data += ",%s,%s,%s"%(high,number,gsm_sig,)
+        send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)
+        send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)
+        send_data += ",%d,%s"%(WIFI_num,WIFI_data)
+
+        send_len = len(send_data)
+
+        send_data = "SZKW*%s*%04X*%s"%(self.imei,send_len,send_data)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #print("UD_ProtoCol:send:%s"%(data))
+
+        
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #print("KA_ProtoCol:recv:%s"%(msg))   
+
+class CR_ProtoCol(ProtoCol):
+    """立即定位"""
+    TYPE = "CR"
+
+    def send(self, event, msg):
+        #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING]
+        send_data = "SZKW*%s*0002*CR"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #print("CR_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.publish(constants.PROTOCOL.CR_SEND)
+        EventMesh.publish(constants.EVENT.START_LOCATION) #开始定位
+        #print("CR_ProtoCol:recv:%s"%(msg))   
+        
+class FIND_ProtoCol(ProtoCol):
+    """查找设备"""
+    TYPE = "FIND"
+
+    def send(self, event, msg):
+        #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING]
+        send_data = "SZKW*%s*0004*FIND"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #print("FIND_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: FIND,播放铃声
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.publish(constants.PROTOCOL.FIND_SEND)
+        # a = audio.Audio(0)
+        # a.set_pa(Pin.GPIO29)
+        # a.setVolume(10)
+        # a.play(1, 0, 'E:/audio_audio_haixiu.mp3')  #文件名前面要加上路径
+        EventMesh.publish("load_screen", {"screen": "FIND"})
+        #print("FIND_ProtoCol:recv:%s"%(msg)) 
+
+class POWEROFF_ProtoCol(ProtoCol):
+    """关机"""
+    TYPE = "POWEROFF"
+
+    def send(self, event, msg):
+        # [SZKW*867387060319491*0008*POWEROFF]
+        send_data = "SZKW*%s*0008*POWEROFF"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #print("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: POWEROFF关机
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.publish(constants.PROTOCOL.POWEROFF_SEND)
+        #print("POWEROFF_ProtoCol:recv:%s"%(msg))
+        Power.powerDown()
+         
+
+class ProtoColResolver(object):
+    def __init__(self):
+        self.protocol_list = []
+
+    def add_support(self, prot):
+        self.protocol_list.append(prot)
+        prot.initialization()
+
+    def handler(self, data):
+        # 这里接收数据
+        
+        #print("handler -> {}".format(data))
+        # if data.startswith('Init;'):
+        #     data = data[5:]
+        #     EventMesh.publish(constants.EVENT.SET_KEY, {"value": ujson.loads(data)['KEY']})
+            
+        # elif data.startswith("Update;"):
+        #     data = data[7:]
+        #     EventMesh.publish(constants.PROTOCOL.H04_RECV, data)
+        data_tmp = data.split(']')[0] #去掉]
+        ProtoCol_type = data_tmp.split('*')[3] #拿到协议标识
+        ProtoCol_type = ProtoCol_type.split(',')[0]
+        ProtoCol_type = "%s_RECV"%(ProtoCol_type)
+        #print("ProtoCol_type:%s"%(ProtoCol_type))
+        EventMesh.publish(ProtoCol_type, data) #返回协议read
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1.jpg
new file mode 100644 (file)
index 0000000..78bf3c5
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_11.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_11.jpg
new file mode 100644 (file)
index 0000000..81d42b0
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_11.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_11_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_11_1.jpg
new file mode 100644 (file)
index 0000000..88c0c4b
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_11_1.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_12.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_12.jpg
new file mode 100644 (file)
index 0000000..284ff43
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_12.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_12_1_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_12_1_1.jpg
new file mode 100644 (file)
index 0000000..3b304a6
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_12_1_1.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_13.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_13.jpg
new file mode 100644 (file)
index 0000000..433682d
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_13.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_13_1_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_13_1_1.jpg
new file mode 100644 (file)
index 0000000..1b43e75
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_13_1_1.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_1_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_1_1.jpg
new file mode 100644 (file)
index 0000000..40fdf42
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_1_1.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_2.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_2.jpg
new file mode 100644 (file)
index 0000000..6a7be6f
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_2.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_2_1.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_2_1.jpg
new file mode 100644 (file)
index 0000000..d54e4b1
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_2_1.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/1_2_2.jpg b/3.code/1.watch/2.code/static/APP/alipay/1_2_2.jpg
new file mode 100644 (file)
index 0000000..ba42366
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/1_2_2.jpg differ
diff --git a/3.code/1.watch/2.code/static/APP/alipay/loading.jpg b/3.code/1.watch/2.code/static/APP/alipay/loading.jpg
new file mode 100644 (file)
index 0000000..7726101
Binary files /dev/null and b/3.code/1.watch/2.code/static/APP/alipay/loading.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_APP_QR_CODE.jpg b/3.code/1.watch/2.code/static/IMAGE_APP_QR_CODE.jpg
new file mode 100644 (file)
index 0000000..ca88ccc
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_APP_QR_CODE.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_BUTTON_DELKEY.jpg b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DELKEY.jpg
new file mode 100644 (file)
index 0000000..92f7606
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DELKEY.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL.jpg b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL.jpg
new file mode 100644 (file)
index 0000000..95e0d79
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL_CONTACT.jpg b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL_CONTACT.jpg
new file mode 100644 (file)
index 0000000..4f02c40
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_BUTTON_DIAL_CONTACT.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_REDETECT.jpg b/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_REDETECT.jpg
new file mode 100644 (file)
index 0000000..ec55e37
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_REDETECT.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_TEST_DONE.jpg b/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_TEST_DONE.jpg
new file mode 100644 (file)
index 0000000..8f30f36
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_HEART_ONLY_TEST_DONE.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.jpg b/3.code/1.watch/2.code/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.jpg
new file mode 100644 (file)
index 0000000..8c1aa40
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NOTICE_CALL.jpg b/3.code/1.watch/2.code/static/IMAGE_NOTICE_CALL.jpg
new file mode 100644 (file)
index 0000000..c73bc5d
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NOTICE_CALL.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NOTICE_NONE.jpg b/3.code/1.watch/2.code/static/IMAGE_NOTICE_NONE.jpg
new file mode 100644 (file)
index 0000000..2a42a82
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NOTICE_NONE.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY0_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY0_ICON.jpg
new file mode 100644 (file)
index 0000000..0a5fbbb
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY0_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY1_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY1_ICON.jpg
new file mode 100644 (file)
index 0000000..35e08c1
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY1_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY2_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY2_ICON.jpg
new file mode 100644 (file)
index 0000000..7500ae7
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY2_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY3_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY3_ICON.jpg
new file mode 100644 (file)
index 0000000..8783cfa
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY3_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY4_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY4_ICON.jpg
new file mode 100644 (file)
index 0000000..90d2a3e
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY4_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY5_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY5_ICON.jpg
new file mode 100644 (file)
index 0000000..c66444d
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY5_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY6_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY6_ICON.jpg
new file mode 100644 (file)
index 0000000..43450ec
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY6_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY7_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY7_ICON.jpg
new file mode 100644 (file)
index 0000000..c4087a5
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY7_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY8_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY8_ICON.jpg
new file mode 100644 (file)
index 0000000..e979dc9
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY8_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY9_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY9_ICON.jpg
new file mode 100644 (file)
index 0000000..522f3fb
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEY9_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYHASH_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYHASH_ICON.jpg
new file mode 100644 (file)
index 0000000..754a1fc
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYHASH_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYSTAR_ICON.jpg b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYSTAR_ICON.jpg
new file mode 100644 (file)
index 0000000..ecba5a6
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_NUMBER_KEYSTAR_ICON.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_ALARM.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_ALARM.jpg
new file mode 100644 (file)
index 0000000..393a581
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_ALARM.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_COUNTDOWN.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_COUNTDOWN.jpg
new file mode 100644 (file)
index 0000000..2a3aafb
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_COUNTDOWN.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_STEP.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_STEP.jpg
new file mode 100644 (file)
index 0000000..b10a13a
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_STEP.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_STOPWATCH.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_STOPWATCH.jpg
new file mode 100644 (file)
index 0000000..737bcbc
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_STOPWATCH.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_SECMENU_WEATHER.jpg b/3.code/1.watch/2.code/static/IMAGE_SECMENU_WEATHER.jpg
new file mode 100644 (file)
index 0000000..b5884b2
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SECMENU_WEATHER.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_REDETECT.jpg b/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_REDETECT.jpg
new file mode 100644 (file)
index 0000000..8c5cc3a
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_REDETECT.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg b/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg
new file mode 100644 (file)
index 0000000..cb2ef0d
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMAGE_STEP.jpg b/3.code/1.watch/2.code/static/IMAGE_STEP.jpg
new file mode 100644 (file)
index 0000000..2f9d654
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMAGE_STEP.jpg differ
diff --git a/3.code/1.watch/2.code/static/IMG_CC_HUNGUP1.jpg b/3.code/1.watch/2.code/static/IMG_CC_HUNGUP1.jpg
new file mode 100644 (file)
index 0000000..57acd14
Binary files /dev/null and b/3.code/1.watch/2.code/static/IMG_CC_HUNGUP1.jpg differ
diff --git a/3.code/1.watch/2.code/static/add_btn.jpg b/3.code/1.watch/2.code/static/add_btn.jpg
new file mode 100644 (file)
index 0000000..86b84fc
Binary files /dev/null and b/3.code/1.watch/2.code/static/add_btn.jpg differ
diff --git a/3.code/1.watch/2.code/static/answer.jpg b/3.code/1.watch/2.code/static/answer.jpg
new file mode 100644 (file)
index 0000000..7a7072e
Binary files /dev/null and b/3.code/1.watch/2.code/static/answer.jpg differ
diff --git a/3.code/1.watch/2.code/static/audio_audio_haixiu.mp3 b/3.code/1.watch/2.code/static/audio_audio_haixiu.mp3
new file mode 100644 (file)
index 0000000..97d5db5
Binary files /dev/null and b/3.code/1.watch/2.code/static/audio_audio_haixiu.mp3 differ
diff --git a/3.code/1.watch/2.code/static/cancel_icon.jpg b/3.code/1.watch/2.code/static/cancel_icon.jpg
new file mode 100644 (file)
index 0000000..36c338b
Binary files /dev/null and b/3.code/1.watch/2.code/static/cancel_icon.jpg differ
diff --git a/3.code/1.watch/2.code/static/charge_in.jpg b/3.code/1.watch/2.code/static/charge_in.jpg
new file mode 100644 (file)
index 0000000..7938028
Binary files /dev/null and b/3.code/1.watch/2.code/static/charge_in.jpg differ
diff --git a/3.code/1.watch/2.code/static/cloudy.jpg b/3.code/1.watch/2.code/static/cloudy.jpg
new file mode 100644 (file)
index 0000000..aac5b3c
Binary files /dev/null and b/3.code/1.watch/2.code/static/cloudy.jpg differ
diff --git a/3.code/1.watch/2.code/static/degree.jpg b/3.code/1.watch/2.code/static/degree.jpg
new file mode 100644 (file)
index 0000000..ba3324b
Binary files /dev/null and b/3.code/1.watch/2.code/static/degree.jpg differ
diff --git a/3.code/1.watch/2.code/static/fine.jpg b/3.code/1.watch/2.code/static/fine.jpg
new file mode 100644 (file)
index 0000000..7531acb
Binary files /dev/null and b/3.code/1.watch/2.code/static/fine.jpg differ
diff --git a/3.code/1.watch/2.code/static/hang_up.jpg b/3.code/1.watch/2.code/static/hang_up.jpg
new file mode 100644 (file)
index 0000000..9fa5c3b
Binary files /dev/null and b/3.code/1.watch/2.code/static/hang_up.jpg differ
diff --git a/3.code/1.watch/2.code/static/lightrain.jpg b/3.code/1.watch/2.code/static/lightrain.jpg
new file mode 100644 (file)
index 0000000..b23ac85
Binary files /dev/null and b/3.code/1.watch/2.code/static/lightrain.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-1.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-1.jpg
new file mode 100644 (file)
index 0000000..ebd1ccc
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-1.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-2.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-2.jpg
new file mode 100644 (file)
index 0000000..4b78c8e
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-2.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-3.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-3.jpg
new file mode 100644 (file)
index 0000000..fbefbce
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-3.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-4.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-4.jpg
new file mode 100644 (file)
index 0000000..86e9a90
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-4.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/4-5.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-5.jpg
new file mode 100644 (file)
index 0000000..d129946
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/4-5.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu1/IMAGE_MAINMENU_WECHAT.png b/3.code/1.watch/2.code/static/main_menu/main_menu1/IMAGE_MAINMENU_WECHAT.png
new file mode 100644 (file)
index 0000000..8414d97
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu1/IMAGE_MAINMENU_WECHAT.png differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.jpg
new file mode 100644 (file)
index 0000000..4afb319
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.jpg
new file mode 100644 (file)
index 0000000..537e0f5
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.jpg
new file mode 100644 (file)
index 0000000..6ba5f72
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.jpg
new file mode 100644 (file)
index 0000000..98393c2
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.jpg
new file mode 100644 (file)
index 0000000..c6f0cbd
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.jpg
new file mode 100644 (file)
index 0000000..93ffe9d
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.jpg
new file mode 100644 (file)
index 0000000..f207090
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.jpg
new file mode 100644 (file)
index 0000000..740f0a1
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.jpg differ
diff --git a/3.code/1.watch/2.code/static/main_menu/main_menu2/alipay_.jpg b/3.code/1.watch/2.code/static/main_menu/main_menu2/alipay_.jpg
new file mode 100644 (file)
index 0000000..aa98ef5
Binary files /dev/null and b/3.code/1.watch/2.code/static/main_menu/main_menu2/alipay_.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_app_qrcode.jpg b/3.code/1.watch/2.code/static/menu_app_qrcode.jpg
new file mode 100644 (file)
index 0000000..e4b9ecc
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_app_qrcode.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_bright.jpg b/3.code/1.watch/2.code/static/menu_bright.jpg
new file mode 100644 (file)
index 0000000..d5072f0
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_bright.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_connect_device.jpg b/3.code/1.watch/2.code/static/menu_connect_device.jpg
new file mode 100644 (file)
index 0000000..ba518ad
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_connect_device.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_imei_qrcode.jpg b/3.code/1.watch/2.code/static/menu_imei_qrcode.jpg
new file mode 100644 (file)
index 0000000..79ceca4
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_imei_qrcode.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_language.jpg b/3.code/1.watch/2.code/static/menu_language.jpg
new file mode 100644 (file)
index 0000000..a156a9b
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_language.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_poweroff.jpg b/3.code/1.watch/2.code/static/menu_poweroff.jpg
new file mode 100644 (file)
index 0000000..52a73e2
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_poweroff.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_restore.jpg b/3.code/1.watch/2.code/static/menu_restore.jpg
new file mode 100644 (file)
index 0000000..3f3b87d
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_restore.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_theme_switch.jpg b/3.code/1.watch/2.code/static/menu_theme_switch.jpg
new file mode 100644 (file)
index 0000000..5511231
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_theme_switch.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_time.jpg b/3.code/1.watch/2.code/static/menu_time.jpg
new file mode 100644 (file)
index 0000000..7d4f722
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_time.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_upgrade.jpg b/3.code/1.watch/2.code/static/menu_upgrade.jpg
new file mode 100644 (file)
index 0000000..8332b8c
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_upgrade.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_version.jpg b/3.code/1.watch/2.code/static/menu_version.jpg
new file mode 100644 (file)
index 0000000..f1e9618
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_version.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_volume.jpg b/3.code/1.watch/2.code/static/menu_volume.jpg
new file mode 100644 (file)
index 0000000..064581d
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_volume.jpg differ
diff --git a/3.code/1.watch/2.code/static/menu_watch_switch.jpg b/3.code/1.watch/2.code/static/menu_watch_switch.jpg
new file mode 100644 (file)
index 0000000..bdef441
Binary files /dev/null and b/3.code/1.watch/2.code/static/menu_watch_switch.jpg differ
diff --git a/3.code/1.watch/2.code/static/mpsignal1.jpg b/3.code/1.watch/2.code/static/mpsignal1.jpg
new file mode 100644 (file)
index 0000000..520bd7f
Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal1.jpg differ
diff --git a/3.code/1.watch/2.code/static/mpsignal2.jpg b/3.code/1.watch/2.code/static/mpsignal2.jpg
new file mode 100644 (file)
index 0000000..dd915c8
Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal2.jpg differ
diff --git a/3.code/1.watch/2.code/static/mpsignal3.jpg b/3.code/1.watch/2.code/static/mpsignal3.jpg
new file mode 100644 (file)
index 0000000..05baf08
Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal3.jpg differ
diff --git a/3.code/1.watch/2.code/static/mpsignal4.jpg b/3.code/1.watch/2.code/static/mpsignal4.jpg
new file mode 100644 (file)
index 0000000..deeaffa
Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal4.jpg differ
diff --git a/3.code/1.watch/2.code/static/mpsignal5.jpg b/3.code/1.watch/2.code/static/mpsignal5.jpg
new file mode 100644 (file)
index 0000000..f0bbbfd
Binary files /dev/null and b/3.code/1.watch/2.code/static/mpsignal5.jpg differ
diff --git a/3.code/1.watch/2.code/static/off_icon.jpg b/3.code/1.watch/2.code/static/off_icon.jpg
new file mode 100644 (file)
index 0000000..9f019e3
Binary files /dev/null and b/3.code/1.watch/2.code/static/off_icon.jpg differ
diff --git a/3.code/1.watch/2.code/static/poweroff_icon.jpg b/3.code/1.watch/2.code/static/poweroff_icon.jpg
new file mode 100644 (file)
index 0000000..e3aff09
Binary files /dev/null and b/3.code/1.watch/2.code/static/poweroff_icon.jpg differ
diff --git a/3.code/1.watch/2.code/static/reduce_btn.jpg b/3.code/1.watch/2.code/static/reduce_btn.jpg
new file mode 100644 (file)
index 0000000..2d76ae2
Binary files /dev/null and b/3.code/1.watch/2.code/static/reduce_btn.jpg differ
diff --git a/3.code/1.watch/2.code/static/snow.jpg b/3.code/1.watch/2.code/static/snow.jpg
new file mode 100644 (file)
index 0000000..15ecdc9
Binary files /dev/null and b/3.code/1.watch/2.code/static/snow.jpg differ
diff --git a/3.code/1.watch/2.code/static/stopwatch_play.jpg b/3.code/1.watch/2.code/static/stopwatch_play.jpg
new file mode 100644 (file)
index 0000000..9deda48
Binary files /dev/null and b/3.code/1.watch/2.code/static/stopwatch_play.jpg differ
diff --git a/3.code/1.watch/2.code/static/stopwatch_reset.jpg b/3.code/1.watch/2.code/static/stopwatch_reset.jpg
new file mode 100644 (file)
index 0000000..013ff61
Binary files /dev/null and b/3.code/1.watch/2.code/static/stopwatch_reset.jpg differ
diff --git a/3.code/1.watch/2.code/static/stopwatch_stop.jpg b/3.code/1.watch/2.code/static/stopwatch_stop.jpg
new file mode 100644 (file)
index 0000000..4b4a998
Binary files /dev/null and b/3.code/1.watch/2.code/static/stopwatch_stop.jpg differ
diff --git a/3.code/1.watch/2.code/static/sunny.jpg b/3.code/1.watch/2.code/static/sunny.jpg
new file mode 100644 (file)
index 0000000..f49510e
Binary files /dev/null and b/3.code/1.watch/2.code/static/sunny.jpg differ
diff --git a/3.code/1.watch/2.code/static/temp_bg.jpg b/3.code/1.watch/2.code/static/temp_bg.jpg
new file mode 100644 (file)
index 0000000..59bdff6
Binary files /dev/null and b/3.code/1.watch/2.code/static/temp_bg.jpg differ
diff --git a/3.code/1.watch/2.code/static/time_down.jpg b/3.code/1.watch/2.code/static/time_down.jpg
new file mode 100644 (file)
index 0000000..ac9cc05
Binary files /dev/null and b/3.code/1.watch/2.code/static/time_down.jpg differ
diff --git a/3.code/1.watch/2.code/static/time_finish.jpg b/3.code/1.watch/2.code/static/time_finish.jpg
new file mode 100644 (file)
index 0000000..0259ac0
Binary files /dev/null and b/3.code/1.watch/2.code/static/time_finish.jpg differ
diff --git a/3.code/1.watch/2.code/static/time_up.jpg b/3.code/1.watch/2.code/static/time_up.jpg
new file mode 100644 (file)
index 0000000..441aa09
Binary files /dev/null and b/3.code/1.watch/2.code/static/time_up.jpg differ
diff --git a/3.code/1.watch/2.code/static/update.jpg b/3.code/1.watch/2.code/static/update.jpg
new file mode 100644 (file)
index 0000000..3ce99f0
Binary files /dev/null and b/3.code/1.watch/2.code/static/update.jpg differ
diff --git a/3.code/1.watch/2.code/static/vbat_0.jpg b/3.code/1.watch/2.code/static/vbat_0.jpg
new file mode 100644 (file)
index 0000000..511db7c
Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_0.jpg differ
diff --git a/3.code/1.watch/2.code/static/vbat_100.jpg b/3.code/1.watch/2.code/static/vbat_100.jpg
new file mode 100644 (file)
index 0000000..c8b4259
Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_100.jpg differ
diff --git a/3.code/1.watch/2.code/static/vbat_20.jpg b/3.code/1.watch/2.code/static/vbat_20.jpg
new file mode 100644 (file)
index 0000000..fd0b86e
Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_20.jpg differ
diff --git a/3.code/1.watch/2.code/static/vbat_40.jpg b/3.code/1.watch/2.code/static/vbat_40.jpg
new file mode 100644 (file)
index 0000000..1f00b2a
Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_40.jpg differ
diff --git a/3.code/1.watch/2.code/static/vbat_60.jpg b/3.code/1.watch/2.code/static/vbat_60.jpg
new file mode 100644 (file)
index 0000000..047e69b
Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_60.jpg differ
diff --git a/3.code/1.watch/2.code/static/vbat_80.jpg b/3.code/1.watch/2.code/static/vbat_80.jpg
new file mode 100644 (file)
index 0000000..31bee1d
Binary files /dev/null and b/3.code/1.watch/2.code/static/vbat_80.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/bg.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/bg.jpg
new file mode 100644 (file)
index 0000000..750057c
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/bg.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/blood.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/blood.jpg
new file mode 100644 (file)
index 0000000..edc286d
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/blood.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/heart.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/heart.jpg
new file mode 100644 (file)
index 0000000..05f942a
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/heart.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/step.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/step.jpg
new file mode 100644 (file)
index 0000000..f16ef9c
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/step.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/0.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/0.jpg
new file mode 100644 (file)
index 0000000..62e72ad
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/0.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/1.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/1.jpg
new file mode 100644 (file)
index 0000000..7f84eca
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/1.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/2.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/2.jpg
new file mode 100644 (file)
index 0000000..137d209
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/2.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/3.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/3.jpg
new file mode 100644 (file)
index 0000000..b00537d
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/3.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/4.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/4.jpg
new file mode 100644 (file)
index 0000000..00d3837
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/4.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/5.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/5.jpg
new file mode 100644 (file)
index 0000000..51870ff
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/5.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/6.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/6.jpg
new file mode 100644 (file)
index 0000000..d5bd2f2
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/6.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/7.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/7.jpg
new file mode 100644 (file)
index 0000000..17a9fbc
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/7.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/8.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/8.jpg
new file mode 100644 (file)
index 0000000..e06aff6
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/8.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/9.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/9.jpg
new file mode 100644 (file)
index 0000000..a4e2c9d
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/9.jpg differ
diff --git a/3.code/1.watch/2.code/static/watch_plate/style_1/time/colon.jpg b/3.code/1.watch/2.code/static/watch_plate/style_1/time/colon.jpg
new file mode 100644 (file)
index 0000000..621c933
Binary files /dev/null and b/3.code/1.watch/2.code/static/watch_plate/style_1/time/colon.jpg differ
diff --git a/3.code/1.watch/2.code/ui.py b/3.code/1.watch/2.code/ui.py
new file mode 100644 (file)
index 0000000..ec3d337
--- /dev/null
@@ -0,0 +1,3480 @@
+import utime
+import osTimer
+import lvgl as lv
+from ext import EventMesh
+from machine import Timer
+import voiceCall
+import osTimer
+from ext import constants
+from misc import Power
+import pm
+import ujson
+import ql_fs
+import audio
+from machine import Pin
+from ext.lcd import gpio_backlight,lcd,lcd_ctrl,tp_cst816
+# -----------------------------------------style create--------------------------------------
+style_screen = lv.style_t()
+style_screen.init()
+style_screen.set_radius(0)
+style_screen.set_bg_color(lv.color_make(0x00, 0x00, 0x00))
+style_screen.set_bg_opa(255)
+style_screen.set_border_width(0)
+style_screen.set_pad_left(0)
+style_screen.set_pad_right(0)
+style_screen.set_pad_top(0)
+style_screen.set_pad_bottom(0)
+
+style_font_youyuan_20 = lv.style_t()
+style_font_youyuan_20.init()
+style_font_youyuan_20.set_text_color(lv.color_make(0xff, 0xff, 0xff))
+style_font_youyuan_20.set_text_font_v2("font.bin",0)
+
+# 默认白色
+
+
+class LabelStyle(object):
+    def __init__(self):
+        self.style = lv.style_t()
+
+    def style_label(self, font):
+        self.style.init()
+        self.style.set_text_color(lv.color_make(0xff, 0xff, 0xff))
+        self.style.set_text_font(font)
+        return self.style
+
+# cont style
+class ContStyle(object):
+    def __init__(self):
+        self.style = lv.style_t()
+
+    def style_cont(self, radius, color1, color2, opa):
+        self.style.init()
+        self.style.set_radius(radius)
+        self.style.set_bg_color(color1)
+        self.style.set_bg_grad_color(color2)
+        self.style.set_bg_grad_dir(lv.GRAD_DIR.VER)
+        self.style.set_bg_opa(opa)
+        self.style.set_border_width(0)
+        self.style.set_pad_left(0)
+        self.style.set_pad_right(0)
+        self.style.set_pad_top(0)
+        self.style.set_pad_bottom(0)
+        return self.style
+
+style_img = lv.style_t()
+style_img.init()
+style_img.set_img_opa(255)
+
+style_line = lv.style_t()
+style_line.init()
+style_line.set_line_width(2)
+style_line.set_line_color(lv.color_make(0xff, 0xff, 0xff))
+
+
+style_list = lv.style_t()
+style_list.init()
+style_list.set_bg_color(lv.color_make(0x00, 0x00, 0x00))
+style_list.set_radius(0)
+style_list.set_bg_opa(255)
+style_list.set_border_width(0)
+style_list.set_pad_left(0)
+style_list.set_pad_right(0)
+style_list.set_pad_top(0)
+
+style_list_scro = lv.style_t()
+style_list_scro.init()
+style_list_scro.set_bg_opa(0)
+
+# create style style_btn
+style_btn = lv.style_t()
+style_btn.init()
+style_btn.set_bg_opa(0)
+style_btn.set_shadow_opa(0)
+style_btn.set_border_width(0)
+
+style_contact_btn =  lv.style_t()
+style_contact_btn.init()
+style_contact_btn.set_bg_color(lv.color_make(0x1E, 0x26, 0xff))
+style_contact_btn.set_border_width(0)
+style_contact_btn.set_shadow_opa(0)
+
+style_contact_btn_pressed =  lv.style_t()
+style_contact_btn_pressed.init()
+style_contact_btn_pressed.set_bg_color(lv.color_make(0x1E, 0x26, 0xff))
+style_contact_btn_pressed.set_bg_opa(100)
+style_contact_btn_pressed.set_border_width(0)
+style_contact_btn_pressed.set_shadow_opa(0)
+
+style_alipay_btn = lv.style_t()
+style_alipay_btn.init()
+style_alipay_btn.set_bg_color(lv.color_make(0xFF, 0xFF, 0xff))
+style_alipay_btn.set_bg_opa(20)
+style_alipay_btn.set_border_width(0)
+style_alipay_btn.set_shadow_opa(0)
+
+style_volume_btn =  lv.style_t()
+style_volume_btn.init()
+style_volume_btn.set_shadow_opa(0)
+style_volume_btn.set_border_width(0)
+style_volume_btn.set_bg_color(lv.color_make(0x80, 0x80, 0x80))
+
+style_circle = lv.style_t()
+style_circle.init()
+style_circle.set_bg_color(lv.color_make(0xff, 0xff, 0xff))
+style_circle.set_radius(0x7FFF)
+
+style_bar = lv.style_t()
+style_bar.init()
+style_bar.set_radius(10)
+style_bar.set_bg_color(lv.color_make(0xA0, 0xA0, 0xA0))
+style_bar.set_bg_grad_color(lv.color_make(0xA0, 0xA0, 0xA0))
+style_bar.set_bg_grad_dir(lv.GRAD_DIR.VER)
+style_bar.set_bg_opa(60)
+style_bar.set_pad_left(0)
+style_bar.set_pad_right(0)
+style_bar.set_pad_top(0)
+style_bar.set_pad_bottom(0)
+
+style_bar_indic = lv.style_t()
+style_bar_indic.init()
+style_bar_indic.set_radius(10)
+style_bar_indic.set_bg_color(lv.color_make(0xff, 0x61, 0x3a))
+style_bar_indic.set_bg_grad_color(lv.color_make(0xff, 0x61, 0x3a))
+style_bar_indic.set_bg_grad_dir(lv.GRAD_DIR.VER)
+style_bar_indic.set_bg_opa(255)
+
+
+# -------------------------------------------phone screen----------------------------------------------------------
+phone_screen = lv.obj()
+phone = lv.obj(phone_screen)
+phone.center()
+phone.set_size(240, 320)
+phone.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+phone_label = lv.label(phone)
+phone_label.set_pos(0, 50)
+phone_label.set_size(240, 30)
+phone_label.set_text("")
+phone_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_label.set_long_mode(lv.label.LONG.WRAP)
+phone_label.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0)
+
+phone_one = lv.img(phone)
+phone_one.set_src("E:/static/IMAGE_NUMBER_KEY1_ICON.png")
+phone_one.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_one.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_one.set_pos(3, 100)
+
+phone_two = lv.img(phone)
+phone_two.set_size(76, 40)
+phone_two.set_src("E:/static/IMAGE_NUMBER_KEY2_ICON.png")
+phone_two.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_two.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_two.set_pos(82, 100)
+
+phone_three = lv.img(phone)
+phone_three.set_size(76, 40)
+phone_three.set_src("E:/static/IMAGE_NUMBER_KEY3_ICON.png")
+phone_three.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_three.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_three.set_pos(161, 100)
+
+phone_four = lv.img(phone)
+phone_four.set_size(76, 40)
+phone_four.set_src("E:/static/IMAGE_NUMBER_KEY4_ICON.png")
+phone_four.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_four.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_four.set_pos(3, 142)
+
+phone_five = lv.img(phone)
+phone_five.set_size(76, 40)
+phone_five.set_src("E:/static/IMAGE_NUMBER_KEY5_ICON.png")
+phone_five.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_five.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_five.set_pos(82, 142)
+
+phone_six = lv.img(phone)
+phone_six.set_size(76, 40)
+phone_six.set_src("E:/static/IMAGE_NUMBER_KEY6_ICON.png")
+phone_six.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_six.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_six.set_pos(161, 142)
+
+phone_seven = lv.img(phone)
+phone_seven.set_size(76, 40)
+phone_seven.set_src("E:/static/IMAGE_NUMBER_KEY7_ICON.png")
+phone_seven.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_seven.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_seven.set_pos(3, 184)
+
+phone_eight = lv.img(phone)
+phone_eight.set_size(76, 40)
+phone_eight.set_src("E:/static/IMAGE_NUMBER_KEY8_ICON.png")
+phone_eight.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_eight.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_eight.set_pos(82, 184)
+
+phone_nine = lv.img(phone)
+phone_nine.set_size(76, 40)
+phone_nine.set_src("E:/static/IMAGE_NUMBER_KEY9_ICON.png")
+phone_nine.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_nine.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_nine.set_pos(161, 184)
+
+phone_start = lv.img(phone)
+phone_start.set_size(76, 40)
+phone_start.set_src("E:/static/IMAGE_NUMBER_KEYSTAR_ICON.png")
+phone_start.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_start.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_start.set_pos(3, 226)
+
+phone_zero = lv.img(phone)
+phone_zero.set_size(76, 40)
+phone_zero.set_src("E:/static/IMAGE_NUMBER_KEY0_ICON.png")
+phone_zero.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_zero.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_zero.set_pos(82, 226)
+
+phone_hash = lv.img(phone)
+phone_hash.set_size(76, 40)
+phone_hash.set_src("E:/static/IMAGE_NUMBER_KEYSTAR_ICON.png")
+phone_hash.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_hash.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_hash.set_pos(161, 226)
+
+phone_call = lv.img(phone)
+phone_call.set_size(76, 40)
+phone_call.set_src("E:/static/IMAGE_BUTTON_DIAL.png")
+phone_call.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_call.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_call.set_pos(3, 268)
+
+phone_contact = lv.img(phone)
+phone_contact.set_size(76, 40)
+phone_contact.set_src("E:/static/IMAGE_BUTTON_DIAL_CONTACT.png")
+phone_contact.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_contact.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_contact.set_pos(84, 268)
+
+phone_delete = lv.img(phone)
+phone_delete.set_size(76, 40)
+phone_delete.set_src("E:/static/IMAGE_BUTTON_DELKEY.png")
+phone_delete.add_flag(lv.obj.FLAG.CLICKABLE)
+phone_delete.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+phone_delete.set_pos(161, 268)
+
+# -------------------------------------------heartrate screen----------------------------------------------------------
+heartrate_screen = lv.obj()
+heartrate = lv.obj(heartrate_screen)
+heartrate.center()
+heartrate.set_size(240, 320)
+heartrate.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+heartrate_label = lv.label(heartrate)
+heartrate_label.set_pos(0, 10)
+heartrate_label.set_size(240, 40)
+heartrate_label.set_text("心率")
+heartrate_label.set_long_mode(lv.label.LONG.WRAP)
+heartrate_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+heartrate_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+heartrate_done_img = lv.img(heartrate)
+heartrate_done_img.set_pos(0, 50)
+heartrate_done_img.set_size(240, 96)
+heartrate_done_img.set_src("E:/static/IMAGE_HEART_ONLY_TEST_DONE.jpg")
+
+heartrate_start_label = lv.label(heartrate)
+heartrate_start_label.set_size(240,40)
+heartrate_start_label.set_pos(0,160)
+heartrate_start_label.set_text(" ")
+heartrate_start_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+heartrate_start_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+heartrate_start_label.set_style_text_color(lv.color_make(0xff, 0x6f, 0x3a), lv.STATE.DEFAULT)
+
+
+heartrate_bpm_label = lv.label(heartrate)
+heartrate_bpm_label.set_size(240, 40)
+heartrate_bpm_label.set_pos(0, 210)
+heartrate_bpm_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+
+heartrate_bpm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+heartrate_bpm_label.set_style_text_color(lv.color_make(0xff, 0x6f, 0x3f), lv.STATE.DEFAULT)
+
+
+heartrate_mmhg_label = lv.label(heartrate)
+heartrate_mmhg_label.set_size(240, 40)
+heartrate_mmhg_label.set_pos(0, 240)
+heartrate_mmhg_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+
+heartrate_mmhg_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+heartrate_mmhg_label.set_style_text_color(lv.color_make(0xff, 0x6f, 0x3f), lv.STATE.DEFAULT)
+
+
+
+# -------------------------------------------toolbox screen----------------------------------------------------------
+toolbox_screen = lv.obj()
+toolbox = lv.obj(toolbox_screen)
+toolbox.center()
+toolbox.set_size(240, 320)
+toolbox.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox.set_scrollbar_mode(0)
+
+toolbox_title = lv.label(toolbox)
+toolbox_title.set_pos(0, 10)
+toolbox_title.set_size(240, 40)
+toolbox_title.set_text("工具箱")
+toolbox_title.set_long_mode(lv.label.LONG.WRAP)
+toolbox_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+toolbox_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+toolbox_cont = lv.obj(toolbox)
+toolbox_cont.set_pos(0, 50)
+toolbox_cont.set_size(240, 270)
+toolbox_cont_style = ContStyle()
+toolbox_cont.add_style(
+    toolbox_cont_style.style_cont(0, lv.color_make(0x00, 0x00, 0x00), lv.color_make(0x00, 0x00, 0x00), 255),
+    lv.PART.MAIN | lv.STATE.DEFAULT)
+
+toolbox_step = lv.btn(toolbox_cont)
+toolbox_step.set_pos(0, 0)
+toolbox_step.set_size(240, 54)
+toolbox_step_label = lv.label(toolbox_step)
+toolbox_step_label.set_text("计步")
+toolbox_step.set_style_pad_all(0, lv.STATE.DEFAULT)
+toolbox_step_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+toolbox_step_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_step.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_step_img = lv.img(toolbox_cont)
+toolbox_step_img.set_pos(10, 0)
+toolbox_step_img.set_size(47, 47)
+toolbox_step_img.add_flag(lv.obj.FLAG.CLICKABLE)
+toolbox_step_img.set_src("E:/static/IMAGE_SECMENU_STEP.png")
+toolbox_step_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+toolbox_weather = lv.btn(toolbox_cont)
+toolbox_weather.set_pos(0, 60)
+toolbox_weather.set_size(240, 54)
+toolbox_weather_label = lv.label(toolbox_weather)
+toolbox_weather_label.set_text("天气")
+toolbox_weather.set_style_pad_all(0, lv.STATE.DEFAULT)
+toolbox_weather_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+toolbox_weather_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_weather.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_weather_img = lv.img(toolbox_cont)
+toolbox_weather_img.set_pos(10, 60)
+toolbox_weather_img.set_size(47, 47)
+toolbox_weather_img.add_flag(lv.obj.FLAG.CLICKABLE)
+toolbox_weather_img.set_src("E:/static/IMAGE_SECMENU_WEATHER.png")
+toolbox_weather_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+toolbox_alarm = lv.btn(toolbox_cont)
+toolbox_alarm.set_pos(0, 120)
+toolbox_alarm.set_size(240, 54)
+toolbox_alarm_label = lv.label(toolbox_alarm)
+toolbox_alarm_label.set_text("闹钟")
+toolbox_alarm.set_style_pad_all(0, lv.STATE.DEFAULT)
+toolbox_alarm_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+toolbox_alarm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_alarm.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_alarm_img = lv.img(toolbox_cont)
+toolbox_alarm_img.set_pos(10, 120)
+toolbox_alarm_img.set_size(47, 47)
+toolbox_alarm_img.add_flag(lv.obj.FLAG.CLICKABLE)
+toolbox_alarm_img.set_src("E:/static/IMAGE_SECMENU_ALARM.png")
+toolbox_alarm_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+toolbox_countdown = lv.btn(toolbox_cont)
+toolbox_countdown.set_pos(0, 180)
+toolbox_countdown.set_size(240, 54)
+toolbox_countdown_label = lv.label(toolbox_countdown)
+toolbox_countdown_label.set_text("倒计时")
+toolbox_countdown.set_style_pad_all(0, lv.STATE.DEFAULT)
+toolbox_countdown_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+toolbox_countdown_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_countdown.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_countdown_img = lv.img(toolbox_cont)
+toolbox_countdown_img.set_pos(10, 180)
+toolbox_countdown_img.set_size(47, 47)
+toolbox_countdown_img.add_flag(lv.obj.FLAG.CLICKABLE)
+toolbox_countdown_img.set_src("E:/static/IMAGE_SECMENU_COUNTDOWN.png")
+toolbox_countdown_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+toolbox_stopwatch = lv.btn(toolbox_cont)
+toolbox_stopwatch.set_pos(0, 240)
+toolbox_stopwatch.set_size(240, 54)
+toolbox_stopwatch_label = lv.label(toolbox_stopwatch)
+toolbox_stopwatch_label.set_text("秒表")
+toolbox_stopwatch.set_style_pad_all(0, lv.STATE.DEFAULT)
+toolbox_stopwatch_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+toolbox_stopwatch_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_stopwatch.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+toolbox_stopwatch_img = lv.img(toolbox_cont)
+toolbox_stopwatch_img.set_pos(10, 240)
+toolbox_stopwatch_img.set_size(47, 47)
+toolbox_stopwatch_img.add_flag(lv.obj.FLAG.CLICKABLE)
+toolbox_stopwatch_img.set_src("E:/static/IMAGE_SECMENU_STOPWATCH.png")
+toolbox_stopwatch_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------setting screen----------------------------------------------------------
+setting_screen = lv.obj()
+setting = lv.obj(setting_screen)
+setting.center()
+setting.set_size(240, 320)
+setting.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_title = lv.label(setting)
+setting_title.set_pos(0, 10)
+setting_title.set_size(240, 40)
+setting_title.set_text("设置")
+setting_title.set_long_mode(lv.label.LONG.WRAP)
+setting_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+setting_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_cont = lv.obj(setting)
+setting_cont.set_pos(0, 50)
+setting_cont.set_size(240, 270)
+setting_cont_style = ContStyle()
+setting_cont.add_style(
+    setting_cont_style.style_cont(0, lv.color_make(0x00, 0x00, 0x00), lv.color_make(0x00, 0x00, 0x00), 255),
+    lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_language = lv.btn(setting_cont)
+setting_language.set_pos(0, 0)
+setting_language.set_size(240, 54)
+setting_language_label = lv.label(setting_language)
+setting_language_label.set_text("语言设置")
+setting_language.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_language_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_language_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_language_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_language.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_language_img = lv.img(setting_cont)
+setting_language_img.set_pos(10, 0)
+setting_language_img.set_size(47, 47)
+setting_language_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_language_img.set_src("E:/static/menu_language.png")
+setting_language_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_dialswitch = lv.btn(setting_cont)
+setting_dialswitch.set_pos(0, 60)
+setting_dialswitch.set_size(240, 54)
+setting_dialswitch_label = lv.label(setting_dialswitch)
+setting_dialswitch_label.set_text("表盘切换")
+setting_dialswitch.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_dialswitch_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_dialswitch_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_dialswitch_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_dialswitch.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_dialswitch_img = lv.img(setting_cont)
+setting_dialswitch_img.set_pos(10, 60)
+setting_dialswitch_img.set_size(47, 47)
+setting_dialswitch_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_dialswitch_img.set_src("E:/static/menu_watch_switch.png")
+setting_dialswitch_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_themeswitch = lv.btn(setting_cont)
+setting_themeswitch.set_pos(0, 120)
+setting_themeswitch.set_size(240, 54)
+setting_themeswitch_label = lv.label(setting_themeswitch)
+setting_themeswitch_label.set_text("主题切换")
+setting_themeswitch.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_themeswitch_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_themeswitch_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_themeswitch_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_themeswitch.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_themeswitch_img = lv.img(setting_cont)
+setting_themeswitch_img.set_pos(10, 120)
+setting_themeswitch_img.set_size(47, 47)
+setting_themeswitch_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_themeswitch_img.set_src("E:/static/menu_theme_switch.png")
+setting_themeswitch_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_imei = lv.btn(setting_cont)
+setting_imei.set_pos(0, 180)
+setting_imei.set_size(240, 54)
+setting_imei_label = lv.label(setting_imei)
+setting_imei_label.set_text("设备IMEI号")
+setting_imei.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_imei_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_imei_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_imei_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_imei.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_imei_img = lv.img(setting_cont)
+setting_imei_img.set_pos(10, 180)
+setting_imei_img.set_size(47, 47)
+setting_imei_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_imei_img.set_src("E:/static/menu_imei_qrcode.png")
+setting_imei_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_app = lv.btn(setting_cont)
+setting_app.set_pos(0, 240)
+setting_app.set_size(240, 54)
+setting_app_label = lv.label(setting_app)
+setting_app_label.set_text("手机安装APP")
+setting_app.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_app_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_app_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_app_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_app.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_app_img = lv.img(setting_cont)
+setting_app_img.set_pos(10, 240)
+setting_app_img.set_size(47, 47)
+setting_app_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_app_img.set_src("E:/static/menu_app_qrcode.png")
+setting_app_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_bright = lv.btn(setting_cont)
+setting_bright.set_pos(0, 300)
+setting_bright.set_size(240, 54)
+setting_bright_label = lv.label(setting_bright)
+setting_bright_label.set_text("屏幕调节")
+setting_bright.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_bright_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_bright_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_bright_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_bright.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_bright_img = lv.img(setting_cont)
+setting_bright_img.set_pos(10, 300)
+setting_bright_img.set_size(47, 47)
+setting_bright_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_bright_img.set_src("E:/static/menu_bright.png")
+setting_bright_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_volume = lv.btn(setting_cont)
+setting_volume.set_pos(0, 360)
+setting_volume.set_size(240, 54)
+setting_volume_label = lv.label(setting_volume)
+setting_volume_label.set_text("铃声")
+setting_volume.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_volume_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_volume_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_volume_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_volume.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_volume_img = lv.img(setting_cont)
+setting_volume_img.set_pos(10, 360)
+setting_volume_img.set_size(47, 47)
+setting_volume_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_volume_img.set_src("E:/static/menu_volume.png")
+setting_volume_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_restore = lv.btn(setting_cont)
+setting_restore.set_pos(0, 420)
+setting_restore.set_size(240, 54)
+setting_restore_label = lv.label(setting_restore)
+setting_restore_label.set_text("回复出厂设置")
+setting_restore.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_restore_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_restore_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_restore_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_restore.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_restore_img = lv.img(setting_cont)
+setting_restore_img.set_pos(10, 420)
+setting_restore_img.set_size(47, 47)
+setting_restore_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_restore_img.set_src("E:/static/menu_restore.png")
+setting_restore_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+setting_poweroff = lv.btn(setting_cont)
+setting_poweroff.set_pos(0, 480)
+setting_poweroff.set_size(240, 54)
+setting_poweroff_label = lv.label(setting_poweroff)
+setting_poweroff_label.set_text("关机")
+setting_poweroff.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_poweroff_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_poweroff_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_poweroff_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_poweroff.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_poweroff_img = lv.img(setting_cont)
+setting_poweroff_img.set_pos(10, 480)
+setting_poweroff_img.set_size(47, 47)
+setting_poweroff_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_poweroff_img.set_src("E:/static/menu_poweroff.png")
+setting_poweroff_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_version = lv.btn(setting_cont)
+setting_version.set_pos(0, 540)
+setting_version.set_size(240, 54)
+setting_version_label = lv.label(setting_version)
+setting_version_label.set_text("关于设备")
+setting_version.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_version_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_version_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_version_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_version.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_version_img = lv.img(setting_cont)
+setting_version_img.set_pos(10, 540)
+setting_version_img.set_size(47, 47)
+setting_version_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_version_img.set_src("E:/static/menu_version.png")
+setting_version_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+setting_update = lv.btn(setting_cont)
+setting_update.set_pos(0, 600)
+setting_update.set_size(240, 54)
+setting_update_label = lv.label(setting_update)
+setting_update_label.set_text("系统升级")
+setting_update.set_style_pad_all(0, lv.STATE.DEFAULT)
+setting_update_label.align(lv.ALIGN.LEFT_MID, 70, 0)
+setting_update_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT)
+setting_update_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_update.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+setting_update_img = lv.img(setting_cont)
+setting_update_img.set_pos(10, 600)
+setting_update_img.set_size(47, 47)
+setting_update_img.add_flag(lv.obj.FLAG.CLICKABLE)
+setting_update_img.set_src("E:/static/menu_upgrade.png")
+setting_update_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------step screen----------------------------------------------------------
+step_screen = lv.obj()
+step = lv.obj(step_screen)
+step.center()
+step.set_size(240, 320)
+step.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+step_label = lv.label(step)
+step_label.set_pos(10, 30)
+step_label.set_size(100, 50)
+step_label.set_text("今日步数")
+step_label.set_long_mode(lv.label.LONG.WRAP)
+step_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+step_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+step_label_01 = lv.label(step)
+step_label_01.set_pos(50, 100)
+step_label_01.set_size(100, 50)
+step_label_01.set_text("666 步")
+step_label_01.set_long_mode(lv.label.LONG.WRAP)
+step_label_01.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+step_label_01.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+step_img = lv.img(step)
+step_img.set_pos(100, 150)
+step_img.set_size(40, 65)
+step_img.set_src("E:/static/IMAGE_STEP.png")
+step_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------weather screen----------------------------------------------------------
+weather_screen = lv.obj()
+weather = lv.obj(weather_screen)
+weather.center()
+weather.set_size(240, 320)
+weather.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+weather_img = lv.img(weather)
+weather_img.set_pos(10, 10)
+weather_img.set_size(135, 120)
+weather_img.set_src("E:/static/cloudy.png")
+weather_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+weather_tem_label = lv.label(weather)
+weather_tem_label.set_pos(140, 40)
+weather_tem_label.set_size(50, 50)
+weather_tem_label.set_text("19°C")
+weather_tem_label.set_long_mode(lv.label.LONG.WRAP)
+weather_tem_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+weather_tem_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+weather_detail_label = lv.label(weather)
+weather_detail_label.set_pos(140, 80)
+weather_detail_label.set_size(50, 50)
+weather_detail_label.set_text("01/30")
+weather_detail_label.set_long_mode(lv.label.LONG.WRAP)
+weather_detail_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+weather_detail_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+weather_location_label = lv.label(weather)
+weather_location_label.set_pos(100, 200)
+weather_location_label.set_size(80, 50)
+weather_location_label.set_text("深圳市")
+weather_location_label.set_long_mode(lv.label.LONG.WRAP)
+weather_location_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+weather_location_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------alarm screen----------------------------------------------------------
+alarm_screen = lv.obj()
+alarm = lv.obj(alarm_screen)
+alarm.center()
+alarm.set_size(240, 320)
+alarm.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# alarm_nodata_img = lv.img(alarm)
+# alarm_nodata_img.center()
+# alarm_nodata_img.set_size(113, 152)
+# alarm_nodata_img.set_src("E:/static/IMAGE_IDLE_SCREEN_ALARM_ICON_NEW.png")
+# alarm_nodata_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+alarm_title = lv.label(alarm)
+alarm_title.set_pos(0, 20)
+alarm_title.set_size(240, 20)
+alarm_title.set_text("闹钟")
+alarm_title.set_long_mode(lv.label.LONG.WRAP)
+alarm_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+alarm_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# alarm_list = lv.list(alarm)
+# alarm_list.set_pos(0, 50)
+# alarm_list.set_size(240, 250)
+# alarm_list.add_style(style_list, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------countdown screen----------------------------------------------------------
+countdown_screen = lv.obj()
+countdown = lv.obj(countdown_screen)
+countdown.center()
+countdown.set_size(240, 320)
+countdown.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+countdown_title = lv.label(countdown)
+countdown_title.set_pos(0, 20)
+countdown_title.set_size(240, 20)
+countdown_title.set_text("倒计时")
+countdown_title.set_long_mode(lv.label.LONG.WRAP)
+countdown_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+countdown_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+countdown_hour = lv.label(countdown)
+countdown_hour.set_pos(30, 140)
+countdown_hour.set_size(30, 30)
+countdown_hour.set_text(" 00")
+countdown_hour.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+countdown_hour.set_long_mode(lv.label.LONG.WRAP)
+countdown_hour.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0)
+
+countdown_min = lv.label(countdown)
+countdown_min.set_pos(80, 140)
+countdown_min.set_size(30, 30)
+countdown_min.set_text("00 ")
+countdown_min.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+countdown_min.set_long_mode(lv.label.LONG.WRAP)
+countdown_min.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0)
+
+countdown_sec = lv.label(countdown)
+countdown_sec.set_pos(160, 140)
+countdown_sec.set_size(30, 30)
+countdown_sec.set_text("00 ")
+countdown_sec.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+countdown_sec.set_long_mode(lv.label.LONG.WRAP)
+countdown_sec.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0)
+
+countdown_hour_up = lv.img(countdown)
+countdown_hour_up.set_size(34, 30)
+countdown_hour_up.set_pos(23, 100)
+countdown_hour_up.set_src("E:/static/time_up.png")
+
+
+
+countdown_hour_up.add_flag(lv.obj.FLAG.CLICKABLE)
+countdown_hour_up.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+countdown_hour_down = lv.img(countdown)
+countdown_hour_down.set_size(34, 30)
+countdown_hour_down.set_pos(23, 180)
+countdown_hour_down.set_src("E:/static/time_down.png")
+
+
+
+countdown_hour_down.add_flag(lv.obj.FLAG.CLICKABLE)
+countdown_hour_down.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+countdown_min_up = lv.img(countdown)
+countdown_min_up.set_size(34, 30)
+countdown_min_up.set_pos(80, 100)
+countdown_min_up.set_src("E:/static/time_up.png")
+
+
+
+countdown_min_up.add_flag(lv.obj.FLAG.CLICKABLE)
+countdown_min_up.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+countdown_min_down = lv.img(countdown)
+countdown_min_down.set_size(34, 30)
+countdown_min_down.set_pos(80, 180)
+countdown_min_down.set_src("E:/static/time_down.png")
+
+
+
+countdown_min_down.add_flag(lv.obj.FLAG.CLICKABLE)
+countdown_min_down.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+countdown_sec_up = lv.img(countdown)
+countdown_sec_up.set_size(34, 30)
+countdown_sec_up.set_pos(160, 100)
+countdown_sec_up.set_src("E:/static/time_up.png")
+
+
+
+countdown_sec_up.add_flag(lv.obj.FLAG.CLICKABLE)
+countdown_sec_up.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+countdown_sec_down = lv.img(countdown)
+countdown_sec_down.set_size(34, 30)
+countdown_sec_down.set_pos(160, 180)
+countdown_sec_down.set_src("E:/static/time_down.png")
+
+
+
+countdown_sec_down.add_flag(lv.obj.FLAG.CLICKABLE)
+countdown_sec_down.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+countdown_reset_imgbtn = lv.img(countdown)
+countdown_reset_imgbtn.set_size(99, 36)
+countdown_reset_imgbtn.set_src("E:/static/stopwatch_reset.png")
+
+
+
+countdown_reset_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+countdown_reset_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+countdown_reset_imgbtn.set_pos(10, 260)
+
+countdown_start_imgbtn = lv.img(countdown)
+countdown_start_imgbtn.set_size(99, 36)
+countdown_start_imgbtn.set_src("E:/static/stopwatch_play.png")
+
+
+
+countdown_start_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+countdown_start_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+countdown_start_imgbtn.set_pos(120, 260)
+
+countdown_stop_imgbtn = lv.img(countdown)
+countdown_stop_imgbtn.set_size(99, 36)
+countdown_stop_imgbtn.set_src("E:/static/stopwatch_stop.png")
+
+
+
+countdown_stop_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+countdown_stop_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+countdown_stop_imgbtn.set_pos(120, 260)
+countdown_stop_imgbtn.add_flag(lv.obj.FLAG.HIDDEN)
+
+
+# -------------------------------------------stopwatch screen----------------------------------------------------------
+stopwatch_screen = lv.obj()
+stopwatch = lv.obj(stopwatch_screen)
+stopwatch.center()
+stopwatch.set_size(240, 320)
+stopwatch.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+stopwatch_title = lv.label(stopwatch)
+stopwatch_title.set_pos(0, 20)
+stopwatch_title.set_size(240, 20)
+stopwatch_title.set_text("秒表")
+stopwatch_title.set_long_mode(lv.label.LONG.WRAP)
+stopwatch_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+stopwatch_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+stopwatch_label_min = lv.label(stopwatch)
+stopwatch_label_min.set_pos(20, 100)
+stopwatch_label_min.set_size(40, 20)
+stopwatch_label_min.set_long_mode(lv.label.LONG.WRAP)
+stopwatch_label_min.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+stopwatch_label_min.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+#stopwatch_label_min.add_style(style_font_tianbo_12, lv.PART.MAIN | lv.STATE.DEFAULT)
+stopwatch_label_min.set_text("00")
+
+stopwatch_label_sec = lv.label(stopwatch)
+stopwatch_label_sec.set_pos(80, 100)
+stopwatch_label_sec.set_size(40, 20)
+stopwatch_label_sec.set_long_mode(lv.label.LONG.WRAP)
+stopwatch_label_sec.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+stopwatch_label_sec.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+#stopwatch_label_sec.add_style(style_font_tianbo_12, lv.PART.MAIN | lv.STATE.DEFAULT)
+stopwatch_label_sec.set_text("00")
+
+stopwatch_label_ms = lv.label(stopwatch)
+stopwatch_label_ms.set_pos(140, 100)
+stopwatch_label_ms.set_size(40, 20)
+stopwatch_label_ms.set_text("00")
+stopwatch_label_ms.set_long_mode(lv.label.LONG.WRAP)
+stopwatch_label_ms.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+stopwatch_label_ms.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+#stopwatch_label_ms.add_style(style_font_tianbo_12, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+stopwatch_reset_imgbtn = lv.img(stopwatch)
+stopwatch_reset_imgbtn.set_size(99, 36)
+stopwatch_reset_imgbtn.set_src("E:/static/stopwatch_reset.png")
+stopwatch_reset_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+stopwatch_reset_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+stopwatch_reset_imgbtn.set_pos(10, 210)
+
+stopwatch_start_imgbtn = lv.img(stopwatch)
+stopwatch_start_imgbtn.set_size(99, 36)
+
+stopwatch_start_imgbtn.set_src("E:/static/stopwatch_play.png")
+stopwatch_start_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+stopwatch_start_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+stopwatch_start_imgbtn.set_pos(115, 210)
+
+stopwatch_stop_imgbtn = lv.img(stopwatch)
+stopwatch_stop_imgbtn.set_size(99, 36)
+stopwatch_stop_imgbtn.set_src("E:/static/stopwatch_stop.png")
+stopwatch_stop_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+stopwatch_stop_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+stopwatch_stop_imgbtn.set_pos(115, 210)
+stopwatch_stop_imgbtn.add_flag(lv.obj.FLAG.HIDDEN)
+
+# -------------------------------------------temperature screen----------------------------------------------------------
+temperature_screen = lv.obj()
+temperature = lv.obj(temperature_screen)
+temperature.center()
+temperature.set_size(240, 320)
+temperature.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+temperature_bg_img = lv.img(temperature)
+temperature_bg_img.set_pos(0, 0)
+temperature_bg_img.set_size(71, 170)
+temperature_bg_img.set_src("E:/static/temp_bg.png")
+temperature_bg_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+temperature_body_label = lv.label(temperature)
+temperature_body_label.set_pos(80, 40)
+temperature_body_label.set_size(100, 20)
+temperature_body_label.set_text("当前体温")
+temperature_body_label.set_long_mode(lv.label.LONG.WRAP)
+temperature_body_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+temperature_body_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+temperature_degree_img = lv.img(temperature)
+temperature_degree_img.set_pos(150, 70)
+temperature_degree_img.set_size(22, 22)
+temperature_degree_img.set_src("E:/static/degree.png")
+temperature_degree_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+temperature_value_label = lv.label(temperature)
+temperature_value_label.set_pos(100,70)
+temperature_value_label.set_size(50, 20)
+temperature_value_label.set_text("36.1")
+temperature_value_label.set_long_mode(lv.label.LONG.WRAP)
+temperature_value_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+temperature_value_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+temperature_wrist_label = lv.label(temperature)
+temperature_wrist_label.set_pos(80,120)
+temperature_wrist_label.set_size(100, 20)
+temperature_wrist_label.set_text("当前腕温")
+temperature_wrist_label.set_long_mode(lv.label.LONG.WRAP)
+temperature_wrist_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+temperature_wrist_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+temperature_wrist_degree_img = lv.img(temperature)
+temperature_wrist_degree_img.set_pos(150, 150)
+temperature_wrist_degree_img.set_size(22, 22)
+temperature_wrist_degree_img.set_src("E:/static/degree.png")
+temperature_wrist_degree_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+temperature_wrist_value_label = lv.label(temperature)
+temperature_wrist_value_label.set_pos(100,150)
+temperature_wrist_value_label.set_size(50, 20)
+temperature_wrist_value_label.set_text("24.9")
+temperature_wrist_value_label.set_long_mode(lv.label.LONG.WRAP)
+temperature_wrist_value_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+temperature_wrist_value_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+
+# temperature_status_label = lv.label(temperature)
+# temperature_status_label.set_pos(80,160)
+# temperature_status_label.set_size(100, 20)
+# temperature_status_label.set_text("对对对对")
+# temperature_status_label.set_long_mode(lv.label.LONG.WRAP)
+# temperature_status_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# temperature_status_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# temperature_notice_label = lv.label(temperature)
+# temperature_notice_label.set_pos(50,200)
+# temperature_notice_label.set_size(100, 20)
+# temperature_notice_label.set_text("对对对对对对")
+# temperature_notice_label.set_long_mode(lv.label.LONG.WRAP)
+# temperature_notice_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# temperature_notice_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------spo2 screen----------------------------------------------------------
+spo2_screen = lv.obj()
+spo2 = lv.obj(spo2_screen)
+spo2.center()
+spo2.set_size(240, 320)
+spo2.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+spo2_label = lv.label(spo2)
+spo2_label.set_pos(0, 10)
+spo2_label.set_size(240, 40)
+spo2_label.set_text("血氧")
+spo2_label.set_long_mode(lv.label.LONG.WRAP)
+spo2_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+spo2_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+spo2_done_img = lv.img(spo2)
+spo2_done_img.set_pos(0, 50)
+spo2_done_img.set_size(240, 96)
+spo2_done_img.set_src("E:/static/IMAGE_SPO2_ONLY_TEST_DONE.jpg")
+
+# spo2_finish_gif = lv.gif(spo2)
+# spo2_finish_gif.set_pos(0, 40)
+# spo2_finish_gif.set_size(240, 120)
+# #spo2_finish_img.add_flag(lv.obj.FLAG.CLICKABLE)
+# spo2_finish_gif.set_src("E:/static/IMAGE_SPO2_ONLY_ANI.gif")
+# #spo2_finish_gif.set_opa(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+spo2_label = lv.label(spo2)
+spo2_label.set_size(240,30)
+spo2_label.set_pos(0,160)
+spo2_label.set_text(" ")
+spo2_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+spo2_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+spo2_label_1 = lv.label(spo2)
+spo2_label_1.set_size(240,40)
+spo2_label_1.set_pos(0,200)
+spo2_label_1.set_text(" ")
+spo2_label_1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+spo2_label_1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+line_points = [{"x":0,"y":245},{"x":240,"y":245}]
+spo2_line = lv.line(spo2)
+spo2_line.set_points(line_points,2)
+spo2_line.add_style(style_line,0)
+
+spo2_last_time = lv.label(spo2)
+spo2_last_time.set_size(240, 15)
+spo2_last_time.set_pos(0, 250)
+spo2_last_time.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+spo2_last_time.set_text("2023.01.29 19:33")
+spo2_last_time.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+
+spo2_last_value = lv.label(spo2)
+spo2_last_value.set_size(240, 15)
+spo2_last_value.set_pos(0, 280)
+spo2_last_value.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+spo2_last_value.set_text("96%")
+spo2_last_value.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+
+
+
+# -------------------------------------------wechat screen----------------------------------------------------------
+wechat_screen = lv.obj()
+wechat = lv.obj(wechat_screen)
+wechat.center()
+wechat.set_size(240, 320)
+wechat.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+wechat_press_btn = lv.btn(wechat)
+wechat_press_btn.set_pos(0, 260)
+wechat_press_btn.set_size(220, 56)
+wechat_press_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+wechat_press_btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED)
+wechat_press_btn.set_style_radius(30,0)
+
+wechat_press_label = lv.label(wechat_press_btn)
+wechat_press_label.set_text("请按住说话")
+wechat_press_label.align(lv.ALIGN.CENTER, 10, 0)
+wechat_press_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+wechat_label = lv.label(wechat)
+wechat_label.center()
+wechat_label.set_size(240, 40)
+wechat_label.set_long_mode(lv.label.LONG.WRAP)
+wechat_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+wechat_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+# -------------------------------------------contacts screen----------------------------------------------------------
+contacts_screen = lv.obj()
+contacts = lv.obj(contacts_screen)
+contacts.center()
+contacts.set_size(240, 320)
+contacts.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------language screen----------------------------------------------------------
+language_screen = lv.obj()
+language = lv.obj(language_screen)
+language.center()
+language.set_size(240, 320)
+language.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+language_title = lv.label(language)
+language_title.set_pos(0, 10)
+language_title.set_size(240, 40)
+language_title.set_text("语言设置")
+language_title.set_long_mode(lv.label.LONG.WRAP)
+language_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+language_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+language_english_btn = lv.btn(language)
+language_english_btn.set_size(240,50)
+language_english_btn.set_pos(0, 60)
+language_english_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED)
+language_english_btn.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+language_english_btn_label = lv.label(language_english_btn)
+language_english_btn_label.set_text("English")
+language_english_btn_label.align(lv.ALIGN.LEFT_MID, 10, 0)
+language_english_btn_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+language_chinese_btn = lv.btn(language)
+language_chinese_btn.set_size(240,50)
+language_chinese_btn.set_pos(0, 120)
+language_chinese_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED)
+language_chinese_btn.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+language_chinese_btn_label = lv.label(language_chinese_btn)
+language_chinese_btn_label.set_text("简体中文")
+language_chinese_btn_label.align(lv.ALIGN.LEFT_MID, 10, 0)
+language_chinese_btn_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------dialswitch screen----------------------------------------------------------
+dialswitch_screen = lv.obj()
+dialswitch = lv.obj(dialswitch_screen)
+dialswitch.center()
+dialswitch.set_size(240, 320)
+dialswitch.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+dialswitch_title = lv.label(dialswitch)
+dialswitch_title.set_pos(0, 10)
+dialswitch_title.set_size(240, 40)
+dialswitch_title.set_text("表盘切换")
+dialswitch_title.set_long_mode(lv.label.LONG.WRAP)
+dialswitch_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+dialswitch_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+dialswitch_btn1 = lv.btn(dialswitch)
+dialswitch_btn1.set_size(240,54)
+dialswitch_btn1.set_pos(0, 50)
+dialswitch_btn1.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED)
+dialswitch_btn1.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+dialswitch_btn1_label = lv.label(dialswitch_btn1)
+dialswitch_btn1_label.set_text("表盘1")
+dialswitch_btn1_label.align(lv.ALIGN.LEFT_MID, 10, 0)
+dialswitch_btn1_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+dialswitch_btn2 = lv.btn(dialswitch)
+dialswitch_btn2.set_size(240,54)
+dialswitch_btn2.set_pos(0, 104)
+dialswitch_btn2.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED)
+dialswitch_btn2.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+dialswitch_btn2_label = lv.label(dialswitch_btn2)
+dialswitch_btn2_label.set_text("表盘2")
+dialswitch_btn2_label.align(lv.ALIGN.LEFT_MID, 10, 0)
+dialswitch_btn2_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+btn1_switch = lv.switch(dialswitch_btn1)
+btn1_switch.set_pos(185, 3)
+btn1_switch.set_size(10, 10)
+btn1_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR)
+btn1_switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB | lv.STATE.CHECKED)
+btn1_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB)
+
+btn2_switch = lv.switch(dialswitch_btn2)
+btn2_switch.set_pos(185, 3)
+btn2_switch.set_size(10, 10)
+btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR)
+btn2_switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB | lv.STATE.CHECKED)
+btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB)
+
+# -------------------------------------------menustyle screen----------------------------------------------------------
+menustyle_screen = lv.obj()
+menustyle = lv.obj(menustyle_screen)
+menustyle.center()
+menustyle.set_size(240, 320)
+menustyle.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+menustyle_title = lv.label(menustyle)
+menustyle_title.set_pos(0, 10)
+menustyle_title.set_size(240, 40)
+menustyle_title.set_text("主菜单风格")
+menustyle_title.set_long_mode(lv.label.LONG.WRAP)
+menustyle_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+menustyle_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+menustyle_btn1 = lv.btn(menustyle)
+menustyle_btn1.set_size(240,54)
+menustyle_btn1.set_pos(0, 50)
+menustyle_btn1.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED)
+menustyle_btn1.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+menustyle_btn1_label = lv.label(menustyle_btn1)
+menustyle_btn1_label.set_text("四宫格")
+menustyle_btn1_label.align(lv.ALIGN.LEFT_MID, 10, 0)
+menustyle_btn1_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+menu_btn1_switch = lv.switch(menustyle_btn1)
+menu_btn1_switch.set_pos(185, 3)
+menu_btn1_switch.set_size(10, 10)
+menu_btn1_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR)
+menu_btn1_switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB | lv.STATE.CHECKED)
+menu_btn1_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB)
+
+menustyle_btn2 = lv.btn(menustyle)
+menustyle_btn2.set_size(240,54)
+menustyle_btn2.set_pos(0, 104)
+menustyle_btn2.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.PRESSED)
+menustyle_btn2.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+menustyle_btn2_label = lv.label(menustyle_btn2)
+menustyle_btn2_label.set_text("单页")
+menustyle_btn2_label.align(lv.ALIGN.LEFT_MID, 10, 0)
+menustyle_btn2_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+menu_btn2_switch = lv.switch(menustyle_btn2)
+menu_btn2_switch.set_pos(185, 3)
+menu_btn2_switch.set_size(10, 10)
+menu_btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR)
+menu_btn2_switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB | lv.STATE.CHECKED)
+menu_btn2_switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.KNOB)
+
+
+# -------------------------------------------imei screen----------------------------------------------------------
+imei_screen = lv.obj()
+imei = lv.obj(imei_screen)
+imei.center()
+imei.set_size(240, 320)
+imei.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+bg_color = lv.palette_lighten(lv.PALETTE.LIGHT_BLUE, 5)
+fg_color = lv.palette_darken(lv.PALETTE.BLUE, 4)
+
+imei_qr = lv.qrcode(imei, 150, fg_color, bg_color)
+imei_qr.center()
+# Add a border with bg_color
+imei_qr.set_style_border_color(bg_color, 0)
+imei_qr.set_style_border_width(5, 0)
+imei_qr_data = str("867387060319145")
+imei_qr.update(imei_qr_data,len(imei_qr_data))
+
+imei_label = lv.label(imei)
+imei_label.set_pos(0, 280)
+imei_label.set_size(240, 20)
+imei_label.set_text("867387060319145")
+imei_label.set_long_mode(lv.label.LONG.WRAP)
+imei_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+imei_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+# -------------------------------------------app screen----------------------------------------------------------
+app_screen = lv.obj()
+app = lv.obj(app_screen)
+app.center()
+app.set_size(240, 320)
+app.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+app_qr = lv.qrcode(imei, 150, fg_color, bg_color)
+app_qr.center()
+# Add a border with bg_color
+app_qr.set_style_border_color(bg_color, 0)
+app_qr.set_style_border_width(5, 0)
+app_qr_data = str("https://fangzoudiu.xcloudtech.com/xiao_jian")
+app_qr.update(app_qr_data,len(app_qr_data))
+
+app_label = lv.label(app)
+app_label.set_pos(0, 280)
+app_label.set_size(240, 20)
+app_label.set_text("867387060319145")
+app_label.set_long_mode(lv.label.LONG.WRAP)
+app_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+app_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------brightness screen----------------------------------------------------------
+brightness_screen = lv.obj()
+brightness = lv.obj(brightness_screen)
+brightness.center()
+brightness.set_size(240, 320)
+brightness.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+brightness_title = lv.label(brightness)
+brightness_title.set_pos(0, 10)
+brightness_title.set_size(240, 40)
+brightness_title.set_text("屏幕调节")
+brightness_title.set_long_mode(lv.label.LONG.WRAP)
+brightness_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+brightness_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+brightness_label1 = lv.label(brightness)
+brightness_label1.set_pos(10, 60)
+brightness_label1.set_size(50, 40)
+brightness_label1.set_text("亮度")
+brightness_label1.set_long_mode(lv.label.LONG.WRAP)
+brightness_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+brightness_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+brightness_bar = lv.bar(brightness)
+brightness_bar.set_pos(20, 120)
+brightness_bar.set_size(200, 15)
+brightness_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT)
+brightness_bar.set_mode(lv.bar.MODE.NORMAL)
+brightness_bar.set_value(50, lv.ANIM.OFF)
+brightness_bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT)
+brightness_bar.add_style(style_bar_indic, lv.PART.INDICATOR | lv.STATE.DEFAULT)
+
+brightness_add_imgbtn = lv.img(brightness)
+brightness_add_imgbtn.set_pos(50, 250)
+brightness_add_imgbtn.set_size(34, 30)
+brightness_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+brightness_add_imgbtn.set_src("E:/static/time_up.png")
+brightness_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+brightness_reduce_imgbtn = lv.img(brightness)
+brightness_reduce_imgbtn.set_pos(150, 250)
+brightness_reduce_imgbtn.set_size(34, 30)
+brightness_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+brightness_reduce_imgbtn.set_src("E:/static/time_down.png")
+brightness_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+# -------------------------------------------volume screen----------------------------------------------------------
+volume_screen = lv.obj()
+volume = lv.obj(volume_screen)
+volume.center()
+volume.set_size(240, 320)
+volume.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+volume_phone_btn = lv.btn(volume)
+volume_phone_btn.set_size(200,50)
+volume_phone_btn.set_pos(20,30)
+volume_phone_btn.add_style(style_volume_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+volume_phone_label = lv.label(volume_phone_btn)
+volume_phone_label.set_text("电话铃声")
+volume_phone_label.align(lv.ALIGN.LEFT_MID, 50, 0)
+volume_phone_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+volume_alarm_btn = lv.btn(volume)
+volume_alarm_btn.set_size(200,50)
+volume_alarm_btn.set_pos(20,100)
+volume_alarm_btn.add_style(style_volume_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+volume_alarm_label = lv.label(volume_alarm_btn)
+volume_alarm_label.set_text("闹钟铃声")
+volume_alarm_label.align(lv.ALIGN.LEFT_MID, 50, 0)
+volume_alarm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+volume_message_btn = lv.btn(volume)
+volume_message_btn.set_size(200,50)
+volume_message_btn.set_pos(20,170)
+volume_message_btn.add_style(style_volume_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+volume_message_label = lv.label(volume_message_btn)
+volume_message_label.set_text("消息铃声")
+volume_message_label.align(lv.ALIGN.LEFT_MID, 50, 0)
+volume_message_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------phonering screen----------------------------------------------------------
+phonering_screen = lv.obj()
+phonering = lv.obj(phonering_screen)
+phonering.center()
+phonering.set_size(240, 320)
+phonering.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+phonering_title = lv.label(phonering)
+phonering_title.set_pos(0, 10)
+phonering_title.set_size(240, 40)
+phonering_title.set_text("电话铃声")
+phonering_title.set_long_mode(lv.label.LONG.WRAP)
+phonering_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+phonering_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+phonering_label1 = lv.label(phonering)
+phonering_label1.set_pos(10, 60)
+phonering_label1.set_size(50, 40)
+phonering_label1.set_text("电话铃声")
+phonering_label1.set_long_mode(lv.label.LONG.WRAP)
+phonering_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+phonering_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+phonering_bar = lv.bar(phonering)
+phonering_bar.set_pos(20, 120)
+phonering_bar.set_size(200, 15)
+phonering_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT)
+phonering_bar.set_mode(lv.bar.MODE.NORMAL)
+phonering_bar.set_value(50, lv.ANIM.OFF)
+phonering_bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT)
+phonering_bar.add_style(style_bar_indic, lv.PART.INDICATOR | lv.STATE.DEFAULT)
+
+phonering_add_imgbtn = lv.img(phonering)
+phonering_add_imgbtn.set_pos(50, 250)
+phonering_add_imgbtn.set_size(34, 30)
+phonering_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+phonering_add_imgbtn.set_src("E:/static/time_up.png")
+phonering_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+phonering_reduce_imgbtn = lv.img(phonering)
+phonering_reduce_imgbtn.set_pos(150, 250)
+phonering_reduce_imgbtn.set_size(34, 30)
+phonering_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+
+phonering_reduce_imgbtn.set_src("E:/static/time_down.png")
+
+phonering_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+# -------------------------------------------alarmvolume screen----------------------------------------------------------
+alarmvolume_screen = lv.obj()
+alarmvolume = lv.obj(alarmvolume_screen)
+alarmvolume.center()
+alarmvolume.set_size(240, 320)
+alarmvolume.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+alarmvolume_title = lv.label(alarmvolume)
+alarmvolume_title.set_pos(0, 10)
+alarmvolume_title.set_size(240, 40)
+alarmvolume_title.set_text("闹钟铃声")
+alarmvolume_title.set_long_mode(lv.label.LONG.WRAP)
+alarmvolume_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+alarmvolume_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+alarmvolume_label1 = lv.label(alarmvolume)
+alarmvolume_label1.set_pos(10, 60)
+alarmvolume_label1.set_size(50, 40)
+alarmvolume_label1.set_text("闹钟铃声")
+alarmvolume_label1.set_long_mode(lv.label.LONG.WRAP)
+alarmvolume_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+alarmvolume_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+alarmvolume_bar = lv.bar(alarmvolume)
+alarmvolume_bar.set_pos(20, 120)
+alarmvolume_bar.set_size(200, 15)
+alarmvolume_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT)
+alarmvolume_bar.set_mode(lv.bar.MODE.NORMAL)
+alarmvolume_bar.set_value(50, lv.ANIM.OFF)
+alarmvolume_bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT)
+alarmvolume_bar.add_style(style_bar_indic, lv.PART.INDICATOR | lv.STATE.DEFAULT)
+
+alarmvolume_add_imgbtn = lv.img(alarmvolume)
+alarmvolume_add_imgbtn.set_pos(50, 250)
+alarmvolume_add_imgbtn.set_size(34, 30)
+alarmvolume_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+
+alarmvolume_add_imgbtn.set_src("E:/static/time_up.png")
+
+alarmvolume_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+alarmvolume_reduce_imgbtn = lv.img(alarmvolume)
+alarmvolume_reduce_imgbtn.set_pos(150, 250)
+alarmvolume_reduce_imgbtn.set_size(34, 30)
+alarmvolume_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+
+alarmvolume_reduce_imgbtn.set_src("E:/static/time_down.png")
+
+alarmvolume_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+# -------------------------------------------msgvolume screen----------------------------------------------------------
+msgvolume_screen = lv.obj()
+msgvolume = lv.obj(msgvolume_screen)
+msgvolume.center()
+msgvolume.set_size(240, 320)
+msgvolume.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+msgvolume_title = lv.label(msgvolume)
+msgvolume_title.set_pos(0, 10)
+msgvolume_title.set_size(240, 40)
+msgvolume_title.set_text("消息铃声")
+msgvolume_title.set_long_mode(lv.label.LONG.WRAP)
+msgvolume_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+msgvolume_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+msgvolume_label1 = lv.label(msgvolume)
+msgvolume_label1.set_pos(10, 60)
+msgvolume_label1.set_size(50, 40)
+msgvolume_label1.set_text("消息铃声")
+msgvolume_label1.set_long_mode(lv.label.LONG.WRAP)
+msgvolume_label1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+msgvolume_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+msgvolume_bar = lv.bar(msgvolume)
+msgvolume_bar.set_pos(20, 120)
+msgvolume_bar.set_size(200, 15)
+msgvolume_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT)
+msgvolume_bar.set_mode(lv.bar.MODE.NORMAL)
+msgvolume_bar.set_value(50, lv.ANIM.OFF)
+msgvolume_bar.add_style(style_bar, lv.PART.MAIN | lv.STATE.DEFAULT)
+msgvolume_bar.add_style(style_bar_indic, lv.PART.INDICATOR | lv.STATE.DEFAULT)
+
+msgvolume_add_imgbtn = lv.img(msgvolume)
+msgvolume_add_imgbtn.set_pos(50, 250)
+msgvolume_add_imgbtn.set_size(34, 30)
+msgvolume_add_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+
+msgvolume_add_imgbtn.set_src("E:/static/time_up.png")
+
+msgvolume_add_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+msgvolume_reduce_imgbtn = lv.img(msgvolume)
+msgvolume_reduce_imgbtn.set_pos(150, 250)
+msgvolume_reduce_imgbtn.set_size(34, 30)
+msgvolume_reduce_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+
+msgvolume_reduce_imgbtn.set_src("E:/static/time_down.png")
+
+msgvolume_reduce_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+# -------------------------------------------restore screen----------------------------------------------------------
+restore_screen = lv.obj()
+restore = lv.obj(restore_screen)
+restore.center()
+restore.set_size(240, 320)
+restore.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+restore_label = lv.label(restore)
+restore_label.set_pos(0, 100)
+restore_label.set_size(240, 40)
+restore_label.set_text("恢复出厂设置?")
+restore_label.set_long_mode(lv.label.LONG.WRAP)
+restore_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+restore_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+restore_confirm = lv.label(restore)
+restore_confirm.set_text("确认")
+restore_confirm.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+restore_confirm.set_size(120, 20)
+restore_confirm.set_pos(0,280)
+restore_confirm.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+restore_confirm.add_flag(lv.obj.FLAG.CLICKABLE)
+restore_confirm.set_ext_click_area(20)
+
+restore_cancel = lv.label(restore)
+restore_cancel.set_text("返回")
+restore_cancel.set_size(120, 20)
+restore_cancel.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+restore_cancel.set_pos(120,280)
+restore_cancel.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+restore_cancel.add_flag(lv.obj.FLAG.CLICKABLE)
+restore_cancel.set_ext_click_area(20)
+
+
+
+# -------------------------------------------poweroff screen----------------------------------------------------------
+poweroff_screen = lv.obj()
+poweroff = lv.obj(poweroff_screen)
+poweroff.center()
+poweroff.set_size(240, 320)
+poweroff.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+poweroff_img = lv.img(poweroff)
+poweroff_img.set_pos(100, 30)
+poweroff_img.set_size(61, 61)
+poweroff_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+poweroff_img.set_src("E:/static/poweroff_icon.png")
+
+poweroff_label = lv.label(poweroff)
+poweroff_label.set_text("是否关机?")
+poweroff_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+poweroff_label.set_size(240, 20)
+poweroff_label.set_pos(0,120)
+poweroff_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+poweroff_confirm = lv.img(poweroff)
+poweroff_confirm.set_size(176, 46)
+poweroff_confirm.set_pos(32, 150)
+poweroff_confirm.set_src("E:/static/off_icon.png")
+poweroff_confirm.add_flag(lv.obj.FLAG.CLICKABLE)
+poweroff_confirm.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+poweroff_confirm.set_ext_click_area(20)
+
+poweroff_confirm_label = lv.label(poweroff_confirm)
+poweroff_confirm_label.set_text("关机")
+poweroff_confirm_label.align(lv.ALIGN.CENTER, 10, 0)
+poweroff_confirm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+poweroff_return = lv.img(poweroff)
+poweroff_return.set_size(176, 46)
+poweroff_return.set_pos(32, 210)
+poweroff_return.set_src("E:/static/cancel_icon.png")
+poweroff_return.add_flag(lv.obj.FLAG.CLICKABLE)
+poweroff_return.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+poweroff_return_label = lv.label(poweroff_return)
+poweroff_return_label.set_text("返回")
+poweroff_return_label.align(lv.ALIGN.CENTER, 10, 0)
+poweroff_return_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+poweroff_return.set_ext_click_area(20)
+
+# -------------------------------------------version screen----------------------------------------------------------
+version_screen = lv.obj()
+version = lv.obj(version_screen)
+version.center()
+version.set_size(240, 320)
+version.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+version_msg = """Software Version:
+MMI
+Version:UIX8910_C55_V
+1.0_Release
+Build Time:
+2-17-2023
+9:32:5
+IMEI:
+867387060319145
+"""
+
+version_label = lv.label(version)
+version_label.set_pos(0, 0)
+version_label.set_size(240, 320)
+version_label.set_long_mode(lv.label.LONG.WRAP)
+version_label.set_text(version_msg)
+
+version_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+version_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+# -------------------------------------------update screen----------------------------------------------------------
+update_screen = lv.obj()
+update = lv.obj(update_screen)
+update.center()
+update.set_size(240, 320)
+update.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+update_title = lv.label(update)
+update_title.set_pos(0, 10)
+update_title.set_size(240, 40)
+update_title.set_text("系统更新")
+update_title.set_long_mode(lv.label.LONG.WRAP)
+update_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+update_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+update_label = lv.label(update)
+update_label.set_text(" 检查版本更新!/n 请稍后...")
+update_label.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+update_label.set_size(240, 50)
+update_label.set_pos(0,50)
+update_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+update_return = lv.label(update)
+update_return.set_text("返回")
+update_return.set_size(120, 20)
+update_return.set_style_text_align(lv.TEXT_ALIGN.RIGHT, 0)
+update_return.set_pos(0,280)
+update_return.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+update_return.add_flag(lv.obj.FLAG.CLICKABLE)
+
+
+# -------------------------------------------dialing screen----------------------------------------------------------
+dialing_screen = lv.obj()
+dialing = lv.obj(dialing_screen)
+dialing.center()
+dialing.set_size(240, 320)
+dialing.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+dialing_img = lv.img(dialing)
+dialing_img.set_pos(80, 50)
+dialing_img.set_size(64, 64)
+dialing_img.set_src("E:/static/IMAGE_NOTICE_CALL.png")
+dialing_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+dialing_label = lv.label(dialing)
+dialing_label.set_pos(0, 150)
+dialing_label.set_size(240, 50)
+dialing_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+dialing_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+hangup_imgbtn = lv.img(dialing)
+hangup_imgbtn.set_size(64, 64)
+hangup_imgbtn.set_src("E:/static/IMG_CC_HUNGUP1.png")
+
+
+
+hangup_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
+hangup_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+hangup_imgbtn.set_pos(80, 220)
+
+# -------------------------------------------incoming_call screen----------------------------------------------------------
+incoming_call_screen = lv.obj()
+incoming_call = lv.obj(incoming_call_screen)
+incoming_call.center()
+incoming_call.set_size(240, 320)
+incoming_call.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+incoming_call_img = lv.img(incoming_call)
+incoming_call_img.set_pos(80, 50)
+incoming_call_img.set_size(64, 64)
+incoming_call_img.set_src("E:/static/IMAGE_NOTICE_CALL.png")
+incoming_call_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+incoming_call_label = lv.label(incoming_call)
+incoming_call_label.set_pos(0, 150)
+incoming_call_label.set_size(240, 50)
+incoming_call_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+incoming_call_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+incoming_call_answer = lv.img(incoming_call)
+incoming_call_answer.set_size(64, 64)
+incoming_call_answer.add_flag(lv.obj.FLAG.CLICKABLE)
+incoming_call_answer.set_pos(30, 220)
+incoming_call_answer.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+incoming_call_answer.set_src("E:/static/answer.png")
+
+incoming_call_hangup = lv.img(incoming_call)
+incoming_call_hangup.set_size(64, 64)
+incoming_call_hangup.add_flag(lv.obj.FLAG.CLICKABLE)
+incoming_call_hangup.set_pos(150, 220)
+incoming_call_hangup.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+incoming_call_hangup.set_src("E:/static/hang_up.png")
+
+# -------------------------------------------on_call screen----------------------------------------------------------
+on_call_screen = lv.obj()
+on_call = lv.obj(on_call_screen)
+on_call.center()
+on_call.set_size(240, 320)
+on_call.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+on_call_img = lv.img(on_call)
+on_call_img.set_pos(80, 50)
+on_call_img.set_size(64, 64)
+on_call_img.set_src("E:/static/IMAGE_NOTICE_CALL.png")
+on_call_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+on_call_label = lv.label(on_call)
+on_call_label.set_pos(0, 150)
+on_call_label.set_size(240, 50)
+on_call_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+on_call_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+on_call_hangup = lv.img(on_call)
+on_call_hangup.set_size(64, 64)
+on_call_hangup.add_flag(lv.obj.FLAG.CLICKABLE)
+on_call_hangup.set_pos(85, 220)
+on_call_hangup.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+on_call_hangup.set_src("E:/static/hang_up.png")
+
+
+# -------------------------------------------sms_detail screen----------------------------------------------------------
+msg_detail_screen = lv.obj()
+sms_detail = lv.obj(msg_detail_screen)
+sms_detail.center()
+sms_detail.set_size(240, 320)
+sms_detail.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+msg_detail_title = lv.label(sms_detail)
+msg_detail_title.set_pos(0, 10)
+msg_detail_title.set_size(240, 40)
+msg_detail_title.set_long_mode(lv.label.LONG.WRAP)
+msg_detail_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+msg_detail_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+msg_detail_cont = lv.label(sms_detail)
+msg_detail_cont.set_pos(0, 50)
+msg_detail_cont.set_size(240, 200)
+msg_detail_cont.set_long_mode(lv.label.LONG.WRAP)
+msg_detail_cont.set_style_text_align(lv.TEXT_ALIGN.LEFT, 20)
+msg_detail_cont.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# -------------------------------------------call_log screen----------------------------------------------------------
+call_log_screen = lv.obj()
+call_log = lv.obj(call_log_screen)
+call_log.center()
+call_log.set_size(240, 320)
+call_log.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+call_log_title = lv.label(call_log)
+call_log_title.set_pos(0, 10)
+call_log_title.set_size(240, 40)
+call_log_title.set_long_mode(lv.label.LONG.WRAP)
+call_log_title.set_text("通话记录")
+call_log_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+call_log_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+from ext.common import Abstract
+
+class Screen(Abstract):
+    def __init__(self):
+        self.meta = None
+        self.meta_info = None
+        self.last_screen_info = None
+        self.bg_img = None
+
+    def set_bg_img(self, _fp):
+        print("bg _fp = {} NAME = {} bg_img = {}".format(_fp, self.NAME, self.bg_img))
+        if self.bg_img:
+            self.bg_img.set_src(_fp)
+  
+    def load_screen(self, e, msg):
+        print("msg = {}".format(msg))
+        EventMesh.publish("load_screen", msg)
+    
+    def load_screen_anim(self, e, msg):
+        print("msg = {}".format(msg))
+        EventMesh.publish("load_screen_anim", msg)
+
+    def load_screen_animtop(self, e, msg):
+        print("msg = {}".format(msg))
+        EventMesh.publish("load_screen_animtop", msg)
+
+    def load(self):
+        pass
+
+    def get_meta(self):
+        return self.meta
+
+    def Close(self):
+        pass
+
+    def done_left_to_right(self):
+        pass
+
+    def done_right_to_left(self):
+        pass
+
+    def done_bottom_to_top(self):
+        pass
+
+    def done_top_to_bottom(self):
+        pass
+
+    def done_return(self):
+        pass
+
+    def done_click(self):
+        pass
+
+    def done_error(self):
+        pass
+
+class PhoneScreen(Screen):
+    NAME = "Phone"
+
+    def __init__(self):
+
+        super().__init__()
+        self.meta = phone_screen
+        self.phone_num = ''
+        self.phone_list = []
+        phone_one.add_event_cb(lambda e: self.one(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_two.add_event_cb(lambda e: self.two(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_three.add_event_cb(lambda e: self.three(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_four.add_event_cb(lambda e: self.four(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_five.add_event_cb(lambda e: self.five(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_six.add_event_cb(lambda e: self.six(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_seven.add_event_cb(lambda e: self.seven(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_eight.add_event_cb(lambda e: self.eight(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_nine.add_event_cb(lambda e: self.nine(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_zero.add_event_cb(lambda e: self.zero(e),
+                                     lv.EVENT.CLICKED, None)
+
+        phone_call.add_event_cb(lambda e: self.call(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_contact.add_event_cb(lambda e: self.contact(e),
+                                     lv.EVENT.CLICKED, None)
+        phone_delete.add_event_cb(lambda e: self.delete(e),
+                                     lv.EVENT.CLICKED, None)
+        
+    def one(self,e):
+        self.phone_list.append("1")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+    
+    def two(self,e):
+        self.phone_list.append("2")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+
+    def three(self,e):
+        self.phone_list.append("3")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+
+    def four(self,e):
+        self.phone_list.append("4")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+
+    def five(self,e):
+        self.phone_list.append("5")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+
+    def six(self,e):
+        self.phone_list.append("6")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+
+    def seven(self,e):
+        self.phone_list.append("7")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+
+    def eight(self,e):
+        self.phone_list.append("8")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+
+    def nine(self,e):
+        self.phone_list.append("9")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+
+    def zero(self,e):
+        self.phone_list.append("0")                
+        self.phone_num = ''.join(self.phone_list)
+        self.show_num()
+
+    def delete(self,e):
+        if self.phone_list is not None:
+            self.phone_list.pop()
+            self.phone_num = ''.join(self.phone_list)
+            self.show_num()
+
+    def contact(self,e):
+        EventMesh.publish("load_screen", {"screen": "contacts"})
+
+    def call(self,e):
+        EventMesh.publish("load_screen", {"screen": "dialing"})
+        voiceCall.callStart(self.phone_num)
+        
+    def show_num(self):
+        phone_label.set_text(self.phone_num)
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+CALLLOG_FLAG = 0
+class CallLogScreen(Screen):
+    NAME = "call_log"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = call_log_screen
+        self.log_list = []
+
+    def post_processor_before_initialization(self):
+        self.log_list = EventMesh.publish("get_call_log_list")
+
+    def initialization(self):
+        global CALLLOG_FLAG
+        if CALLLOG_FLAG == 0:
+            self.btn_create()
+    
+    def btn_create(self):
+        h = 0
+        for i ,each in enumerate(self.log_list):
+
+            _btn = lv.btn(call_log)
+            _btn.set_size(240,50)
+            _btn.set_pos(0,52*h + 50)
+            _btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+            _btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED)
+            _btn.add_event_cb(lambda e: self.calling(e),
+                                     lv.EVENT.PRESSED, None)
+
+            _btn_label1 = lv.label(_btn)
+            _btn_label1.set_pos(0, 0)
+            _btn_label1.set_long_mode(lv.label.LONG.DOT)
+            _btn_label1.set_size(0, 0)
+            _btn_label1.set_text(str(i))
+
+            _btn_label2 = lv.label(_btn)
+            _btn_label2.set_pos(0, 5)
+            _btn_label2.set_size(100, 25)
+            _btn_label2.set_text(each[0])
+            _btn_label2.set_long_mode(lv.label.LONG.DOT)
+            _btn_label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+            #
+            _btn_label3 = lv.label(_btn)
+            _btn_label3.set_pos(100, 5)
+            _btn_label3.set_size(100, 25)
+            _btn_label3.set_text("(" + each[1] + ") " + each[3])
+            _btn_label3.set_long_mode(lv.label.LONG.DOT)
+            _btn_label3.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            h = h + 1
+        
+    def calling(self,e):
+            _i = int(e.get_target().get_child(0).get_text())
+            _msg = self.log_list[_i]
+            EventMesh.publish("save_phonenum",_msg[1])
+            EventMesh.publish("load_screen", {"screen": "dialing"})
+
+    def done_return(self):
+            EventMesh.publish("load_screen", {"screen": "tilemenu"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+
+class DialingScreen(Screen):
+    NAME = "dialing"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = dialing_screen
+        hangup_imgbtn.add_event_cb(lambda e: self.hangup(e),
+                                     lv.EVENT.CLICKED, None)
+        self.value = ""
+
+
+    def initialization(self):
+        #获取字符串
+        self.value = EventMesh.publish("get_phonenum")
+        dialing_label.set_text(self.value)
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def hangup(self,e):
+        voiceCall.callEnd()
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+MSG_FLAG = 0
+class PopupScreen(Screen):
+    NAME = "popup"
+
+    def __init__(self):
+        super().__init__()
+        # -------------------------------------------popup_menu screen----------------------------------------------------------
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.msg_title = lv.label(self.meta)
+        self.msg_title.set_pos(0, 10)
+        self.msg_title.set_size(240, 40)
+        self.msg_title.set_text("信息")
+        self.msg_title.set_long_mode(lv.label.LONG.WRAP)
+        self.msg_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.msg_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+    # def post_processor_before_initialization(self):
+    #     EventMesh.publish("get_msg_count")
+    #     self.msg_detail = EventMesh.publish("get_msg_detail")
+
+    def post_processor_before_initialization(self):
+        check_json = ql_fs.path_exists("/usr/msg.json")
+        self.msg_detail = EventMesh.publish("get_msg_detail")
+        if check_json == False:
+            with open("usr/msg.json","w",encoding="utf-8") as fd:
+                ujson.dump(self.msg_detail,fd)
+                print("创建短信")
+        else:
+            with open("usr/msg.json","r",encoding="utf-8") as fd:
+                self.msg_detail = ujson.load(fd)
+                print("读取短信")
+
+
+    def initialization(self):
+        global MSG_FLAG
+        if MSG_FLAG == 0:
+            self.btn_create()
+    
+    def btn_create(self):
+        global MSG_FLAG
+        MSG_FLAG = 1
+        i = 0
+        for key in self.msg_detail.keys():
+            msg_btn = lv.btn(self.meta)
+            msg_btn.set_size(240,50)
+            msg_btn.set_pos(0,52*i)
+            msg_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+            msg_btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED)
+            msg_btn.add_event_cb(lambda e: self.calling(e),
+                                     lv.EVENT.PRESSED, None)
+
+            contact_btn_label = lv.label(msg_btn)
+            contact_btn_label.set_text(key)
+            contact_btn_label.align(lv.ALIGN.LEFT_MID, 10, 0)
+            contact_btn_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            detail = self.msg_detail[key]
+            print("------:",detail)
+            contact_content_label = lv.label(msg_btn)
+            contact_content_label.set_text(detail[:15])
+            contact_content_label.align(lv.ALIGN.LEFT_MID, 80, 0)
+            contact_content_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            i = i + 1
+            # self.name.append(str(key)) 
+                                    
+            # print(self.name)
+    def calling(self,e):
+        #上传标题和内容
+        _name = e.get_target().get_child(0).get_text()
+        EventMesh.publish("save_msg_name", _name)       
+        #_content = e.get_target().get_child(1).get_text()
+        EventMesh.publish("save_msg_content", self.msg_detail[_name]) 
+        print(_name,self.msg_detail[_name])
+        #显示详细页面
+        EventMesh.publish("load_screen", {"screen": "msg_detail"})
+
+
+    def done_bottom_to_top(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class MsgDetailScreen(Screen):
+    NAME = "msg_detail"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = msg_detail_screen
+
+        self.name = ""
+        self.contetn = ""
+
+
+    def initialization(self):
+        #获取字符串
+        self.name = EventMesh.publish("get_msg_name")
+        self.content = EventMesh.publish("get_msg_content")
+        msg_detail_title.set_text(self.name)
+        msg_detail_cont.set_text(self.content)
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def hangup(self,e):
+        voiceCall.callEnd()
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class HeartrateScreen(Screen):
+    NAME = "heartrate"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = heartrate_screen
+        self.point = 0
+        #self.timer = Timer(Timer.Timer1)
+        self.timer = osTimer()
+
+    def initialization(self):
+        heartrate_bpm_label.add_flag(lv.obj.FLAG.HIDDEN)
+        heartrate_mmhg_label.add_flag(lv.obj.FLAG.HIDDEN)
+        heartrate_start_label.clear_flag(lv.obj.FLAG.HIDDEN)
+
+        #self.monitor_timer.start(7 * 60 * 1000, 1, self.check)
+
+    def post_processor_after_initialization(self):
+        self.timer.start(1*1000, 1, self.start_measure)
+        #self.timer.start(period=1000, mode=self.timer.PERIODIC, callback=self.start_measure)
+
+
+    def start_measure(self,*args):
+        self.point = self.point + 1
+        print("point:",self.point)
+        if self.point == 1:
+            heartrate_start_label.set_text("测量中...")
+        if self.point == 2:
+            heartrate_start_label.set_text("测量中.....")
+        if self.point == 3:
+            heartrate_bpm_label.clear_flag(lv.obj.FLAG.HIDDEN)
+            heartrate_mmhg_label.clear_flag(lv.obj.FLAG.HIDDEN)
+            heartrate_start_label.add_flag(lv.obj.FLAG.HIDDEN)
+            heartrate_bpm_label.set_text("74 bpm")
+            heartrate_mmhg_label.set_text("110 / 70 mmhg")
+            self.point = 0
+            self.timer.stop()
+
+    def done_return(self):
+        heartrate_bpm_label.add_flag(lv.obj.FLAG.HIDDEN)
+        heartrate_mmhg_label.add_flag(lv.obj.FLAG.HIDDEN)
+        heartrate_start_label.clear_flag(lv.obj.FLAG.HIDDEN)
+        self.timer.stop()
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        self.timer.stop()
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        self.timer.stop()
+
+    
+
+class ToolboxScreen(Screen):
+    NAME = "toolbox"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = toolbox_screen
+        toolbox_step.add_event_cb(lambda e: self.load_screen(e, {"screen": "step"}), lv.EVENT.CLICKED, None)
+        toolbox_weather.add_event_cb(lambda e: self.load_screen(e, {"screen": "weather"}), lv.EVENT.CLICKED, None)
+        toolbox_alarm.add_event_cb(lambda e: self.load_screen(e, {"screen": "alarm"}), lv.EVENT.CLICKED, None)
+        toolbox_countdown.add_event_cb(lambda e: self.load_screen(e, {"screen": "countdown"}), lv.EVENT.CLICKED, None)
+        toolbox_stopwatch.add_event_cb(lambda e: self.load_screen(e, {"screen": "stopwatch"}), lv.EVENT.CLICKED, None)
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class SettingScreen(Screen):
+    NAME = "setting"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = setting_screen
+        setting_language.add_event_cb(lambda e: self.load_screen(e, {"screen": "language"}), lv.EVENT.CLICKED, None)
+        setting_dialswitch.add_event_cb(lambda e: self.load_screen(e, {"screen": "dialswitch"}), lv.EVENT.CLICKED, None)
+        setting_themeswitch.add_event_cb(lambda e: self.load_screen(e, {"screen": "themeswitch"}), lv.EVENT.CLICKED, None)
+        setting_imei.add_event_cb(lambda e: self.load_screen(e, {"screen": "imei"}), lv.EVENT.CLICKED, None)
+        setting_app.add_event_cb(lambda e: self.load_screen(e, {"screen": "app"}), lv.EVENT.CLICKED, None)
+        setting_bright.add_event_cb(lambda e: self.load_screen(e, {"screen": "brightness"}), lv.EVENT.CLICKED, None)
+        setting_volume.add_event_cb(lambda e: self.load_screen(e, {"screen": "volume"}), lv.EVENT.CLICKED, None)
+        setting_restore.add_event_cb(lambda e: self.load_screen(e, {"screen": "restore"}), lv.EVENT.CLICKED, None)
+        setting_poweroff.add_event_cb(lambda e: self.load_screen(e, {"screen": "poweroff"}), lv.EVENT.CLICKED, None)
+        setting_update.add_event_cb(lambda e: self.load_screen(e, {"screen": "update"}), lv.EVENT.CLICKED, None)
+        setting_version.add_event_cb(lambda e: self.load_screen(e, {"screen": "version"}), lv.EVENT.CLICKED, None)
+
+    def done_bottom_to_top(self):
+        #上滑添加动画切屏:动画类型,时间,延迟,auto_del
+        EventMesh.publish("load_screen", {"screen": "setting2"})
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class RestoreScreen(Screen):
+    NAME = "restore"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = restore_screen
+        restore_confirm.add_event_cb(lambda e: self.confirm(e),lv.EVENT.CLICKED, None)
+        restore_cancel.add_event_cb(lambda e: self.concel(e),lv.EVENT.CLICKED, None)
+        
+    def confirm(self, e):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def concel(self, e):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class UpdateScreen(Screen):
+    NAME = "update"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = update_screen
+        update_return.add_event_cb(lambda e: self.back(e),lv.EVENT.CLICKED, None)
+    
+    def back(self,e):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+       
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class VersionScreen(Screen):
+    NAME = "version"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = version_screen
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class PoweroffScreen(Screen):
+    NAME = "poweroff"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = poweroff_screen
+        poweroff_confirm.add_event_cb(lambda e: self.confirm(e),lv.EVENT.CLICKED, None)
+        poweroff_return.add_event_cb(lambda e: self.concel(e),lv.EVENT.CLICKED, None)
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+        
+    def confirm(self, e):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def concel(self, e):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class LanguageScreen(Screen):
+    NAME = "language"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = language_screen
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class DialswitchScreen(Screen):
+    NAME = "dialswitch"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = dialswitch_screen
+        dialswitch_btn1.add_event_cb(lambda e: self.watchface01(e),
+                                     lv.EVENT.PRESSED, None)
+
+        dialswitch_btn2.add_event_cb(lambda e: self.watchface02(e),
+                                     lv.EVENT.PRESSED, None)
+
+    def watchface01(self,e):
+        #watchface2.add_flag(lv.obj.FLAG.HIDDEN)
+        #watchface01.clear_flag(lv.obj.FLAG.HIDDEN)
+        btn1_switch.add_state(lv.STATE.CHECKED)
+        btn2_switch.clear_state(lv.STATE.CHECKED)
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def watchface02(self,e):
+        #watchface01.add_flag(lv.obj.FLAG.HIDDEN)
+        #watchface2.clear_flag(lv.obj.FLAG.HIDDEN)
+        btn1_switch.clear_state(lv.STATE.CHECKED)
+        btn2_switch.add_state(lv.STATE.CHECKED)
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class ThemeswitchScreen(Screen):
+    NAME = "themeswitch"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = menustyle_screen
+        menustyle_btn1.add_event_cb(lambda e: self.fun1(e),
+                                     lv.EVENT.PRESSED, None)
+
+        menustyle_btn2.add_event_cb(lambda e: self.fun2(e),
+                                     lv.EVENT.PRESSED, None)
+
+    def fun1(self,e):
+        menu_btn1_switch.add_state(lv.STATE.CHECKED)
+        menu_btn2_switch.clear_state(lv.STATE.CHECKED)
+        EventMesh.publish("change_style", "MainMenu1")
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def fun2(self,e):
+        menu_btn1_switch.clear_state(lv.STATE.CHECKED)
+        menu_btn2_switch.add_state(lv.STATE.CHECKED)
+        EventMesh.publish("change_style", "MainMenu2")
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class ImeiScreen(Screen):
+    NAME = "imei"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = imei_screen
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class AppScreen(Screen):
+    NAME = "app"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = app_screen
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class BrightnessScreen(Screen):
+    NAME = "brightness"
+
+    def __init__(self):
+        super().__init__()
+        self.level = 0
+        self.meta = brightness_screen
+        brightness_add_imgbtn.add_event_cb(lambda e: self.add_level(e),
+                                     lv.EVENT.CLICKED, None)
+        brightness_reduce_imgbtn.add_event_cb(lambda e: self.reduce_level(e),
+                                     lv.EVENT.CLICKED, None)
+
+    def add_level(self, e):
+        EventMesh.publish("push_add_brightness_level")
+        self.level = EventMesh.publish("get_brightness_level")
+        self.show_bar()
+
+    def reduce_level(self, e):
+        EventMesh.publish("push_reduce_brightness_level")
+        self.level = EventMesh.publish("get_brightness_level")
+        self.show_bar()
+
+    def show_bar(self):
+        brightness_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF)
+
+    def initialization(self):
+        self.level = EventMesh.publish("get_brightness_level")
+        self.show_bar()
+    
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class VolumeScreen(Screen):
+    NAME = "volume"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = volume_screen
+        volume_phone_btn.add_event_cb(lambda e: self.load_screen(e, {"screen": "phonering"}), lv.EVENT.CLICKED, None)
+        volume_message_btn.add_event_cb(lambda e: self.load_screen(e, {"screen": "msgvolume"}), lv.EVENT.CLICKED, None)
+        volume_alarm_btn.add_event_cb(lambda e: self.load_screen(e, {"screen": "alarmvolume"}), lv.EVENT.CLICKED, None)
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "setting"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+
+class PhoneringScreen(Screen):
+    NAME = "phonering"
+
+    def __init__(self):
+        super().__init__()
+        self.level = 0
+        self.meta = phonering_screen
+        phonering_add_imgbtn.add_event_cb(lambda e: self.add_level(e),
+                                     lv.EVENT.CLICKED, None)
+        phonering_reduce_imgbtn.add_event_cb(lambda e: self.reduce_level(e),
+                                     lv.EVENT.CLICKED, None)
+        phonering_add_imgbtn.set_ext_click_area(20)
+        phonering_reduce_imgbtn.set_ext_click_area(20)
+
+    def add_level(self, e):
+        EventMesh.publish("push_add_phonering_level")
+        self.level = EventMesh.publish("get_phonering_level")
+        self.show_bar()
+
+    def reduce_level(self, e):
+        EventMesh.publish("push_reduce_phonering_level")
+        self.level = EventMesh.publish("get_phonering_level")
+        self.show_bar()
+
+    def show_bar(self):
+        phonering_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF)
+
+    def initialization(self):
+        self.level = EventMesh.publish("get_phonering_level")
+        self.show_bar()
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "volume"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+
+class AlarmvolumeScreen(Screen):
+    NAME = "alarmvolume"
+
+    def __init__(self):
+        super().__init__()
+        self.level = 0
+        self.meta = alarmvolume_screen
+        alarmvolume_add_imgbtn.add_event_cb(lambda e: self.add_level(e),
+                                     lv.EVENT.CLICKED, None)
+        alarmvolume_reduce_imgbtn.add_event_cb(lambda e: self.reduce_level(e),
+                                     lv.EVENT.CLICKED, None)
+
+    def add_level(self, e):
+        EventMesh.publish("push_add_alarmvolume_level")
+        self.level = EventMesh.publish("get_alarmvolume_level")
+        self.show_bar()
+
+    def reduce_level(self, e):
+        EventMesh.publish("push_reduce_alarmvolume_level")
+        self.level = EventMesh.publish("get_alarmvolume_level")
+        self.show_bar()
+
+    def show_bar(self):
+        alarmvolume_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF)
+
+    def initialization(self):
+        self.level = EventMesh.publish("get_alarmvolume_level")
+        self.show_bar()
+    
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "volume"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+
+class MsgvolumeScreen(Screen):
+    NAME = "msgvolume"
+
+    def __init__(self):
+        super().__init__()
+        self.level = 0
+        self.meta = msgvolume_screen
+        msgvolume_add_imgbtn.add_event_cb(lambda e: self.add_level(e),
+                                     lv.EVENT.CLICKED, None)
+        msgvolume_reduce_imgbtn.add_event_cb(lambda e: self.reduce_level(e),
+                                     lv.EVENT.CLICKED, None)
+
+    def add_level(self, e):
+        EventMesh.publish("push_add_msgvolume_level")
+        self.level = EventMesh.publish("get_msgvolume_level")
+        self.show_bar()
+
+    def reduce_level(self, e):
+        EventMesh.publish("push_reduce_msgvolume_level")
+        self.level = EventMesh.publish("get_msgvolume_level")
+        self.show_bar()
+
+    def show_bar(self):
+        alarmvolume_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF)
+
+    def initialization(self):
+        self.level = EventMesh.publish("get_msgvolume_level")
+        self.show_bar()
+    
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "volume"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class IncomingCallScreen(Screen):
+    NAME = "incoming_call"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = incoming_call_screen
+        incoming_call_answer.add_event_cb(lambda e: self.answer(e),
+                                     lv.EVENT.CLICKED, None)
+        incoming_call_hangup.add_event_cb(lambda e: self.hangup(e),
+                                     lv.EVENT.CLICKED, None)
+
+    def post_processor_after_initialization(self):
+
+        incoming_call_label.set_text(str(self.meta_info))
+
+    def answer(self,e):
+        voiceCall.callAnswer()
+
+    def hangup(self,e):
+        voiceCall.callEnd()
+
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class OnCallScreen(Screen):
+    NAME = "oncall"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = on_call_screen
+        on_call_hangup.add_event_cb(lambda e: self.hangup(e),
+                                     lv.EVENT.CLICKED, None)
+
+    def post_processor_after_initialization(self):
+        on_call_label.set_text(str(self.meta_info))
+
+    def hangup(self,e):
+        voiceCall.callEnd()
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+class StepScreen(Screen):
+    NAME = "step"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = step_screen
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "toolbox"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+
+class WeatherScreen(Screen):
+    NAME = "weather"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = weather_screen
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "toolbox"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class WechatScreen(Screen):
+    NAME = "wechat"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = wechat_screen
+        wechat_press_btn.add_event_cb(lambda e: self.talking(e),
+                                     lv.EVENT.PRESSING, None)
+        wechat_press_btn.add_event_cb(lambda e: self.sending(e),
+                                     lv.EVENT.PRESS_LOST, None)
+        self.timer = osTimer()
+        wechat_label.set_text(" ")
+
+    def talking(self,e):
+        wechat_label.set_text("松开发送,上滑取消")
+    
+    def sending(self,e):
+        wechat_label.set_text("发送中")
+        self.timer.start(2 * 1000, 0, self.hide_label)
+    
+    def hide_label(self,*args):
+        wechat_label.add_flag(lv.obj.FLAG.HIDDEN)
+    #     self.make_btn()
+    
+    # def make_btn(self):
+    #     _btn = lv.btn(alarm)
+    #     _btn.set_size(60,50)
+    #     _btn.set_pos(, 52*i + 50)
+    #     _btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+    #     _btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED)
+
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class StepScreen(Screen):
+    NAME = "step"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = step_screen
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "toolbox"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+CONTACT_FLAG = 0
+class ContactsScreen(Screen):
+    NAME = "contacts"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = contacts_screen
+        self.phonebook = {}
+        self.count = 0
+        self.phone_num = ""
+        self.name = []
+
+    def post_processor_before_initialization(self):
+        check_json = ql_fs.path_exists("/usr/phonebook.json")
+        self.phonebook = EventMesh.publish("get_addr_book_list") 
+        if check_json == False:
+            with open("usr/phonebook.json","w",encoding="utf-8") as fd:
+                ujson.dump(self.phonebook,fd)
+                print("创建电话簿")
+        else:
+            with open("usr/phonebook.json","r",encoding="utf-8") as fd:
+                self.phonebook = ujson.load(fd)
+                print("读取电话簿")
+
+    def initialization(self):
+        #读取json文件中的字典放到self.phonebook中
+        global CONTACT_FLAG
+        #创建btn
+        if CONTACT_FLAG == 0:
+            self.btn_create()
+
+    def btn_create(self):
+        #读取json文件中的键作为label文本;
+        global CONTACT_FLAG
+        CONTACT_FLAG = 1
+        for key in self.phonebook.keys():
+            
+            contact_btn = lv.btn(contacts)
+            contact_btn.set_size(240,50)
+            contact_btn.set_pos(0,52*self.count )
+            contact_btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+            contact_btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED)
+            contact_btn.add_event_cb(lambda e: self.calling(e),
+                                     lv.EVENT.PRESSED, None)
+
+            contact_btn_label = lv.label(contact_btn)
+            contact_btn_label.set_text(key)
+            contact_btn_label.align(lv.ALIGN.LEFT_MID, 10, 0)
+            contact_btn_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+            self.count += 1
+
+    def calling(self,e):
+        _msg = e.get_target().get_child(0).get_text()
+        EventMesh.publish("save_phonenum", _msg)       
+        self.phone_num = self.phonebook[_msg]
+        print(_msg,self.phone_num,_msg)
+        voiceCall.callStart(self.phone_num)
+        EventMesh.publish("load_screen", {"screen": "dialing"})
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "tilemenu"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class AlarmScreen(Screen):
+    NAME = "alarm"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = alarm_screen
+        self.count = 2
+
+    def post_processor_after_initialization(self):
+        self.btn_create()
+        
+    def btn_create(self):
+        for i in range(self.count):
+            
+            _btn = lv.btn(alarm)
+            _btn.set_size(240,50)
+            _btn.set_pos(0, 52*i + 50)
+            _btn.add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+            _btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED)
+
+            _label = lv.label(_btn)
+            _label.set_text("08:00")
+            _label.set_pos(2, 0)
+            _label.set_size(100, 25)
+
+            _label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            #频率
+            _label2 = lv.label(_btn)
+            _label2.set_pos(2, 25)
+            _label2.set_size(100, 25)
+            _label2.set_text("一 二 三")
+            _label2.set_long_mode(lv.label.LONG.DOT)
+            _label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            #开关
+            _switch = lv.switch(_btn)
+            _switch.set_pos(150, 3)
+            _switch.set_size(50, 25)
+            _switch.set_style_bg_color(lv.color_make(0xff, 0xff, 0xff),lv.PART.MAIN | lv.PART.INDICATOR)
+            _switch.set_style_bg_color(lv.color_make(0xff, 0x00, 0x00),lv.PART.KNOB)
+
+
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "toolbox"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class TemperatureScreen(Screen):
+    NAME = "temperature"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = temperature_screen
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+
+class Spo2Screen(Screen):
+    NAME = "spo2"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = spo2_screen
+        self.timer = osTimer()
+        self.point = 0
+
+    def post_processor_after_initialization(self):
+        self.timer.start(1*1000, 1, self.start_measure)
+
+    def start_measure(self,*args):
+        self.point = self.point + 1
+        if self.point == 1:
+            spo2_label.set_text("96 %")
+            spo2_label_1.set_text("测量中")
+
+        if self.point == 2:
+            spo2_label.set_text("97 %")
+            spo2_label_1.set_text("测量中")
+
+        if self.point == 3:
+            spo2_label.set_text("98 %")
+            spo2_label_1.set_text("测量中")
+
+        if self.point == 4:
+            spo2_label.set_text("99 %")
+            spo2_label_1.set_text("测量完成")
+            self.timer.stop()
+            self.point = 0
+            
+    def done_return(self):
+        spo2_start_btn.clear_flag(lv.obj.FLAG.HIDDEN)
+        spo2_now_value.add_flag(lv.obj.FLAG.HIDDEN)
+        self.timer.stop()
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        self.timer.stop()
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        self.timer.stop()
+
+class CountdownScreen(Screen):
+    NAME = "countdown"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = countdown_screen
+        self.timer = Timer(Timer.Timer1)
+        self.sec = 0
+        self.min = 0
+        self.hour = 0
+        self.total = 0
+        self.flag = 1
+        countdown_sec_up.add_event_cb(lambda e: self.sec_up(e),
+                                     lv.EVENT.CLICKED, None)
+        countdown_sec_down.add_event_cb(lambda e: self.sec_down(e),
+                                     lv.EVENT.CLICKED, None)
+        countdown_min_up.add_event_cb(lambda e: self.min_up(e),
+                                     lv.EVENT.CLICKED, None)
+        countdown_min_down.add_event_cb(lambda e: self.min_down(e),
+                                     lv.EVENT.CLICKED, None)
+        countdown_hour_up.add_event_cb(lambda e: self.hour_up(e),
+                                     lv.EVENT.CLICKED, None)
+        countdown_hour_down.add_event_cb(lambda e: self.hour_down(e),
+                                     lv.EVENT.CLICKED, None)
+        countdown_start_imgbtn.add_event_cb(lambda e: self.start(e),
+                                     lv.EVENT.CLICKED, None)
+        countdown_reset_imgbtn.add_event_cb(lambda e: self.reset(e),
+                                     lv.EVENT.CLICKED, None)
+        countdown_stop_imgbtn.add_event_cb(lambda e: self.stop(e),
+                                     lv.EVENT.CLICKED, None)                          
+
+    def sec_up(self,e):
+        if self.sec < 59:
+            self.sec = self.sec + 1
+            print("sec_up:",self.sec)
+        self.show_value()
+
+    def sec_down(self,e):
+        if self.sec > 0:
+            self.sec = self.sec - 1
+            print("sec_down:",self.sec)
+        self.show_value()
+
+    def min_up(self,e):
+        if self.min < 59:
+            self.min = self.min + 1
+            print("min_up:",self.min)
+        self.show_value()
+
+    def min_down(self,e):
+        if self.min > 0:
+            self.min = self.min - 1
+            print("min_down:",self.min)
+        self.show_value()
+
+    def hour_up(self,e):
+        if self.hour < 23:
+            self.hour = self.hour + 1
+            print("hour_up:",self.hour)
+        self.show_value()
+
+    def hour_down(self,e):
+        if self.hour > 0:
+            self.hour = self.hour - 1
+            print("hour_down:",self.hour)
+        self.show_value()
+    
+    def start(self,e):
+        self.total = self.hour*60*60 + self.min*60 + self.sec
+        print("--00:",self.total,self.hour,self.min,self.sec)
+        self.timer.start(period=1000, mode=self.timer.PERIODIC, callback=self.fun)
+        countdown_stop_imgbtn.clear_flag(lv.obj.FLAG.HIDDEN)
+        countdown_start_imgbtn.add_flag(lv.obj.FLAG.HIDDEN)
+
+    def stop(self,e):
+        print("in stop")
+        countdown_start_imgbtn.clear_flag(lv.obj.FLAG.HIDDEN)
+        countdown_stop_imgbtn.add_flag(lv.obj.FLAG.HIDDEN)
+        self.timer.stop()
+        self.show_value()
+
+    def fun(self,e):
+        self.show_value()        
+        self.total = self.total - 1
+        if self.total < 1:
+            self.timer.stop()
+        self.sec = self.sec - 1 
+        
+        if self.sec < 0:
+            self.sec = 59
+            self.min = self.min -1
+         
+
+    def reset(self,e):
+        print("in reset")
+        self.timer.stop()
+        self.hour = 0
+        self.min = 0
+        self.sec = 0
+        self.show_value()
+
+    def show_value(self):
+
+        print(" in show value :",str(self.sec),str(self.min),str(self.hour))
+        countdown_sec.set_text(str(self.sec))
+        countdown_min.set_text(str(self.min))
+        countdown_hour.set_text(str(self.hour))
+
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "toolbox"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        self.timer.stop()
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        self.timer.stop()
+
+
+class StopwatchScreen(Screen):
+    NAME = "stopwatch"
+
+    def __init__(self):
+        super().__init__()
+        self.meta = stopwatch_screen
+        self.ms_value = 0
+        self.sec_value = 0
+        self.min_value = 0
+        self.timer = Timer(Timer.Timer1)
+        stopwatch_start_imgbtn.add_event_cb(lambda e: self.start(e),
+                                     lv.EVENT.CLICKED, None)
+        
+        stopwatch_reset_imgbtn.add_event_cb(lambda e: self.reset(e),
+                                     lv.EVENT.CLICKED, None)
+        stopwatch_stop_imgbtn.add_event_cb(lambda e: self.paused(e),
+                                     lv.EVENT.CLICKED, None)
+
+    def start(self, e):      
+        #self.timer.start(100, 1, self._fun)  
+        self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self._fun)
+        stopwatch_stop_imgbtn.clear_flag(lv.obj.FLAG.HIDDEN)
+        stopwatch_start_imgbtn.add_flag(lv.obj.FLAG.HIDDEN)
+
+
+    def paused(self, e):        
+        print("stopwatch pause")
+        stopwatch_start_imgbtn.clear_flag(lv.obj.FLAG.HIDDEN)
+        stopwatch_stop_imgbtn.add_flag(lv.obj.FLAG.HIDDEN)
+        self.timer.stop()
+        self.show_value()
+
+    def reset(self, e):
+        print("stopwatch reset")        
+        self.sec_value = 0
+        self.min_value = 0
+        self.ms_value = 0
+        self.timer.stop()
+        self.show_value()
+
+    def _fun(self,e):
+        self.ms_value += 1
+        if self.ms_value > 9:
+            self.ms_value = 0   
+            self.sec_value += 1
+        if self.sec_value > 60:
+            self.sec_value = 0
+            self.min_value += 1
+        if self.min_value > 60:
+            self.timer.stop()
+        self.show_value()
+
+    def show_value(self):
+
+        stopwatch_label_ms.set_text(str(self.ms_value))
+        stopwatch_label_sec.set_text(str(self.sec_value))
+        stopwatch_label_min.set_text(str(self.min_value))
+
+    def done_return(self):
+        self.timer.stop()
+        EventMesh.publish("load_screen", {"screen": "toolbox"})
+
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        self.timer.stop()
+        
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+        self.timer.stop()
+       
+
+
+
+class UIFINDScreen(Screen):
+    NAME = "FIND"
+    def __init__(self):
+        super().__init__()
+        self.aud = audio.Audio(0)
+        self.aud.set_pa(Pin.GPIO29)
+        self.aud.setVolume(10)
+        self.FIND_timer = osTimer()
+        self.FIND_timer_count = 0
+
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # add style for watchface
+        self.meta.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT)
+        #进入图片
+        self.watchface_mpsignal_img = lv.img(self.meta)
+        self.watchface_mpsignal_img.set_pos(int(0),int(80))
+        self.watchface_mpsignal_img.set_size(140,140)
+        self.watchface_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface_mpsignal_img.set_src("E:/static/time_finish.png")
+        self.watchface_mpsignal_img.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+    def initialization(self):
+        self.FIND_timer.start(3000, 1, self.FIND_timer_cb)
+        self.aud.play(1, 0, 'E:/static/audio_audio_haixiu.mp3')  #播放声音
+        
+    def post_processor_after_instantiation(self):
+        pass
+    def post_processor_after_initialization(self):
+        pass
+    def FIND_timer_cb(self, *args):
+        self.aud.play(1, 0, 'E:/static/audio_audio_haixiu.mp3') 
+        self.FIND_timer_count += 1
+        if self.FIND_timer_count > 40: #120秒
+            self.stop_FIND()
+    
+    def stop_FIND(self) :
+        self.FIND_timer.stop()
+        self.aud.stopAll()
+
+    def done_left_to_right(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def done_right_to_left(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def done_bottom_to_top(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def done_top_to_bottom(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def done_return(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def done_click(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    
+
+    def Close(self):
+        self.stop_FIND()
+        pass
+        
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+ 
+
+#from usr.ui_WatchFaceScreen import WatchFaceScreen
+class UI(object):
+    def __init__(self, lcd_gpio):
+        #self.screen = WatchFaceScreen()
+        #self.screen_old = self.screen
+        self.screen = None
+        self.screen_old = None
+        self.screen_list = []
+        self.lv = lv
+        self.lcd_gpio = lcd_gpio
+        self.system_sleep_timer = osTimer()
+        self.system_sleep_timer_count = 0
+        self.main_flag = 0
+        self.sleep_flag = 1
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("load_screen", self.load_screen)
+        EventMesh.subscribe("load_screen_anim", self.load_screen_anim)
+        EventMesh.subscribe("load_screen_animtop", self.load_screen_animtop)
+
+        EventMesh.subscribe("btn1_press", self.btn_press)
+        EventMesh.subscribe("btn8_press", self.btn_press)
+        EventMesh.subscribe("btn8_long_press", self.btn_press)
+
+        EventMesh.subscribe("btn1_release", self.btn_release)
+
+        EventMesh.subscribe("done_left_to_right", self.ui_press)
+        EventMesh.subscribe("done_right_to_left", self.ui_press)
+        EventMesh.subscribe("done_bottom_to_top", self.ui_press)
+        EventMesh.subscribe("done_top_to_bottom", self.ui_press)
+        EventMesh.subscribe("done_return", self.ui_press)
+        EventMesh.subscribe("done_click", self.ui_press)
+        EventMesh.subscribe("done_error", self.ui_press)
+        EventMesh.subscribe("call_in", self.publish_call_in)
+
+
+        #EventMesh.subscribe("call_in", self.publish_call_in)
+        #EventMesh.subscribe("set_bg_img", self.set_bg_img)
+
+        EventMesh.subscribe(constants.EVENT.SYSTEM_SLEEP, self.system_sleep)
+        EventMesh.subscribe(constants.EVENT.SYSTEM_UP, self.system_up)
+        self.system_sleep_timer.start(1000, 1, self.system_sleep_timer_cb)
+
+        for screen in self.screen_list:
+            screen.post_processor_after_instantiation()
+
+    def ui_press(self, event, key):
+        self.system_sleep_timeout_rest()
+        print("ui press {}".format(event))
+        if event == "done_left_to_right":
+            self.screen.done_left_to_right()
+        if event == "done_right_to_left":
+            self.screen.done_right_to_left()
+        if event == "done_bottom_to_top":
+            self.screen.done_bottom_to_top()
+        if event == "done_top_to_bottom":
+            self.screen.done_top_to_bottom()
+        if event == "done_return":
+            self.screen.done_return()
+        if event == "done_click":
+            self.screen.done_click()
+    def btn_press(self, event, key):
+        print("btn_press: {}".format(event))
+        #主表盘按电源键,息屏
+        if event == "btn8_press" and self.main_flag == 1:
+            if self.sleep_flag == 1 :
+                self.__lcd_off()
+                return
+        #息屏状态按按钮都亮屏
+        
+        self.__lcd_on()
+        
+        # if event == "btn1_press":
+        #     self.screen.btn1_press()
+
+        if event == "btn8_press":
+            self.screen.btn8_press()
+        if event == "btn8_long_press":
+            Power.powerDown()
+
+    def btn_release(self, event, msg):
+        print("btn_release: {}".format(event))
+        if event == "btn1_release":
+            self.screen.btn1_release()
+
+    def __lcd_state(self):
+        return self.lcd_gpio.read()
+
+    def __lcd_on(self):
+        print("__lcd_on")
+        if self.sleep_flag == 0 :
+            self.sleep_flag = 1
+            self.system_sleep_timeout_rest()
+            gpio_backlight.write(1)
+            #lcd_ctrl.write(1)
+            #utime.sleep(10)
+            tp_cst816.resume()
+            lcd.lcd_display_on()
+            lv.autoSleep(0)
+            pm.autosleep(0)
+        
+    def publish_call_in(self, event, msg):
+        EventMesh.publish("load_screen", {"screen": "dialing", "meta": msg})
+
+    def __lcd_off(self):
+        print("__lcd_off")
+        if self.sleep_flag == 1 :
+            self.sleep_flag = 0
+            gpio_backlight.write(0)
+            #lcd_ctrl.write(0)
+            #utime.sleep(10)
+            tp_cst816.suspend()
+            lcd.lcd_display_off()
+            lv.autoSleep(1)
+            pm.autosleep(1)
+
+    def system_sleep(self, event, msg) :
+        self.__lcd_off()
+
+    def system_up(self, event, msg):
+        self.__lcd_on()
+
+    def system_sleep_timer_cb(self, *args):
+        self.system_sleep_timer_count += 1
+        if self.system_sleep_timer_count > 50 :
+            self.system_sleep_timer_count = 0
+            #print("__lcd_state")
+            #if self.sleep_flag == 1:  # 未息屏状态,熄灭屏幕
+            self.__lcd_off()
+
+    def system_sleep_timeout_rest(self) :
+        #print("system_sleep_timeout_rest")
+        self.system_sleep_timer_count = 0
+
+    def start(self):
+        self.post_processor_after_instantiation()
+
+    def add_screen(self, screen):
+        self.screen_list.append(screen)
+        return self
+    
+
+    def load_screen(self, topic, msg):
+        print("msg={}".format(msg))
+        for scr in self.screen_list:
+            if scr.NAME == msg["screen"]:
+                # 每次屏幕切换开始息屏倒计时
+                self.__lcd_on()
+                if scr.NAME == 'watchface':
+                    self.main_flag = 1
+                else :
+                    self.main_flag = 0
+                self.screen = scr
+                if self.screen_old != None :
+                    self.screen_old.Close() #先关闭上一次界面
+                    self.lv.img.cache_invalidate_src(None) #清img cache
+                    self.lv.img.cache_set_size(16) #开img cache
+                self.screen_old = self.screen
+                if msg.get("meta"):
+                    self.screen.meta_info = msg.get("meta")
+                self.screen.post_processor_before_initialization()
+                self.screen.initialization()
+                
+                print("load_screen.load()")
+                self.screen.load()
+                self.lv.scr_load(self.screen.get_meta())
+                self.screen.post_processor_after_initialization()
+
+    def load_screen_anim(self, topic, msg):
+        print("msg={}".format(msg))
+        for scr in self.screen_list:
+            if scr.NAME == msg["screen"]:
+                # 每次屏幕切换开始息屏倒计时
+                self.__lcd_on()
+                if scr.NAME == 'watchface':
+                    self.main_flag = 1
+                else :
+                    self.main_flag = 0
+                self.screen = scr
+                if self.screen_old != None :
+                    self.screen_old.Close() #先关闭上一次界面
+                self.screen_old = self.screen
+                if msg.get("meta"):
+                    self.screen.meta_info = msg.get("meta")
+                self.screen.post_processor_before_initialization()
+                self.screen.initialization()
+                
+                print("load_screen.load()")
+                print("**************")
+                self.screen.load()
+                self.lv.scr_load_anim(self.screen.get_meta(),lv.SCR_LOAD_ANIM.MOVE_BOTTOM,100,0,0)
+                self.screen.post_processor_after_initialization()
+    
+    def load_screen_animtop(self, topic, msg):
+        print("msg={}".format(msg))
+        for scr in self.screen_list:
+            if scr.NAME == msg["screen"]:
+                # 每次屏幕切换开始息屏倒计时
+                self.__lcd_on()
+                if scr.NAME == 'watchface':
+                    self.main_flag = 1
+                else :
+                    self.main_flag = 0
+                self.screen = scr
+                if self.screen_old != None :
+                    self.screen_old.Close() #先关闭上一次界面
+                self.screen_old = self.screen
+                if msg.get("meta"):
+                    self.screen.meta_info = msg.get("meta")
+                self.screen.post_processor_before_initialization()
+                self.screen.initialization()
+                
+                print("load_screen.load()")
+                print("**************")
+                self.screen.load()
+                self.lv.scr_load_anim(self.screen.get_meta(),lv.SCR_LOAD_ANIM.MOVE_TOP,100,0,0)
+                self.screen.post_processor_after_initialization()
+
+
+
diff --git a/3.code/1.watch/2.code/ui_WatchFaceScreen.py b/3.code/1.watch/2.code/ui_WatchFaceScreen.py
new file mode 100644 (file)
index 0000000..ac50e44
--- /dev/null
@@ -0,0 +1,503 @@
+#表盘
+import utime
+import osTimer
+import lvgl as lv
+from ext import EventMesh
+from machine import Timer
+import voiceCall
+import osTimer
+from ext import constants
+from misc import Power
+import pm
+from ext.ui import Screen
+
+class Watchface2():
+    NAME = "Watchface2"
+    # # #表盘1
+    def __init__(self): 
+        print("Watchface2:__init__")
+
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # create style watchface_default
+        self.watchface_default = lv.style_t()
+        self.watchface_default.init()
+        self.watchface_default.set_bg_color(lv.color_make(0x00,0x00,0x00))
+        self.watchface_default.set_bg_opa(255)
+        # add style for watchface
+        self.meta.add_style(self.watchface_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.style_watchface_img_default = lv.style_t()
+        self.style_watchface_img_default.init()
+        self.style_watchface_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff))
+        self.style_watchface_img_default.set_img_recolor_opa(0)
+        self.style_watchface_img_default.set_img_opa(255)
+
+        #状态栏
+        
+        self.watchface_mpsignal_img = lv.img(self.meta)
+        self.watchface_mpsignal_img.set_pos(int(0),int(0))
+        self.watchface_mpsignal_img.set_size(24,17)
+        self.watchface_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface_mpsignal_img.set_src("E:/static/mpsignal5.png")
+        self.watchface_mpsignal_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.watchface_res_stat_battery_img = lv.img(self.meta)
+        self.watchface_res_stat_battery_img.set_pos(int(200),int(0))
+        self.watchface_res_stat_battery_img.set_size(30,18)
+        self.watchface_res_stat_battery_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface_res_stat_battery_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface_res_stat_battery_img.set_src("E:/static/vbat_100.png")
+        self.watchface_res_stat_battery_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.watchface_res_stat_charge_in_img = lv.img(self.meta)
+        self.watchface_res_stat_charge_in_img.set_pos(int(190),int(0))
+        self.watchface_res_stat_charge_in_img.set_size(10,18)
+        self.watchface_res_stat_charge_in_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface_res_stat_charge_in_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface_res_stat_charge_in_img.set_src("E:/static/charge_in.png")
+        # add style for watchface_res_stat_charge_in_img
+        self.watchface_res_stat_charge_in_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #时间
+        x = 10
+        y = 60
+        self.watchface1_time1_img = lv.img(self.meta)
+        self.watchface1_time1_img.set_pos(int(x),int(y))
+        self.watchface1_time1_img.set_size(56,56)
+        self.watchface1_time1_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_time1_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_time1_img.set_src("E:/static/watch_plate/style_2/time/1.png")
+        self.watchface1_time1_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        
+        self.watchface1_time2_img = lv.img(self.meta)
+        self.watchface1_time2_img.set_pos(int(x+60),int(y))
+        self.watchface1_time2_img.set_size(56,56)
+        self.watchface1_time2_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_time2_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_time2_img.set_src("E:/static/watch_plate/style_2/time/3.png")
+        self.watchface1_time2_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.watchface1_time4_img = lv.img(self.meta)
+        self.watchface1_time4_img.set_pos(int(x),int(y + 5 + 56))
+        self.watchface1_time4_img.set_size(56,56)
+        self.watchface1_time4_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_time4_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_time4_img.set_src("E:/static/watch_plate/style_2/time/2.png")
+        self.watchface1_time4_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.watchface1_time5_img = lv.img(self.meta)
+        self.watchface1_time5_img.set_pos(int(x+60),int(y+5+56))
+        self.watchface1_time5_img.set_size(56,56)
+        self.watchface1_time5_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_time5_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_time5_img.set_src("E:/static/watch_plate/style_2/time/3.png")
+        self.watchface1_time5_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #星期
+
+        self.weekday = lv.img(self.meta)
+        self.weekday.set_pos(15,190)
+        self.weekday.set_size(56,56)
+        self.weekday.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.weekday.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.weekday.set_src("E:/static/watch_plate/style_2/week/fri.png")
+        self.weekday.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        #日期
+        
+        self.date = lv.label(self.meta)
+        self.date.set_pos()
+        self.date.set_size()
+        self.date.set_long_mode(lv.label.LONG.WRAP)
+        self.date.set_text()
+        self.date.set_style_text_align(lv.TEXT_ALIGN.CENTER,0)
+        self.date.add_style(style_font_youyuan_20,lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #阴历
+        self.date = lv.label(self.meta)
+        self.date.set_pos()
+        self.date.set_size()
+        self.date.set_long_mode(lv.label.LONG.WRAP)
+        self.date.set_text()
+        self.date.set_style_text_align(lv.TEXT_ALIGN.CENTER,0)
+        self.date.add_style(style_font_youyuan_20,lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #天气logo
+        self.weather = lv.img(self.meta)
+        self.weather.set_pos(0, 50)
+        self.weather.set_size(240, 96)
+        self.weather.set_src("E:/static/IMAGE_HEART_ONLY_TEST_DONE.jpg")
+        #温度
+
+
+class Watchface1():
+    NAME = "Watchface1"
+    # # #表盘1
+    def __init__(self): 
+        print("Watchface1:__init__")
+
+        self.meta = lv.obj()
+        self.meta.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        # create style watchface_default
+        self.watchface_default = lv.style_t()
+        self.watchface_default.init()
+        self.watchface_default.set_bg_color(lv.color_make(0x00,0x00,0x00))
+        self.watchface_default.set_bg_opa(255)
+        # add style for watchface
+        self.meta.add_style(self.watchface_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        
+        # create style style_watchface_img_default
+        self.style_watchface_img_default = lv.style_t()
+        self.style_watchface_img_default.init()
+        self.style_watchface_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff))
+        self.style_watchface_img_default.set_img_recolor_opa(0)
+        self.style_watchface_img_default.set_img_opa(255)
+
+        #状态栏
+        
+        self.watchface_mpsignal_img = lv.img(self.meta)
+        self.watchface_mpsignal_img.set_pos(int(0),int(0))
+        self.watchface_mpsignal_img.set_size(24,17)
+        self.watchface_mpsignal_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface_mpsignal_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface_mpsignal_img.set_src("E:/static/mpsignal5.png")
+        self.watchface_mpsignal_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.watchface_res_stat_battery_img = lv.img(self.meta)
+        self.watchface_res_stat_battery_img.set_pos(int(200),int(0))
+        self.watchface_res_stat_battery_img.set_size(30,18)
+        self.watchface_res_stat_battery_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface_res_stat_battery_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface_res_stat_battery_img.set_src("E:/static/vbat_100.png")
+        self.watchface_res_stat_battery_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.watchface_res_stat_charge_in_img = lv.img(self.meta)
+        self.watchface_res_stat_charge_in_img.set_pos(int(190),int(0))
+        self.watchface_res_stat_charge_in_img.set_size(10,18)
+        self.watchface_res_stat_charge_in_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface_res_stat_charge_in_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface_res_stat_charge_in_img.set_src("E:/static/charge_in.png")
+        # add style for watchface_res_stat_charge_in_img
+        self.watchface_res_stat_charge_in_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        
+        #主图片
+        self.watchface1_bg_img = lv.img(self.meta)
+        self.watchface1_bg_img.set_pos(int(0),int(40))
+        self.watchface1_bg_img.set_size(240,280)
+        self.watchface1_bg_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_bg_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_bg_img.set_src("E:/static/watch_plate/style_1/bg.png")
+        self.watchface1_bg_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        #时间
+        x = 40
+        y = 80
+        self.watchface1_time1_img = lv.img(self.meta)
+        self.watchface1_time1_img.set_pos(int(x),int(y))
+        self.watchface1_time1_img.set_size(36,44)
+        self.watchface1_time1_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_time1_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_time1_img.set_src("E:/static/watch_plate/style_1/time/1.png")
+        self.watchface1_time1_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        
+        self.watchface1_time2_img = lv.img(self.meta)
+        self.watchface1_time2_img.set_pos(int(x+36),int(y))
+        self.watchface1_time2_img.set_size(36,44)
+        self.watchface1_time2_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_time2_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_time2_img.set_src("E:/static/watch_plate/style_1/time/3.png")
+        self.watchface1_time2_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.watchface1_time3_img = lv.img(self.meta)
+        self.watchface1_time3_img.set_pos(int(x+36+36+4),int(y+2))
+        self.watchface1_time3_img.set_size(8,24)
+        self.watchface1_time3_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_time3_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_time3_img.set_src("E:/static/watch_plate/style_1/time/colon.png")
+        self.watchface1_time3_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.watchface1_time4_img = lv.img(self.meta)
+        self.watchface1_time4_img.set_pos(int(x+36+36+16),int(y))
+        self.watchface1_time4_img.set_size(36,44)
+        self.watchface1_time4_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_time4_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_time4_img.set_src("E:/static/watch_plate/style_1/time/2.png")
+        self.watchface1_time4_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        self.watchface1_time5_img = lv.img(self.meta)
+        self.watchface1_time5_img.set_pos(int(x+36+36+16+36),int(y))
+        self.watchface1_time5_img.set_size(36,44)
+        self.watchface1_time5_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_time5_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_time5_img.set_src("E:/static/watch_plate/style_1/time/3.png")
+        self.watchface1_time5_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        #日期
+        self.watchface1_date = lv.spangroup(self.meta)
+        self.watchface1_date.set_pos(int(24),int(131))
+        self.watchface1_date.set_size(84,17)
+        self.watchface1_date.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_date.set_align(lv.TEXT_ALIGN.LEFT)
+        self.watchface1_date.set_overflow(lv.SPAN_OVERFLOW.CLIP)
+        self.watchface1_date.set_mode(lv.SPAN_MODE.BREAK)
+        self.watchface1_date_span = self.watchface1_date.new_span()
+        self.watchface1_date_span.set_text("12月9日")
+        self.watchface1_date_span.style.set_text_color(lv.color_make(0xe0,0xd7,0xd7))
+        self.watchface1_date_span.style.set_text_decor(lv.TEXT_DECOR.NONE)
+        self.watchface1_date_span.style.set_size(100)
+        #main_style_1_spangroup_date_span.style.set_text_font(lv.font_harmony_19)
+        self.watchface1_date.refr_mode()
+        # create style self.watchface1_style_default
+        self.watchface1_style_default = lv.style_t()
+        self.watchface1_style_default.init()
+        self.watchface1_style_default.set_radius(0)
+        self.watchface1_style_default.set_bg_color(lv.color_make(0x21,0x95,0xf6))
+        self.watchface1_style_default.set_bg_grad_color(lv.color_make(0x21,0x95,0xf6))
+        self.watchface1_style_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+        self.watchface1_style_default.set_bg_opa(0)
+        self.watchface1_style_default.set_border_color(lv.color_make(0x00,0x00,0x00))
+        self.watchface1_style_default.set_border_width(0)
+        self.watchface1_style_default.set_border_opa(255)
+        self.watchface1_style_default.set_pad_left(0)
+        self.watchface1_style_default.set_pad_right(0)
+        self.watchface1_style_default.set_pad_top(0)
+        self.watchface1_style_default.set_pad_bottom(0)
+        self.watchface1_style_default.set_text_font_v2("font.bin",0) #将外部字体库与该style对象绑定
+        # add style for main_style_1_spangroup_date
+        self.watchface1_date.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        #星期
+        self.watchface1_week = lv.spangroup(self.meta)
+        self.watchface1_week.set_pos(int(29),int(163))
+        self.watchface1_week.set_size(64,17)
+        self.watchface1_week.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_week.set_align(lv.TEXT_ALIGN.LEFT)
+        self.watchface1_week.set_overflow(lv.SPAN_OVERFLOW.CLIP)
+        self.watchface1_week.set_mode(lv.SPAN_MODE.BREAK)
+        self.watchface1_week_span = self.watchface1_week.new_span()
+        self.watchface1_week_span.set_text("星期四")
+        self.watchface1_week_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7))
+        self.watchface1_week_span.style.set_text_decor(lv.TEXT_DECOR.NONE)
+        #self.watchface1_week_week_span.style.set_text_font(lv.font_harmony_19)
+        self.watchface1_week.refr_mode()
+        # add style for main_style_1_spangroup_week
+        self.watchface1_week.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        
+        #阴历
+        self.watchface1_lunar_calendar = lv.spangroup(self.meta)
+        self.watchface1_lunar_calendar.set_pos(int(124),int(131))
+        self.watchface1_lunar_calendar.set_size(110,17)
+        self.watchface1_lunar_calendar.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_lunar_calendar.set_align(lv.TEXT_ALIGN.LEFT)
+        self.watchface1_lunar_calendar.set_overflow(lv.SPAN_OVERFLOW.CLIP)
+        self.watchface1_lunar_calendar.set_mode(lv.SPAN_MODE.BREAK)
+        self.watchface1_lunar_calendar_span = self.watchface1_lunar_calendar.new_span()
+        self.watchface1_lunar_calendar_span.set_text("三月初三")
+        self.watchface1_lunar_calendar_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7))
+        self.watchface1_lunar_calendar_span.style.set_text_decor(lv.TEXT_DECOR.NONE)
+        #self.watchface1_lunar_calendar_span.style.set_text_font(lv.font_harmony_19)
+        self.watchface1_lunar_calendar.refr_mode()
+        # add style for main_style_1_spangroup_week
+        self.watchface1_lunar_calendar.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        
+        #计步
+        self.watchface1_step_img = lv.img(self.meta)
+        self.watchface1_step_img.set_pos(int(130),int(154))
+        self.watchface1_step_img.set_size(26,24)
+        self.watchface1_step_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_step_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_step_img.set_src("E:/static/watch_plate/style_1/step.png")
+        self.watchface1_step_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        
+        self.watchface1_step_txt = lv.spangroup(self.meta)
+        self.watchface1_step_txt.set_pos(int(170),int(163))
+        self.watchface1_step_txt.set_size(60,18)
+        self.watchface1_step_txt.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_step_txt.set_align(lv.TEXT_ALIGN.LEFT)
+        self.watchface1_step_txt.set_overflow(lv.SPAN_OVERFLOW.CLIP)
+        self.watchface1_step_txt.set_mode(lv.SPAN_MODE.BREAK)
+        self.watchface1_step_span = self.watchface1_step_txt.new_span()
+        self.watchface1_step_span.set_text("16888")
+        self.watchface1_step_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7))
+        self.watchface1_step_span.style.set_text_decor(lv.TEXT_DECOR.NONE)
+        #self.watchface1_week_step_span.style.set_text_font(lv.font_harmony_19)
+        self.watchface1_step_txt.refr_mode()
+        # add style for main_style_1_spangroup_week
+        self.watchface1_step_txt.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #心律
+        self.watchface1_HB_img = lv.img(self.meta)
+        self.watchface1_HB_img.set_pos(int(53),int(198))
+        self.watchface1_HB_img.set_size(30,27)
+        self.watchface1_HB_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_HB_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_HB_img.set_src("E:/static/watch_plate/style_1/heart.png")
+        self.watchface1_HB_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        
+        self.watchface1_HB_txt = lv.spangroup(self.meta)
+        self.watchface1_HB_txt.set_pos(int(55),int(235))
+        self.watchface1_HB_txt.set_size(45,18)
+        self.watchface1_HB_txt.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_HB_txt.set_align(lv.TEXT_ALIGN.LEFT)
+        self.watchface1_HB_txt.set_overflow(lv.SPAN_OVERFLOW.CLIP)
+        self.watchface1_HB_txt.set_mode(lv.SPAN_MODE.BREAK)
+        self.watchface1_HB_span = self.watchface1_HB_txt.new_span()
+        self.watchface1_HB_span.set_text("199")
+        self.watchface1_HB_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7))
+        self.watchface1_HB_span.style.set_text_decor(lv.TEXT_DECOR.NONE)
+        #self.watchface1_week_HB_span.style.set_text_font(lv.font_harmony_19)
+        self.watchface1_HB_txt.refr_mode()
+        # add style for main_style_1_spangroup_week
+        self.watchface1_HB_txt.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+        #血氧
+        self.watchface1_SPO2_img = lv.img(self.meta)
+        self.watchface1_SPO2_img.set_pos(int(161),int(193))
+        self.watchface1_SPO2_img.set_size(23,32)
+        self.watchface1_SPO2_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_SPO2_img.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.watchface1_SPO2_img.set_src("E:/static/watch_plate/style_1/blood.png")
+        self.watchface1_SPO2_img.add_style(self.style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+        
+        self.watchface1_SPO2_txt = lv.spangroup(self.meta)
+        self.watchface1_SPO2_txt.set_pos(int(160),int(235))
+        self.watchface1_SPO2_txt.set_size(42,18)
+        self.watchface1_SPO2_txt.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+        self.watchface1_SPO2_txt.set_align(lv.TEXT_ALIGN.LEFT)
+        self.watchface1_SPO2_txt.set_overflow(lv.SPAN_OVERFLOW.CLIP)
+        self.watchface1_SPO2_txt.set_mode(lv.SPAN_MODE.BREAK)
+        self.watchface1_SPO2_span = self.watchface1_SPO2_txt.new_span()
+        self.watchface1_SPO2_span.set_text("199")
+        self.watchface1_SPO2_span.style.set_text_color(lv.color_make(0xee,0xe7,0xe7))
+        self.watchface1_SPO2_span.style.set_text_decor(lv.TEXT_DECOR.NONE)
+        #self.watchface1_week_SPO2_span.style.set_text_font(lv.font_harmony_19)
+        self.watchface1_SPO2_txt.refr_mode()
+        # add style for main_style_1_spangroup_week
+        self.watchface1_SPO2_txt.add_style(self.watchface1_style_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+
+    def initialization(self):    
+        #获取信号
+        signal = EventMesh.publish("screen_get_sig")
+        if signal:
+            self.__signal(None, signal)
+        # 获取电池电量
+        battery = EventMesh.publish("screen_get_battery")
+        if battery:
+            self.__battery(None, battery)
+        time = EventMesh.publish("screen_get_time")
+        #print("publish_time:"+time)
+        if time:
+            self.__time(None, time)
+        
+    def timerout_update(self):
+        #获取信号
+        signal = EventMesh.publish("screen_get_sig")
+        if signal:
+            self.__signal(None, signal)
+        # 获取电池电量
+        battery = EventMesh.publish("screen_get_battery")
+        if battery:
+            self.__battery(None, battery)
+         
+        time = EventMesh.publish("screen_get_time")
+        #print("publish_time:"+time)
+        if time:
+            self.__time(None, time)
+
+    def __time(self, event, msg):
+        #时间
+        hour1_chose = (msg[0][0])//10%10
+        hour2_chose = (msg[0][0])%10
+        min1_chose = (msg[0][1])//10%10
+        min2_chose = (msg[0][1])%10
+        self.watchface1_time1_img.set_src("E:/static/watch_plate/style_1/time/%d.png"%(hour1_chose))
+        self.watchface1_time2_img.set_src("E:/static/watch_plate/style_1/time/%d.png"%(hour2_chose))
+        self.watchface1_time4_img.set_src("E:/static/watch_plate/style_1/time/%d.png"%(min1_chose))
+        self.watchface1_time5_img.set_src("E:/static/watch_plate/style_1/time/%d.png"%(min2_chose))
+        self.watchface1_date_span.set_text(msg[2])#日期
+        self.watchface1_week_span.set_text(msg[3])   #星期
+
+    def __signal(self, event, msg):
+        #print("__signal_cb:",str(msg))
+        # 信号强度值范围0 ~ 31,值越大表示信号强度越好
+        #print("__signal_cb:{}".format(msg//8))
+        if msg:
+            if msg >= 0 and msg<=31 :
+                self.watchface_mpsignal_img.set_src("E:/static/mpsignal{}.png".format(msg//8))
+            else :
+                self.watchface_mpsignal_img.set_src("E:/static/mpsignal5.png") 
+
+    def __battery(self, event, msg):
+        #print("__battery_cb:",str(msg))
+        #print(msg)
+        if msg[0] == '1':
+            self.watchface_res_stat_charge_in_img.set_src("E:/static/charge_in.png")
+        else:
+            self.watchface_res_stat_charge_in_img.set_src("E:/static/charge_in1.png")
+
+        self.watchface_res_stat_battery_img.set_src("E:/static/vbat_%d.png"%(msg[1]))#"E:/vbat_60.png"
+        pass
+
+
+class WatchFaceScreen(Screen):
+    NAME = "watchface"
+
+    def __init__(self):
+        super().__init__()
+        #表盘
+        self.watchface_list = []
+        self.meta = None
+        self.watchface_style_num = "Watchface1"
+
+        self.timer_update = osTimer()
+        
+    def initialization(self):
+        print("watchface INIT !!!!!!!!")
+        if self.watchface_list == [] : #第一次初始化
+            self.watchface_list.append( Watchface1())
+
+        for wat in self.watchface_list:
+            if wat.NAME == self.watchface_style_num :
+                self.watchface_style = wat
+        self.meta = self.watchface_style.meta
+        self.watchface_style.initialization()
+        self.timer_update.start(10000, 1, self.timerout_update)
+        
+    def post_processor_after_initialization(self):
+        EventMesh.subscribe("change_face", self.change_face)
+    
+
+    def change_face(self, event=None, msg=None):
+        print("change face :",msg)
+        self.watchface_style_num = msg
+
+    def timerout_update(self, *args, **kwargs):
+        self.watchface_style.timerout_update()
+        
+
+    
+    
+    def Close(self):
+        print("watchface Close !!!!!!!!")
+        self.timer_update.stop()
+        return
+        
+        
+
+    def done_right_to_left(self):
+        EventMesh.publish("load_screen", {"screen": "main_menu"})
+        #EventMesh.publish("load_screen", {"screen": "watchface"})
+        #self.timer_update.stop()
+
+    def done_top_to_bottom(self):
+        #EventMesh.publish("load_screen", {"screen": "watchface"})
+        #self.timer_update.stop()
+        EventMesh.publish("load_screen", {"screen": "popup"})
+
+    def done_bottom_to_top(self):
+        EventMesh.publish("load_screen", {"screen": "call_log"})
+        #EventMesh.publish("load_screen", {"screen": "watchface"})
+        #self.timer_update.stop()
+    def btn1_release(self):
+        pass
+    def btn8_press(self):
+        pass
diff --git a/3.code/1.watch/2.code/ui_main_menu.py b/3.code/1.watch/2.code/ui_main_menu.py
new file mode 100644 (file)
index 0000000..a75b11e
--- /dev/null
@@ -0,0 +1,447 @@
+#主菜单
+import utime
+import osTimer
+import lvgl as lv
+from ext import EventMesh
+from machine import Timer
+import voiceCall
+import osTimer
+from ext import constants
+from misc import Power
+import pm
+from ext.ui import Screen
+style_MainMenu_screen_default = lv.style_t()
+style_MainMenu_screen_default.init()
+style_MainMenu_screen_default.set_radius(0)
+style_MainMenu_screen_default.set_bg_color(lv.color_make(0x00, 0x00, 0x00))
+style_MainMenu_screen_default.set_bg_opa(255)
+style_MainMenu_screen_default.set_border_width(0)
+style_MainMenu_screen_default.set_pad_left(0)
+style_MainMenu_screen_default.set_pad_right(0)
+style_MainMenu_screen_default.set_pad_top(0)
+style_MainMenu_screen_default.set_pad_bottom(0)
+
+style_MainMenu_img_default = lv.style_t()
+style_MainMenu_img_default.init()
+style_MainMenu_img_default.set_img_recolor(lv.color_make(0xff,0xff,0xff))
+style_MainMenu_img_default.set_img_recolor_opa(0)
+style_MainMenu_img_default.set_img_opa(255)
+
+style_font_youyuan_20 = lv.style_t()
+style_font_youyuan_20.init()
+style_font_youyuan_20.set_text_color(lv.color_make(0xff, 0xff, 0xff))
+style_font_youyuan_20.set_text_font_v2("font.bin",0)
+
+style_btn = lv.style_t()
+style_btn.init()
+style_btn.set_bg_opa(lv.OPA.TRANSP)
+style_btn.set_shadow_opa(0)
+style_btn.set_border_width(0)
+
+class MainMenuScreen(Screen):
+    NAME = "main_menu"
+
+    def __init__(self):
+        super().__init__()
+        #主菜单
+        self.main_menu_list = []
+        self.meta = None
+        self.main_menu_style_num = "MainMenu2"
+
+    def initialization(self):
+        print("main_menu INIT !!!!!!!!")
+        if self.main_menu_list == [] : #第一次初始化
+            self.main_menu_list.append( MainMenu1())
+            self.main_menu_list.append( MainMenu2())
+
+        for menu in self.main_menu_list:
+            if menu.NAME == self.main_menu_style_num :
+                self.main_menu_style = menu
+        self.meta = self.main_menu_style.meta
+        self.main_menu_style.initialization()
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("change_style", self.change_style)
+    
+
+    def change_style(self, event=None, msg=None):
+        print("change style :",msg)
+        self.main_menu_style_num = msg
+
+
+    def Close(self):
+        print("main_menu Close !!!!!!!!")
+        return
+
+    # def done_return(self):
+    #     EventMesh.publish("load_screen", {"screen": "watchface"})
+    def btn1_release(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+    def btn8_press(self):
+        EventMesh.publish("load_screen", {"screen": "watchface"})
+
+#主菜单风格1,四宫格
+class MainMenu1():
+    NAME = "MainMenu1"
+    def __init__(self): 
+        print("MainMenuSquare:__init__")    
+        self.meta = lv.obj()
+        self.MainMenu1 = lv.tileview(self.meta)
+        self.MainMenu1.set_scrollbar_mode(0)
+        self.MainMenu1.add_style(style_MainMenu_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        #第一页
+        self.MainMenu1_1 = self.MainMenu1.add_tile(0, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+
+        # #闹钟
+        self.MainMenu1_img_alarm = lv.btn(self.MainMenu1_1)
+        self.MainMenu1_img_alarm.set_size(70, 70)
+        self.MainMenu1_img_alarm.set_pos(30,60)
+        self.MainMenu1_img_alarm.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+        self.MainMenu1_img_alarm.add_event_cb(lambda e: self.img_cb(e,  "Phone"), lv.EVENT.CLICKED, None)
+
+        # #支付宝
+        self.MainMenu1_img_ali = lv.btn(self.MainMenu1_1)
+        self.MainMenu1_img_ali.set_size(70, 70)
+        self.MainMenu1_img_ali.set_pos(140,60)
+        self.MainMenu1_img_ali.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+        self.MainMenu1_img_ali.add_event_cb(lambda e: self.img_cb(e,  "alipay_open"), lv.EVENT.CLICKED, None)
+
+        # #拍照
+        self.MainMenu1_img_camera = lv.btn(self.MainMenu1_1)
+        self.MainMenu1_img_camera.set_size(70, 70)
+        self.MainMenu1_img_camera.set_pos(30,190)
+        self.MainMenu1_img_camera.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+        self.MainMenu1_img_camera.add_event_cb(lambda e: self.img_cb(e,  "Phone"), lv.EVENT.CLICKED, None)
+
+        # #倒计时
+        self.MainMenu1_img_countdown = lv.btn(self.MainMenu1_1)
+        self.MainMenu1_img_countdown.set_size(70, 70)
+        self.MainMenu1_img_countdown.set_pos(140,190)
+        self.MainMenu1_img_countdown.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+        self.MainMenu1_img_countdown.add_event_cb(lambda e: self.img_cb(e,  "countdown"), lv.EVENT.CLICKED, None)
+
+        #第一页图片
+        self.MainMenu1_1_img = lv.img(self.MainMenu1_1)
+        self.MainMenu1_1_img.set_size(240, 200)
+        self.MainMenu1_1_img.set_pos(0,60)
+        self.MainMenu1_1_img.set_src("E:/static/main_menu/main_menu1/4-1.jpg")
+        self.MainMenu1_1_img.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+
+
+
+        #第二页
+        self.MainMenu1_2 = self.MainMenu1.add_tile(1, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+
+        # #通话
+        self.MainMenu1_img_call = lv.btn(self.MainMenu1_2)
+        self.MainMenu1_img_call.set_size(70, 70)
+        self.MainMenu1_img_call.set_pos(30,60)
+        self.MainMenu1_img_call.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+        self.MainMenu1_img_call.add_event_cb(lambda e: self.img_cb(e,  "Phone"), lv.EVENT.CLICKED, None)
+
+        # #心率
+        self.MainMenu1_img_hr = lv.btn(self.MainMenu1_2)
+        self.MainMenu1_img_hr.set_size(70, 70)
+        self.MainMenu1_img_hr.set_pos(140,60)
+        self.MainMenu1_img_hr.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+        self.MainMenu1_img_hr.add_event_cb(lambda e: self.img_cb(e,  "heartrate"), lv.EVENT.CLICKED, None)
+
+        # #血氧
+        self.MainMenu1_img_spo2 = lv.btn(self.MainMenu1_2)
+        self.MainMenu1_img_spo2.set_size(70, 70)
+        self.MainMenu1_img_spo2.set_pos(30,190)
+        self.MainMenu1_img_spo2.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+
+        self.MainMenu1_img_spo2.add_event_cb(lambda e: self.img_cb(e,  "spo2"), lv.EVENT.CLICKED, None)
+
+        # #短信
+        self.MainMenu1_img_sms = lv.btn(self.MainMenu1_2)
+        self.MainMenu1_img_sms.set_size(70, 70)
+        self.MainMenu1_img_sms.set_pos(140,190)
+        self.MainMenu1_img_sms.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+
+        self.MainMenu1_img_sms.add_event_cb(lambda e: self.img_cb(e,  "popup"), lv.EVENT.CLICKED, None)
+
+        #第二页图片
+        self.MainMenu1_2_img = lv.img(self.MainMenu1_2)
+        self.MainMenu1_2_img.set_size(240, 200)
+        self.MainMenu1_2_img.set_pos(0,60)
+        self.MainMenu1_2_img.set_src("E:/static/main_menu/main_menu1/4-2.jpg")
+        self.MainMenu1_2_img.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #第三页
+        self.MainMenu1_3 = self.MainMenu1.add_tile(2, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+
+        #第三页图片
+        self.MainMenu1_3_img = lv.img(self.MainMenu1_3)
+        self.MainMenu1_3_img.set_size(240, 200)
+        self.MainMenu1_3_img.set_pos(0,60)
+        self.MainMenu1_3_img.set_src("E:/static/main_menu/main_menu1/4-3.jpg")
+        self.MainMenu1_3_img.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        # #通讯录
+        self.MainMenu1_img_contacts = lv.btn(self.MainMenu1_3)
+        self.MainMenu1_img_contacts.set_size(70, 70)
+        self.MainMenu1_img_contacts.set_pos(30,60)
+        self.MainMenu1_img_contacts.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+        self.MainMenu1_img_contacts.add_event_cb(lambda e: self.img_cb(e,  "contacts"), lv.EVENT.CLICKED, None)
+        
+        # #照片
+        self.MainMenu1_img_photo = lv.btn(self.MainMenu1_3)
+        self.MainMenu1_img_photo.set_size(70, 70)
+        self.MainMenu1_img_photo.set_pos(140,60)
+        self.MainMenu1_img_photo.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+        self.MainMenu1_img_photo.add_event_cb(lambda e: self.img_cb(e,  "Phone"), lv.EVENT.CLICKED, None)
+
+        # #设置
+        self.MainMenu1_img_setting = lv.btn(self.MainMenu1_3)
+        self.MainMenu1_img_setting.set_size(70, 70)
+        self.MainMenu1_img_setting.set_pos(30,190)
+        self.MainMenu1_img_setting.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)        
+        self.MainMenu1_img_setting.add_event_cb(lambda e: self.img_cb(e,  "setting"), lv.EVENT.CLICKED, None)
+
+        # #步数
+        self.MainMenu1_img_steps = lv.btn(self.MainMenu1_3)
+        self.MainMenu1_img_steps.set_size(70, 70)
+        self.MainMenu1_img_steps.set_pos(30,190)
+        self.MainMenu1_img_steps.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.MainMenu1_img_steps.add_event_cb(lambda e: self.img_cb(e,  "step"), lv.EVENT.CLICKED, None)
+
+        #第四页
+        self.MainMenu1_4 = self.MainMenu1.add_tile(3, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+
+        #第四页图片
+        self.MainMenu1_4_img = lv.img(self.MainMenu1_4)
+        self.MainMenu1_4_img.set_size(240, 200)
+        self.MainMenu1_4_img.set_pos(0,60)
+        self.MainMenu1_4_img.set_src("E:/static/main_menu/main_menu1/4-4.jpg")
+        self.MainMenu1_4_img.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        # #秒表
+        self.MainMenu1_img_stopwatch = lv.btn(self.MainMenu1_4)
+        self.MainMenu1_img_stopwatch.set_size(70, 70)
+        self.MainMenu1_img_stopwatch.set_pos(30,60)
+        self.MainMenu1_img_stopwatch.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.MainMenu1_img_stopwatch.add_event_cb(lambda e: self.img_cb(e,  "stopwatch"), lv.EVENT.CLICKED, None)
+
+        # #天气
+        self.MainMenu1_img_weather = lv.btn(self.MainMenu1_4)
+        self.MainMenu1_img_weather.set_size(70, 70)
+        self.MainMenu1_img_weather.set_pos(140,60)
+        self.MainMenu1_img_weather.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        self.MainMenu1_img_weather.add_event_cb(lambda e: self.img_cb(e,  "weather"), lv.EVENT.CLICKED, None)
+
+        # #工具箱
+        self.MainMenu1_img_toolbox = lv.btn(self.MainMenu1_4)
+        self.MainMenu1_img_toolbox.set_size(70, 70)
+        self.MainMenu1_img_toolbox.set_pos(30,190)
+        self.MainMenu1_img_toolbox.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        self.MainMenu1_img_toolbox.add_event_cb(lambda e: self.img_cb(e,  "toolbox"), lv.EVENT.CLICKED, None)
+    
+
+        # #温度
+        self.MainMenu1_img_tem = lv.btn(self.MainMenu1_4)
+        self.MainMenu1_img_tem.set_size(70, 70)
+        self.MainMenu1_img_tem.set_pos(140,190)
+        self.MainMenu1_img_tem.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        self.MainMenu1_img_tem.add_event_cb(lambda e: self.img_cb(e,  "temperature"), lv.EVENT.CLICKED, None)
+        
+        #第五页
+        self.MainMenu1_5 = self.MainMenu1.add_tile(4, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+
+        #微聊
+        self.MainMenu1_img_wechat = lv.img(self.MainMenu1_5)
+        self.MainMenu1_img_wechat.set_size(70, 70)
+        self.MainMenu1_img_wechat.set_pos(30,60)
+        self.MainMenu1_img_wechat.set_src("E:/static/main_menu/main_menu1/IMAGE_MAINMENU_WECHAT.png")
+        self.MainMenu1_img_wechat.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu1_img_wechat.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.MainMenu1_img_wechat.add_event_cb(lambda e: self.img_cb(e,  "wechat"), lv.EVENT.CLICKED, None)
+
+        
+    def initialization(self):
+        pass
+    def img_cb(self, e, msg):
+        print("MainMenu2:img_cb:{}".format(msg))
+        EventMesh.publish("load_screen", {"screen": "{}".format(msg)})
+
+
+
+
+#主菜单风格2,单页
+class MainMenu2():
+    NAME = "MainMenu2"
+    def __init__(self): 
+        print("MainMenu1:__init__")    
+        self.meta = lv.obj()
+        self.MainMenu2 = lv.tileview(self.meta)
+        self.MainMenu2.set_scrollbar_mode(0)
+        self.MainMenu2.add_style(style_MainMenu_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        #支付宝
+        self.MainMenu2_alipay = self.MainMenu2.add_tile(0, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+        self.MainMenu2_img_alipay = lv.img(self.MainMenu2_alipay)
+        self.MainMenu2_img_alipay.set_size(126, 126)
+        self.MainMenu2_img_alipay.center()
+        self.MainMenu2_img_alipay.set_src("E:/static/main_menu/main_menu2/alipay_.jpg")
+        self.MainMenu2_img_alipay.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu2_img_alipay.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.label = lv.label(self.MainMenu2_alipay)
+        self.label.set_pos(0, 280)
+        self.label.set_size(240, 40)
+        self.label.set_text("支付宝")
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+        #拨号盘
+        self.MainMenu2_phone = self.MainMenu2.add_tile(1, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+        self.MainMenu2_img_phone = lv.img(self.MainMenu2_phone)
+        self.MainMenu2_img_phone.set_size(128, 128)
+        self.MainMenu2_img_phone.center()
+        self.MainMenu2_img_phone.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.jpg")
+        self.MainMenu2_img_phone.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu2_img_phone.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.label = lv.label(self.MainMenu2_phone)
+        self.label.set_pos(0, 280)
+        self.label.set_size(240, 40)
+        self.label.set_text("通话")
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #通讯录
+        self.MainMenu2_contacts = self.MainMenu2.add_tile(2, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+        self.MainMenu2_img_contacts = lv.img(self.MainMenu2_contacts)
+        self.MainMenu2_img_contacts.set_size(128, 128)
+        self.MainMenu2_img_contacts.center()
+        self.MainMenu2_img_contacts.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.jpg")
+        self.MainMenu2_img_contacts.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu2_img_contacts.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.label = lv.label(self.MainMenu2_contacts)
+        self.label.set_pos(0, 280)
+        self.label.set_size(240, 40)
+        self.label.set_text("通讯录")
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #心律检测
+        self.MainMenu2_heartrate = self.MainMenu2.add_tile(3, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+        self.MainMenu2_img_heartrate = lv.img(self.MainMenu2_heartrate)
+        self.MainMenu2_img_heartrate.set_size(128, 128)
+        self.MainMenu2_img_heartrate.center()
+        self.MainMenu2_img_heartrate.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.jpg")
+        self.MainMenu2_img_heartrate.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu2_img_heartrate.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.label = lv.label(self.MainMenu2_heartrate)
+        self.label.set_pos(0, 280)
+        self.label.set_size(240, 40)
+        self.label.set_text("心率")
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #血样检测
+        self.MainMenu2_spo2 = self.MainMenu2.add_tile(4, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+        self.MainMenu2_img_spo2 = lv.img(self.MainMenu2_spo2)
+        self.MainMenu2_img_spo2.set_size(128, 128)
+        self.MainMenu2_img_spo2.center()
+        self.MainMenu2_img_spo2.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.jpg")
+        self.MainMenu2_img_spo2.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu2_img_spo2.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.label = lv.label(self.MainMenu2_spo2)
+        self.label.set_pos(0, 280)
+        self.label.set_size(240, 40)
+        self.label.set_text("血氧")
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #工具箱
+        self.MainMenu2_toolbox = self.MainMenu2.add_tile(5, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+        self.MainMenu2_img_toolbox = lv.img(self.MainMenu2_toolbox)
+        self.MainMenu2_img_toolbox.set_size(128, 128)
+        self.MainMenu2_img_toolbox.center()
+        self.MainMenu2_img_toolbox.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.jpg")
+        self.MainMenu2_img_toolbox.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu2_img_toolbox.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.label = lv.label(self.MainMenu2_toolbox)
+        self.label.set_pos(0, 280)
+        self.label.set_size(240, 40)
+        self.label.set_text("工具箱")
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #设置
+        self.MainMenu2_setting = self.MainMenu2.add_tile(6, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+        self.MainMenu2_img_setting = lv.img(self.MainMenu2_setting)
+        self.MainMenu2_img_setting.set_size(128, 128)
+        self.MainMenu2_img_setting.center()
+        self.MainMenu2_img_setting.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.jpg")
+        self.MainMenu2_img_setting.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu2_img_setting.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.label = lv.label(self.MainMenu2_setting)
+        self.label.set_pos(0, 280)
+        self.label.set_size(240, 40)
+        self.label.set_text("设置")
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #体温测量
+        self.MainMenu2_temperature = self.MainMenu2.add_tile(7, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+        self.MainMenu2_img_temperature = lv.img(self.MainMenu2_temperature)
+        self.MainMenu2_img_temperature.set_size(128, 128)
+        self.MainMenu2_img_temperature.center()
+        self.MainMenu2_img_temperature.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.jpg")
+        self.MainMenu2_img_temperature.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu2_img_temperature.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.label = lv.label(self.MainMenu2_temperature)
+        self.label.set_pos(0, 280)
+        self.label.set_size(240, 40)
+        self.label.set_text("体温")
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+        #微聊
+        self.MainMenu2_wechat = self.MainMenu2.add_tile(8, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+        self.MainMenu2_img_wechat = lv.img(self.MainMenu2_wechat)
+        self.MainMenu2_img_wechat.set_size(128, 128)
+        self.MainMenu2_img_wechat.center()
+        self.MainMenu2_img_wechat.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.jpg")
+        self.MainMenu2_img_wechat.add_flag(lv.obj.FLAG.CLICKABLE)
+        self.MainMenu2_img_wechat.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+        self.label = lv.label(self.MainMenu2_wechat)
+        self.label.set_pos(0, 280)
+        self.label.set_size(240, 40)
+        self.label.set_text("微聊")
+        self.label.set_long_mode(lv.label.LONG.WRAP)
+        self.label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+        self.label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+          
+
+        self.MainMenu2_img_phone.add_event_cb(lambda e: self.img_cb(e,  "Phone"), lv.EVENT.CLICKED, None)
+        self.MainMenu2_img_toolbox.add_event_cb(lambda e: self.img_cb(e, "toolbox"), lv.EVENT.CLICKED, None)
+        self.MainMenu2_img_setting.add_event_cb(lambda e: self.img_cb(e, "setting"), lv.EVENT.CLICKED, None)
+        self.MainMenu2_img_heartrate.add_event_cb(lambda e: self.img_cb(e, "heartrate"), lv.EVENT.CLICKED, None)
+        self.MainMenu2_img_contacts.add_event_cb(lambda e: self.img_cb(e,  "contacts"), lv.EVENT.CLICKED, None)
+        self.MainMenu2_img_wechat.add_event_cb(lambda e: self.img_cb(e, "wechat"), lv.EVENT.CLICKED, None)
+        self.MainMenu2_img_spo2.add_event_cb(lambda e: self.img_cb(e, "spo2"), lv.EVENT.CLICKED, None)
+        self.MainMenu2_img_temperature.add_event_cb(lambda e: self.img_cb(e, "temperature"), lv.EVENT.CLICKED, None)
+        self.MainMenu2_img_alipay.add_event_cb(lambda e: self.img_cb(e, "alipay_open"), lv.EVENT.CLICKED, None)
+    def initialization(self):
+        pass
+    def img_cb(self, e, msg):
+        print("MainMenu2:img_cb:{}".format(msg))
+        EventMesh.publish("load_screen", {"screen": "{}".format(msg)})
+
+
+
+