summaryrefslogtreecommitdiff
authorjiamin.miao <jiamin.miao@amlogic.com>2014-06-24 09:29:05 (GMT)
committer jiamin.miao <jiamin.miao@amlogic.com>2014-06-24 09:29:05 (GMT)
commitdad358e9a83000381654c981498dd1839add545e (patch)
treec828041171eb05260d51faef2fa5e3dfd43159b6
parent6c514eb5cab96bd5a388eb36de3e1e52d365600d (diff)
download8723bs-dad358e9a83000381654c981498dd1839add545e.zip
8723bs-dad358e9a83000381654c981498dd1839add545e.tar.gz
8723bs-dad358e9a83000381654c981498dd1839add545e.tar.bz2
PD#93284:update 8723bs wifi driver
Diffstat
-rwxr-xr-xrtl8723BS/Makefile43
-rwxr-xr-xrtl8723BS/core/rtw_ap.c48
-rwxr-xr-xrtl8723BS/core/rtw_bt_mp.c2
-rwxr-xr-xrtl8723BS/core/rtw_btcoex.c25
-rwxr-xr-xrtl8723BS/core/rtw_cmd.c214
-rwxr-xr-xrtl8723BS/core/rtw_debug.c393
-rwxr-xr-xrtl8723BS/core/rtw_ioctl_set.c4
-rwxr-xr-xrtl8723BS/core/rtw_mem.c103
-rwxr-xr-xrtl8723BS/core/rtw_mlme.c146
-rwxr-xr-xrtl8723BS/core/rtw_mlme_ext.c383
-rwxr-xr-xrtl8723BS/core/rtw_mp.c109
-rwxr-xr-xrtl8723BS/core/rtw_odm.c2
-rwxr-xr-xrtl8723BS/core/rtw_p2p.c13
-rwxr-xr-xrtl8723BS/core/rtw_pwrctrl.c19
-rwxr-xr-xrtl8723BS/core/rtw_recv.c147
-rwxr-xr-xrtl8723BS/core/rtw_security.c85
-rwxr-xr-xrtl8723BS/core/rtw_sreset.c8
-rwxr-xr-xrtl8723BS/core/rtw_tdls.c6
-rwxr-xr-xrtl8723BS/core/rtw_vht.c5
-rwxr-xr-xrtl8723BS/core/rtw_wlan_util.c604
-rwxr-xr-xrtl8723BS/core/rtw_xmit.c312
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c17
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.h7
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c17
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.h7
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c17
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h7
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c17
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h7
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c7
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c67
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.h7
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c1169
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h40
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c471
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h17
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c17
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h7
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c17
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h7
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c633
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.h21
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c180
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h16
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c4140
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h186
-rwxr-xr-xrtl8723BS/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h97
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm.c6487
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm.h416
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_AntDiv.c16
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_CfoTracking.c363
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_CfoTracking.h66
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_DIG.c2591
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_DIG.h395
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_DynamicBBPowerSaving.c218
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_DynamicBBPowerSaving.h61
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_DynamicTxPower.c884
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_DynamicTxPower.h87
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_EdcaTurboCheck.c1915
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_EdcaTurboCheck.h150
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_HWConfig.c191
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_HWConfig.h8
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_NoiseMonitor.c197
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_NoiseMonitor.h49
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_PathDiv.c1580
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_PathDiv.h196
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_RegDefine11AC.h20
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_RegDefine11N.h36
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_debug.c2
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_debug.h18
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_interface.c41
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_interface.h17
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_precomp.h7
-rwxr-xr-xrtl8723BS/hal/OUTSRC/odm_types.h9
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c402
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h4
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c9833
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c222
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h2
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.c705
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.h2
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c273
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h7
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c305
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.c24
-rwxr-xr-xrtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.h5
-rwxr-xr-xrtl8723BS/hal/hal_btcoex.c288
-rwxr-xr-xrtl8723BS/hal/hal_com.c637
-rwxr-xr-xrtl8723BS/hal/hal_com_phycfg.c46
-rwxr-xr-xrtl8723BS/hal/hal_intf.c28
-rwxr-xr-xrtl8723BS/hal/rtl8723b/rtl8723b_cmd.c28
-rwxr-xr-xrtl8723BS/hal/rtl8723b/rtl8723b_dm.c15
-rwxr-xr-xrtl8723BS/hal/rtl8723b/rtl8723b_hal_init.c251
-rwxr-xr-xrtl8723BS/hal/rtl8723b/rtl8723b_mp.c21
-rwxr-xr-xrtl8723BS/hal/rtl8723b/rtl8723b_phycfg.c9
-rwxr-xr-xrtl8723BS/hal/rtl8723b/rtl8723b_rxdesc.c16
-rwxr-xr-xrtl8723BS/hal/rtl8723b/sdio/rtl8723bs_recv.c11
-rwxr-xr-xrtl8723BS/hal/rtl8723b/sdio/rtl8723bs_xmit.c7
-rwxr-xr-xrtl8723BS/hal/rtl8723b/sdio/sdio_halinit.c221
-rwxr-xr-xrtl8723BS/hal/rtl8723b/sdio/sdio_ops.c13
-rwxr-xr-xrtl8723BS/include/Hal8188EPhyReg.h1
-rwxr-xr-xrtl8723BS/include/Hal8192CPhyReg.h1
-rwxr-xr-xrtl8723BS/include/Hal8192DPhyReg.h3
-rwxr-xr-xrtl8723BS/include/Hal8192EPhyReg.h7
-rwxr-xr-xrtl8723BS/include/Hal8812PhyReg.h3
-rwxr-xr-xrtl8723BS/include/autoconf.h33
-rwxr-xr-xrtl8723BS/include/drv_conf.h7
-rwxr-xr-xrtl8723BS/include/drv_types.h168
-rwxr-xr-xrtl8723BS/include/hal_btcoex.h8
-rwxr-xr-xrtl8723BS/include/hal_com.h39
-rwxr-xr-xrtl8723BS/include/hal_com_h2c.h1
-rwxr-xr-xrtl8723BS/include/hal_com_phycfg.h4
-rwxr-xr-xrtl8723BS/include/hal_com_reg.h9
-rwxr-xr-xrtl8723BS/include/hal_data.h16
-rwxr-xr-xrtl8723BS/include/hal_gspi.h32
-rwxr-xr-xrtl8723BS/include/hal_intf.h11
-rwxr-xr-xrtl8723BS/include/ioctl_cfg80211.h1
-rwxr-xr-xrtl8723BS/include/osdep_intf.h12
-rwxr-xr-xrtl8723BS/include/pci_hal.h4
-rwxr-xr-xrtl8723BS/include/pci_ops.h10
-rwxr-xr-xrtl8723BS/include/rtl8188e_hal.h15
-rwxr-xr-xrtl8723BS/include/rtl8188e_spec.h5
-rwxr-xr-xrtl8723BS/include/rtl8188e_xmit.h7
-rwxr-xr-xrtl8723BS/include/rtl8192c_hal.h2
-rwxr-xr-xrtl8723BS/include/rtl8192c_recv.h2
-rwxr-xr-xrtl8723BS/include/rtl8192d_cmd.h28
-rwxr-xr-xrtl8723BS/include/rtl8192d_recv.h2
-rwxr-xr-xrtl8723BS/include/rtl8192e_cmd.h24
-rwxr-xr-xrtl8723BS/include/rtl8192e_hal.h31
-rwxr-xr-xrtl8723BS/include/rtl8192e_recv.h35
-rwxr-xr-xrtl8723BS/include/rtl8192e_spec.h65
-rwxr-xr-xrtl8723BS/include/rtl8192e_xmit.h40
-rwxr-xr-xrtl8723BS/include/rtl8723a_cmd.h6
-rwxr-xr-xrtl8723BS/include/rtl8723a_xmit.h2
-rwxr-xr-xrtl8723BS/include/rtl8723b_cmd.h48
-rwxr-xr-xrtl8723BS/include/rtl8812a_cmd.h2
-rwxr-xr-xrtl8723BS/include/rtl8812a_recv.h6
-rwxr-xr-xrtl8723BS/include/rtw_android.h9
-rwxr-xr-xrtl8723BS/include/rtw_bt_mp.h2
-rwxr-xr-xrtl8723BS/include/rtw_btcoex.h8
-rwxr-xr-xrtl8723BS/include/rtw_cmd.h17
-rwxr-xr-xrtl8723BS/include/rtw_debug.h17
-rwxr-xr-xrtl8723BS/include/rtw_eeprom.h4
-rwxr-xr-xrtl8723BS/include/rtw_event.h4
-rwxr-xr-xrtl8723BS/include/rtw_ht.h2
-rwxr-xr-xrtl8723BS/include/rtw_mem.h38
-rwxr-xr-xrtl8723BS/include/rtw_mlme.h3
-rwxr-xr-xrtl8723BS/include/rtw_mlme_ext.h25
-rwxr-xr-xrtl8723BS/include/rtw_mp.h10
-rwxr-xr-xrtl8723BS/include/rtw_mp_phy_regdef.h9
-rwxr-xr-xrtl8723BS/include/rtw_pwrctrl.h7
-rwxr-xr-xrtl8723BS/include/rtw_recv.h29
-rwxr-xr-xrtl8723BS/include/rtw_security.h24
-rwxr-xr-xrtl8723BS/include/rtw_version.h4
-rwxr-xr-xrtl8723BS/include/rtw_wifi_regd.h4
-rwxr-xr-xrtl8723BS/include/rtw_xmit.h77
-rwxr-xr-xrtl8723BS/include/wifi.h1
-rwxr-xr-xrtl8723BS/os_dep/linux/ioctl_cfg80211.c199
-rwxr-xr-xrtl8723BS/os_dep/linux/ioctl_linux.c501
-rwxr-xr-xrtl8723BS/os_dep/linux/mlme_linux.c32
-rwxr-xr-xrtl8723BS/os_dep/linux/os_intfs.c637
-rwxr-xr-xrtl8723BS/os_dep/linux/recv_linux.c20
-rwxr-xr-xrtl8723BS/os_dep/linux/rtw_android.c160
-rwxr-xr-xrtl8723BS/os_dep/linux/rtw_proc.c51
-rwxr-xr-xrtl8723BS/os_dep/linux/sdio_intf.c594
-rwxr-xr-xrtl8723BS/os_dep/linux/wifi_regd.c11
-rwxr-xr-xrtl8723BS/os_dep/linux/xmit_linux.c31
-rwxr-xr-xrtl8723BS/platform/platform_ARM_SUNnI_sdio.c17
-rwxr-xr-xrtl8723BS/platform/platform_ARM_WMT_sdio.c51
169 files changed, 27007 insertions, 15542 deletions
diff --git a/rtl8723BS/Makefile b/rtl8723BS/Makefile
index 2969577..42cff0c 100755
--- a/rtl8723BS/Makefile
+++ b/rtl8723BS/Makefile
@@ -54,6 +54,7 @@ CONFIG_LOAD_PHY_PARA_FROM_FILE = y
CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY = n
CONFIG_CALIBRATE_TX_POWER_TO_MAX = n
CONFIG_ODM_ADAPTIVITY = n
+CONFIG_SKIP_SIGNAL_SCALE_MAPPING = n
######################## Wake On Lan ##########################
CONFIG_WOWLAN = n
CONFIG_GPIO_WAKEUP = n
@@ -104,6 +105,7 @@ CONFIG_PLATFORM_ACTIONS_ATV5201 = n
CONFIG_PLATFORM_ARM_RTD299X = n
CONFIG_PLATFORM_ARM_SPREADTRUM_6820 = n
CONFIG_PLATFORM_ARM_SPREADTRUM_8810 = n
+CONFIG_PLATFORM_ARM_WMT = n
CONFIG_PLATFORM_AML = y
CONFIG_RTL8723BS = m
CONFIG_DEBUG_RTL871X = n
@@ -168,7 +170,14 @@ _OUTSRC_FILES := hal/OUTSRC/odm_debug.o \
hal/OUTSRC/odm_interface.o\
hal/OUTSRC/odm_HWConfig.o\
hal/OUTSRC/odm.o\
- hal/OUTSRC/HalPhyRf.o
+ hal/OUTSRC/HalPhyRf.o\
+ hal/OUTSRC/odm_EdcaTurboCheck.o\
+ hal/OUTSRC/odm_DIG.o\
+ hal/OUTSRC/odm_PathDiv.o\
+ hal/OUTSRC/odm_DynamicBBPowerSaving.o\
+ hal/OUTSRC/odm_DynamicTxPower.o\
+ hal/OUTSRC/odm_CfoTracking.o\
+ hal/OUTSRC/odm_NoiseMonitor.o
EXTRA_CFLAGS += -I$(src)/platform
_PLATFORM_FILES := platform/platform_ops.o
@@ -692,6 +701,12 @@ endif
ifeq ($(CONFIG_EFUSE_CONFIG_FILE), y)
EXTRA_CFLAGS += -DCONFIG_EFUSE_CONFIG_FILE
+ifeq ($(MODULE_NAME), 8189es)
+EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_8189e.map\"
+else
+EXTRA_CFLAGS += -DEFUSE_MAP_PATH=\"/system/etc/wifi/wifi_efuse_$(MODULE_NAME).map\"
+endif
+EXTRA_CFLAGS += -DWIFIMAC_PATH=\"/data/wifimac.txt\"
endif
ifeq ($(CONFIG_EXT_CLK), y)
@@ -717,6 +732,9 @@ endif
ifeq ($(CONFIG_ODM_ADAPTIVITY), y)
EXTRA_CFLAGS += -DCONFIG_ODM_ADAPTIVITY
endif
+ifeq ($(CONFIG_SKIP_SIGNAL_SCALE_MAPPING), y)
+EXTRA_CFLAGS += -DCONFIG_SKIP_SIGNAL_SCALE_MAPPING
+endif
ifeq ($(CONFIG_WOWLAN), y)
EXTRA_CFLAGS += -DCONFIG_WOWLAN
@@ -934,6 +952,7 @@ endif
ifeq ($(CONFIG_PLATFORM_TI_DM365), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_TI_DM365
+EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_RX
ARCH := arm
CROSS_COMPILE := /home/cnsd4/Appro/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-
KVER := 2.6.18
@@ -1003,10 +1022,15 @@ MODULE_NAME := wlan
endif
ifeq ($(CONFIG_PLATFORM_ARM_RK3188), y)
-EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS -DCONFIG_MINIMAL_MEMORY_USAGE
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS
+# default setting for Android 4.1, 4.2, 4.3, 4.4
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+# default setting for Power control
EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN
-EXTRA_CFLAGS += -DRTW_USE_CFG80211_STA_EVENT
+# default setting for Special function
+EXTRA_CFLAGS += -DCONFIG_P2P_IPS
ARCH := arm
CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3188/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
KSRC := /home/android_sdk/Rockchip/Rk3188/kernel
@@ -1247,6 +1271,19 @@ EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS
_PLATFORM_FILES += platform/platform_sprd_sdio.o
endif
endif
+ifeq ($(CONFIG_PLATFORM_ARM_WMT), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
+EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
+EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS
+ifeq ($(CONFIG_SDIO_HCI), y)
+_PLATFORM_FILES += platform/platform_ARM_WMT_sdio.o
+endif
+ARCH := arm
+CROSS_COMPILE := /home/android_sdk/WonderMedia/wm8880-android4.4/toolchain/arm_201103_gcc4.5.2/mybin/arm_1103_le-
+KSRC := /home/android_sdk/WonderMedia/wm8880-android4.4/kernel4.4/
+MODULE_NAME :=8189es_kk
+endif
ifeq ($(CONFIG_MULTIDRV), y)
diff --git a/rtl8723BS/core/rtw_ap.c b/rtl8723BS/core/rtw_ap.c
index 9406080..8c4166f 100755
--- a/rtl8723BS/core/rtw_ap.c
+++ b/rtl8723BS/core/rtw_ap.c
@@ -992,26 +992,39 @@ void update_sta_info_apmode(_adapter *padapter, struct sta_info *psta)
//check if sta supports rx ampdu
phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable;
- //check if sta support s Short GI 20M
- if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20))
- {
- phtpriv_sta->sgi_20m = _TRUE;
+ phtpriv_sta->rx_ampdu_min_spacing = (phtpriv_sta->ht_cap.ampdu_params_info&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2;
+
+ // bwmode
+ if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))
+ {
+ psta->bw_mode = CHANNEL_WIDTH_40;
}
- //check if sta support s Short GI 40M
- if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40))
+ else
+ {
+ psta->bw_mode = CHANNEL_WIDTH_20;
+ }
+
+ if(pmlmeext->cur_bwmode < psta->bw_mode)
{
- phtpriv_sta->sgi_40m = _TRUE;
+ psta->bw_mode = pmlmeext->cur_bwmode;
}
- // bwmode
- if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH))
+ phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;
+
+
+ //check if sta support s Short GI 20M
+ if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20))
{
- phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset;
- psta->bw_mode = CHANNEL_WIDTH_40;
+ phtpriv_sta->sgi_20m = _TRUE;
}
- else
+
+ //check if sta support s Short GI 40M
+ if((phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & cpu_to_le16(IEEE80211_HT_CAP_SGI_40))
{
- psta->bw_mode = CHANNEL_WIDTH_20;
+ if(psta->bw_mode == CHANNEL_WIDTH_40) //according to psta->bw_mode
+ phtpriv_sta->sgi_40m = _TRUE;
+ else
+ phtpriv_sta->sgi_40m = _FALSE;
}
psta->qos_option = _TRUE;
@@ -2879,6 +2892,10 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso
issue_deauth(padapter, psta->hwaddr, reason);
}
+#ifdef CONFIG_BEAMFORMING
+ beamforming_wk_cmd(padapter, BEAMFORMING_CTRL_LEAVE, psta->hwaddr, ETH_ALEN, 1);
+#endif
+
psta->htpriv.agg_enable_bitmap = 0x0;//reset
psta->htpriv.candidate_tid_bitmap = 0x0;//reset
@@ -2886,7 +2903,7 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso
//report_del_sta_event(padapter, psta->hwaddr, reason);
//clear cam entry / key
- rtw_clearstakey_cmd(padapter, (u8*)psta, (u8)rtw_get_camid(psta->mac_id), _TRUE);
+ rtw_clearstakey_cmd(padapter, psta, _TRUE);
_enter_critical_bh(&psta->lock, &irqL);
@@ -3125,13 +3142,14 @@ void rtw_ap_restore_network(_adapter *padapter)
if (psta == NULL) {
DBG_871X(FUNC_ADPT_FMT" sta_info is null\n", FUNC_ADPT_ARG(padapter));
} else if (psta->state &_FW_LINKED) {
+ rtw_sta_media_status_rpt(padapter, psta, 1);
Update_RA_Entry(padapter, psta);
//pairwise key
/* per sta pairwise key and settings */
if( (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) ||
(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_))
{
- rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE,_FALSE);
+ rtw_setstakey_cmd(padapter, psta, _TRUE,_FALSE);
}
}
}
diff --git a/rtl8723BS/core/rtw_bt_mp.c b/rtl8723BS/core/rtw_bt_mp.c
index 63fbf9e..c9554f7 100755
--- a/rtl8723BS/core/rtw_bt_mp.c
+++ b/rtl8723BS/core/rtw_bt_mp.c
@@ -529,7 +529,7 @@ MPTBT_FwC2hBtMpCtrl(
if(Adapter->bBTFWReady == _FALSE || Adapter->registrypriv.mp_mode == 0 )
{
- DBG_8192C("Ignore C2H BT MP Info since not in MP mode \n");
+ //DBG_8192C("Ignore C2H BT MP Info since not in MP mode \n");
return;
}
if( length > 32 || length < 3 )
diff --git a/rtl8723BS/core/rtw_btcoex.c b/rtl8723BS/core/rtw_btcoex.c
index 43ebaf7..bfaecca 100755
--- a/rtl8723BS/core/rtw_btcoex.c
+++ b/rtl8723BS/core/rtw_btcoex.c
@@ -28,9 +28,14 @@ void rtw_btcoex_Initialize(PADAPTER padapter)
hal_btcoex_Initialize(padapter);
}
-void rtw_btcoex_HAL_Initialize(PADAPTER padapter)
+void rtw_btcoex_PowerOnSetting(PADAPTER padapter)
{
- hal_btcoex_InitHwConfig(padapter);
+ hal_btcoex_PowerOnSetting(padapter);
+}
+
+void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly)
+{
+ hal_btcoex_InitHwConfig(padapter, bWifiOnly);
}
void rtw_btcoex_IpsNotify(PADAPTER padapter, u8 type)
@@ -150,9 +155,9 @@ void rtw_btcoex_HaltNotify(PADAPTER padapter)
hal_btcoex_HaltNotify(padapter);
}
-void rtw_btcoex_SwitchGntBt(PADAPTER padapter)
+void rtw_btcoex_SwitchBtTRxMask(PADAPTER padapter)
{
- hal_btcoex_SwitchGntBt(padapter);
+ hal_btcoex_SwitchBtTRxMask(padapter);
}
void rtw_btcoex_Switch(PADAPTER padapter, u8 enable)
@@ -240,9 +245,9 @@ void rtw_btcoex_SetChipType(PADAPTER padapter, u8 chipType)
hal_btcoex_SetChipType(padapter, chipType);
}
-void rtw_btcoex_SetPGAntNum(PADAPTER padapter, u8 antNum, u8 antInverse)
+void rtw_btcoex_SetPGAntNum(PADAPTER padapter, u8 antNum)
{
- hal_btcoex_SetPgAntNum(padapter, antNum, antInverse);
+ hal_btcoex_SetPgAntNum(padapter, antNum);
}
u8 rtw_btcoex_GetPGAntNum(PADAPTER padapter)
@@ -250,6 +255,11 @@ u8 rtw_btcoex_GetPGAntNum(PADAPTER padapter)
return hal_btcoex_GetPgAntNum(padapter);
}
+void rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath)
+{
+ hal_btcoex_SetSingleAntPath(padapter, singleAntPath);
+}
+
u32 rtw_btcoex_GetRaMask(PADAPTER padapter)
{
return hal_btcoex_GetRaMask(padapter);
@@ -299,7 +309,8 @@ void rtw_btcoex_RejectApAggregatedPacket(PADAPTER padapter, u8 enable)
if (_TRUE == enable)
{
pmlmeinfo->bAcceptAddbaReq = _FALSE;
- send_delba(padapter, 0, psta->hwaddr);
+ if (psta)
+ send_delba(padapter, 0, psta->hwaddr);
}
else
{
diff --git a/rtl8723BS/core/rtw_cmd.c b/rtl8723BS/core/rtw_cmd.c
index fb77701..59182b1 100755
--- a/rtl8723BS/core/rtw_cmd.c
+++ b/rtl8723BS/core/rtw_cmd.c
@@ -330,7 +330,7 @@ int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
bAllow = _TRUE;
if( (pcmdpriv->padapter->hw_init_completed ==_FALSE && bAllow == _FALSE)
- || pcmdpriv->cmdthd_running== _FALSE //com_thread not running
+ || ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _FALSE //com_thread not running
)
{
//DBG_871X("%s:%s: drop cmdcode:%u, hw_init_completed:%u, cmdthd_running:%u\n", caller_func, __FUNCTION__,
@@ -430,8 +430,9 @@ _func_exit_;
void rtw_stop_cmd_thread(_adapter *adapter)
{
- if(adapter->cmdThread && adapter->cmdpriv.cmdthd_running == _TRUE
- && adapter->cmdpriv.stop_req == 0)
+ if(adapter->cmdThread &&
+ ATOMIC_READ(&(adapter->cmdpriv.cmdthd_running)) == _TRUE &&
+ adapter->cmdpriv.stop_req == 0)
{
adapter->cmdpriv.stop_req = 1;
_rtw_up_sema(&adapter->cmdpriv.cmd_queue_sema);
@@ -460,7 +461,7 @@ _func_enter_;
prspbuf = pcmdpriv->rsp_buf;
pcmdpriv->stop_req = 0;
- pcmdpriv->cmdthd_running=_TRUE;
+ ATOMIC_SET(&(pcmdpriv->cmdthd_running), _TRUE);
_rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("start r871x rtw_cmd_thread !!!!\n"));
@@ -607,8 +608,6 @@ post_process:
goto _next;
}
- pcmdpriv->cmdthd_running=_FALSE;
-
// free all cmd_obj resources
do{
@@ -633,6 +632,7 @@ post_process:
}while(1);
_rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
+ ATOMIC_SET(&(pcmdpriv->cmdthd_running), _FALSE);
_func_exit_;
@@ -1570,7 +1570,7 @@ _func_exit_;
return res;
}
-u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue)
+u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 unicast_key, bool enqueue)
{
struct cmd_obj* ph2c;
struct set_stakey_parm *psetstakey_para;
@@ -1579,7 +1579,6 @@ u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue)
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct security_priv *psecuritypriv = &padapter->securitypriv;
- struct sta_info* sta = (struct sta_info* )psta;
u8 res=_SUCCESS;
_func_enter_;
@@ -1651,7 +1650,7 @@ _func_exit_;
return res;
}
-u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue)
+u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue)
{
struct cmd_obj* ph2c;
struct set_stakey_parm *psetstakey_para;
@@ -1659,14 +1658,18 @@ u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue)
struct set_stakey_rsp *psetstakey_rsp = NULL;
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct security_priv *psecuritypriv = &padapter->securitypriv;
- struct sta_info* sta = (struct sta_info* )psta;
+ s16 cam_id = 0;
u8 res=_SUCCESS;
_func_enter_;
if(!enqueue)
{
- clear_cam_entry(padapter, entry);
+ while((cam_id = rtw_camid_search(padapter, sta->hwaddr, -1)) >= 0) {
+ DBG_871X_LEVEL(_drv_always_, "clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(sta->hwaddr), cam_id);
+ clear_cam_entry(padapter, cam_id);
+ rtw_camid_free(padapter, cam_id);
+ }
}
else
{
@@ -1698,8 +1701,6 @@ _func_enter_;
_rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);
psetstakey_para->algorithm = _NO_PRIVACY_;
-
- psetstakey_para->id = entry;
res = rtw_enqueue_cmd(pcmdpriv, ph2c);
@@ -2288,7 +2289,14 @@ static void collect_traffic_statistics(_adapter *padapter)
u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
{
u8 bEnterPS = _FALSE;
- u16 BusyThreshold = 100;
+#ifdef CONFIG_BT_COEXIST
+ u16 BusyThresholdHigh = 25;
+ u16 BusyThresholdLow = 10;
+#else
+ u16 BusyThresholdHigh = 100;
+ u16 BusyThresholdLow = 75;
+#endif
+ u16 BusyThreshold = BusyThresholdHigh;
u8 bBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE;
u8 bHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE, bHigherBusyTxTraffic = _FALSE;
@@ -2309,16 +2317,12 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
/*&& !MgntInitAdapterInProgress(pMgntInfo)*/)
{
-#ifdef CONFIG_BT_COEXIST
- if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 25 ||
- pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 25 )
-#else // !CONFIG_BT_COEXIST
// if we raise bBusyTraffic in last watchdog, using lower threshold.
if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
- BusyThreshold = 75;
+ BusyThreshold = BusyThresholdLow;
+
if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold ||
pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold )
-#endif // !CONFIG_BT_COEXIST
{
bBusyTraffic = _TRUE;
@@ -2494,6 +2498,28 @@ u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
}
+//To avoid RX affect TX throughput
+void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer)
+{
+ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
+ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+
+ if(IS_HARDWARE_TYPE_8821U(padapter) || IS_HARDWARE_TYPE_8192EU(padapter))
+ {
+ if(check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
+ {
+ if(pdvobjpriv->traffic_stat.cur_tx_tp > 2 && pdvobjpriv->traffic_stat.cur_rx_tp < 30)
+ rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x1010);
+ else
+ rtw_write16(padapter, REG_RXDMA_AGG_PG_TH,0x2005); //dmc agg th 20K
+
+ //DBG_871X("TX_TP=%u, RX_TP=%u \n", pdvobjpriv->traffic_stat.cur_tx_tp, pdvobjpriv->traffic_stat.cur_rx_tp);
+ }
+ }
+}
+
+
+
void dynamic_chk_wk_hdl(_adapter *padapter)
{
struct mlme_priv *pmlmepriv;
@@ -2521,6 +2547,7 @@ void dynamic_chk_wk_hdl(_adapter *padapter)
{
linked_status_chk(padapter);
traffic_status_watchdog(padapter, 0);
+ dm_DynamicUsbTxAgg(padapter, 0);
}
#ifdef CONFIG_BEAMFORMING
@@ -3123,6 +3150,147 @@ exit:
}
#endif
+#ifdef CONFIG_BT_COEXIST
+struct btinfo {
+ u8 cid;
+ u8 len;
+
+ u8 bConnection:1;
+ u8 bSCOeSCO:1;
+ u8 bInQPage:1;
+ u8 bACLBusy:1;
+ u8 bSCOBusy:1;
+ u8 bHID:1;
+ u8 bA2DP:1;
+ u8 bFTP:1;
+
+ u8 retry_cnt:4;
+ u8 rsvd_34:1;
+ u8 rsvd_35:1;
+ u8 rsvd_36:1;
+ u8 rsvd_37:1;
+
+ u8 rssi;
+
+ u8 rsvd_50:1;
+ u8 rsvd_51:1;
+ u8 rsvd_52:1;
+ u8 rsvd_53:1;
+ u8 rsvd_54:1;
+ u8 rsvd_55:1;
+ u8 eSCO_SCO:1;
+ u8 Master_Slave:1;
+
+ u8 rsvd_6;
+ u8 rsvd_7;
+};
+
+void btinfo_evt_dump(void *sel, void *buf)
+{
+ struct btinfo *info = (struct btinfo *)buf;
+
+ DBG_871X_SEL_NL(sel, "cid:0x%02x, len:%u\n", info->cid, info->len);
+
+ if (info->len > 2)
+ DBG_871X_SEL_NL(sel, "byte2:%s%s%s%s%s%s%s%s\n"
+ , info->bConnection?"bConnection ":""
+ , info->bSCOeSCO?"bSCOeSCO ":""
+ , info->bInQPage?"bInQPage ":""
+ , info->bACLBusy?"bACLBusy ":""
+ , info->bSCOBusy?"bSCOBusy ":""
+ , info->bHID?"bHID ":""
+ , info->bA2DP?"bA2DP ":""
+ , info->bFTP?"bFTP":""
+ );
+
+ if (info->len > 3)
+ DBG_871X_SEL_NL(sel, "retry_cnt:%u\n", info->retry_cnt);
+
+ if (info->len > 4)
+ DBG_871X_SEL_NL(sel, "rssi:%u\n", info->rssi);
+
+ if (info->len > 5)
+ DBG_871X_SEL_NL(sel, "byte5:%s%s\n"
+ , info->eSCO_SCO?"eSCO_SCO ":""
+ , info->Master_Slave?"Master_Slave ":""
+ );
+}
+
+static void rtw_btinfo_hdl(_adapter *adapter, u8 *buf, u16 buf_len)
+{
+ #define BTINFO_WIFI_FETCH 0x23
+ #define BTINFO_BT_AUTO_RPT 0x27
+ struct btinfo *info = (struct btinfo *)buf;
+ u8 cmd_idx;
+ u8 len;
+
+ cmd_idx = info->cid;
+
+ if (info->len > buf_len-2) {
+ rtw_warn_on(1);
+ len = buf_len-2;
+ } else {
+ len = info->len;
+ }
+
+//#define DBG_PROC_SET_BTINFO_EVT
+#ifdef DBG_PROC_SET_BTINFO_EVT
+ btinfo_evt_dump(RTW_DBGDUMP, info);
+#endif
+
+ /* transform BT-FW btinfo to WiFI-FW C2H format and notify */
+ if (cmd_idx == BTINFO_WIFI_FETCH)
+ buf[1] = 0;
+ else if (cmd_idx == BTINFO_BT_AUTO_RPT)
+ buf[1] = 2;
+ rtw_btcoex_BtInfoNotify(adapter ,len+1, &buf[1]);
+}
+
+u8 rtw_btinfo_cmd(_adapter *adapter, u8 *buf, u16 len)
+{
+ struct cmd_obj *ph2c;
+ struct drvextra_cmd_parm *pdrvextra_cmd_parm;
+ u8 *btinfo;
+ struct cmd_priv *pcmdpriv = &adapter->cmdpriv;
+ u8 res = _SUCCESS;
+
+ ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
+ if (ph2c == NULL) {
+ res = _FAIL;
+ goto exit;
+ }
+
+ pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
+ if (pdrvextra_cmd_parm == NULL) {
+ rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
+ res = _FAIL;
+ goto exit;
+ }
+
+ btinfo = rtw_zmalloc(len);
+ if (btinfo == NULL) {
+ rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
+ rtw_mfree((u8*)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm));
+ res = _FAIL;
+ goto exit;
+ }
+
+ pdrvextra_cmd_parm->ec_id = BTINFO_WK_CID;
+ pdrvextra_cmd_parm->type = 0;
+ pdrvextra_cmd_parm->size = len;
+ pdrvextra_cmd_parm->pbuf = btinfo;
+
+ _rtw_memcpy(btinfo, buf, len);
+
+ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
+
+ res = rtw_enqueue_cmd(pcmdpriv, ph2c);
+
+exit:
+ return res;
+}
+#endif
+
//#ifdef CONFIG_C2H_PACKET_EN
u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length)
{
@@ -3355,7 +3523,11 @@ u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf)
case DM_RA_MSK_WK_CID:
rtw_dm_ra_mask_hdl(padapter, (struct sta_info *)pdrvextra_cmd->pbuf);
break;
-
+#ifdef CONFIG_BT_COEXIST
+ case BTINFO_WK_CID:
+ rtw_btinfo_hdl(padapter ,pdrvextra_cmd->pbuf, pdrvextra_cmd->size);
+ break;
+#endif
default:
break;
}
diff --git a/rtl8723BS/core/rtw_debug.c b/rtl8723BS/core/rtw_debug.c
index 175110c..adff131 100755
--- a/rtl8723BS/core/rtw_debug.c
+++ b/rtl8723BS/core/rtw_debug.c
@@ -281,6 +281,23 @@ int proc_get_sec_info(struct seq_file *m, void *v)
DBG_871X_SEL_NL(m, "hw_decrypted=%d\n", sec->hw_decrypted);
+#ifdef DBG_SW_SEC_CNT
+ DBG_871X_SEL_NL(m, "wep_sw_enc_cnt=%llu, %llu, %llu\n"
+ , sec->wep_sw_enc_cnt_bc , sec->wep_sw_enc_cnt_mc, sec->wep_sw_enc_cnt_uc);
+ DBG_871X_SEL_NL(m, "wep_sw_dec_cnt=%llu, %llu, %llu\n"
+ , sec->wep_sw_dec_cnt_bc , sec->wep_sw_dec_cnt_mc, sec->wep_sw_dec_cnt_uc);
+
+ DBG_871X_SEL_NL(m, "tkip_sw_enc_cnt=%llu, %llu, %llu\n"
+ , sec->tkip_sw_enc_cnt_bc , sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc);
+ DBG_871X_SEL_NL(m, "tkip_sw_dec_cnt=%llu, %llu, %llu\n"
+ , sec->tkip_sw_dec_cnt_bc , sec->tkip_sw_dec_cnt_mc, sec->tkip_sw_dec_cnt_uc);
+
+ DBG_871X_SEL_NL(m, "aes_sw_enc_cnt=%llu, %llu, %llu\n"
+ , sec->aes_sw_enc_cnt_bc , sec->aes_sw_enc_cnt_mc, sec->aes_sw_enc_cnt_uc);
+ DBG_871X_SEL_NL(m, "aes_sw_dec_cnt=%llu, %llu, %llu\n"
+ , sec->aes_sw_dec_cnt_bc , sec->aes_sw_dec_cnt_mc, sec->aes_sw_dec_cnt_uc);
+#endif /* DBG_SW_SEC_CNT */
+
return 0;
}
@@ -449,6 +466,7 @@ int proc_get_survey_info(struct seq_file *m, void *v)
struct wlan_network *pnetwork = NULL;
_list *plist, *phead;
s32 notify_signal;
+ s16 notify_noise = 0;
u16 index = 0;
_enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
@@ -457,7 +475,7 @@ int proc_get_survey_info(struct seq_file *m, void *v)
if ((!phead) || (!plist))
return 0;
- DBG_871X_SEL_NL(m, "%5s %-17s %3s %-3s %-4s %5s %s\n","index", "bssid", "ch", "dBm", "SdBm", "age", "ssid");
+ DBG_871X_SEL_NL(m, "%5s %-17s %3s %-3s %-4s %-4s %5s %s\n","index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "ssid");
while(1)
{
if (rtw_end_of_queue_search(phead,plist)== _TRUE)
@@ -473,13 +491,18 @@ int proc_get_survey_info(struct seq_file *m, void *v)
} else {
notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);//dbm
}
+
+ #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+ rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(notify_noise));
+ #endif
- DBG_871X_SEL_NL(m, "%5d "MAC_FMT" %3d %3d %4d %5d %s\n",
+ DBG_871X_SEL_NL(m, "%5d "MAC_FMT" %3d %3d %4d %4d %5d %s\n",
++index,
MAC_ARG(pnetwork->network.MacAddress),
pnetwork->network.Configuration.DSConfig,
(int)pnetwork->network.Rssi,
notify_signal,
+ notify_noise,
rtw_get_passing_time_ms((u32)pnetwork->last_scanned),
//translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength),
pnetwork->network.Ssid.Ssid);
@@ -547,8 +570,14 @@ int proc_get_adapter_state(struct seq_file *m, void *v)
struct net_device *dev = m->private;
_adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
- DBG_871X_SEL_NL(m, "bSurpriseRemoved=%d, bDriverStopped=%d\n",
- padapter->bSurpriseRemoved, padapter->bDriverStopped);
+#ifdef CONFIG_CONCURRENT_MODE
+ DBG_871X_SEL_NL(m, "name=%s, iface_type=%d, bSurpriseRemoved=%d, bDriverStopped=%d\n",
+ dev->name, padapter->iface_type,
+ padapter->bSurpriseRemoved, padapter->bDriverStopped);
+#else
+ DBG_871X_SEL_NL(m, "name=%s, bSurpriseRemoved=%d, bDriverStopped=%d\n",
+ dev->name, padapter->bSurpriseRemoved, padapter->bDriverStopped);
+#endif
return 0;
}
@@ -695,6 +724,269 @@ int proc_get_suspend_resume_info(struct seq_file *m, void *v)
return 0;
}
+#ifdef CONFIG_DBG_COUNTER
+
+int proc_get_rx_logs(struct seq_file *m, void *v)
+{
+ struct net_device *dev = m->private;
+ _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+ struct rx_logs *rx_logs = &padapter->rx_logs;
+
+ DBG_871X_SEL_NL(m,
+ "intf_rx=%d\n"
+ "intf_rx_err_recvframe=%d\n"
+ "intf_rx_err_skb=%d\n"
+ "intf_rx_report=%d\n"
+ "core_rx=%d\n"
+ "core_rx_pre=%d\n"
+ "core_rx_pre_ver_err=%d\n"
+ "core_rx_pre_mgmt=%d\n"
+ "core_rx_pre_mgmt_err_80211w=%d\n"
+ "core_rx_pre_mgmt_err=%d\n"
+ "core_rx_pre_ctrl=%d\n"
+ "core_rx_pre_ctrl_err=%d\n"
+ "core_rx_pre_data=%d\n"
+ "core_rx_pre_data_wapi_seq_err=%d\n"
+ "core_rx_pre_data_wapi_key_err=%d\n"
+ "core_rx_pre_data_handled=%d\n"
+ "core_rx_pre_data_err=%d\n"
+ "core_rx_pre_data_unknown=%d\n"
+ "core_rx_pre_unknown=%d\n"
+ "core_rx_enqueue=%d\n"
+ "core_rx_dequeue=%d\n"
+ "core_rx_post=%d\n"
+ "core_rx_post_decrypt=%d\n"
+ "core_rx_post_decrypt_wep=%d\n"
+ "core_rx_post_decrypt_tkip=%d\n"
+ "core_rx_post_decrypt_aes=%d\n"
+ "core_rx_post_decrypt_wapi=%d\n"
+ "core_rx_post_decrypt_hw=%d\n"
+ "core_rx_post_decrypt_unknown=%d\n"
+ "core_rx_post_decrypt_err=%d\n"
+ "core_rx_post_defrag_err=%d\n"
+ "core_rx_post_portctrl_err=%d\n"
+ "core_rx_post_indicate=%d\n"
+ "core_rx_post_indicate_in_oder=%d\n"
+ "core_rx_post_indicate_reoder=%d\n"
+ "core_rx_post_indicate_err=%d\n"
+ "os_indicate=%d\n"
+ "os_indicate_ap_mcast=%d\n"
+ "os_indicate_ap_forward=%d\n"
+ "os_indicate_ap_self=%d\n"
+ "os_indicate_err=%d\n"
+ "os_netif_ok=%d\n"
+ "os_netif_err=%d\n",
+ rx_logs->intf_rx,
+ rx_logs->intf_rx_err_recvframe,
+ rx_logs->intf_rx_err_skb,
+ rx_logs->intf_rx_report,
+ rx_logs->core_rx,
+ rx_logs->core_rx_pre,
+ rx_logs->core_rx_pre_ver_err,
+ rx_logs->core_rx_pre_mgmt,
+ rx_logs->core_rx_pre_mgmt_err_80211w,
+ rx_logs->core_rx_pre_mgmt_err,
+ rx_logs->core_rx_pre_ctrl,
+ rx_logs->core_rx_pre_ctrl_err,
+ rx_logs->core_rx_pre_data,
+ rx_logs->core_rx_pre_data_wapi_seq_err,
+ rx_logs->core_rx_pre_data_wapi_key_err,
+ rx_logs->core_rx_pre_data_handled,
+ rx_logs->core_rx_pre_data_err,
+ rx_logs->core_rx_pre_data_unknown,
+ rx_logs->core_rx_pre_unknown,
+ rx_logs->core_rx_enqueue,
+ rx_logs->core_rx_dequeue,
+ rx_logs->core_rx_post,
+ rx_logs->core_rx_post_decrypt,
+ rx_logs->core_rx_post_decrypt_wep,
+ rx_logs->core_rx_post_decrypt_tkip,
+ rx_logs->core_rx_post_decrypt_aes,
+ rx_logs->core_rx_post_decrypt_wapi,
+ rx_logs->core_rx_post_decrypt_hw,
+ rx_logs->core_rx_post_decrypt_unknown,
+ rx_logs->core_rx_post_decrypt_err,
+ rx_logs->core_rx_post_defrag_err,
+ rx_logs->core_rx_post_portctrl_err,
+ rx_logs->core_rx_post_indicate,
+ rx_logs->core_rx_post_indicate_in_oder,
+ rx_logs->core_rx_post_indicate_reoder,
+ rx_logs->core_rx_post_indicate_err,
+ rx_logs->os_indicate,
+ rx_logs->os_indicate_ap_mcast,
+ rx_logs->os_indicate_ap_forward,
+ rx_logs->os_indicate_ap_self,
+ rx_logs->os_indicate_err,
+ rx_logs->os_netif_ok,
+ rx_logs->os_netif_err
+ );
+
+ return 0;
+}
+
+int proc_get_tx_logs(struct seq_file *m, void *v)
+{
+ struct net_device *dev = m->private;
+ _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+ struct tx_logs *tx_logs = &padapter->tx_logs;
+
+ DBG_871X_SEL_NL(m,
+ "os_tx=%d\n"
+ "os_tx_err_up=%d\n"
+ "os_tx_err_xmit=%d\n"
+ "os_tx_m2u=%d\n"
+ "os_tx_m2u_ignore_fw_linked=%d\n"
+ "os_tx_m2u_ignore_self=%d\n"
+ "os_tx_m2u_entry=%d\n"
+ "os_tx_m2u_entry_err_xmit=%d\n"
+ "os_tx_m2u_entry_err_skb=%d\n"
+ "os_tx_m2u_stop=%d\n"
+ "core_tx=%d\n"
+ "core_tx_err_pxmitframe=%d\n"
+ "core_tx_err_brtx=%d\n"
+ "core_tx_upd_attrib=%d\n"
+ "core_tx_upd_attrib_adhoc=%d\n"
+ "core_tx_upd_attrib_sta=%d\n"
+ "core_tx_upd_attrib_ap=%d\n"
+ "core_tx_upd_attrib_unknown=%d\n"
+ "core_tx_upd_attrib_dhcp=%d\n"
+ "core_tx_upd_attrib_icmp=%d\n"
+ "core_tx_upd_attrib_active=%d\n"
+ "core_tx_upd_attrib_err_ucast_sta=%d\n"
+ "core_tx_upd_attrib_err_ucast_ap_link=%d\n"
+ "core_tx_upd_attrib_err_sta=%d\n"
+ "core_tx_upd_attrib_err_link=%d\n"
+ "core_tx_upd_attrib_err_sec=%d\n"
+ "core_tx_ap_enqueue_warn_fwstate=%d\n"
+ "core_tx_ap_enqueue_warn_sta=%d\n"
+ "core_tx_ap_enqueue_warn_nosta=%d\n"
+ "core_tx_ap_enqueue_warn_link=%d\n"
+ "core_tx_ap_enqueue_warn_trigger=%d\n"
+ "core_tx_ap_enqueue_mcast=%d\n"
+ "core_tx_ap_enqueue_ucast=%d\n"
+ "core_tx_ap_enqueue=%d\n"
+ "intf_tx=%d\n"
+ "intf_tx_pending_ac=%d\n"
+ "intf_tx_pending_fw_under_survey=%d\n"
+ "intf_tx_pending_fw_under_linking=%d\n"
+ "intf_tx_pending_xmitbuf=%d\n"
+ "intf_tx_enqueue=%d\n"
+ "core_tx_enqueue=%d\n"
+ "core_tx_enqueue_class=%d\n"
+ "core_tx_enqueue_class_err_sta=%d\n"
+ "core_tx_enqueue_class_err_nosta=%d\n"
+ "core_tx_enqueue_class_err_fwlink=%d\n"
+ "intf_tx_direct=%d\n"
+ "intf_tx_direct_err_coalesce=%d\n"
+ "intf_tx_dequeue=%d\n"
+ "intf_tx_dequeue_err_coalesce=%d\n"
+ "intf_tx_dump_xframe=%d\n"
+ "intf_tx_dump_xframe_err_txdesc=%d\n"
+ "intf_tx_dump_xframe_err_port=%d\n",
+ tx_logs->os_tx,
+ tx_logs->os_tx_err_up,
+ tx_logs->os_tx_err_xmit,
+ tx_logs->os_tx_m2u,
+ tx_logs->os_tx_m2u_ignore_fw_linked,
+ tx_logs->os_tx_m2u_ignore_self,
+ tx_logs->os_tx_m2u_entry,
+ tx_logs->os_tx_m2u_entry_err_xmit,
+ tx_logs->os_tx_m2u_entry_err_skb,
+ tx_logs->os_tx_m2u_stop,
+ tx_logs->core_tx,
+ tx_logs->core_tx_err_pxmitframe,
+ tx_logs->core_tx_err_brtx,
+ tx_logs->core_tx_upd_attrib,
+ tx_logs->core_tx_upd_attrib_adhoc,
+ tx_logs->core_tx_upd_attrib_sta,
+ tx_logs->core_tx_upd_attrib_ap,
+ tx_logs->core_tx_upd_attrib_unknown,
+ tx_logs->core_tx_upd_attrib_dhcp,
+ tx_logs->core_tx_upd_attrib_icmp,
+ tx_logs->core_tx_upd_attrib_active,
+ tx_logs->core_tx_upd_attrib_err_ucast_sta,
+ tx_logs->core_tx_upd_attrib_err_ucast_ap_link,
+ tx_logs->core_tx_upd_attrib_err_sta,
+ tx_logs->core_tx_upd_attrib_err_link,
+ tx_logs->core_tx_upd_attrib_err_sec,
+ tx_logs->core_tx_ap_enqueue_warn_fwstate,
+ tx_logs->core_tx_ap_enqueue_warn_sta,
+ tx_logs->core_tx_ap_enqueue_warn_nosta,
+ tx_logs->core_tx_ap_enqueue_warn_link,
+ tx_logs->core_tx_ap_enqueue_warn_trigger,
+ tx_logs->core_tx_ap_enqueue_mcast,
+ tx_logs->core_tx_ap_enqueue_ucast,
+ tx_logs->core_tx_ap_enqueue,
+ tx_logs->intf_tx,
+ tx_logs->intf_tx_pending_ac,
+ tx_logs->intf_tx_pending_fw_under_survey,
+ tx_logs->intf_tx_pending_fw_under_linking,
+ tx_logs->intf_tx_pending_xmitbuf,
+ tx_logs->intf_tx_enqueue,
+ tx_logs->core_tx_enqueue,
+ tx_logs->core_tx_enqueue_class,
+ tx_logs->core_tx_enqueue_class_err_sta,
+ tx_logs->core_tx_enqueue_class_err_nosta,
+ tx_logs->core_tx_enqueue_class_err_fwlink,
+ tx_logs->intf_tx_direct,
+ tx_logs->intf_tx_direct_err_coalesce,
+ tx_logs->intf_tx_dequeue,
+ tx_logs->intf_tx_dequeue_err_coalesce,
+ tx_logs->intf_tx_dump_xframe,
+ tx_logs->intf_tx_dump_xframe_err_txdesc,
+ tx_logs->intf_tx_dump_xframe_err_port
+ );
+
+ return 0;
+}
+
+int proc_get_int_logs(struct seq_file *m, void *v)
+{
+ struct net_device *dev = m->private;
+ _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+
+ DBG_871X_SEL_NL(m,
+ "all=%d\n"
+ "err=%d\n"
+ "tbdok=%d\n"
+ "tbder=%d\n"
+ "bcnderr=%d\n"
+ "bcndma=%d\n"
+ "bcndma_e=%d\n"
+ "rx=%d\n"
+ "rx_rdu=%d\n"
+ "rx_fovw=%d\n"
+ "txfovw=%d\n"
+ "mgntok=%d\n"
+ "highdok=%d\n"
+ "bkdok=%d\n"
+ "bedok=%d\n"
+ "vidok=%d\n"
+ "vodok=%d\n",
+ padapter->int_logs.all,
+ padapter->int_logs.err,
+ padapter->int_logs.tbdok,
+ padapter->int_logs.tbder,
+ padapter->int_logs.bcnderr,
+ padapter->int_logs.bcndma,
+ padapter->int_logs.bcndma_e,
+ padapter->int_logs.rx,
+ padapter->int_logs.rx_rdu,
+ padapter->int_logs.rx_fovw,
+ padapter->int_logs.txfovw,
+ padapter->int_logs.mgntok,
+ padapter->int_logs.highdok,
+ padapter->int_logs.bkdok,
+ padapter->int_logs.bedok,
+ padapter->int_logs.vidok,
+ padapter->int_logs.vodok
+ );
+
+ return 0;
+}
+
+#endif // CONFIG_DBG_COUNTER
+
int proc_get_rx_signal(struct seq_file *m, void *v)
{
struct net_device *dev = m->private;
@@ -705,7 +997,7 @@ int proc_get_rx_signal(struct seq_file *m, void *v)
//DBG_871X_SEL_NL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb);
DBG_871X_SEL_NL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength);
DBG_871X_SEL_NL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual);
- DBG_871X_SEL_NL(m, "noise:%u\n", padapter->recvpriv.noise);
+ DBG_871X_SEL_NL(m, "noise:%d\n", padapter->recvpriv.noise);
rtw_odm_get_perpkt_rssi(m,padapter);
#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
rtw_get_raw_rssi_info(m,padapter);
@@ -1114,6 +1406,11 @@ int proc_get_all_sta_info(struct seq_file *m, void *v)
DBG_871X_SEL_NL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
#endif //CONFIG_80211N_HT
DBG_871X_SEL_NL(m, "sleepq_len=%d\n", psta->sleepq_len);
+ DBG_871X_SEL_NL(m, "sta_xmitpriv.vo_q_qcnt=%d\n", psta->sta_xmitpriv.vo_q.qcnt);
+ DBG_871X_SEL_NL(m, "sta_xmitpriv.vi_q_qcnt=%d\n", psta->sta_xmitpriv.vi_q.qcnt);
+ DBG_871X_SEL_NL(m, "sta_xmitpriv.be_q_qcnt=%d\n", psta->sta_xmitpriv.be_q.qcnt);
+ DBG_871X_SEL_NL(m, "sta_xmitpriv.bk_q_qcnt=%d\n", psta->sta_xmitpriv.bk_q.qcnt);
+
DBG_871X_SEL_NL(m, "capability=0x%x\n", psta->capability);
DBG_871X_SEL_NL(m, "flags=0x%x\n", psta->flags);
DBG_871X_SEL_NL(m, "wpa_psk=0x%x\n", psta->wpa_psk);
@@ -1386,5 +1683,91 @@ ssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t cou
}
#endif /* DBG_CONFIG_ERROR_DETECT */
+#ifdef CONFIG_PCI_HCI
+
+int proc_get_rx_ring(struct seq_file *m, void *v)
+{
+ _irqL irqL;
+ struct net_device *dev = m->private;
+ _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
+ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
+ struct recv_priv *precvpriv = &padapter->recvpriv;
+ struct rtw_rx_ring *rx_ring = &precvpriv->rx_ring[RX_MPDU_QUEUE];
+ int i, j;
+
+ DBG_871X_SEL_NL(m, "rx ring (%p)\n", rx_ring);
+ DBG_871X_SEL_NL(m, " dma: 0x%08x\n", (int) rx_ring->dma);
+ DBG_871X_SEL_NL(m, " idx: %d\n", rx_ring->idx);
+
+ _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
+ for (i=0; i<precvpriv->rxringcount; i++)
+ {
+ struct recv_stat *entry = &rx_ring->desc[i];
+ struct sk_buff *skb = rx_ring->rx_buf[i];
+
+ DBG_871X_SEL_NL(m, " desc[%03d]: %p, rx_buf[%03d]: 0x%08x\n",
+ i, entry, i, cpu_to_le32(*((dma_addr_t *)skb->cb)));
+
+ for (j=0; j<sizeof(*entry)/4; j++)
+ {
+ if ((j % 4) == 0)
+ DBG_871X_SEL_NL(m, " 0x%03x", j);
+
+ DBG_871X_SEL_NL(m, " 0x%08x ", ((int *) entry)[j]);
+
+ if ((j % 4) == 3)
+ DBG_871X_SEL_NL(m, "\n");
+ }
+ }
+ _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
+
+ return 0;
+}
+
+int proc_get_tx_ring(struct seq_file *m, void *v)
+{
+ _irqL irqL;
+ struct net_device *dev = m->private;
+ _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
+ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
+ struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+ int i, j, k;
+
+ _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
+ for (i = 0; i < PCI_MAX_TX_QUEUE_COUNT; i++)
+ {
+ struct rtw_tx_ring *tx_ring = &pxmitpriv->tx_ring[i];
+
+ DBG_871X_SEL_NL(m, "tx ring[%d] (%p)\n", i, tx_ring);
+ DBG_871X_SEL_NL(m, " dma: 0x%08x\n", (int) tx_ring->dma);
+ DBG_871X_SEL_NL(m, " idx: %d\n", tx_ring->idx);
+ DBG_871X_SEL_NL(m, " entries: %d\n", tx_ring->entries);
+// DBG_871X_SEL_NL(m, " queue: %d\n", tx_ring->queue);
+ DBG_871X_SEL_NL(m, " qlen: %d\n", tx_ring->qlen);
+
+ for (j=0; j < pxmitpriv->txringcount[i]; j++)
+ {
+ struct tx_desc *entry = &tx_ring->desc[j];
+
+ DBG_871X_SEL_NL(m, " desc[%03d]: %p\n", j, entry);
+ for (k=0; k < sizeof(*entry)/4; k++)
+ {
+ if ((k % 4) == 0)
+ DBG_871X_SEL_NL(m, " 0x%03x", k);
+
+ DBG_871X_SEL_NL(m, " 0x%08x ", ((int *) entry)[k]);
+
+ if ((k % 4) == 3)
+ DBG_871X_SEL_NL(m, "\n");
+ }
+ }
+ }
+ _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
+
+ return 0;
+}
+
+#endif
+
#endif
diff --git a/rtl8723BS/core/rtw_ioctl_set.c b/rtl8723BS/core/rtw_ioctl_set.c
index 255453b..59b88f4 100755
--- a/rtl8723BS/core/rtw_ioctl_set.c
+++ b/rtl8723BS/core/rtw_ioctl_set.c
@@ -1254,11 +1254,11 @@ _func_enter_;
//Set key to CAM through H2C command
if(bgrouptkey)//never go to here
{
- res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _FALSE, _TRUE);
+ res=rtw_setstakey_cmd(padapter, stainfo, _FALSE, _TRUE);
RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(group)\n"));
}
else{
- res=rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, _TRUE, _TRUE);
+ res=rtw_setstakey_cmd(padapter, stainfo, _TRUE, _TRUE);
RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n"));
}
diff --git a/rtl8723BS/core/rtw_mem.c b/rtl8723BS/core/rtw_mem.c
new file mode 100755
index 0000000..a4de3e6
--- a/dev/null
+++ b/rtl8723BS/core/rtw_mem.c
@@ -0,0 +1,103 @@
+
+#include <drv_types.h>
+#include <rtw_mem.h>
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Realtek Wireless Lan Driver");
+MODULE_AUTHOR("Realtek Semiconductor Corp.");
+MODULE_VERSION("DRIVERVERSION");
+
+struct sk_buff_head rtk_skb_mem_q;
+struct u8* rtk_buf_mem[NR_RECVBUFF];
+
+struct u8 * rtw_get_buf_premem(int index)
+{
+ printk("%s, rtk_buf_mem index : %d\n", __func__, index);
+ return rtk_buf_mem[index];
+}
+
+struct sk_buff *rtw_alloc_skb_premem(void)
+{
+ struct sk_buff *skb = NULL;
+
+ skb = skb_dequeue(&rtk_skb_mem_q);
+
+ printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
+
+ return skb;
+}
+EXPORT_SYMBOL(rtw_alloc_skb_premem);
+
+int rtw_free_skb_premem(struct sk_buff *pskb)
+{
+ if(!pskb)
+ return -1;
+
+ if(skb_queue_len(&rtk_skb_mem_q) >= NR_PREALLOC_RECV_SKB)
+ return -1;
+
+ skb_queue_tail(&rtk_skb_mem_q, pskb);
+
+ printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
+
+ return 0;
+}
+EXPORT_SYMBOL(rtw_free_skb_premem);
+
+static int __init rtw_mem_init(void)
+{
+ int i;
+ SIZE_PTR tmpaddr=0;
+ SIZE_PTR alignment=0;
+ struct sk_buff *pskb=NULL;
+
+ printk("%s\n", __func__);
+
+#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
+ for(i=0; i<NR_RECVBUFF; i++)
+ {
+ rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);
+ }
+#endif //CONFIG_USE_USB_BUFFER_ALLOC_RX
+
+ skb_queue_head_init(&rtk_skb_mem_q);
+
+ for(i=0; i<NR_PREALLOC_RECV_SKB; i++)
+ {
+ pskb = __dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
+ if(pskb)
+ {
+ tmpaddr = (SIZE_PTR)pskb->data;
+ alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
+ skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));
+
+ skb_queue_tail(&rtk_skb_mem_q, pskb);
+ }
+ else
+ {
+ printk("%s, alloc skb memory fail!\n", __func__);
+ }
+
+ pskb=NULL;
+ }
+
+ printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
+
+ return 0;
+
+}
+
+static void __exit rtw_mem_exit(void)
+{
+ if (skb_queue_len(&rtk_skb_mem_q)) {
+ printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
+ }
+
+ skb_queue_purge(&rtk_skb_mem_q);
+
+ printk("%s\n", __func__);
+}
+
+module_init(rtw_mem_init);
+module_exit(rtw_mem_exit);
+
diff --git a/rtl8723BS/core/rtw_mlme.c b/rtl8723BS/core/rtw_mlme.c
index 6c1898e..40eadc9 100755
--- a/rtl8723BS/core/rtw_mlme.c
+++ b/rtl8723BS/core/rtw_mlme.c
@@ -25,13 +25,6 @@
extern void indicate_wx_scan_complete_event(_adapter *padapter);
extern u8 rtw_do_join(_adapter * padapter);
-#ifdef CONFIG_DISABLE_MCS13TO15
-extern unsigned char MCS_rate_2R_MCS13TO15_OFF[16];
-extern unsigned char MCS_rate_2R[16];
-#else //CONFIG_DISABLE_MCS13TO15
-extern unsigned char MCS_rate_2R[16];
-#endif //CONFIG_DISABLE_MCS13TO15
-extern unsigned char MCS_rate_1R[16];
sint _rtw_init_mlme_priv (_adapter* padapter)
{
@@ -540,15 +533,18 @@ void rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork
_func_enter_;
RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid));
_rtw_free_network(pmlmepriv, pnetwork, is_freeall);
-_func_exit_;
+_func_exit_;
}
-void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork );
-void rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork )
+void rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork );
+void rtw_free_network_nolock(_adapter * padapter, struct wlan_network *pnetwork )
{
_func_enter_;
//RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_network==> ssid = %s \n\n" , pnetwork->network.Ssid.Ssid));
- _rtw_free_network_nolock(pmlmepriv, pnetwork);
+ _rtw_free_network_nolock(&(padapter->mlmepriv), pnetwork);
+#ifdef CONFIG_IOCTL_CFG80211
+ rtw_cfg80211_unlink_bss(padapter, pnetwork);
+#endif //CONFIG_IOCTL_CFG80211
_func_exit_;
}
@@ -1449,6 +1445,14 @@ _func_enter_;
_func_exit_;
}
+
+void rtw_reset_rx_info(struct debug_priv *pdbgpriv){
+ pdbgpriv->dbg_rx_ampdu_drop_count = 0;
+ pdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0;
+ pdbgpriv->dbg_rx_ampdu_loss_count = 0;
+ pdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0;
+ pdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0;
+}
/*
*rtw_free_assoc_resources: the caller has to lock pmlmepriv->lock
@@ -1457,9 +1461,12 @@ void rtw_free_assoc_resources(_adapter *adapter, int lock_scanned_queue)
{
_irqL irqL;
struct wlan_network* pwlan = NULL;
- struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
- struct sta_priv *pstapriv = &adapter->stapriv;
+ struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
+ struct sta_priv *pstapriv = &adapter->stapriv;
struct wlan_network *tgt_network = &pmlmepriv->cur_network;
+ struct dvobj_priv *psdpriv = adapter->dvobj;
+ struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+
#ifdef CONFIG_TDLS
struct tdls_info *ptdlsinfo = &adapter->tdlsinfo;
@@ -1554,7 +1561,7 @@ _func_enter_;
if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) && (adapter->stapriv.asoc_sta_count== 1))
/*||check_fwstate(pmlmepriv, WIFI_STATION_STATE)*/)
{
- rtw_free_network_nolock(pmlmepriv, pwlan);
+ rtw_free_network_nolock(adapter, pwlan);
}
if(lock_scanned_queue)
@@ -1562,6 +1569,8 @@ _func_enter_;
adapter->securitypriv.key_mask = 0;
+ rtw_reset_rx_info(pdbgpriv);
+
_func_exit_;
}
@@ -1808,6 +1817,7 @@ static struct sta_info *rtw_joinbss_update_stainfo(_adapter *padapter, struct wl
_rtw_memset((u8 *)&psta->dot11tkiptxmickey, 0, sizeof (union Keytype));
_rtw_memset((u8 *)&psta->dot11txpn, 0, sizeof (union pn48));
+ psta->dot11txpn.val = psta->dot11txpn.val + 1;
#ifdef CONFIG_IEEE80211W
_rtw_memset((u8 *)&psta->dot11wtxpn, 0, sizeof (union pn48));
#endif //CONFIG_IEEE80211W
@@ -2316,6 +2326,10 @@ _func_enter_;
rtw_indicate_sta_assoc_event(adapter, psta);
#endif //!CONFIG_IOCTL_CFG80211
#endif //!CONFIG_AUTO_AP_MODE
+
+#ifdef CONFIG_BEAMFORMING
+ beamforming_wk_cmd(adapter, BEAMFORMING_CTRL_ENTER, (u8 *)psta, sizeof(struct sta_info), 0);
+#endif
}
goto exit;
}
@@ -2378,7 +2392,7 @@ _func_enter_;
#ifdef CONFIG_RTL8711
//submit SetStaKey_cmd to tell fw, fw will allocate an CAM entry for this sta
- rtw_setstakey_cmd(adapter, (unsigned char*)psta, _FALSE, _TRUE);
+ rtw_setstakey_cmd(adapter, psta, _FALSE, _TRUE);
#endif
exit:
@@ -2479,7 +2493,7 @@ _func_enter_;
pwlan = rtw_find_network(&pmlmepriv->scanned_queue, tgt_network->network.MacAddress);
if (pwlan) {
pwlan->fixed = _FALSE;
- rtw_free_network_nolock(pmlmepriv, pwlan);
+ rtw_free_network_nolock(adapter, pwlan);
}
_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
@@ -2509,7 +2523,7 @@ _func_enter_;
if(pwlan)
{
pwlan->fixed = _FALSE;
- rtw_free_network_nolock(pmlmepriv, pwlan);
+ rtw_free_network_nolock(adapter, pwlan);
}
_exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
//re-create ibss
@@ -2569,6 +2583,17 @@ _func_exit_;
}
+
+void rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf)
+{
+_func_enter_;
+
+ WMMOnAssocRsp(padapter);
+
+_func_exit_;
+
+}
+
/*
* _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss
* @adapter: pointer to _adapter structure
@@ -2692,6 +2717,8 @@ void rtw_scan_timeout_handler (_adapter *adapter)
void rtw_mlme_reset_auto_scan_int(_adapter *adapter)
{
struct mlme_priv *mlme = &adapter->mlmepriv;
+ struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
#ifdef CONFIG_P2P
if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) {
@@ -2699,8 +2726,11 @@ void rtw_mlme_reset_auto_scan_int(_adapter *adapter)
goto exit;
}
#endif
-
- if(adapter->registrypriv.wifi_spec) {
+ if(pmlmeinfo->VHT_enable) //disable auto scan when connect to 11AC AP
+ {
+ mlme->auto_scan_int_ms = 0;
+ }
+ else if(adapter->registrypriv.wifi_spec && is_client_associated_to_ap(adapter) == _TRUE) {
mlme->auto_scan_int_ms = 60*1000;
#ifdef CONFIG_LAYER2_ROAMING
} else if(rtw_chk_roam_flags(adapter, RTW_ROAM_ACTIVE)) {
@@ -3817,6 +3847,7 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
struct registry_priv *pregistrypriv = &padapter->registrypriv;
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct ht_priv *phtpriv = &pmlmepriv->htpriv;
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
phtpriv->ht_option = _FALSE;
@@ -3890,17 +3921,21 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
}
}
+ //fill default supported_mcs_set
+ _rtw_memcpy(ht_capie.supp_mcs_set, pmlmeext->default_supported_mcs_set, 16);
+
+ //update default supported_mcs_set
rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
-#ifdef RTL8192C_RECONFIG_TO_1T1R
- rf_type = RF_1T1R;
-#endif
- switch (rf_type) {
+
+ switch(rf_type)
+ {
case RF_1T1R:
+
if (stbc_rx_enable)
ht_capie.cap_info |= IEEE80211_HT_CAP_RX_STBC_1R;//RX STBC One spatial stream
- _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_1R, 16);
- break;
+ set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_1R);
+ break;
case RF_2T2R:
case RF_1T2R:
@@ -3911,11 +3946,11 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
#ifdef CONFIG_DISABLE_MCS13TO15
if(((cbw40_enable == 1) && (operation_bw == CHANNEL_WIDTH_40)) && (pregistrypriv->wifi_spec!=1))
- _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R_MCS13TO15_OFF, 16);
+ set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R_13TO15_OFF);
else
- _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16);
+ set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R);
#else //CONFIG_DISABLE_MCS13TO15
- _rtw_memcpy(ht_capie.supp_mcs_set, MCS_rate_2R, 16);
+ set_mcs_rate_by_mask(ht_capie.supp_mcs_set, MCS_RATE_2R);
#endif //CONFIG_DISABLE_MCS13TO15
break;
}
@@ -3942,7 +3977,12 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui
#endif
*/
+ if(padapter->driver_rx_ampdu_factor != 0xFF)
+ max_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)padapter->driver_rx_ampdu_factor;
+ else
rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
+
+ //rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
ht_capie.ampdu_params_info = (max_rx_ampdu_factor&0x03);
if(padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ )
@@ -4025,7 +4065,9 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
{
if(pregistrypriv->wifi_spec==1)
{
- phtpriv->ampdu_enable = _FALSE;
+ //remove this part because testbed AP should disable RX AMPDU
+ //phtpriv->ampdu_enable = _FALSE;
+ phtpriv->ampdu_enable = _TRUE;
}
else
{
@@ -4034,7 +4076,8 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
}
else if(pregistrypriv->ampdu_enable==2)
{
- phtpriv->ampdu_enable = _TRUE;
+ //remove this part because testbed AP should disable RX AMPDU
+ //phtpriv->ampdu_enable = _TRUE;
}
@@ -4077,34 +4120,31 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel)
int i;
u8 rf_type;
- padapter->HalFunc.GetHwRegHandler(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
+ rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
- //update the MCS rates
+ //update the MCS set
for (i = 0; i < 16; i++)
+ pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i];
+
+ //update the MCS rates
+ switch(rf_type)
{
- if((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
- {
- pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
- }
- else
- {
- #ifdef CONFIG_DISABLE_MCS13TO15
- if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )
- {
- pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R_MCS13TO15_OFF[i];
- }
+ case RF_1T1R:
+ case RF_1T2R:
+ set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R);
+ break;
+ case RF_2T2R:
+ default:
+#ifdef CONFIG_DISABLE_MCS13TO15
+ if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )
+ set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R_13TO15_OFF);
else
- pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
- #else
- pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
- #endif //CONFIG_DISABLE_MCS13TO15
- }
- #ifdef RTL8192C_RECONFIG_TO_1T1R
- {
- pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
- }
- #endif
+ set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#else //CONFIG_DISABLE_MCS13TO15
+ set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#endif //CONFIG_DISABLE_MCS13TO15
}
+
//switch to the 40M Hz mode accoring to the AP
//pmlmeext->cur_bwmode = CHANNEL_WIDTH_40;
switch ((pmlmeinfo->HT_info.infos[0] & 0x3))
diff --git a/rtl8723BS/core/rtw_mlme_ext.c b/rtl8723BS/core/rtw_mlme_ext.c
index 4b72c2f..e3f4e81 100755
--- a/rtl8723BS/core/rtw_mlme_ext.c
+++ b/rtl8723BS/core/rtw_mlme_ext.c
@@ -113,16 +113,6 @@ unsigned char RSN_TKIP_CIPHER[4] = {0x00, 0x0f, 0xac, 0x02};
extern unsigned char REALTEK_96B_IE[];
-/********************************************************
-MCS rate definitions
-*********************************************************/
-#ifdef CONFIG_DISABLE_MCS13TO15
-unsigned char MCS_rate_2R_MCS13TO15_OFF[16] = {0xff, 0x1f, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-unsigned char MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-#else //CONFIG_DISABLE_MCS13TO15
-unsigned char MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
-#endif //CONFIG_DISABLE_MCS13TO15
-unsigned char MCS_rate_1R[16] = {0xff, 0x00, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
/********************************************************
ChannelPlan definitions
@@ -345,18 +335,24 @@ int init_hw_mlme_ext(_adapter *padapter)
return _SUCCESS;
}
-static void init_mlme_ext_priv_value(_adapter* padapter)
+void init_mlme_default_rate_set(_adapter* padapter)
{
- struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
- struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-#ifdef CONFIG_TDLS
- u8 i;
-#endif
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
- //unsigned char default_channel_set[MAX_CHANNEL_NUM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0};
unsigned char mixed_datarate[NumRates] = {_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_,_9M_RATE_, _12M_RATE_, _18M_RATE_, _24M_RATE_, _36M_RATE_, _48M_RATE_, _54M_RATE_, 0xff};
unsigned char mixed_basicrate[NumRates] ={_1M_RATE_, _2M_RATE_, _5M_RATE_, _11M_RATE_, _6M_RATE_, _12M_RATE_, _24M_RATE_, 0xff,};
+ unsigned char supported_mcs_set[16] = {0xff, 0xff, 0x00, 0x00, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+
+ _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates);
+ _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates);
+
+ _rtw_memcpy(pmlmeext->default_supported_mcs_set, supported_mcs_set, sizeof(pmlmeext->default_supported_mcs_set));
+}
+
+static void init_mlme_ext_priv_value(_adapter* padapter)
+{
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
ATOMIC_SET(&pmlmeext->event_seq, 0);
pmlmeext->mgnt_seq = 0;//reset to zero when disconnect at client mode
@@ -373,10 +369,7 @@ static void init_mlme_ext_priv_value(_adapter* padapter)
pmlmeext->cur_wireless_mode = padapter->registrypriv.wireless_mode;
- //_rtw_memcpy(pmlmeext->channel_set, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Channel, DefaultChannelPlan[padapter->mlmepriv.ChannelPlan].Len);
- //_rtw_memcpy(pmlmeext->channel_set, default_channel_set, MAX_CHANNEL_NUM);
- _rtw_memcpy(pmlmeext->datarate, mixed_datarate, NumRates);
- _rtw_memcpy(pmlmeext->basicrate, mixed_basicrate, NumRates);
+ init_mlme_default_rate_set(padapter);
if(pmlmeext->cur_channel > 14)
pmlmeext->tx_rate = IEEE80211_OFDM_RATE_6MB;
@@ -2238,6 +2231,10 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame)
if (elems.vht_op_mode_notify && elems.vht_op_mode_notify_len == 1) {
_rtw_memcpy(&pstat->vhtpriv.vht_op_mode_notify, elems.vht_op_mode_notify, 1);
}
+ else // for Frame without Operating Mode notify ie; default: 80M
+ {
+ pstat->vhtpriv.vht_op_mode_notify = CHANNEL_WIDTH_80;
+ }
}
else {
pstat->flags &= ~WLAN_STA_VHT;
@@ -3185,7 +3182,7 @@ void issue_p2p_GO_request(_adapter *padapter, u8* raddr)
// Value:
// Todo the tie breaker bit.
- p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) | BIT(0) );
+ p2pie[ p2pielen++ ] = ( ( pwdinfo->intent << 1 ) & 0xFE );
// Configuration Timeout
// Type:
@@ -5820,8 +5817,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
result = process_p2p_group_negotation_req( pwdinfo, frame_body, len );
issue_p2p_GO_response( padapter, GetAddr2Ptr(pframe), frame_body, len, result );
#ifdef CONFIG_INTEL_WIDI
- if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
- {
+ if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
_cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0);
@@ -6070,8 +6066,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
_set_timer( &pwdinfo->restore_p2p_state_timer, 3000 );
}
#ifdef CONFIG_INTEL_WIDI
- if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
- {
+ if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
_cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0);
@@ -6156,8 +6151,7 @@ unsigned int on_action_public_p2p(union recv_frame *precv_frame)
rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_PROVISION_DIS_REQ);
_set_timer( &pwdinfo->restore_p2p_state_timer, P2P_PROVISION_TIMEOUT );
#ifdef CONFIG_INTEL_WIDI
- if( (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) && (padapter->mlmepriv.widi_state != INTEL_WIDI_STATE_WFD_CONNECTION) )
- {
+ if (padapter->mlmepriv.widi_state == INTEL_WIDI_STATE_LISTEN) {
padapter->mlmepriv.widi_state = INTEL_WIDI_STATE_WFD_CONNECTION;
_cancel_timer_ex(&(padapter->mlmepriv.listen_timer));
intel_widi_wk_cmd(padapter, INTEL_WIDI_LISTEN_STOP_WK, NULL, 0);
@@ -6389,10 +6383,7 @@ unsigned int OnAction_p2p(_adapter *padapter, union recv_frame *precv_frame)
u8 *pframe = precv_frame->u.hdr.rx_data;
uint len = precv_frame->u.hdr.len;
struct wifidirect_info *pwdinfo = &( padapter->wdinfo );
-
- DBG_871X("%s\n", __FUNCTION__);
-
//check RA matches or not
if (!_rtw_memcmp(myid(&(padapter->eeprompriv)), GetAddr1Ptr(pframe), ETH_ALEN))//for if1, sta/ap mode
return _SUCCESS;
@@ -6734,7 +6725,11 @@ void issue_beacon(_adapter *padapter, int timeout_ms)
//DBG_871X("%s\n", __FUNCTION__);
+#ifdef CONFIG_BCN_ICF
+ if ((pmgntframe = rtw_alloc_bcnxmitframe(pxmitpriv)) == NULL)
+#else
if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
+#endif
{
DBG_871X("%s, alloc mgnt frame fail\n", __FUNCTION__);
return;
@@ -7847,6 +7842,7 @@ void issue_assocreq(_adapter *padapter)
struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
int bssrate_len = 0, sta_bssrate_len = 0;
+ u8 vs_ie_length = 0;
#ifdef CONFIG_P2P
struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
u8 p2pie[ 255 ] = { 0x00 };
@@ -8033,17 +8029,18 @@ void issue_assocreq(_adapter *padapter)
if ((_rtw_memcmp(pIE->data, RTW_WPA_OUI, 4)) ||
(_rtw_memcmp(pIE->data, WMM_OUI, 4)) ||
(_rtw_memcmp(pIE->data, WPS_OUI, 4)))
- {
- if(!padapter->registrypriv.wifi_spec)
+ {
+ vs_ie_length = pIE->Length;
+ if((!padapter->registrypriv.wifi_spec) && (_rtw_memcmp(pIE->data, WPS_OUI, 4)))
{
//Commented by Kurt 20110629
//In some older APs, WPS handshake
//would be fail if we append vender extensions informations to AP
- if(_rtw_memcmp(pIE->data, WPS_OUI, 4)){
- pIE->Length=14;
- }
+
+ vs_ie_length = 14;
}
- pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, pIE->Length, pIE->data, &(pattrib->pktlen));
+
+ pframe = rtw_set_ie(pframe, _VENDOR_SPECIFIC_IE_, vs_ie_length, pIE->data, &(pattrib->pktlen));
}
break;
@@ -8987,7 +8984,11 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
#endif
*/
+ if(padapter->driver_rx_ampdu_factor != 0xFF)
+ max_rx_ampdu_factor = (HT_CAP_AMPDU_FACTOR)padapter->driver_rx_ampdu_factor;
+ else
rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor);
+
if(MAX_AMPDU_FACTOR_64K == max_rx_ampdu_factor)
BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
else if(MAX_AMPDU_FACTOR_32K == max_rx_ampdu_factor)
@@ -9000,7 +9001,8 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); //64 buffer size
#ifdef CONFIG_BT_COEXIST
- if (rtw_btcoex_IsBTCoexCtrlAMPDUSize(padapter) == _TRUE)
+ if (rtw_btcoex_IsBTCoexCtrlAMPDUSize(padapter) == _TRUE &&
+ padapter->driver_rx_ampdu_factor == 0xFF)
{
// max buffer size is 8 MSDU
BA_para_set &= ~RTW_IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK;
@@ -9014,6 +9016,10 @@ void issue_action_BA(_adapter *padapter, unsigned char *raddr, unsigned char act
BA_para_set = cpu_to_le16(BA_para_set | BIT(0));
else //auto
BA_para_set = cpu_to_le16(BA_para_set);
+
+ //set amsdu_ampdu to auto during wifi logo test
+ if (padapter->registrypriv.wifi_spec)
+ BA_para_set = cpu_to_le16(BA_para_set);
pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(BA_para_set)), &(pattrib->pktlen));
pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)(&(pmlmeinfo->ADDBA_req.BA_timeout_value)), &(pattrib->pktlen));
@@ -9348,6 +9354,7 @@ void site_survey(_adapter *padapter)
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
u32 initialgain = 0;
+ u32 channel_scan_time_ms = 0,val32 = 0;
#ifdef CONFIG_P2P
@@ -9522,28 +9529,43 @@ void site_survey(_adapter *padapter)
}
}
}
+
#if defined(CONFIG_ATMEL_RC_PATCH)
// treat wlan0 & p2p0 in same way, may be changed in near feature.
// assume home channel is 6, channel switch sequence will be
// 1,2-6-3,4-6-5,6-6-7,8-6-9,10-6-11,12-6-13,14
//if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)==_TRUE)
- if( stay_buddy_ch == 1 )
- set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
+ if( stay_buddy_ch == 1 ){
+ channel_scan_time_ms = pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND;
+ }
else {
if( check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
- set_survey_timer(pmlmeext, 20);
+ channel_scan_time_ms = 20;
else
- set_survey_timer(pmlmeext, 40);
+ channel_scan_time_ms = 40
}
#elif defined(CONFIG_STA_MODE_SCAN_UNDER_AP_MODE)
if( stay_buddy_ch == 1 )
- set_survey_timer(pmlmeext, pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND );
- else
- set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+ channel_scan_time_ms = pmlmeext->chan_scan_time * RTW_STAY_AP_CH_MILLISECOND ;
+ else
+ channel_scan_time_ms = pmlmeext->chan_scan_time;
#else
- set_survey_timer(pmlmeext, pmlmeext->chan_scan_time);
+ channel_scan_time_ms = pmlmeext->chan_scan_time;
+#endif
+
+ set_survey_timer(pmlmeext, channel_scan_time_ms);
+#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+ {
+ struct noise_info info;
+ info.bPauseDIG = _FALSE;
+ info.IGIValue = 0;
+ info.max_time = channel_scan_time_ms/2;//ms
+ info.chan = survey_channel;
+ rtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&info, _FALSE);
+ }
#endif
+
}
else
{
@@ -10689,6 +10711,52 @@ void report_join_res(_adapter *padapter, int res)
}
+void report_wmm_edca_update(_adapter *padapter)
+{
+ struct cmd_obj *pcmd_obj;
+ u8 *pevtcmd;
+ u32 cmdsz;
+ struct wmm_event *pwmm_event;
+ struct C2HEvent_Header *pc2h_evt_hdr;
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
+ struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
+
+ if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL)
+ {
+ return;
+ }
+
+ cmdsz = (sizeof(struct wmm_event) + sizeof(struct C2HEvent_Header));
+ if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL)
+ {
+ rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj));
+ return;
+ }
+
+ _rtw_init_listhead(&pcmd_obj->list);
+
+ pcmd_obj->cmdcode = GEN_CMD_CODE(_Set_MLME_EVT);
+ pcmd_obj->cmdsz = cmdsz;
+ pcmd_obj->parmbuf = pevtcmd;
+
+ pcmd_obj->rsp = NULL;
+ pcmd_obj->rspsz = 0;
+
+ pc2h_evt_hdr = (struct C2HEvent_Header*)(pevtcmd);
+ pc2h_evt_hdr->len = sizeof(struct wmm_event);
+ pc2h_evt_hdr->ID = GEN_EVT_CODE(_WMM);
+ pc2h_evt_hdr->seq = ATOMIC_INC_RETURN(&pmlmeext->event_seq);
+
+ pwmm_event = (struct wmm_event*)(pevtcmd + sizeof(struct C2HEvent_Header));
+ pwmm_event->wmm =0;
+
+ rtw_enqueue_cmd(pcmdpriv, pcmd_obj);
+
+ return;
+
+}
+
void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason)
{
struct cmd_obj *pcmd_obj;
@@ -10911,6 +10979,8 @@ void update_sta_info(_adapter *padapter, struct sta_info *psta)
psta->htpriv.ampdu_enable = pmlmepriv->htpriv.ampdu_enable;
+ psta->htpriv.rx_ampdu_min_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para&IEEE80211_HT_CAP_AMPDU_DENSITY)>>2;
+
if (support_short_GI(padapter, &(pmlmeinfo->HT_caps), CHANNEL_WIDTH_20))
psta->htpriv.sgi_20m = _TRUE;
@@ -10970,10 +11040,27 @@ static void rtw_mlmeext_disconnect(_adapter *padapter)
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
+ WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
u8 state_backup = (pmlmeinfo->state&0x03);
//set_opmode_cmd(padapter, infra_client_with_mlme);
+#if 1
+ /*
+ * For safety, prevent from keeping macid sleep.
+ * If we can sure all power mode enter/leave are paired,
+ * this check can be removed.
+ * Lucas@20131113
+ */
+ /* wakeup macid after disconnect. */
+ {
+ struct sta_info *psta;
+ psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
+ if (psta)
+ rtw_hal_macid_wakeup(padapter, psta->mac_id);
+ }
+#endif
+
rtw_hal_set_hwreg(padapter, HW_VAR_MLME_DISCONNECT, 0);
rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, null_addr);
@@ -11111,6 +11198,10 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res)
set_sta_rate(padapter, psta);
rtw_sta_media_status_rpt(padapter, psta, 1);
+
+ /* wakeup macid after join bss successfully to ensure
+ the subsequent data frames can be sent out normally */
+ rtw_hal_macid_wakeup(padapter, psta->mac_id);
}
if (rtw_port_switch_chk(padapter) == _TRUE)
@@ -12096,48 +12187,6 @@ u8 join_cmd_hdl(_adapter *padapter, u8 *pbuf)
//u32 acparm;
u8 ch, bw, offset;
-#if 1
- /*
- * For safety, prevent from keeping macid sleep.
- * If we can sure all power mode enter/leave are paired,
- * this check can be removed.
- * Lucas@20131113
- */
- {
- struct sta_info *psta;
- psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
- if (psta)
- rtw_hal_macid_wakeup(padapter, psta->mac_id);
- }
-#endif
-
-#ifdef CONFIG_BT_COEXIST
-{
- static u8 bw_mode = 0;
-
- if (0 == bw_mode)
- {
- bw_mode = pregpriv->bw_mode; // keep original bw_mode
- DBG_871X(FUNC_ADPT_FMT ": [BTCOEX] Save bw_mode(0x%02x)\n",
- FUNC_ADPT_ARG(padapter), pregpriv->bw_mode);
- }
-
- if ((rtw_btcoex_1Ant(padapter) == _TRUE)
- && (rtw_btcoex_IsBtLinkExist(padapter) == _TRUE))
- {
- pregpriv->bw_mode = 0x00;
- DBG_871X(FUNC_ADPT_FMT ": [BTCOEX] Change bw_mode to 20MHz(0x%02x)\n",
- FUNC_ADPT_ARG(padapter), pregpriv->bw_mode);
- }
- else
- {
- pregpriv->bw_mode = bw_mode;
- DBG_871X(FUNC_ADPT_FMT ": [BTCOEX] Restore bw_mode(0x%02x)\n",
- FUNC_ADPT_ARG(padapter), pregpriv->bw_mode);
- }
-}
-#endif // CONFIG_BT_COEXIST
-
//check already connecting to AP or not
if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)
{
@@ -12353,22 +12402,6 @@ u8 disconnect_hdl(_adapter *padapter, unsigned char *pbuf)
WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network));
u8 val8;
-
-#if 1
- /*
- * For safety, prevent from keeping macid sleep.
- * If we can sure all power mode enter/leave are paired,
- * this check can be removed.
- * Lucas@20131113
- */
- {
- struct sta_info *psta;
- psta = rtw_get_stainfo(&padapter->stapriv, get_my_bssid(pnetwork));
- if (psta)
- rtw_hal_macid_wakeup(padapter, psta->mac_id);
- }
-#endif
-
if (is_client_associated_to_ap(padapter))
{
#ifdef CONFIG_DFS
@@ -12668,23 +12701,38 @@ u8 setauth_hdl(_adapter *padapter, unsigned char *pbuf)
u8 setkey_hdl(_adapter *padapter, u8 *pbuf)
{
- unsigned short ctrl;
+ u16 ctrl = 0;
+ s16 cam_id = 0;
struct setkey_parm *pparm = (struct setkey_parm *)pbuf;
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
- unsigned char null_sta[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ unsigned char null_addr[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ u8 *addr;
//main tx key for wep.
if(pparm->set_tx)
pmlmeinfo->key_index = pparm->keyid;
-
- //write cam
- ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid;
- DBG_871X_LEVEL(_drv_always_, "set group key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) "
- "keyid:%d\n", pparm->algorithm, pparm->keyid);
- write_cam(padapter, pparm->keyid, ctrl, null_sta, pparm->key);
-
+ cam_id = rtw_camid_alloc(padapter, NULL, pparm->keyid);
+
+ if (cam_id < 0){
+ } else {
+ if (cam_id > 3) /* not default key, searched by A2 */
+ addr = get_bssid(&padapter->mlmepriv);
+ else
+ addr = null_addr;
+
+ ctrl = BIT(15) | BIT6 |((pparm->algorithm) << 2) | pparm->keyid;
+ write_cam(padapter, cam_id, ctrl, addr, pparm->key);
+ DBG_871X_LEVEL(_drv_always_, "set group key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n"
+ ,cam_id, MAC_ARG(addr), pparm->keyid, security_type_str(pparm->algorithm));
+ }
+
+ #ifdef DYNAMIC_CAMID_ALLOC
+ if (cam_id >=0 && cam_id <=3)
+ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_TRUE);
+ #endif
+
//allow multicast packets to driver
padapter->HalFunc.SetHwRegHandler(padapter, HW_VAR_ON_RCR_AM, null_addr);
@@ -12693,8 +12741,8 @@ u8 setkey_hdl(_adapter *padapter, u8 *pbuf)
u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf)
{
- u16 ctrl=0;
- u8 cam_id = 0;//cam_entry
+ u16 ctrl = 0;
+ s16 cam_id = 0;
u8 ret = H2C_SUCCESS;
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
@@ -12705,82 +12753,38 @@ u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf)
struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
#endif //CONFIG_TDLS
- //cam_entry:
- //0~3 for default key
-
- //for concurrent mode (ap+sta, sta+sta):
- //default key is disable, using sw encrypt/decrypt
- //camid 0, 1, 2, 3 is default entry for default key/group key
- //macid = 1 is for bc/mc stainfo, no mapping to camid
- //macid = 0 mapping to camid 4
- //for macid >=2, camid = macid+3;
+ if(pparm->algorithm == _NO_PRIVACY_)
+ goto write_to_cam;
-
- if(pparm->algorithm == _NO_PRIVACY_) // clear cam entry
- {
- clear_cam_entry(padapter, pparm->id);
- ret = H2C_SUCCESS;
- goto exit_set_stakey_hdl;
+ psta = rtw_get_stainfo(pstapriv, pparm->addr);
+ if (!psta) {
+ DBG_871X_LEVEL(_drv_always_, "%s sta:"MAC_FMT" not found\n", __func__, MAC_ARG(pparm->addr));
+ ret = H2C_REJECTED;
+ goto exit;
}
- if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)
- {
- psta = rtw_get_stainfo(pstapriv, pparm->addr);
- if(psta)
- {
- ctrl = (BIT(15) | ((pparm->algorithm) << 2));
-
- DBG_871X("r871x_set_stakey_hdl(): enc_algorithm=%d\n", pparm->algorithm);
-
- if((psta->mac_id == 1) || (psta->mac_id>(NUM_STA-4)))
- {
- DBG_871X("r871x_set_stakey_hdl():set_stakey failed, mac_id(aid)=%d\n", psta->mac_id);
- ret = H2C_REJECTED;
- goto exit_set_stakey_hdl;
- }
-
- cam_id = (u8)rtw_get_camid(psta->mac_id);//0~3 for default key, cmd_id=macid + 3;
-
- DBG_871X("Write CAM, mac_addr=%x:%x:%x:%x:%x:%x, cam_entry=%d\n", pparm->addr[0],
- pparm->addr[1], pparm->addr[2], pparm->addr[3], pparm->addr[4],
- pparm->addr[5], cam_id);
-
- write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);
-
- ret = H2C_SUCCESS_RSP;
- goto exit_set_stakey_hdl;
+ pmlmeinfo->enc_algo = pparm->algorithm;
+ cam_id = rtw_camid_alloc(padapter, psta, 0);
+ if (cam_id < 0)
+ goto exit;
+write_to_cam:
+ if(pparm->algorithm == _NO_PRIVACY_) {
+ while((cam_id = rtw_camid_search(padapter, pparm->addr, -1)) >= 0) {
+ DBG_871X_LEVEL(_drv_always_, "clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(pparm->addr), cam_id);
+ clear_cam_entry(padapter, cam_id);
+ rtw_camid_free(padapter,cam_id);
}
- else
- {
- DBG_871X("r871x_set_stakey_hdl(): sta has been free\n");
- ret = H2C_REJECTED;
- goto exit_set_stakey_hdl;
- }
-
- }
-
-
- //below for sta mode
- if((psta = rtw_get_stainfo(pstapriv, pparm->addr)))
- {
- cam_id = (u8)rtw_get_camid(psta->mac_id);
+ } else {
+ DBG_871X_LEVEL(_drv_always_, "set pairwise key camid:%d, addr:"MAC_FMT", kid:%d, type:%s\n",
+ cam_id, MAC_ARG(pparm->addr), pparm->keyid, security_type_str(pparm->algorithm));
+ ctrl = BIT(15) | ((pparm->algorithm) << 2) | pparm->keyid;
+ write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);
}
- else
- cam_id = 4;
-
- ctrl = BIT(15) | ((pparm->algorithm) << 2);
- pmlmeinfo->enc_algo = pparm->algorithm;
-
- DBG_871X_LEVEL(_drv_always_, "set pairwise key to hw: alg:%d(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:%d\n",
- pparm->algorithm, cam_id);
-
- write_cam(padapter, cam_id, ctrl, pparm->addr, pparm->key);
-
-exit_set_stakey_hdl:
+ ret = H2C_SUCCESS_RSP;
+exit:
return ret;
-
}
u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf)
@@ -13013,7 +13017,8 @@ u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf)
pxmitframe->attrib.triggered=1;
- pxmitframe->attrib.qsel = 0x11;//HIQ
+ if (xmitframe_hiq_filter(pxmitframe) == _TRUE)
+ pxmitframe->attrib.qsel = 0x11;//HIQ
#if 0
_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
@@ -13029,10 +13034,10 @@ u8 chk_bmc_sleepq_hdl(_adapter *padapter, unsigned char *pbuf)
//_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
_exit_critical_bh(&pxmitpriv->lock, &irqL);
- //#if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
- #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
- rtw_chk_hi_queue_cmd(padapter);
- #endif
+ if (padapter->interface_type != RTW_PCIE) {
+ /* check hi queue and bmc_sleepq */
+ rtw_chk_hi_queue_cmd(padapter);
+ }
}
#endif
diff --git a/rtl8723BS/core/rtw_mp.c b/rtl8723BS/core/rtw_mp.c
index 91372d0..dbc1f40 100755
--- a/rtl8723BS/core/rtw_mp.c
+++ b/rtl8723BS/core/rtw_mp.c
@@ -292,7 +292,7 @@ s32 init_mp_priv(PADAPTER padapter)
pmppriv->tx.stop = 1;
pmppriv->bSetTxPower=0; //for manually set tx power
pmppriv->bTxBufCkFail=_FALSE;
- pmppriv->pktInterval=300;
+ pmppriv->pktInterval=1;
mp_init_xmit_attrib(&pmppriv->tx, padapter);
@@ -550,7 +550,7 @@ MPT_InitializeAdapter(
PHY_LCCalibrate(pAdapter);
PHY_IQCalibrate(pAdapter, _FALSE);
- dm_CheckTXPowerTracking(&pHalData->odmpriv); //trigger thermal meter
+ //dm_CheckTXPowerTracking(&pHalData->odmpriv); //trigger thermal meter
PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); //default use Main
@@ -560,15 +560,14 @@ MPT_InitializeAdapter(
#ifdef CONFIG_RTL8188E
pMptCtx->backup0x52_RF_A = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);
pMptCtx->backup0x52_RF_B = (u1Byte)PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);
+ rtw_write32(pAdapter, REG_MACID_NO_LINK_0, 0x0);
+ rtw_write32(pAdapter, REG_MACID_NO_LINK_1, 0x0);
#endif
//set ant to wifi side in mp mode
rtw_write16(pAdapter, 0x870, 0x300);
rtw_write16(pAdapter, 0x860, 0x110);
- if (pAdapter->registrypriv.mp_mode == 1)
- pmlmepriv->fw_state = WIFI_MP_STATE;
-
return rtStatus;
}
@@ -679,9 +678,9 @@ static void disable_dm(PADAPTER padapter)
#endif
Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, _TRUE);
-#ifdef CONFIG_BT_COEXIST
- rtw_btcoex_Switch(padapter, 0);
-#endif
+//#ifdef CONFIG_BT_COEXIST
+// rtw_btcoex_Switch(padapter, 0); //remove for BT MP Down.
+//#endif
}
@@ -691,8 +690,7 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
struct dm_priv *pdmpriv = &pHalData->dmpriv;
PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
- //Switch_DM_Func(padapter, DYNAMIC_RF_CALIBRATION, bstart);
- if (bstart==1){
+ if (bstart==1){
DBG_871X("in MPT_PwrCtlDM start \n");
Switch_DM_Func(padapter, DYNAMIC_RF_TX_PWR_TRACK, _TRUE);
pdmpriv->InitODMFlag |= ODM_RF_TX_PWR_TRACK ;
@@ -700,6 +698,9 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
pdmpriv->TxPowerTrackControl = _TRUE;
pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
padapter->mppriv.mp_dm =1;
+ odm_TXPowerTrackingInit(pDM_Odm);
+ ODM_ClearTxPowerTrackingState(pDM_Odm);
+
}else{
DBG_871X("in MPT_PwrCtlDM stop \n");
disable_dm(padapter);
@@ -707,6 +708,15 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
pdmpriv->TxPowerTrackControl = _FALSE;
pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;
padapter->mppriv.mp_dm = 0;
+ {
+ TXPWRTRACK_CFG c;
+ u1Byte chnl =0 ;
+
+ ConfigureTxpowerTrack(pDM_Odm, &c);
+ ODM_ClearTxPowerTrackingState(pDM_Odm);
+ (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_A, chnl);
+ (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_B, chnl);
+ }
}
}
@@ -724,9 +734,7 @@ u32 mp_join(PADAPTER padapter,u8 mode)
struct mp_priv *pmppriv = &padapter->mppriv;
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct wlan_network *tgt_network = &pmlmepriv->cur_network;
- _adapter *pbuddyadapter = padapter->pbuddy_adapter;
- struct mlme_priv *pbuddymlmepriv = &pbuddyadapter->mlmepriv;
-
+
// 1. initialize a new WLAN_BSSID_EX
_rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX));
DBG_8192C("%s ,pmppriv->network_macaddr=%x %x %x %x %x %x \n",__func__,
@@ -757,21 +765,18 @@ u32 mp_join(PADAPTER padapter,u8 mode)
_enter_critical_bh(&pmlmepriv->lock, &irqL);
- //if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
- // goto end_of_mp_start_test;
-#if 0
+ if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
+ goto end_of_mp_start_test;
+
//init mp_start_test status
if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
- rtw_disassoc_cmd(padapter, 0, _TRUE);
+ rtw_disassoc_cmd(padapter, 500, _TRUE);
rtw_indicate_disconnect(padapter);
rtw_free_assoc_resources(padapter, 1);
}
- rtw_msleep_os(500);
-
pmppriv->prev_fw_state = get_fwstate(pmlmepriv);
- if (padapter->registrypriv.mp_mode == 1)
- pmlmepriv->fw_state = WIFI_MP_STATE;
-
+ pmlmepriv->fw_state = WIFI_MP_STATE;
+#if 0
if (pmppriv->mode == _LOOPBOOK_MODE_) {
set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); //append txdesc
RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in Lookback mode\n"));
@@ -779,17 +784,8 @@ u32 mp_join(PADAPTER padapter,u8 mode)
RT_TRACE(_module_mp_, _drv_notice_, ("+start mp in normal mode\n"));
}
#endif
- _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
- _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
- _clr_fwstate_(pmlmepriv, _FW_LINKED);
- _clr_fwstate_(pbuddymlmepriv, _FW_UNDER_SURVEY);
- _clr_fwstate_(pbuddymlmepriv, _FW_UNDER_LINKING);
- _clr_fwstate_(pbuddymlmepriv, _FW_LINKED);
-
set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
- set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
- #if 1
//3 2. create a new psta for mp driver
//clear psta in the cur_network, if any
psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);
@@ -802,7 +798,7 @@ u32 mp_join(PADAPTER padapter,u8 mode)
res = _FAIL;
goto end_of_mp_start_test;
}
- #endif
+
//3 3. join psudo AdHoc
tgt_network->join_res = 1;
tgt_network->aid = psta->aid = 1;
@@ -815,26 +811,26 @@ end_of_mp_start_test:
_exit_critical_bh(&pmlmepriv->lock, &irqL);
- if(1) //(res == _SUCCESS)
+ if(1) //(res == _SUCCESS)
{
// set MSR to WIFI_FW_ADHOC_STATE
- if( mode==WIFI_FW_ADHOC_STATE ){
+ if( mode==WIFI_FW_ADHOC_STATE ){
- val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102
- val8 |= WIFI_FW_ADHOC_STATE;
- rtw_write8(padapter, MSR, val8); // Link in ad hoc network
- }
- else {
- Set_MSR(padapter, WIFI_FW_STATION_STATE);
+ val8 = rtw_read8(padapter, MSR) & 0xFC; // 0x0102
+ val8 |= WIFI_FW_ADHOC_STATE;
+ rtw_write8(padapter, MSR, val8); // Link in ad hoc network
+ }
+ else {
+ Set_MSR(padapter, WIFI_FW_STATION_STATE);
- DBG_8192C("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n",__func__,
- pmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]);
+ DBG_8192C("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n",__func__,
+ pmppriv->network_macaddr[0],pmppriv->network_macaddr[1],pmppriv->network_macaddr[2],pmppriv->network_macaddr[3],pmppriv->network_macaddr[4],pmppriv->network_macaddr[5]);
- rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);
- }
+ rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);
}
- pmlmepriv->fw_state = WIFI_MP_STATE;
- return res;
+ }
+
+ return res;
}
//This function initializes the DUT to the MP test mode
s32 mp_start_test(PADAPTER padapter)
@@ -1280,7 +1276,7 @@ static thread_return mp_xmit_packet_thread(thread_context context)
_rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib));
- rtw_udelay_os(padapter->mppriv.pktInterval);
+ rtw_usleep_os(padapter->mppriv.pktInterval);
dump_mpframe(padapter, pxmitframe);
pmptx->sended++;
@@ -1361,7 +1357,7 @@ void fill_tx_desc_8188e(PADAPTER padapter)
u32 pkt_size = pattrib->last_txcmdsz;
s32 bmcast = IS_MCAST(pattrib->ra);
// offset 0
-#if !defined(CONFIG_RTL8188E_SDIO)
+#if !defined(CONFIG_RTL8188E_SDIO) && !defined(CONFIG_PCI_HCI)
desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); // packet size
desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); //32 bytes for TX Desc
@@ -1545,14 +1541,14 @@ void fill_tx_desc_8723b(PADAPTER padapter)
static void Rtw_MPSetMacTxEDCA(PADAPTER padapter)
{
- rtw_write32(padapter, 0x508 , 0x00a43f); //Disable EDCA BE Txop for MP pkt tx adjust Packet interval
+ rtw_write32(padapter, 0x508 , 0x00a422); //Disable EDCA BE Txop for MP pkt tx adjust Packet interval
//DBG_871X("%s:write 0x508~~~~~~ 0x%x\n", __func__,rtw_read32(padapter, 0x508));
PHY_SetMacReg(padapter, 0x458 ,bMaskDWord , 0x0);
//DBG_8192C("%s()!!!!! 0x460 = 0x%x\n" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord));
PHY_SetMacReg(padapter, 0x460 ,bMaskLWord , 0x0);//fast EDCA queue packet interval & time out vaule
- PHY_SetMacReg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);
- PHY_SetMacReg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);
- PHY_SetMacReg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);
+ //PHY_SetMacReg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);
+ //PHY_SetMacReg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);
+ //PHY_SetMacReg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);
DBG_8192C("%s()!!!!! 0x460 = 0x%x\n" ,__func__,PHY_QueryBBReg(padapter, 0x460, bMaskDWord));
}
@@ -1885,7 +1881,7 @@ u32 mp_query_psd(PADAPTER pAdapter, u8 *data)
}
-
+#if 0
void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)
{
int i,res;
@@ -1952,7 +1948,7 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)
pxmitbuf->padapter = padapter;
pxmitbuf->buf_tag = XMITBUF_MGNT;
- if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _FALSE)) == _FAIL) {
+ if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
res= _FAIL;
goto exit;
}
@@ -1977,7 +1973,7 @@ void _rtw_mp_xmit_priv (struct xmit_priv *pxmitpriv)
exit:
;
}
-
+#endif
ULONG getPowerDiffByRate8188E(
@@ -2446,8 +2442,5 @@ void Hal_ProSetCrystalCap (PADAPTER pAdapter , u32 CrystalCap)
PHY_SetBBReg(pAdapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));
}
}
-
-
-
#endif
diff --git a/rtl8723BS/core/rtw_odm.c b/rtl8723BS/core/rtw_odm.c
index 75beea8..936ce36 100755
--- a/rtl8723BS/core/rtw_odm.c
+++ b/rtl8723BS/core/rtw_odm.c
@@ -132,7 +132,7 @@ void rtw_odm_dbg_level_msg(void *sel, _adapter *adapter)
int i;
rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_LEVEL, &dbg_level);
- DBG_871X_SEL_NL(sel, "odm.DebugDebugLevel = %u\n", dbg_level);
+ DBG_871X_SEL_NL(sel, "odm.DebugLevel = %u\n", dbg_level);
for (i=0;i<RTW_ODM_DBG_LEVEL_NUM;i++) {
if (odm_dbg_level_str[i])
DBG_871X_SEL_NL(sel, "%u %s\n", i, odm_dbg_level_str[i]);
diff --git a/rtl8723BS/core/rtw_p2p.c b/rtl8723BS/core/rtw_p2p.c
index f1bed6f..92423bb 100755
--- a/rtl8723BS/core/rtw_p2p.c
+++ b/rtl8723BS/core/rtw_p2p.c
@@ -5277,10 +5277,6 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
adapter_wdev_data(padapter)->p2p_enabled = _FALSE;
#endif //CONFIG_IOCTL_CFG80211
- if (_FAIL == rtw_pwr_wakeup(padapter)) {
- ret = _FAIL;
- goto exit;
- }
//Disable P2P function
if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
@@ -5299,6 +5295,10 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
rtw_p2p_set_pre_state(pwdinfo, P2P_STATE_NONE);
rtw_p2p_set_role(pwdinfo, P2P_ROLE_DISABLE);
_rtw_memset(&pwdinfo->rx_prov_disc_info, 0x00, sizeof(struct rx_provdisc_req_info));
+
+ /* Remove profiles in wifidirect_info structure. */
+ _rtw_memset( &pwdinfo->profileinfo[ 0 ], 0x00, sizeof( struct profile_info ) * P2P_MAX_PERSISTENT_GROUP_NUM );
+ pwdinfo->profileindex = 0;
}
rtw_hal_set_odm_var(padapter,HAL_ODM_P2P_STATE,NULL,_FALSE);
@@ -5306,6 +5306,11 @@ int rtw_p2p_enable(_adapter *padapter, enum P2P_ROLE role)
rtw_hal_set_odm_var(padapter,HAL_ODM_WIFI_DISPLAY_STATE,NULL,_FALSE);
#endif
+ if (_FAIL == rtw_pwr_wakeup(padapter)) {
+ ret = _FAIL;
+ goto exit;
+ }
+
//Restore to initial setting.
update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode);
diff --git a/rtl8723BS/core/rtw_pwrctrl.c b/rtl8723BS/core/rtw_pwrctrl.c
index b2c24fa..2076e15 100755
--- a/rtl8723BS/core/rtw_pwrctrl.c
+++ b/rtl8723BS/core/rtw_pwrctrl.c
@@ -1116,7 +1116,7 @@ _func_enter_;
)
{ //connect
- if(pwrpriv->power_mgnt == PS_MODE_ACTIVE) {
+ if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) {
DBG_871X("%s: Driver Already Leave LPS\n",__FUNCTION__);
return;
}
@@ -1201,7 +1201,7 @@ _func_enter_;
else
#endif
{
-#if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS) || (defined(CONFIG_PLATFORM_SPRD) && defined(CONFIG_RTL8188E))
+#if defined(CONFIG_FWLPS_IN_IPS) || defined(CONFIG_SWLPS_IN_IPS) || defined(CONFIG_RTL8188E)
#ifdef CONFIG_IPS
if(_FALSE == ips_leave(pri_padapter))
{
@@ -1209,8 +1209,8 @@ _func_enter_;
}
#endif
#endif //CONFIG_SWLPS_IN_IPS || (CONFIG_PLATFORM_SPRD && CONFIG_RTL8188E)
- }
- }
+ }
+ }
}
_func_exit_;
@@ -2146,6 +2146,9 @@ _func_enter_;
rtw_init_timer(&pwrctrlpriv->pwr_state_check_timer, padapter, pwr_state_check_handler);
+ pwrctrlpriv->wowlan_mode = _FALSE;
+ pwrctrlpriv->wowlan_ap_mode = _FALSE;
+
#ifdef CONFIG_RESUME_IN_WORKQUEUE
_init_workitem(&pwrctrlpriv->resume_work, resume_workitem_callback, NULL);
pwrctrlpriv->rtw_workqueue = create_singlethread_workqueue("rtw_workqueue");
@@ -2157,9 +2160,11 @@ _func_enter_;
#endif //CONFIG_HAS_EARLYSUSPEND || CONFIG_ANDROID_POWER
#ifdef CONFIG_PNO_SUPPORT
+ pwrctrlpriv->pno_inited = _FALSE;
pwrctrlpriv->pnlo_info = NULL;
pwrctrlpriv->pscan_info = NULL;
pwrctrlpriv->pno_ssid_list = NULL;
+ pwrctrlpriv->pno_in_resume = _TRUE;
#endif
_func_exit_;
@@ -2221,12 +2226,16 @@ static void resume_workitem_callback(struct work_struct *work)
DBG_871X("%s\n",__FUNCTION__);
rtw_resume_process(adapter);
+
+ rtw_resume_unlock_suspend();
}
void rtw_resume_in_workqueue(struct pwrctrl_priv *pwrpriv)
{
// accquire system's suspend lock preventing from falliing asleep while resume in workqueue
- rtw_lock_suspend();
+ //rtw_lock_suspend();
+
+ rtw_resume_lock_suspend();
#if 1
queue_work(pwrpriv->rtw_workqueue, &pwrpriv->resume_work);
diff --git a/rtl8723BS/core/rtw_recv.c b/rtl8723BS/core/rtw_recv.c
index 186a50e..bee356f 100755
--- a/rtl8723BS/core/rtw_recv.c
+++ b/rtl8723BS/core/rtw_recv.c
@@ -606,8 +606,11 @@ union recv_frame * decryptor(_adapter *padapter,union recv_frame *precv_frame)
struct security_priv *psecuritypriv=&padapter->securitypriv;
union recv_frame *return_packet=precv_frame;
u32 res=_SUCCESS;
+
_func_enter_;
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt);
+
RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("prxstat->decrypted=%x prxattrib->encrypt = 0x%03x\n",prxattrib->bdecrypted,prxattrib->encrypt));
if(prxattrib->encrypt>0)
@@ -653,16 +656,20 @@ _func_enter_;
switch(prxattrib->encrypt){
case _WEP40_:
case _WEP104_:
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wep);
rtw_wep_decrypt(padapter, (u8 *)precv_frame);
break;
case _TKIP_:
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_tkip);
res = rtw_tkip_decrypt(padapter, (u8 *)precv_frame);
break;
case _AES_:
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_aes);
res = rtw_aes_decrypt(padapter, (u8 * )precv_frame);
break;
#ifdef CONFIG_WAPI_SUPPORT
case _SMS4_:
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_wapi);
rtw_sms4_decrypt(padapter, (u8 * )precv_frame);
break;
#endif
@@ -690,6 +697,8 @@ _func_enter_;
else
#endif
{
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_hw);
+
psecuritypriv->hw_decrypted=_TRUE;
#ifdef DBG_RX_DECRYPTOR
DBG_871X("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n",
@@ -700,10 +709,10 @@ _func_enter_;
psecuritypriv->hw_decrypted);
#endif
-
}
}
else {
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_unknown);
#ifdef DBG_RX_DECRYPTOR
DBG_871X("[%s] %d:prxstat->bdecrypted:%d, prxattrib->encrypt:%d, Setting psecuritypriv->hw_decrypted = %d\n",
__FUNCTION__,
@@ -1488,9 +1497,20 @@ _func_enter_;
*psta = rtw_get_stainfo(pstapriv, pattrib->bssid); // get sta_info
if (*psta == NULL)
{
- DBG_871X("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid));
- issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
+ //for AP multicast issue , modify by yiwei
+ static u32 send_issue_deauth_time=0;
+
+ //DBG_871X("After send deauth , %u ms has elapsed.\n", rtw_get_passing_time_ms(send_issue_deauth_time));
+
+ if(rtw_get_passing_time_ms(send_issue_deauth_time) > 10000 || send_issue_deauth_time == 0 )
+ {
+ send_issue_deauth_time = rtw_get_current_time();
+
+ DBG_871X("issue_deauth to the ap=" MAC_FMT " for the reason(7)\n", MAC_ARG(pattrib->bssid));
+
+ issue_deauth(adapter, pattrib->bssid, WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
+ }
}
}
@@ -2148,6 +2168,17 @@ validate_80211w_fail:
}
#endif //CONFIG_IEEE80211W
+static inline void dump_rx_packet(u8 *ptr)
+{
+ int i;
+
+ DBG_871X("############################# \n");
+ for(i=0; i<64;i=i+8)
+ DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
+ *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
+ DBG_871X("############################# \n");
+}
+
sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame);
sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
{
@@ -2180,7 +2211,6 @@ sint validate_recv_frame(_adapter *adapter, union recv_frame *precv_frame)
_func_enter_;
-
#ifdef CONFIG_FIND_BEST_CHANNEL
if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) {
int ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, rtw_get_oper_ch(adapter));
@@ -2214,6 +2244,7 @@ _func_enter_;
if(ver!=0){
RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! (ver!=0)\n"));
retval= _FAIL;
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_ver_err);
goto exit;
}
@@ -2238,46 +2269,23 @@ _func_enter_;
{
u8 bDumpRxPkt;
rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));
- if(bDumpRxPkt ==1){//dump all rx packets
- int i;
- DBG_871X("############################# \n");
-
- for(i=0; i<64;i=i+8)
- DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
- *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
- DBG_871X("############################# \n");
- }
- else if(bDumpRxPkt ==2){
- if(type== WIFI_MGT_TYPE){
- int i;
- DBG_871X("############################# \n");
-
- for(i=0; i<64;i=i+8)
- DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
- *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
- DBG_871X("############################# \n");
- }
- }
- else if(bDumpRxPkt ==3){
- if(type== WIFI_DATA_TYPE){
- int i;
- DBG_871X("############################# \n");
-
- for(i=0; i<64;i=i+8)
- DBG_871X("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X:\n", *(ptr+i),
- *(ptr+i+1), *(ptr+i+2) ,*(ptr+i+3) ,*(ptr+i+4),*(ptr+i+5), *(ptr+i+6), *(ptr+i+7));
- DBG_871X("############################# \n");
- }
- }
+ if (bDumpRxPkt == 1) //dump all rx packets
+ dump_rx_packet(ptr);
+ else if ((bDumpRxPkt == 2) && (type == WIFI_MGT_TYPE))
+ dump_rx_packet(ptr);
+ else if ((bDumpRxPkt == 3) && (type == WIFI_DATA_TYPE))
+ dump_rx_packet(ptr);
}
#endif
switch (type)
{
case WIFI_MGT_TYPE: //mgnt
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt);
#ifdef CONFIG_IEEE80211W
if(validate_80211w_mgmt(adapter, precv_frame) == _FAIL)
{
retval = _FAIL;
+ DBG_COUNTER(padapter->rx_logs.core_rx_pre_mgmt_err_80211w);
break;
}
#endif //CONFIG_IEEE80211W
@@ -2286,18 +2294,22 @@ _func_enter_;
if (retval == _FAIL)
{
RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_mgnt_frame fail\n"));
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_mgmt_err);
}
retval = _FAIL; // only data frame return _SUCCESS
break;
case WIFI_CTRL_TYPE: //ctrl
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl);
retval = validate_recv_ctrl_frame(adapter, precv_frame);
if (retval == _FAIL)
{
RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_ctrl_frame fail\n"));
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_ctrl_err);
}
retval = _FAIL; // only data frame return _SUCCESS
break;
case WIFI_DATA_TYPE: //data
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_data);
#ifdef CONFIG_WAPI_SUPPORT
if(pattrib->qos)
external_len = 2;
@@ -2316,6 +2328,7 @@ _func_enter_;
else
{
retval = _FAIL;
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_seq_err);
break;
}
}
@@ -2324,6 +2337,7 @@ _func_enter_;
if(rtw_wapi_drop_for_key_absent(adapter,GetAddr2Ptr(ptr))){
retval=_FAIL;
WAPI_TRACE(WAPI_RX,"drop for key absent for rx \n");
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_wapi_key_err);
break;
}
}
@@ -2337,9 +2351,30 @@ _func_enter_;
struct recv_priv *precvpriv = &adapter->recvpriv;
//RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail\n"));
precvpriv->rx_drop++;
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_err);
+ }
+ else if (retval == _SUCCESS)
+ {
+#ifdef DBG_RX_DUMP_EAP
+ u8 bDumpRxPkt;
+ u16 eth_type;
+
+ // dump eapol
+ rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt));
+ // get ether_type
+ _rtw_memcpy(&eth_type, ptr + pattrib->hdrlen + pattrib->iv_len + LLC_HEADER_SIZE, 2);
+ eth_type = ntohs((unsigned short) eth_type);
+ if ((bDumpRxPkt == 4) && (eth_type == 0x888e))
+ dump_rx_packet(ptr);
+#endif
+ }
+ else
+ {
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_data_handled);
}
break;
default:
+ DBG_COUNTER(adapter->rx_logs.core_rx_pre_unknown);
RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,("validate_recv_data_frame fail! type=0x%x\n", type));
#ifdef DBG_RX_DROP_FRAME
DBG_871X("DBG_RX_DROP_FRAME validate_recv_data_frame fail! type=0x%x\n", type);
@@ -3103,10 +3138,11 @@ int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, union rec
void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq);
void recv_indicatepkts_pkt_loss_cnt(struct debug_priv *pdbgpriv, u64 prev_seq, u64 current_seq)
-{
+{
if(current_seq < prev_seq)
{
- pdbgpriv->dbg_rx_ampdu_loss_count+= (4096 + current_seq - prev_seq);
+ pdbgpriv->dbg_rx_ampdu_loss_count+= (4096 + current_seq - prev_seq);
+
}
else
{
@@ -3128,6 +3164,8 @@ int recv_indicatepkts_in_order(_adapter *padapter, struct recv_reorder_ctrl *pre
struct dvobj_priv *psdpriv = padapter->dvobj;
struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_in_oder);
+
//DbgPrint("+recv_indicatepkts_in_order\n");
//_enter_critical_ex(&ppending_recvframe_queue->lock, &irql);
@@ -3299,6 +3337,8 @@ int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe)
struct dvobj_priv *psdpriv = padapter->dvobj;
struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_reoder);
+
if(!pattrib->amsdu)
{
//s1.
@@ -3504,6 +3544,8 @@ int process_recv_indicatepkts(_adapter *padapter, union recv_frame *prframe)
#ifdef CONFIG_80211N_HT
struct ht_priv *phtpriv = &pmlmepriv->htpriv;
+
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate);
#ifdef CONFIG_TDLS
if( (phtpriv->ht_option==_TRUE) ||
@@ -3607,10 +3649,14 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe)
struct rx_pkt_attrib *pattrib = &rframe->u.hdr.attrib;
struct recv_priv *precvpriv = &padapter->recvpriv;
_queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
-
#ifdef CONFIG_MP_INCLUDED
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ struct mp_priv *pmppriv = &padapter->mppriv;
+#endif //CONFIG_MP_INCLUDED
+ DBG_COUNTER(padapter->rx_logs.core_rx_pre);
+
+#ifdef CONFIG_MP_INCLUDED
if (padapter->registrypriv.mp_mode == 1)
{
if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE))//&&(padapter->mppriv.check_mp_pkt == 0))
@@ -3626,13 +3672,16 @@ int recv_func_prehandle(_adapter *padapter, union recv_frame *rframe)
}
- if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == _FALSE) {
- //RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("MP - Not in loopback mode , drop pkt \n"));
- ret = _FAIL;
- rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame
- goto exit;
+ if(pmppriv->rx_bindicatePkt == _FALSE)
+ {
+ if (check_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE) == _FALSE) {
+ //RT_TRACE(_module_rtl871x_recv_c_, _drv_alert_, ("MP - Not in loopback mode , drop pkt \n"));
+ ret = _FAIL;
+ rtw_free_recvframe(rframe, pfree_recv_queue);//free this recv_frame
+ goto exit;
+ }
}
- }
+ }
}
#endif
@@ -3656,12 +3705,11 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
struct recv_priv *precvpriv = &padapter->recvpriv;
_queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
-
-
#ifdef CONFIG_TDLS
u8 *psnap_type, *pcategory;
#endif //CONFIG_TDLS
+ DBG_COUNTER(padapter->rx_logs.core_rx_post);
// DATA FRAME
rtw_led_control(padapter, LED_CTL_RX);
@@ -3673,6 +3721,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
DBG_871X("DBG_RX_DROP_FRAME %s decryptor: drop pkt\n", __FUNCTION__);
#endif
ret = _FAIL;
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_decrypt_err);
goto _recv_data_drop;
}
@@ -3712,6 +3761,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
#ifdef DBG_RX_DROP_FRAME
DBG_871X("DBG_RX_DROP_FRAME %s recvframe_chk_defrag: drop pkt\n", __FUNCTION__);
#endif
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_defrag_err);
goto _recv_data_drop;
}
@@ -3722,6 +3772,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
DBG_871X("DBG_RX_DROP_FRAME %s portctrl: drop pkt\n", __FUNCTION__);
#endif
ret = _FAIL;
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_portctrl_err);
goto _recv_data_drop;
}
@@ -3740,6 +3791,7 @@ int recv_func_posthandle(_adapter *padapter, union recv_frame *prframe)
DBG_871X("DBG_RX_DROP_FRAME %s process_recv_indicatepkts fail!\n", __FUNCTION__);
#endif
rtw_free_recvframe(orig_prframe, pfree_recv_queue);//free this recv_frame
+ DBG_COUNTER(padapter->rx_logs.core_rx_post_indicate_err);
goto _recv_data_drop;
}
#else // CONFIG_80211N_HT
@@ -3830,6 +3882,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
while((pending_frame=rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue))) {
cnt++;
+ DBG_COUNTER(padapter->rx_logs.core_rx_dequeue);
recv_func_posthandle(padapter, pending_frame);
}
@@ -3838,6 +3891,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
FUNC_ADPT_ARG(padapter), cnt);
}
+ DBG_COUNTER(padapter->rx_logs.core_rx);
ret = recv_func_prehandle(padapter, rframe);
if(ret == _SUCCESS) {
@@ -3849,6 +3903,7 @@ int recv_func(_adapter *padapter, union recv_frame *rframe)
psecuritypriv->ndisauthtype == Ndis802_11AuthModeWPAPSK &&
!psecuritypriv->busetkipkey)
{
+ DBG_COUNTER(padapter->rx_logs.core_rx_enqueue);
rtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue);
//DBG_871X("%s: no key, enqueue uc_swdec_pending_queue\n", __func__);
diff --git a/rtl8723BS/core/rtw_security.c b/rtl8723BS/core/rtw_security.c
index 579fd09..9841568 100755
--- a/rtl8723BS/core/rtw_security.c
+++ b/rtl8723BS/core/rtw_security.c
@@ -44,6 +44,63 @@ const char *security_type_str(u8 value)
return NULL;
}
+#ifdef DBG_SW_SEC_CNT
+#define WEP_SW_ENC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->wep_sw_enc_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->wep_sw_enc_cnt_mc++; \
+ else \
+ sec->wep_sw_enc_cnt_uc++;
+
+#define WEP_SW_DEC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->wep_sw_dec_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->wep_sw_dec_cnt_mc++; \
+ else \
+ sec->wep_sw_dec_cnt_uc++;
+
+#define TKIP_SW_ENC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->tkip_sw_enc_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->tkip_sw_enc_cnt_mc++; \
+ else \
+ sec->tkip_sw_enc_cnt_uc++;
+
+#define TKIP_SW_DEC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->tkip_sw_dec_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->tkip_sw_dec_cnt_mc++; \
+ else \
+ sec->tkip_sw_dec_cnt_uc++;
+
+#define AES_SW_ENC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->aes_sw_enc_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->aes_sw_enc_cnt_mc++; \
+ else \
+ sec->aes_sw_enc_cnt_uc++;
+
+#define AES_SW_DEC_CNT_INC(sec, ra) \
+ if (is_broadcast_mac_addr(ra)) \
+ sec->aes_sw_dec_cnt_bc++; \
+ else if (is_multicast_mac_addr(ra)) \
+ sec->aes_sw_dec_cnt_mc++; \
+ else \
+ sec->aes_sw_dec_cnt_uc++;
+#else
+#define WEP_SW_ENC_CNT_INC(sec, ra)
+#define WEP_SW_DEC_CNT_INC(sec, ra)
+#define TKIP_SW_ENC_CNT_INC(sec, ra)
+#define TKIP_SW_DEC_CNT_INC(sec, ra)
+#define AES_SW_ENC_CNT_INC(sec, ra)
+#define AES_SW_DEC_CNT_INC(sec, ra)
+#endif /* DBG_SW_SEC_CNT */
+
//=====WEP related=====
#define CRC32_POLY 0x04c11db7
@@ -251,7 +308,8 @@ _func_enter_;
}
}
-
+
+ WEP_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
}
_func_exit_;
@@ -299,8 +357,9 @@ _func_enter_;
{
RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_wep_decrypt:icv error crc[3](%x)!=payload[length-1](%x) || crc[2](%x)!=payload[length-2](%x) || crc[1](%x)!=payload[length-3](%x) || crc[0](%x)!=payload[length-4](%x)\n",
crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));
- }
-
+ }
+
+ WEP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
}
_func_exit_;
@@ -775,7 +834,7 @@ _func_enter_;
}
}
-
+ TKIP_SW_ENC_CNT_INC(psecuritypriv,pattrib->ra);
}
/*
else{
@@ -867,7 +926,6 @@ _func_enter_;
}
else
{
- RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo!=NULL!!!\n"));
prwskey=&stainfo->dot118021x_UncstKey.skey[0];
prwskeylen=16;
}
@@ -897,8 +955,8 @@ _func_enter_;
crc[3],payload[length-1],crc[2],payload[length-2],crc[1],payload[length-3],crc[0],payload[length-4]));
res=_FAIL;
}
-
-
+
+ TKIP_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
}
else{
RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_tkip_decrypt: stainfo==NULL!!!\n"));
@@ -1706,7 +1764,7 @@ _func_enter_;
}
}
-
+ AES_SW_ENC_CNT_INC(psecuritypriv, pattrib->ra);
}
/*
else{
@@ -1714,7 +1772,7 @@ _func_enter_;
DBG_871X("%s, psta==NUL\n", __func__);
res=_FAIL;
}
-*/
+*/
}
@@ -2031,7 +2089,6 @@ _func_enter_;
static u32 no_gkey_bc_cnt = 0;
static u32 no_gkey_mc_cnt = 0;
- //in concurrent we should use sw descrypt in group key, so we remove this message
//DBG_871X("rx bc/mc packets, to perform sw rtw_aes_decrypt\n");
//prwskey = psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey;
if(psecuritypriv->binstallGrpkey==_FALSE)
@@ -2107,10 +2164,10 @@ _func_enter_;
res= aes_decipher(prwskey,prxattrib->hdrlen,pframe, length);
-
+ AES_SW_DEC_CNT_INC(psecuritypriv, prxattrib->ra);
}
else{
- RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_encrypt: stainfo==NULL!!!\n"));
+ RT_TRACE(_module_rtl871x_security_c_,_drv_err_,("rtw_aes_decrypt: stainfo==NULL!!!\n"));
res=_FAIL;
}
@@ -3141,9 +3198,9 @@ void rtw_sec_restore_wep_key(_adapter *adapter)
for(keyid=0;keyid<4;keyid++){
if(securitypriv->key_mask & BIT(keyid)){
if(keyid == securitypriv->dot11PrivacyKeyIndex)
- rtw_set_key(adapter,securitypriv, keyid, 1, _TRUE);
+ rtw_set_key(adapter,securitypriv, keyid, 1, _FALSE);
else
- rtw_set_key(adapter,securitypriv, keyid, 0, _TRUE);
+ rtw_set_key(adapter,securitypriv, keyid, 0, _FALSE);
}
}
}
diff --git a/rtl8723BS/core/rtw_sreset.c b/rtl8723BS/core/rtw_sreset.c
index 108833b..82db59c 100755
--- a/rtl8723BS/core/rtw_sreset.c
+++ b/rtl8723BS/core/rtw_sreset.c
@@ -162,7 +162,7 @@ void sreset_restore_security_station(_adapter *padapter)
else
{
//pairwise key
- rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE,_FALSE);
+ rtw_setstakey_cmd(padapter, psta, _TRUE,_FALSE);
//group key
rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0,_FALSE);
}
@@ -331,10 +331,10 @@ void sreset_reset(_adapter *padapter)
psrtpriv->Wifi_Error_Status = WIFI_STATUS_SUCCESS;
-
-#ifdef CONFIG_POWER_SAVING
+
+#ifdef CONFIG_LPS
rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "SRESET");
-#endif
+#endif//#ifdef CONFIG_LPS
_enter_pwrlock(&pwrpriv->lock);
diff --git a/rtl8723BS/core/rtw_tdls.c b/rtl8723BS/core/rtw_tdls.c
index a4a9c0a..21f9fcc 100755
--- a/rtl8723BS/core/rtw_tdls.c
+++ b/rtl8723BS/core/rtw_tdls.c
@@ -22,8 +22,6 @@
#include <drv_types.h>
#ifdef CONFIG_TDLS
-extern unsigned char MCS_rate_2R[16];
-extern unsigned char MCS_rate_1R[16];
extern void process_wmmps_data(_adapter *padapter, union recv_frame *precv_frame);
void rtw_reset_tdls_info(_adapter* padapter)
@@ -210,7 +208,7 @@ void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta)
}
//clear cam
- rtw_clearstakey_cmd(padapter, (u8 *)ptdls_sta, (u8)rtw_get_camid(ptdls_sta->mac_id), _TRUE);
+ rtw_clearstakey_cmd(padapter, ptdls_sta, _TRUE);
if(ptdlsinfo->sta_cnt==0){
rtw_tdls_cmd(padapter, myid(&(padapter->eeprompriv)), TDLS_RS_RCR);
@@ -230,7 +228,7 @@ void rtw_tdls_set_key(_adapter *padapter, struct rx_pkt_attrib *prx_pkt_attrib,
if(prx_pkt_attrib->encrypt)
{
ptdls_sta->dot118021XPrivacy=_AES_;
- rtw_setstakey_cmd(padapter, (u8*)ptdls_sta, _TRUE, _TRUE);
+ rtw_setstakey_cmd(padapter, ptdls_sta, _TRUE, _TRUE);
}
}
diff --git a/rtl8723BS/core/rtw_vht.c b/rtl8723BS/core/rtw_vht.c
index 1d75271..ce971d5 100755
--- a/rtl8723BS/core/rtw_vht.c
+++ b/rtl8723BS/core/rtw_vht.c
@@ -281,8 +281,9 @@ void update_sta_vht_info_apmode(_adapter *padapter, PVOID sta)
}
bw_mode = GET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&pvhtpriv_sta->vht_op_mode_notify);
- if (bw_mode > psta->bw_mode)
- psta->bw_mode = bw_mode;
+
+ //if (bw_mode > psta->bw_mode)
+ psta->bw_mode = bw_mode;
// B4 Rx LDPC
if (TEST_FLAG(pvhtpriv_ap->ldpc_cap, LDPC_VHT_ENABLE_TX) &&
diff --git a/rtl8723BS/core/rtw_wlan_util.c b/rtl8723BS/core/rtw_wlan_util.c
index 83f6ef3..e3f1fed 100755
--- a/rtl8723BS/core/rtw_wlan_util.c
+++ b/rtl8723BS/core/rtw_wlan_util.c
@@ -40,11 +40,6 @@ unsigned char AIRGOCAP_OUI[] = {0x00, 0x0a, 0xf5};
unsigned char REALTEK_96B_IE[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20};
-extern unsigned char MCS_rate_2R[16];
-#ifdef CONFIG_DISABLE_MCS13TO15
-extern unsigned char MCS_rate_2R_MCS13TO15_OFF[16];
-#endif //CONFIG_DISABLE_MCS13TO15
-extern unsigned char MCS_rate_1R[16];
extern unsigned char RTW_WPA_OUI[];
extern unsigned char WPA_TKIP_CIPHER[4];
extern unsigned char RSN_TKIP_CIPHER[4];
@@ -55,6 +50,9 @@ extern unsigned char RSN_TKIP_CIPHER[4];
#define WAIT_FOR_BCN_TO_MIN (6000)
#define WAIT_FOR_BCN_TO_MAX (20000)
+#define DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS 1000
+#define DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD 3
+
static u8 rtw_basic_rate_cck[4] = {
IEEE80211_CCK_RATE_1MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_2MB|IEEE80211_BASIC_RATE_MASK,
IEEE80211_CCK_RATE_5MB|IEEE80211_BASIC_RATE_MASK, IEEE80211_CCK_RATE_11MB|IEEE80211_BASIC_RATE_MASK
@@ -393,6 +391,19 @@ void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len)
_rtw_memcpy(pbssrate, supportedrates, *bssrate_len);
}
+void set_mcs_rate_by_mask(u8 *mcs_set, u32 mask)
+{
+ u8 mcs_rate_1r = (u8)(mask&0xff);
+ u8 mcs_rate_2r = (u8)((mask>>8)&0xff);
+ u8 mcs_rate_3r = (u8)((mask>>16)&0xff);
+ u8 mcs_rate_4r = (u8)((mask>>24)&0xff);
+
+ mcs_set[0] &= mcs_rate_1r;
+ mcs_set[1] &= mcs_rate_2r;
+ mcs_set[2] &= mcs_rate_3r;
+ mcs_set[3] &= mcs_rate_4r;
+}
+
void UpdateBrateTbl(
IN PADAPTER Adapter,
IN u8 *mBratesOS
@@ -848,7 +859,16 @@ void CAM_empty_entry(
void invalidate_cam_all(_adapter *padapter)
{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+
rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+ cam_ctl->bitmap = 0;
+ _rtw_memset(dvobj->cam_cache, 0, sizeof(struct cam_entry_cache)*TOTAL_CAM_ENTRY);
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
}
#if 1
static u32 _ReadCAM(_adapter *padapter ,u32 addr)
@@ -938,24 +958,254 @@ inline void clear_cam_entry(_adapter *adapter, u8 id)
inline void write_cam_from_cache(_adapter *adapter, u8 id)
{
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+ struct cam_entry_cache cache;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+ _rtw_memcpy(&cache, &dvobj->cam_cache[id], sizeof(struct cam_entry_cache));
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
- _write_cam(adapter, id, dvobj->cam_cache[id].ctrl, dvobj->cam_cache[id].mac, dvobj->cam_cache[id].key);
+ _write_cam(adapter, id, cache.ctrl, cache.mac, cache.key);
}
void write_cam_cache(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key)
{
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
dvobj->cam_cache[id].ctrl = ctrl;
_rtw_memcpy(dvobj->cam_cache[id].mac, mac, ETH_ALEN);
_rtw_memcpy(dvobj->cam_cache[id].key, key, 16);
+
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
}
void clear_cam_cache(_adapter *adapter, u8 id)
{
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
_rtw_memset(&(dvobj->cam_cache[id]), 0, sizeof(struct cam_entry_cache));
+
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
+}
+
+s16 rtw_get_camid(_adapter *adapter, struct sta_info *sta, s16 kid)
+{
+ u8 macid;
+ s16 camid;
+
+ //cam_entry:
+ //0~3 for default key
+
+ //for concurrent mode (ap+sta, sta+sta):
+ //default key is disable, using sw encrypt/decrypt
+ //camid 0, 1, 2, 3 is default entry for default key/group key
+ //macid = 1 is for bc/mc stainfo, no mapping to camid
+ //macid = 0 mapping to camid 4
+ //for macid >=2, camid = macid+3;
+
+ if (sta) {
+ struct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info;
+ macid = sta->mac_id;
+
+ if((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) {
+ if((macid == 1) || (macid>(NUM_STA-4))){
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" failed, mac_id=%d\n", FUNC_ADPT_ARG(adapter), macid);
+ camid = -1;
+ goto exit;
+ }
+ }
+
+ if(macid==0)
+ camid = 4;
+ else if(macid >=2)
+ camid = macid + 3;
+ else
+ camid = 4;
+ }
+ else {
+ /* default key is disabled */
+ camid = -1;
+ }
+
+exit:
+ return (s16)camid;
+}
+
+bool _rtw_camid_is_gk(_adapter *adapter, u8 cam_id)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ bool ret = _FALSE;
+
+ if (cam_id >= TOTAL_CAM_ENTRY)
+ goto exit;
+
+ if (!(cam_ctl->bitmap & BIT(cam_id)))
+ goto exit;
+
+ ret = (dvobj->cam_cache[cam_id].ctrl&BIT6)?_TRUE:_FALSE;
+
+exit:
+ return ret;
+}
+
+bool rtw_camid_is_gk(_adapter *adapter, u8 cam_id)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+ bool ret;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+ ret = _rtw_camid_is_gk(adapter, cam_id);
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
+
+ return ret;
+}
+
+s16 _rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ int i;
+ s16 cam_id = -1;
+
+ for (i=0;i<TOTAL_CAM_ENTRY;i++) {
+ if (addr && _rtw_memcmp(dvobj->cam_cache[i].mac, addr, ETH_ALEN) == _FALSE)
+ continue;
+ if (kid >= 0 && kid != (dvobj->cam_cache[i].ctrl&0x03))
+ continue;
+
+ cam_id = i;
+ break;
+ }
+
+ if (0) {
+ if (addr)
+ DBG_871X(FUNC_ADPT_FMT" addr:"MAC_FMT" kid:%d, return cam_id:%d\n"
+ , FUNC_ADPT_ARG(adapter), MAC_ARG(addr), kid, cam_id);
+ else
+ DBG_871X(FUNC_ADPT_FMT" addr:%p kid:%d, return cam_id:%d\n"
+ , FUNC_ADPT_ARG(adapter), addr, kid, cam_id);
+ }
+
+ return cam_id;
+}
+
+s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+ s16 cam_id = -1;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+ cam_id = _rtw_camid_search(adapter, addr, kid);
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
+
+ return cam_id;
+}
+
+s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+ s16 cam_id = -1;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+#ifdef DYNAMIC_CAMID_ALLOC
+ {
+ struct mlme_ext_info *mlmeinfo = &adapter->mlmeextpriv.mlmext_info;
+
+ if((((mlmeinfo->state&0x03) == WIFI_FW_AP_STATE) || ((mlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE))
+ && !sta) {
+ /* AP/Ad-hoc mode group key: static alloction to default key by key ID */
+ if (kid > 3) {
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key with invalid key id:%u\n"
+ , FUNC_ADPT_ARG(adapter), kid);
+ rtw_warn_on(1);
+ goto bitmap_handle;
+ }
+
+ cam_id = kid;
+ }
+ else {
+ int i;
+ u8 *addr = sta?sta->hwaddr:NULL;
+
+ if(!sta) {
+ if (!(mlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) {
+ /* bypass STA mode group key setting before connected(ex:WEP) because bssid is not ready */
+ goto bitmap_handle;
+ }
+
+ addr = get_bssid(&adapter->mlmepriv);
+ }
+
+ if ((i = _rtw_camid_search(adapter, addr, kid)) >= 0) {
+ /* Fix issue that pairwise and group key have same key id. Pairwise key first, group key can overwirte group only(ex: rekey) */
+ if (sta || _rtw_camid_is_gk(adapter, i) == _TRUE)
+ cam_id = i;
+ else
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key id:%u the same key id as pairwise key\n"
+ , FUNC_ADPT_ARG(adapter), kid);
+ goto bitmap_handle;
+ }
+
+ for (i=4;i<TOTAL_CAM_ENTRY;i++)
+ if (!(cam_ctl->bitmap & BIT(i)))
+ break;
+
+ if (i == TOTAL_CAM_ENTRY) {
+ if (sta)
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" pairwise key with "MAC_FMT" id:%u no room\n"
+ , FUNC_ADPT_ARG(adapter), MAC_ARG(sta->hwaddr), kid);
+ else
+ DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" group key id:%u no room\n"
+ , FUNC_ADPT_ARG(adapter), kid);
+ rtw_warn_on(1);
+ goto bitmap_handle;
+ }
+
+ cam_id = i;
+ }
+ }
+#else
+ cam_id = rtw_get_camid(adapter, sta, kid);
+#endif /* DYNAMIC_CAMID_ALLOC */
+
+bitmap_handle:
+ if (cam_id >= 0)
+ cam_ctl->bitmap |= BIT(cam_id);
+
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
+
+ return cam_id;
+}
+
+void rtw_camid_free(_adapter *adapter, u8 cam_id)
+{
+ struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
+ struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
+ _irqL irqL;
+
+ _enter_critical_bh(&cam_ctl->lock, &irqL);
+
+ if (cam_id < TOTAL_CAM_ENTRY)
+ cam_ctl->bitmap &= ~(BIT(cam_id));
+
+ _exit_critical_bh(&cam_ctl->lock, &irqL);
}
int allocate_fw_sta_entry(_adapter *padapter)
@@ -979,46 +1229,58 @@ int allocate_fw_sta_entry(_adapter *padapter)
void flush_all_cam_entry(_adapter *padapter)
{
- struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
- struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
-
-#ifdef CONFIG_CONCURRENT_MODE
-
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
- //if(check_buddy_mlmeinfo_state(padapter, _HW_STATE_NOLINK_))
- if(check_buddy_fwstate(padapter, _FW_LINKED) == _FALSE)
- {
- rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
- }
- else
+#ifdef CONFIG_CONCURRENT_MODE
+ if(check_buddy_fwstate(padapter, _FW_LINKED) == _TRUE)
{
if(check_fwstate(pmlmepriv, WIFI_STATION_STATE))
{
struct sta_priv *pstapriv = &padapter->stapriv;
struct sta_info *psta;
- u8 cam_id;//cam_entry
psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress);
if(psta) {
if(psta->state & WIFI_AP_STATE)
{} //clear cam when ap free per sta_info
else {
- cam_id = (u8)rtw_get_camid(psta->mac_id);
- rtw_clearstakey_cmd(padapter, (u8*)psta, cam_id, _FALSE);
- }
+ rtw_clearstakey_cmd(padapter, psta, _FALSE);
+ }
}
}
else if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
{
- //clear cam when ap free per sta_info
- }
- }
-#else //CONFIG_CONCURRENT_MODE
+ /* clear default key */
+ int i, cam_id;
+ u8 null_addr[ETH_ALEN]= {0,0,0,0,0,0};
+
+ for (i=0;i<4;i++) {
+ cam_id = rtw_camid_search(padapter, null_addr, i);
+ if (cam_id >= 0) {
+ clear_cam_entry(padapter, cam_id);
+ rtw_camid_free(padapter, cam_id);
+ }
+ }
- rtw_hal_set_hwreg(padapter, HW_VAR_CAM_INVALID_ALL, 0);
+ /* clear default key related key search setting */
+ #ifdef DYNAMIC_CAMID_ALLOC
+ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
+ #endif
+ /* leave pairwise key when ap free per sta_info */
+ }
+ }
+ else
#endif //CONFIG_CONCURRENT_MODE
+ {
+ invalidate_cam_all(padapter);
+ /* clear default key related key search setting */
+ #ifdef DYNAMIC_CAMID_ALLOC
+ rtw_hal_set_hwreg(padapter, HW_VAR_SEC_DK_CFG, (u8*)_FALSE);
+ #endif
+ }
_rtw_memset((u8 *)(pmlmeinfo->FW_sta_info), 0, sizeof(pmlmeinfo->FW_sta_info));
@@ -1070,11 +1332,18 @@ int WMM_param_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
if(pmlmepriv->qospriv.qos_option==0)
{
pmlmeinfo->WMM_enable = 0;
- return _FAIL;
+ return _FALSE;
}
-
+
+ if(_rtw_memcmp(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element)))
+ {
+ return _FALSE;
+ }
+ else
+ {
+ _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
+ }
pmlmeinfo->WMM_enable = 1;
- _rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
return _TRUE;
/*if (pregpriv->wifi_spec == 1)
@@ -1418,29 +1687,28 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
- //update the MCS rates
+
+ //update the MCS set
for (i = 0; i < 16; i++)
+ pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= pmlmeext->default_supported_mcs_set[i];
+
+ //update the MCS rates
+ switch(rf_type)
{
- if((rf_type == RF_1T1R) || (rf_type == RF_1T2R))
- {
- pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
- }
- else
- {
- #ifdef CONFIG_DISABLE_MCS13TO15
- if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && (pregistrypriv->wifi_spec!=1))
- pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R_MCS13TO15_OFF[i];
+ case RF_1T1R:
+ case RF_1T2R:
+ set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_1R);
+ break;
+ case RF_2T2R:
+ default:
+#ifdef CONFIG_DISABLE_MCS13TO15
+ if(pmlmeext->cur_bwmode == CHANNEL_WIDTH_40 && pregistrypriv->wifi_spec != 1 )
+ set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R_13TO15_OFF);
else
- pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
- #else
- pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate[i] &= MCS_rate_2R[i];
- #endif //CONFIG_DISABLE_MCS13TO15
- }
- #ifdef RTL8192C_RECONFIG_TO_1T1R
- {
- pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
- }
- #endif
+ set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#else //CONFIG_DISABLE_MCS13TO15
+ set_mcs_rate_by_mask(pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate, MCS_RATE_2R);
+#endif //CONFIG_DISABLE_MCS13TO15
}
if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
@@ -1508,7 +1776,6 @@ void HT_caps_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
}
#endif //CONFIG_80211N_HT
- return;
}
void HT_info_handler(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
@@ -1748,6 +2015,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
u32 bcn_channel;
unsigned short ht_cap_info;
unsigned char ht_info_infos_0;
+ struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
if (is_client_associated_to_ap(Adapter) == _FALSE)
return _TRUE;
@@ -1771,6 +2039,12 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
return _TRUE;
}
+ if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) > DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS))
+ {
+ pmlmepriv->timeBcnInfoChkStart = 0;
+ pmlmepriv->NumOfBcnInfoChkFail = 0;
+ }
+
subtype = GetFrameSubType(pframe) >> 4;
if(subtype==WIFI_BEACON)
@@ -1805,7 +2079,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
ht_cap_info, ht_info_infos_0);
DBG_871X("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__,
cur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0);
- DBG_871X("%s bw mode change, disconnect\n", __func__);
+ DBG_871X("%s bw mode change\n", __func__);
{
//bcn_info_update
cur_network->BcnInfo.ht_cap_info = ht_cap_info;
@@ -1858,7 +2132,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
if (_rtw_memcmp(bssid->Ssid.Ssid, cur_network->network.Ssid.Ssid, 32) == _FALSE ||
bssid->Ssid.SsidLength != cur_network->network.Ssid.SsidLength) {
if (bssid->Ssid.Ssid[0] != '\0' && bssid->Ssid.SsidLength != 0) { /* not hidden ssid */
- DBG_871X("%s(), SSID is not match return FAIL\n", __func__);
+ DBG_871X("%s(), SSID is not match\n", __func__);
goto _mismatch;
}
}
@@ -1875,7 +2149,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
("%s(): cur_network->network.Privacy is %d, bssid.Privacy is %d\n",
__func__, cur_network->network.Privacy,bssid->Privacy));
if (cur_network->network.Privacy != bssid->Privacy) {
- DBG_871X("%s(), privacy is not match return FAIL\n",__func__);
+ DBG_871X("%s(), privacy is not match\n",__func__);
goto _mismatch;
}
@@ -1891,7 +2165,7 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
}
if (cur_network->BcnInfo.encryp_protocol != encryp_protocol) {
- DBG_871X("%s(): enctyp is not match ,return FAIL\n",__func__);
+ DBG_871X("%s(): enctyp is not match\n",__func__);
goto _mismatch;
}
@@ -1918,14 +2192,14 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,
("%s cur_network->group_cipher is %d: %d\n",__func__, cur_network->BcnInfo.group_cipher, group_cipher));
if (pairwise_cipher != cur_network->BcnInfo.pairwise_cipher || group_cipher != cur_network->BcnInfo.group_cipher) {
- DBG_871X("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match ,return FAIL\n",__func__,
+ DBG_871X("%s pairwise_cipher(%x:%x) or group_cipher(%x:%x) is not match\n",__func__,
pairwise_cipher, cur_network->BcnInfo.pairwise_cipher,
group_cipher, cur_network->BcnInfo.group_cipher);
goto _mismatch;
}
if (is_8021x != cur_network->BcnInfo.is_8021x) {
- DBG_871X("%s authentication is not match ,return FAIL\n", __func__);
+ DBG_871X("%s authentication is not match\n", __func__);
goto _mismatch;
}
}
@@ -1935,7 +2209,26 @@ int rtw_check_bcn_info(ADAPTER *Adapter, u8 *pframe, u32 packet_len)
_mismatch:
rtw_mfree((u8 *)bssid, sizeof(WLAN_BSSID_EX));
- return _FAIL;
+
+ if (pmlmepriv->NumOfBcnInfoChkFail == 0)
+ {
+ pmlmepriv->timeBcnInfoChkStart = rtw_get_current_time();
+ }
+
+ pmlmepriv->NumOfBcnInfoChkFail++;
+ DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d (SeqNum of this Beacon frame = %d).\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail, GetSequence(pframe));
+
+ if ((pmlmepriv->timeBcnInfoChkStart != 0) && (rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart) <= DISCONNECT_BY_CHK_BCN_FAIL_OBSERV_PERIOD_IN_MS)
+ && (pmlmepriv->NumOfBcnInfoChkFail >= DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD))
+ {
+ DBG_871X("%s by "ADPT_FMT" - NumOfChkFail = %d >= threshold : %d (in %d ms), return FAIL.\n", __func__, ADPT_ARG(Adapter), pmlmepriv->NumOfBcnInfoChkFail,
+ DISCONNECT_BY_CHK_BCN_FAIL_THRESHOLD, rtw_get_passing_time_ms(pmlmepriv->timeBcnInfoChkStart));
+ pmlmepriv->timeBcnInfoChkStart = 0;
+ pmlmepriv->NumOfBcnInfoChkFail = 0;
+ return _FAIL;
+ }
+
+ return _SUCCESS;
}
void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta)
@@ -1957,15 +2250,14 @@ void update_beacon_info(_adapter *padapter, u8 *pframe, uint pkt_len, struct sta
switch (pIE->ElementID)
{
-#if 0
case _VENDOR_SPECIFIC_IE_:
- //todo: to update WMM paramter set while receiving beacon
- if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6)) //WMM
+ //to update WMM paramter set while receiving beacon
+ if (_rtw_memcmp(pIE->data, WMM_PARA_OUI, 6) && pIE->Length == WLAN_WMM_LEN) //WMM
{
- (WMM_param_handler(padapter, pIE))? WMMOnAssocRsp(padapter): 0;
- }
+ (WMM_param_handler(padapter, pIE))? report_wmm_edca_update(padapter): 0;
+ }
+
break;
-#endif
case _HT_EXTRA_INFO_IE_: //HT info
//HT_info_handler(padapter, pIE);
@@ -2872,25 +3164,6 @@ void beacon_timing_control(_adapter *padapter)
rtw_hal_bcn_related_reg_setting(padapter);
}
-uint rtw_get_camid(uint macid)
-{
- uint camid;
-
- //camid 0, 1, 2, 3 is default entry for default key/group key
- //macid = 1 is for bc/mc stainfo, no mapping to camid
- //macid = 0 mapping to camid 4
- //for macid >=2, camid = macid+3;
-
- if(macid==0)
- camid = 4;
- else if(macid >=2)
- camid = macid + 3;
- else
- camid = 4;
-
- return camid;
-}
-
void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta)
{
int i;
@@ -3158,6 +3431,49 @@ _adapter *dvobj_get_port0_adapter(struct dvobj_priv *dvobj)
/*
* Description:
+ * rtw_check_invalid_mac_address:
+ * This is only used for checking mac address valid or not.
+ *
+ * Input:
+ * adapter: mac_address pointer.
+ *
+ * Output:
+ * _TRUE: The mac address is invalid.
+ * _FALSE: The mac address is valid.
+ *
+ * Auther: Isaac.Li
+ */
+u8 rtw_check_invalid_mac_address(u8 *mac_addr) {
+ u8 null_mac_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
+ u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+ u8 res = _FALSE;
+
+ if (_rtw_memcmp(mac_addr, null_mac_addr, ETH_ALEN)) {
+ res = _TRUE;
+ goto func_exit;
+ }
+
+ if (_rtw_memcmp(mac_addr, multi_mac_addr, ETH_ALEN)) {
+ res = _TRUE;
+ goto func_exit;
+ }
+
+ if (mac_addr[0] & BIT0) {
+ res = _TRUE;
+ goto func_exit;
+ }
+
+ if (mac_addr[0] & BIT1) {
+ res = _TRUE;
+ goto func_exit;
+ }
+
+func_exit:
+ return res;
+}
+
+/*
+ * Description:
* dump_TX_FIFO: This is only used to dump TX_FIFO for debug WoW mode offload
* contant.
*
@@ -3200,6 +3516,109 @@ void dump_TX_FIFO(_adapter* padapter, u8 page_num, u16 page_size){
}
}
+#ifdef CONFIG_GPIO_API
+int rtw_get_gpio(struct net_device *netdev, int gpio_num)
+{
+ u8 value;
+ u8 direction;
+ _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
+ struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
+
+ rtw_ps_deny(adapter, PS_DENY_IOCTL);
+
+ DBG_871X("rf_pwrstate=0x%02x\n", pwrpriv->rf_pwrstate);
+ LeaveAllPowerSaveModeDirect(adapter);
+
+ /* Read GPIO Direction */
+ direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
+
+ /* According the direction to read register value */
+ if( direction )
+ value = (rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1)& BIT(gpio_num)) >> gpio_num;
+ else
+ value = (rtw_read8(adapter, REG_GPIO_PIN_CTRL)& BIT(gpio_num)) >> gpio_num;
+
+ rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
+ DBG_871X("%s direction=%d value=%d\n",__FUNCTION__,direction,value);
+
+ return value;
+}
+EXPORT_SYMBOL(rtw_get_gpio);
+
+int rtw_set_gpio_output_value(struct net_device *netdev, int gpio_num, BOOLEAN isHigh)
+{
+ u8 direction = 0;
+ u8 res = -1;
+ _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
+
+ /* Check GPIO is 4~7 */
+ if( gpio_num > 7 || gpio_num < 4)
+ {
+ DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
+ return -1;
+ }
+
+ rtw_ps_deny(adapter, PS_DENY_IOCTL);
+
+ LeaveAllPowerSaveModeDirect(adapter);
+
+ /* Read GPIO direction */
+ direction = (rtw_read8(adapter,REG_GPIO_PIN_CTRL + 2) & BIT(gpio_num)) >> gpio_num;
+
+ /* If GPIO is output direction, setting value. */
+ if( direction )
+ {
+ if(isHigh)
+ rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) | BIT(gpio_num));
+ else
+ rtw_write8(adapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(gpio_num));
+
+ DBG_871X("%s Set gpio %x[%d]=%d\n",__FUNCTION__,REG_GPIO_PIN_CTRL+1,gpio_num,isHigh );
+ res = 0;
+ }
+ else
+ {
+ DBG_871X("%s The gpio is input,not be set!\n",__FUNCTION__);
+ res = -1;
+ }
+
+ rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
+ return res;
+}
+EXPORT_SYMBOL(rtw_set_gpio_output_value);
+
+int rtw_config_gpio(struct net_device *netdev, int gpio_num, BOOLEAN isOutput)
+{
+ _adapter *adapter = (_adapter *)rtw_netdev_priv(netdev);
+
+ if( gpio_num > 7 || gpio_num < 4)
+ {
+ DBG_871X("%s The gpio number does not included 4~7.\n",__FUNCTION__);
+ return -1;
+ }
+
+ DBG_871X("%s gpio_num =%d direction=%d\n",__FUNCTION__,gpio_num,isOutput);
+
+ rtw_ps_deny(adapter, PS_DENY_IOCTL);
+
+ LeaveAllPowerSaveModeDirect(adapter);
+
+ if( isOutput )
+ {
+ rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) | BIT(gpio_num));
+ }
+ else
+ {
+ rtw_write8(adapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(adapter, REG_GPIO_PIN_CTRL + 2) & ~BIT(gpio_num));
+ }
+
+ rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
+
+ return 0;
+}
+EXPORT_SYMBOL(rtw_config_gpio);
+#endif
+
#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip)
{
@@ -3523,9 +3942,12 @@ int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num,
pwrctl->pscan_info == NULL ||
pwrctl->pno_ssid_list == NULL){
DBG_871X("%s, ERROR: alloc nlo_info, ssid_list, scan_info fail\n", __func__);
- return -1;
+ goto failing;
}
+ pwrctl->pno_in_resume = _FALSE;
+
+ pwrctl->pno_inited = _TRUE;
/* NLO Info */
ret = rtw_dev_nlo_info_set(pwrctl->pnlo_info, ssid, num,
pno_time, pno_repeat, pno_freq_expo_max);
@@ -3541,6 +3963,22 @@ int rtw_dev_pno_set(struct net_device *net, pno_ssid_t* ssid, int num,
__func__, num, pno_time, pno_repeat, pno_freq_expo_max);
return 0;
+
+failing:
+ if (pwrctl->pnlo_info) {
+ rtw_mfree(pwrctl->pnlo_info, sizeof(pno_nlo_info_t));
+ pwrctl->pnlo_info = NULL;
+ }
+ if (pwrctl->pno_ssid_list) {
+ rtw_mfree(pwrctl->pno_ssid_list, sizeof(pno_ssid_list_t));
+ pwrctl->pno_ssid_list = NULL;
+ }
+ if (pwrctl->pscan_info) {
+ rtw_mfree(pwrctl->pscan_info, sizeof(pno_scan_info_t));
+ pwrctl->pscan_info = NULL;
+ }
+
+ return -1;
}
#ifdef CONFIG_PNO_SET_DEBUG
diff --git a/rtl8723BS/core/rtw_xmit.c b/rtl8723BS/core/rtw_xmit.c
index a6d02c2..83876c0 100755
--- a/rtl8723BS/core/rtw_xmit.c
+++ b/rtl8723BS/core/rtw_xmit.c
@@ -68,9 +68,7 @@ s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter)
struct xmit_buf *pxmitbuf;
struct xmit_frame *pxframe;
sint res=_SUCCESS;
- u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
- u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
-
+
_func_enter_;
// We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
@@ -201,7 +199,7 @@ _func_enter_;
/* init xframe_ext queue, the same count as extbuf */
_rtw_init_queue(&pxmitpriv->free_xframe_ext_queue);
- pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_frame) + 4);
+ pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
if (pxmitpriv->xframe_ext_alloc_addr == NULL){
pxmitpriv->xframe_ext = NULL;
@@ -212,7 +210,7 @@ _func_enter_;
pxmitpriv->xframe_ext = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->xframe_ext_alloc_addr), 4);
pxframe = (struct xmit_frame*)pxmitpriv->xframe_ext;
- for (i = 0; i < num_xmit_extbuf; i++) {
+ for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
_rtw_init_listhead(&(pxframe->list));
pxframe->padapter = padapter;
@@ -229,12 +227,12 @@ _func_enter_;
pxframe++;
}
- pxmitpriv->free_xframe_ext_cnt = num_xmit_extbuf;
+ pxmitpriv->free_xframe_ext_cnt = NR_XMIT_EXTBUFF;
// Init xmit extension buff
_rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
- pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
+ pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
if (pxmitpriv->pallocated_xmit_extbuf == NULL){
RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n"));
@@ -246,7 +244,7 @@ _func_enter_;
pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf;
- for (i = 0; i < num_xmit_extbuf; i++)
+ for (i = 0; i < NR_XMIT_EXTBUFF; i++)
{
_rtw_init_listhead(&pxmitbuf->list);
@@ -254,14 +252,14 @@ _func_enter_;
pxmitbuf->padapter = padapter;
pxmitbuf->buf_tag = XMITBUF_MGNT;
- if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
+ if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
res= _FAIL;
goto exit;
}
#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
pxmitbuf->phead = pxmitbuf->pbuf;
- pxmitbuf->pend = pxmitbuf->pbuf + max_xmit_extbuf_size;
+ pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMIT_EXTBUF_SZ;
pxmitbuf->len = 0;
pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
#endif
@@ -274,29 +272,30 @@ _func_enter_;
}
- pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf;
+ pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF;
+ for (i = 0; i<CMDBUF_MAX; i++) {
+ pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
+ if (pxmitbuf) {
+ _rtw_init_listhead(&pxmitbuf->list);
- pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
- if (pxmitbuf) {
- _rtw_init_listhead(&pxmitbuf->list);
+ pxmitbuf->priv_data = NULL;
+ pxmitbuf->padapter = padapter;
+ pxmitbuf->buf_tag = XMITBUF_CMD;
- pxmitbuf->priv_data = NULL;
- pxmitbuf->padapter = padapter;
- pxmitbuf->buf_tag = XMITBUF_CMD;
-
- if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
- res= _FAIL;
- goto exit;
- }
+ if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
+ res= _FAIL;
+ goto exit;
+ }
#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
- pxmitbuf->phead = pxmitbuf->pbuf;
- pxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;
- pxmitbuf->len = 0;
- pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
+ pxmitbuf->phead = pxmitbuf->pbuf;
+ pxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;
+ pxmitbuf->len = 0;
+ pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
#endif
- pxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ;
+ pxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ;
+ }
}
rtw_alloc_hwxmits(padapter);
@@ -363,15 +362,7 @@ void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
_adapter *padapter = pxmitpriv->adapter;
struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
- u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
- u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
-#if defined(CONFIG_MP_INCLUDED) && (defined(CONFIG_RTL8723A) ||defined(CONFIG_RTL8723B))
- if (padapter->registrypriv.mp_mode) {
- max_xmit_extbuf_size = 20000;
- num_xmit_extbuf = 1;
- }
-#endif
-
+
_func_enter_;
rtw_hal_free_xmit_priv(padapter);
@@ -406,33 +397,35 @@ void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
/* free xframe_ext queue, the same count as extbuf */
if ((pxmitframe = (struct xmit_frame*)pxmitpriv->xframe_ext)) {
- for (i=0; i<num_xmit_extbuf; i++) {
+ for (i=0; i<NR_XMIT_EXTBUFF; i++) {
rtw_os_xmit_complete(padapter, pxmitframe);
pxmitframe++;
}
}
if (pxmitpriv->xframe_ext_alloc_addr)
- rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, num_xmit_extbuf * sizeof(struct xmit_frame) + 4);
+ rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
_rtw_spinlock_free(&pxmitpriv->free_xframe_ext_queue.lock);
// free xmit extension buff
_rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock);
pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
- for(i=0; i<num_xmit_extbuf; i++)
+ for(i=0; i<NR_XMIT_EXTBUFF; i++)
{
- rtw_os_xmit_resource_free(padapter, pxmitbuf,(max_xmit_extbuf_size + XMITBUF_ALIGN_SZ), _TRUE);
+ rtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
pxmitbuf++;
}
if(pxmitpriv->pallocated_xmit_extbuf) {
- rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
+ rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
}
- pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
- if(pxmitbuf!=NULL)
- rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE);
+ for (i=0; i<CMDBUF_MAX; i++) {
+ pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
+ if(pxmitbuf!=NULL)
+ rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE);
+ }
rtw_free_hwxmits(padapter);
@@ -612,23 +605,38 @@ static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitf
break;
}
}
+
+ //for debug : force driver control vrtl_carrier_sense.
+ if(padapter->driver_vcs_en==1)
+ {
+ //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
+ //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
+ pattrib->vcs_mode = padapter->driver_vcs_type;
+ }
+
}
-static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *psta)
+static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
{
+ struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
+
pattrib->rtsen = psta->rtsen;
pattrib->cts2self = psta->cts2self;
pattrib->mdata = 0;
pattrib->eosp = 0;
pattrib->triggered=0;
+ pattrib->ampdu_spacing = 0;
//qos_en, ht_en, init rate, ,bw, ch_offset, sgi
pattrib->qos_en = psta->qos_option;
pattrib->raid = psta->raid;
- pattrib->bwmode = psta->bw_mode;
+ if (mlmeext->cur_bwmode < psta->bw_mode)
+ pattrib->bwmode = mlmeext->cur_bwmode;
+ else
+ pattrib->bwmode = psta->bw_mode;
pattrib->sgi = query_ra_short_GI(psta);
@@ -639,6 +647,11 @@ static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *
pattrib->ht_en = psta->htpriv.ht_option;
pattrib->ch_offset = psta->htpriv.ch_offset;
pattrib->ampdu_en = _FALSE;
+
+ if(padapter->driver_ampdu_spacing != 0xFF) //driver control AMPDU Density for peer sta's rx
+ pattrib->ampdu_spacing = padapter->driver_ampdu_spacing;
+ else
+ pattrib->ampdu_spacing = psta->htpriv.rx_ampdu_min_spacing;
#endif //CONFIG_80211N_HT
//if(pattrib->ht_en && psta->htpriv.ampdu_enable)
//{
@@ -792,7 +805,7 @@ static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib
RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n"));
}
-#ifdef CONFIG_CONCURRENT_MODE
+#if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
if((pattrib->encrypt && bmcast) || (pattrib->encrypt ==_WEP40_) || (pattrib->encrypt ==_WEP104_))
{
pattrib->bswenc = _TRUE;//force using sw enc.
@@ -941,7 +954,7 @@ s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
goto exit;
}
- update_attrib_phy_info(pattrib, psta);
+ update_attrib_phy_info(padapter, pattrib, psta);
exit:
@@ -967,6 +980,8 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
_func_enter_;
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib);
+
_rtw_open_pktfile(pkt, &pktfile);
i = _rtw_pktfile_read(&pktfile, (u8*)&etherhdr, ETH_HLEN);
@@ -981,15 +996,20 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
(check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc);
}
else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
_rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta);
}
else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
_rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
_rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
- }
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap);
+ }
+ else
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown);
#ifdef CONFIG_TDLS
rtw_check_tdls_established(padapter, pattrib);
@@ -1024,6 +1044,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
// pTcb->DataRate = Adapter->MgntInfo.LowestBasicRate;
//RTPRINT(FDM, WA_IOT, ("DHCP TranslateHeader(), pTcb->DataRate = 0x%x\n", pTcb->DataRate));
pattrib->dhcp_pkt = 1;
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_dhcp);
}
}
}
@@ -1034,7 +1055,10 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
pattrib->icmp_pkt = 0;
if(piphdr->protocol == 0x1) // protocol type in ip header 0x1 is ICMP
+ {
pattrib->icmp_pkt = 1;
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp);
+ }
}
@@ -1064,6 +1088,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
#endif
#endif
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_active);
rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
}
#endif //CONFIG_LPS
@@ -1075,7 +1100,8 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
psta = rtw_get_bcmc_stainfo(padapter);
} else {
psta = rtw_get_stainfo(pstapriv, pattrib->ra);
- if (psta == NULL) { // if we cannot get psta => drrp the pkt
+ if (psta == NULL) { // if we cannot get psta => drop the pkt
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta);
RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra)));
#ifdef DBG_TX_DROP_FRAME
DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
@@ -1085,6 +1111,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
}
else if((check_fwstate(pmlmepriv, WIFI_AP_STATE)==_TRUE)&&(!(psta->state & _FW_LINKED)))
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link);
res =_FAIL;
goto exit;
}
@@ -1092,6 +1119,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
if(psta == NULL)
{ // if we cannot get psta => drop the pkt
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta);
RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra)));
#ifdef DBG_TX_DROP_FRAME
DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
@@ -1102,6 +1130,7 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
if(!(psta->state &_FW_LINKED))
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link);
DBG_871X("%s, psta("MAC_FMT")->state(0x%x) != _FW_LINKED\n", __func__, MAC_ARG(psta->hwaddr), psta->state);
return _FAIL;
}
@@ -1111,11 +1140,12 @@ static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattr
//TODO:_lock
if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sec);
res = _FAIL;
goto exit;
}
- update_attrib_phy_info(pattrib, psta);
+ update_attrib_phy_info(padapter, pattrib, psta);
//DBG_8192C("%s ==> mac_id(%d)\n",__FUNCTION__,pattrib->mac_id );
@@ -2525,13 +2555,14 @@ void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz
}
}
-struct xmit_buf *rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv)
+static struct xmit_buf *__rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv,
+ enum cmdbuf_type buf_type)
{
struct xmit_buf *pxmitbuf = NULL;
_func_enter_;
- pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
+ pxmitbuf = &pxmitpriv->pcmd_xmitbuf[buf_type];
if (pxmitbuf != NULL) {
pxmitbuf->priv_data = NULL;
@@ -2543,6 +2574,7 @@ _func_enter_;
#endif
#ifdef CONFIG_PCI_HCI
pxmitbuf->len = 0;
+ pxmitbuf->desc = NULL;
#endif
if (pxmitbuf->sctx) {
@@ -2560,27 +2592,8 @@ _func_exit_;
return pxmitbuf;
}
-s32 rtw_free_cmd_xmitbuf(struct xmit_priv *pxmitpriv)
-{
- struct xmit_buf *pxmitbuf = NULL;
-
-_func_enter_;
-
- pxmitbuf = &pxmitpriv->pcmd_xmitbuf;
- if (pxmitbuf==NULL) {
- DBG_871X("%s fail, no xmitbuf available !!!\n", __func__);
- return _FAIL;
- } else {
- rtw_os_xmit_resource_free(pxmitbuf->padapter, pxmitbuf, pxmitbuf->alloc_sz, _FALSE);
- pxmitbuf->pallocated_buf = NULL;
- }
-
-_func_exit_;
-
- return _SUCCESS;
-}
-
-struct xmit_frame *rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv)
+struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
+ enum cmdbuf_type buf_type)
{
struct xmit_frame *pcmdframe;
struct xmit_buf *pxmitbuf;
@@ -2591,7 +2604,7 @@ struct xmit_frame *rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv)
return NULL;
}
- if ((pxmitbuf = rtw_alloc_cmd_xmitbuf(pxmitpriv)) == NULL) {
+ if ((pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type)) == NULL) {
DBG_871X("%s, alloc xmitbuf fail\n", __FUNCTION__);
rtw_free_xmitframe(pxmitpriv, pcmdframe);
return NULL;
@@ -2650,6 +2663,7 @@ _func_enter_;
#endif
#ifdef CONFIG_PCI_HCI
pxmitbuf->len = 0;
+ pxmitbuf->desc = NULL;
#endif
if (pxmitbuf->sctx) {
@@ -2739,6 +2753,7 @@ _func_enter_;
#endif
#ifdef CONFIG_PCI_HCI
pxmitbuf->len = 0;
+ pxmitbuf->desc = NULL;
#endif
if (pxmitbuf->sctx) {
@@ -3046,6 +3061,7 @@ _func_exit_;
s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_enqueue);
if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL)
{
RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
@@ -3131,7 +3147,7 @@ _func_enter_;
}
#endif
-#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)
for(j=0; j<4; j++)
inx[j] = pxmitpriv->wmm_para_seq[j];
#endif
@@ -3312,6 +3328,8 @@ s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe)
_func_enter_;
+ DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class);
+
/*
if (pattrib->psta) {
psta = pattrib->psta;
@@ -3324,11 +3342,13 @@ _func_enter_;
psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
if(pattrib->psta != psta)
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_sta);
DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
return _FAIL;
}
if (psta == NULL) {
+ DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_nosta);
res = _FAIL;
DBG_8192C("rtw_xmit_classifier: psta == NULL\n");
RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n"));
@@ -3337,6 +3357,7 @@ _func_enter_;
if(!(psta->state &_FW_LINKED))
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_fwlink);
DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
return _FAIL;
}
@@ -3722,6 +3743,8 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
s32 res;
+ DBG_COUNTER(padapter->tx_logs.core_tx);
+
if (start == 0)
start = rtw_get_current_time();
@@ -3737,6 +3760,7 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
if (pxmitframe == NULL) {
drop_cnt ++;
RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n"));
+ DBG_COUNTER(padapter->tx_logs.core_tx_err_pxmitframe);
return -1;
}
@@ -3756,6 +3780,7 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
if (res == -1)
{
rtw_free_xmitframe(pxmitpriv, pxmitframe);
+ DBG_COUNTER(padapter->tx_logs.core_tx_err_brtx);
return -1;
}
}
@@ -3793,11 +3818,13 @@ s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE)
{
_exit_critical_bh(&pxmitpriv->lock, &irqL0);
+ DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue);
return 1;
}
_exit_critical_bh(&pxmitpriv->lock, &irqL0);
#endif
+ //pre_xmitframe
if (rtw_hal_xmit(padapter, pxmitframe) == _FALSE)
return 1;
@@ -3879,6 +3906,47 @@ sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_fra
}
#endif //CONFIG_TDLS
+#define RTW_HIQ_FILTER_ALLOW_ALL 0
+#define RTW_HIQ_FILTER_ALLOW_SPECIAL 1
+#define RTW_HIQ_FILTER_DENY_ALL 2
+
+inline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe)
+{
+ bool allow = _FALSE;
+ _adapter *adapter = xmitframe->padapter;
+ struct registry_priv *registry = &adapter->registrypriv;
+
+if (adapter->interface_type != RTW_PCIE) {
+
+ if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) {
+
+ struct pkt_attrib *attrib = &xmitframe->attrib;
+
+ if (attrib->ether_type == 0x0806
+ || attrib->ether_type == 0x888e
+ #ifdef CONFIG_WAPI_SUPPORT
+ || attrib->ether_type == 0x88B4
+ #endif
+ || attrib->dhcp_pkt
+ ) {
+ if (0)
+ DBG_871X(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter)
+ , attrib->ether_type, attrib->dhcp_pkt?" DHCP":"");
+ allow = _TRUE;
+ }
+ }
+ else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) {
+ allow = _TRUE;
+ }
+ else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) {
+ }
+ else {
+ rtw_warn_on(1);
+ }
+}
+ return allow;
+}
+
#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
@@ -3900,7 +3968,10 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
#endif //CONFIG_TDLS
if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE)
+ {
+ DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_fwstate);
return ret;
+ }
/*
if(pattrib->psta)
{
@@ -3915,31 +3986,33 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
if(pattrib->psta != psta)
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_sta);
DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
return _FALSE;
}
if(psta==NULL)
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_nosta);
DBG_871X("%s, psta==NUL\n", __func__);
return _FALSE;
}
if(!(psta->state &_FW_LINKED))
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_link);
DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
return _FALSE;
}
if(pattrib->triggered==1)
{
+ DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_trigger);
//DBG_871X("directly xmit pspoll_triggered packet\n");
//pattrib->triggered=0;
-
- if(bmcst)
+ if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)
pattrib->qsel = 0x11;//HIQ
-
return ret;
}
@@ -3978,6 +4051,8 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
//_exit_critical_bh(&psta->sleep_q.lock, &irqL);
ret = _TRUE;
+
+ DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast);
}
@@ -4054,6 +4129,7 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p
ret = _TRUE;
+ DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_ucast);
}
}
@@ -4081,14 +4157,16 @@ static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_
{
pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
- plist = get_next(plist);
+ plist = get_next(plist);
+ pattrib = &pxmitframe->attrib;
+
+ pattrib->triggered = 0;
+
ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe);
if(_TRUE == ret)
{
- pattrib = &pxmitframe->attrib;
-
ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
ptxservq->qcnt--;
@@ -4250,6 +4328,41 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
}
+ if(psta->sleepq_len==0)
+ {
+#ifdef CONFIG_TDLS
+ if( psta->tdls_sta_state & TDLS_LINKED_STATE )
+ {
+ if(psta->state&WIFI_SLEEP_STATE)
+ psta->state ^= WIFI_SLEEP_STATE;
+
+ _exit_critical_bh(&pxmitpriv->lock, &irqL);
+ return;
+ }
+#endif //CONFIG_TDLS
+
+ if (pstapriv->tim_bitmap & BIT(psta->aid)) {
+ //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
+ //upate BCN for TIM IE
+ //update_BCNTIM(padapter);
+ update_mask = BIT(0);
+ }
+
+ pstapriv->tim_bitmap &= ~BIT(psta->aid);
+
+ if(psta->state&WIFI_SLEEP_STATE)
+ psta->state ^= WIFI_SLEEP_STATE;
+
+ if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
+ {
+ DBG_871X("%s alive check\n", __func__);
+ psta->expire_to = pstapriv->expire_to;
+ psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
+ }
+
+ pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
+ }
+
//for BC/MC Frames
if(!psta_bmc)
goto _exit;
@@ -4302,41 +4415,6 @@ void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
}
- if(psta->sleepq_len==0)
- {
-#ifdef CONFIG_TDLS
- if( psta->tdls_sta_state & TDLS_LINKED_STATE )
- {
- if(psta->state&WIFI_SLEEP_STATE)
- psta->state ^= WIFI_SLEEP_STATE;
-
- _exit_critical_bh(&pxmitpriv->lock, &irqL);
- return;
- }
-#endif //CONFIG_TDLS
-
- if (pstapriv->tim_bitmap & BIT(psta->aid)) {
- //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
- //upate BCN for TIM IE
- //update_BCNTIM(padapter);
- update_mask = BIT(0);
- }
-
- pstapriv->tim_bitmap &= ~BIT(psta->aid);
-
- if(psta->state&WIFI_SLEEP_STATE)
- psta->state ^= WIFI_SLEEP_STATE;
-
- if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
- {
- DBG_871X("%s alive check\n", __func__);
- psta->expire_to = pstapriv->expire_to;
- psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
- }
-
- pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
- }
-
_exit:
//_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c
index 65cf94e..9f69141 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.c
@@ -1724,10 +1724,18 @@ halbtc8188c2ant_ActionPanA2dp(
// extern function start with EXhalbtc8188c2ant_
//============================================================
VOID
-EXhalbtc8188c2ant_InitHwConfig(
+EXhalbtc8188c2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
+}
+
+VOID
+EXhalbtc8188c2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
u1Byte u1Tmp=0;
BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));
@@ -1775,13 +1783,6 @@ EXhalbtc8188c2ant_DisplayCoexInfo(
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
CL_PRINTF(cliBuf);
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.h
index 086a879..ce7ec56 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8188c2Ant.h
@@ -87,10 +87,15 @@ typedef struct _COEX_STA_8188C_2ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8188c2ant_InitHwConfig(
+EXhalbtc8188c2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8188c2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8188c2ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c
index 0a3f310..239da74 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.c
@@ -1713,10 +1713,18 @@ halbtc8192d2ant_IsBtCoexistEnter(
// extern function start with EXhalbtc8192d2ant_
//============================================================
VOID
-EXhalbtc8192d2ant_InitHwConfig(
+EXhalbtc8192d2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
+}
+
+VOID
+EXhalbtc8192d2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
u1Byte u1Tmp=0;
BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));
@@ -1781,13 +1789,6 @@ EXhalbtc8192d2ant_DisplayCoexInfo(
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
CL_PRINTF(cliBuf);
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.h
index 4d3b838..85fd674 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192d2Ant.h
@@ -108,10 +108,15 @@ typedef struct _COEX_STA_8192D_2ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8192d2ant_InitHwConfig(
+EXhalbtc8192d2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8192d2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8192d2ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c
index a9b90c6..36a48d0 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.c
@@ -2437,10 +2437,18 @@ halbtc8192e1ant_InitCoexDm(
// extern function start with EXhalbtc8192e1ant_
//============================================================
VOID
-EXhalbtc8192e1ant_InitHwConfig(
+EXhalbtc8192e1ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
+}
+
+VOID
+EXhalbtc8192e1ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
u4Byte u4Tmp=0;
u2Byte u2Tmp=0;
u1Byte u1Tmp=0;
@@ -2536,13 +2544,6 @@ EXhalbtc8192e1ant_DisplayCoexInfo(
CL_PRINTF(cliBuf);
}
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h
index 7a1ce5a..8792ec8 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e1Ant.h
@@ -140,10 +140,15 @@ typedef struct _COEX_STA_8192E_1ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8192e1ant_InitHwConfig(
+EXhalbtc8192e1ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8192e1ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8192e1ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c
index a1b8f27..b17ee76 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.c
@@ -3791,10 +3791,18 @@ halbtc8192e2ant_InitHwConfig(
// extern function start with EXhalbtc8192e2ant_
//============================================================
VOID
-EXhalbtc8192e2ant_InitHwConfig(
+EXhalbtc8192e2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
+}
+
+VOID
+EXhalbtc8192e2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
halbtc8192e2ant_InitHwConfig(pBtCoexist, TRUE);
}
@@ -3837,13 +3845,6 @@ EXhalbtc8192e2ant_DisplayCoexInfo(
CL_PRINTF(cliBuf);
}
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h
index dc94c73..58cddce 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8192e2Ant.h
@@ -143,10 +143,15 @@ typedef struct _COEX_STA_8192E_2ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8192e2ant_InitHwConfig(
+EXhalbtc8192e2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8192e2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8192e2ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c
index d2476cd..8cd3d15 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a1Ant.c
@@ -1077,13 +1077,6 @@ EXhalbtc8723a1ant_DisplayCoexInfo(
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
CL_PRINTF(cliBuf);
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c
index 2b72397..3e11586 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.c
@@ -58,6 +58,31 @@ halbtc8723a2ant_IsWifiIdle(
return TRUE;
}
+BOOLEAN
+halbtc8723a2ant_IsWifiConnectedIdle(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ BOOLEAN bWifiConnected=FALSE, bScan=FALSE, bLink=FALSE, bRoam=FALSE, bWifiBusy=FALSE;
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
+
+ if(bScan)
+ return FALSE;
+ if(bLink)
+ return FALSE;
+ if(bRoam)
+ return FALSE;
+ if(bWifiConnected && !bWifiBusy)
+ return TRUE;
+ else
+ return FALSE;
+}
+
u1Byte
halbtc8723a2ant_BtRssiState(
u1Byte levelNum,
@@ -629,6 +654,9 @@ halbtc8723a2ant_NeedToDecBtPwr(
BOOLEAN bRet=FALSE;
BOOLEAN bBtHsOn=FALSE, bWifiConnected=FALSE;
s4Byte btHsRssi=0;
+ u1Byte btRssiState=BTC_RSSI_STATE_HIGH;
+
+ btRssiState = halbtc8723a2ant_BtRssiState(2, 42, 0);
if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))
return FALSE;
@@ -636,6 +664,8 @@ halbtc8723a2ant_NeedToDecBtPwr(
return FALSE;
if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))
return FALSE;
+ if(BTC_RSSI_LOW(btRssiState))
+ return FALSE;
if(bWifiConnected)
{
@@ -1546,6 +1576,26 @@ halbtc8723a2ant_IsCommonAction(
bCommon = TRUE;
}
+ else if(halbtc8723a2ant_IsWifiConnectedIdle(pBtCoexist) &&
+ (BT_8723A_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) )
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected-idle + BT non-idle!!\n"));
+
+ halbtc8723a2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, TRUE);
+ halbtc8723a2ant_RfShrink(pBtCoexist, NORMAL_EXEC, TRUE);
+ halbtc8723a2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0xffff, 0x3);
+
+ halbtc8723a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723a2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ halbtc8723a2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x20);
+ halbtc8723a2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ halbtc8723a2ant_AgcTable(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723a2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723a2ant_DacSwing(pBtCoexist, NORMAL_EXEC, FALSE, 0xc0);
+
+ bCommon = TRUE;
+ }
else
{
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-idle + BT non-idle!!\n"));
@@ -3332,10 +3382,18 @@ wa_halbtc8723a2ant_MonitorC2h(
// extern function start with EXhalbtc8723a2ant_
//============================================================
VOID
-EXhalbtc8723a2ant_InitHwConfig(
+EXhalbtc8723a2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
+}
+
+VOID
+EXhalbtc8723a2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
u4Byte u4Tmp=0;
u1Byte u1Tmp=0;
@@ -3380,13 +3438,6 @@ EXhalbtc8723a2ant_DisplayCoexInfo(
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
CL_PRINTF(cliBuf);
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.h
index c2733d8..f0cc8b5 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723a2Ant.h
@@ -116,10 +116,15 @@ typedef struct _COEX_STA_8723A_2ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8723a2ant_InitHwConfig(
+EXhalbtc8723a2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8723a2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8723a2ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c
index 6105afc..a6a42b2 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.c
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8723b1Ant[]={
"BT Info[bt auto report]",
};
-u4Byte GLCoexVerDate8723b1Ant=20140110;
-u4Byte GLCoexVer8723b1Ant=0x49;
+u4Byte GLCoexVerDate8723b1Ant=20140507;
+u4Byte GLCoexVer8723b1Ant=0x4e;
//============================================================
// local function proto type if needed
@@ -412,6 +412,23 @@ halbtc8723b1ant_LimitedRx(
}
VOID
+halbtc8723b1ant_QueryBtInfo(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte H2C_Parameter[1] ={0};
+
+ pCoexSta->bC2hBtInfoReqSent = TRUE;
+
+ H2C_Parameter[0] |= BIT0; // trigger
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n",
+ H2C_Parameter[0]));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);
+}
+
+VOID
halbtc8723b1ant_MonitorBtCtr(
IN PBTC_COEXIST pBtCoexist
)
@@ -420,7 +437,20 @@ halbtc8723b1ant_MonitorBtCtr(
u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;
u1Byte u1Tmp, u1Tmp1;
s4Byte wifiRssi;
+ static u1Byte NumOfBtCounterChk = 0;
+ //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS
+ //if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) )
+
+ if (pCoexSta->bUnderIps)
+ {
+ pCoexSta->highPriorityTx = 65535;
+ pCoexSta->highPriorityRx = 65535;
+ pCoexSta->lowPriorityTx = 65535;
+ pCoexSta->lowPriorityRx = 65535;
+ return;
+ }
+
regHPTxRx = 0x770;
regLPTxRx = 0x774;
@@ -437,25 +467,122 @@ halbtc8723b1ant_MonitorBtCtr(
pCoexSta->lowPriorityTx = regLPTx;
pCoexSta->lowPriorityRx = regLPRx;
+ if( (pCoexSta->lowPriorityTx >= 1050) && (!pCoexSta->bC2hBtInquiryPage))
+ pCoexSta->popEventCnt++;
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n",
+ regHPRx, regHPTx, regLPRx, regLPTx));
+
// reset counter
pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);
+
+ if ((regHPTx == 0) && (regHPRx ==0) && (regLPTx == 0) && (regLPRx == 0))
+ {
+ NumOfBtCounterChk++;
+ if (NumOfBtCounterChk >= 3)
+{
+ halbtc8723b1ant_QueryBtInfo(pBtCoexist);
+ NumOfBtCounterChk = 0;
+ }
+ }
}
+
VOID
-halbtc8723b1ant_QueryBtInfo(
+halbtc8723b1ant_MonitorWiFiCtr(
IN PBTC_COEXIST pBtCoexist
)
{
- u1Byte H2C_Parameter[1] ={0};
+ u4Byte u4Tmp;
+ u2Byte u2Tmp[3];
+ s4Byte wifiRssi=0;
+ BOOLEAN bWifiBusy = FALSE, bWifiUnderBMode = FALSE;
+ static u1Byte nCCKLockCounter = 0;
- pCoexSta->bC2hBtInfoReqSent = TRUE;
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);
- H2C_Parameter[0] |= BIT0; // trigger
+ if (pCoexSta->bUnderIps)
+ {
+ pCoexSta->nCRCOK_CCK = 0;
+ pCoexSta->nCRCOK_11g = 0;
+ pCoexSta->nCRCOK_11n = 0;
+ pCoexSta->nCRCOK_11nAgg = 0;
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n",
- H2C_Parameter[0]));
+ pCoexSta->nCRCErr_CCK = 0;
+ pCoexSta->nCRCErr_11g = 0;
+ pCoexSta->nCRCErr_11n = 0;
+ pCoexSta->nCRCErr_11nAgg = 0;
+ }
+ else
+ {
+ pCoexSta->nCRCOK_CCK = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);
+ pCoexSta->nCRCOK_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);
+ pCoexSta->nCRCOK_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);
+ pCoexSta->nCRCOK_11nAgg= pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);
+
+ pCoexSta->nCRCErr_CCK = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);
+ pCoexSta->nCRCErr_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);
+ pCoexSta->nCRCErr_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);
+ pCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);
+ }
+
+
+ //reset counter
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);
+
+ if ( (bWifiBusy) && (wifiRssi >= 30) && (!bWifiUnderBMode))
+ {
+ if ( (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||
+ (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
+ (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) )
+ {
+ if (pCoexSta->nCRCOK_CCK >(pCoexSta->nCRCOK_11g + pCoexSta->nCRCOK_11n +
+ pCoexSta->nCRCOK_11nAgg) )
+ {
+ if (nCCKLockCounter < 5)
+ nCCKLockCounter++;
+ }
+ else
+ {
+ if (nCCKLockCounter > 0)
+ nCCKLockCounter--;
+ }
+
+ }
+ else
+ {
+ if (nCCKLockCounter > 0)
+ nCCKLockCounter--;
+ }
+ }
+ else
+ {
+ if (nCCKLockCounter > 0)
+ nCCKLockCounter--;
+ }
+
+ if (!pCoexSta->bPreCCKLock)
+ {
+
+ if (nCCKLockCounter >= 5)
+ pCoexSta->bCCKLock = TRUE;
+ else
+ pCoexSta->bCCKLock = FALSE;
+ }
+ else
+ {
+ if (nCCKLockCounter == 0)
+ pCoexSta->bCCKLock = FALSE;
+ else
+ pCoexSta->bCCKLock = TRUE;
+ }
+
+ pCoexSta->bPreCCKLock = pCoexSta->bCCKLock;
+
- pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);
}
BOOLEAN
@@ -920,9 +1047,9 @@ halbtc8723b1ant_CoexTableWithType(
IN u1Byte type
)
{
-
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ********** CoexTable(%d) **********\n",
- type));
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type));
+
+ pCoexSta->nCoexTableType = type;
switch(type)
{
@@ -936,16 +1063,16 @@ halbtc8723b1ant_CoexTableWithType(
halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);
break;
case 3:
- halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaaaaaa, 0xffffff, 0x3);
+ halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaa5555, 0xaaaa5a5a, 0xffffff, 0x3);
break;
case 4:
- halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);
+ halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);
break;
case 5:
halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3);
break;
case 6:
- halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);
+ halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);
break;
case 7:
halbtc8723b1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);
@@ -999,54 +1126,6 @@ halbtc8723b1ant_IgnoreWlanAct(
}
VOID
-halbtc8723b1ant_SetFwPstdma(
- IN PBTC_COEXIST pBtCoexist,
- IN u1Byte byte1,
- IN u1Byte byte2,
- IN u1Byte byte3,
- IN u1Byte byte4,
- IN u1Byte byte5
- )
-{
- u1Byte H2C_Parameter[5] ={0};
- u1Byte realByte1=byte1, realByte5=byte5;
- BOOLEAN bApEnable=FALSE;
-
- pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
-
- if(bApEnable)
- {
- if(byte1&BIT4 && !(byte1&BIT5))
- {
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n"));
- realByte1 &= ~BIT4;
- realByte1 |= BIT5;
-
- realByte5 |= BIT5;
- realByte5 &= ~BIT6;
- }
- }
-
- H2C_Parameter[0] = realByte1;
- H2C_Parameter[1] = byte2;
- H2C_Parameter[2] = byte3;
- H2C_Parameter[3] = byte4;
- H2C_Parameter[4] = realByte5;
-
- pCoexDm->psTdmaPara[0] = realByte1;
- pCoexDm->psTdmaPara[1] = byte2;
- pCoexDm->psTdmaPara[2] = byte3;
- pCoexDm->psTdmaPara[3] = byte4;
- pCoexDm->psTdmaPara[4] = realByte5;
-
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
- H2C_Parameter[0],
- H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));
-
- pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);
-}
-
-VOID
halbtc8723b1ant_SetLpsRpwm(
IN PBTC_COEXIST pBtCoexist,
IN u1Byte lpsVal,
@@ -1116,39 +1195,62 @@ halbtc8723b1ant_SetAntPath(
)
{
PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
- u4Byte fwVer=0, u4Tmp=0;
+ u4Byte fwVer=0, u4Tmp=0, cntBtCalChk=0;
BOOLEAN bPgExtSwitch=FALSE;
BOOLEAN bUseExtSwitch=FALSE;
- u1Byte H2C_Parameter[2] ={0};
- PADAPTER padapter=pBtCoexist->Adapter;
+ BOOLEAN bIsInMpMode = FALSE;
+ u1Byte H2C_Parameter[2] ={0}, u1Tmp = 0;
+
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); // [31:16]=fw ver, [15:0]=fw sub ver
-
- if((fwVer<0xc0000) || bPgExtSwitch)
+ if((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch)
bUseExtSwitch = TRUE;
if(bInitHwCfg)
{
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi
-
- //Force GNT_BT to Normal
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0);
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi TRx Mask on
+ pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT TRx Mask on
+ if(fwVer >= 0x180000)
+ {
+ /* Use H2C to set GNT_BT to HIGH */
+ H2C_Parameter[0] = 1;
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
+ }
+ else
+ {
+ // set grant_bt to high
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
+ }
//set wlan_act control by PTA
- pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
- //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi
+
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);
}
else if(bWifiOff)
{
- //Force GNT_BT to High
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);
-
+ if(fwVer >= 0x180000)
+ {
+ /* Use H2C to set GNT_BT to HIGH */
+ H2C_Parameter[0] = 1;
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
+ }
+ else
+ {
+ // set grant_bt to high
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
+ }
//set wlan_act to always low
pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
- if(padapter->registrypriv.mp_mode ==0)
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);
+ if(!bIsInMpMode)
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT
else
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi
@@ -1159,6 +1261,46 @@ halbtc8723b1ant_SetAntPath(
u4Tmp &= ~BIT24;
pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
}
+ else
+ {
+ /* Use H2C to set GNT_BT to LOW */
+ if(fwVer >= 0x180000)
+ {
+ if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765) != 0)
+ {
+ H2C_Parameter[0] = 0;
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
+ }
+ }
+ else
+ {
+ // BT calibration check
+ while(cntBtCalChk <= 20)
+ {
+ u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49d);
+ cntBtCalChk++;
+ if(u1Tmp & BIT0)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n", cntBtCalChk));
+ delay_ms(50);
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n", cntBtCalChk));
+ break;
+ }
+ }
+
+ // set grant_bt to PTA
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);
+ }
+
+ if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) != 0xc)
+ {
+ //set wlan_act control by PTA
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);
+ }
+ }
if(bUseExtSwitch)
{
@@ -1170,10 +1312,10 @@ halbtc8723b1ant_SetAntPath(
u4Tmp |= BIT24;
pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT
+
if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
{
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to BT for IPS case 0x4c[23]=1
-
//tell firmware "no antenna inverse"
H2C_Parameter[0] = 0;
H2C_Parameter[1] = 1; //ext switch type
@@ -1181,8 +1323,6 @@ halbtc8723b1ant_SetAntPath(
}
else
{
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to BT for IPS case 0x4c[23]=1
-
//tell firmware "antenna inverse"
H2C_Parameter[0] = 1;
H2C_Parameter[1] = 1; //ext switch type
@@ -1190,12 +1330,7 @@ halbtc8723b1ant_SetAntPath(
}
}
- // fixed internal switch first
- if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
- pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT
- else
- pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); // fixed internal switch S0->WiFi, S1->BT
-
+
// ext switch setting
switch(antPosType)
{
@@ -1231,9 +1366,11 @@ halbtc8723b1ant_SetAntPath(
u4Tmp &=~BIT24;
pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
+ //Fix Ext switch Main->S1, Aux->S0
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0);
+
if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
{
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Main Ant to WiFi for IPS case 0x4c[23]=1
//tell firmware "no antenna inverse"
H2C_Parameter[0] = 0;
@@ -1242,7 +1379,6 @@ halbtc8723b1ant_SetAntPath(
}
else
{
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Aux Ant to BT for IPS case 0x4c[23]=1
//tell firmware "antenna inverse"
H2C_Parameter[0] = 1;
@@ -1251,11 +1387,6 @@ halbtc8723b1ant_SetAntPath(
}
}
- // fixed external switch first
- if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1); //Main->WiFi, Aux->BT
- else
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2); //Main->BT, Aux->WiFi
// internal switch setting
switch(antPosType)
@@ -1284,6 +1415,89 @@ halbtc8723b1ant_SetAntPath(
}
VOID
+halbtc8723b1ant_SetAntPathDCut(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bAntennaAux, //For 1-Ant--> 1: Antenna at S0, 0: Antenna at S1. Set 0 for 2-Ant
+ IN BOOLEAN bExtSwitch, // 1: Ext Switch (SPDT) exist on module, 0: no Ext Switch (SPDT) exist on module
+ IN BOOLEAN bTwoAntenna, // 1: 2-Antenna, 0:1-Antenna
+ IN u1Byte antennaPos, //Set Antenna Pos, For 1-Ant: BTC_ANT_PATH_WIFI, BTC_ANT_PATH_BT, BTC_ANT_PATH_PTA, For 2-Ant:BTC_ANT_WIFI_AT_MAIN, BTC_ANT_WIFI_AT_Aux
+ IN u1Byte wifiState //BTC_WIFI_STAT_INIT, BTC_WIFI_STAT_IQK, BTC_WIFI_STAT_NORMAL_OFF, BTC_WIFI_STAT_MP_OFF, BTC_WIFI_STAT_NORMAL, BTC_WIFI_STAT_ANT_DIV
+ )
+{
+ u1Byte dataLen=5;
+ u1Byte buf[6] = {0};
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT Ant, bAntennaAux/bExtSwitch/bTwoAntenna/antennaPos/wifiState=%d/%d/%d/%d/%d\n",
+ bAntennaAux, bExtSwitch, bTwoAntenna, antennaPos, wifiState));
+
+ buf[0] = dataLen;
+
+ if(bAntennaAux)
+ buf[1] = 0x1;
+
+ if(bExtSwitch)
+ buf[2] = 0x1;
+
+ if(bTwoAntenna)
+ buf[3] = 0x1;
+
+ buf[4] = antennaPos;
+
+ buf[5] = wifiState;
+
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_CTRL_8723B_ANT, (PVOID)&buf[0]);
+}
+
+VOID
+halbtc8723b1ant_SetFwPstdma(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte byte1,
+ IN u1Byte byte2,
+ IN u1Byte byte3,
+ IN u1Byte byte4,
+ IN u1Byte byte5
+ )
+{
+ u1Byte H2C_Parameter[5] ={0};
+ u1Byte realByte1=byte1, realByte5=byte5;
+ BOOLEAN bApEnable=FALSE;
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
+
+ if(bApEnable)
+ {
+ if(byte1&BIT4 && !(byte1&BIT5))
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n"));
+ realByte1 &= ~BIT4;
+ realByte1 |= BIT5;
+
+ realByte5 |= BIT5;
+ realByte5 &= ~BIT6;
+ }
+ }
+
+ H2C_Parameter[0] = realByte1;
+ H2C_Parameter[1] = byte2;
+ H2C_Parameter[2] = byte3;
+ H2C_Parameter[3] = byte4;
+ H2C_Parameter[4] = realByte5;
+
+ pCoexDm->psTdmaPara[0] = realByte1;
+ pCoexDm->psTdmaPara[1] = byte2;
+ pCoexDm->psTdmaPara[2] = byte3;
+ pCoexDm->psTdmaPara[3] = byte4;
+ pCoexDm->psTdmaPara[4] = realByte5;
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
+ H2C_Parameter[0],
+ H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);
+}
+
+
+VOID
halbtc8723b1ant_PsTdma(
IN PBTC_COEXIST pBtCoexist,
IN BOOLEAN bForceExec,
@@ -1292,8 +1506,11 @@ halbtc8723b1ant_PsTdma(
)
{
PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
- BOOLEAN bTurnOnByCnt=FALSE, bWifiBusy=FALSE;
+ PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;
+ BOOLEAN bTurnOnByCnt=FALSE, bWifiBusy=FALSE, bWiFiNoisy=FALSE;
u1Byte psTdmaTypeByCnt=0, rssiAdjustVal=0;
+ u1Byte psTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val = 0x10;
+ s1Byte nWiFiDurationAdjust = 0x0;
//u4Byte fwVer=0;
//BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n",
@@ -1305,12 +1522,12 @@ halbtc8723b1ant_PsTdma(
if (pCoexDm->bCurPsTdmaOn)
{
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ********** TDMA(on, %d) **********\n",
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n",
pCoexDm->curPsTdma));
}
else
{
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ********** TDMA(off, %d) **********\n",
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(off, %d) **********\n",
pCoexDm->curPsTdma));
}
@@ -1320,40 +1537,52 @@ halbtc8723b1ant_PsTdma(
(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )
return;
}
+
+ if (pCoexSta->nScanAPNum <= 5)
+ nWiFiDurationAdjust = 5;
+ else if (pCoexSta->nScanAPNum >= 40)
+ nWiFiDurationAdjust = -15;
+ else if (pCoexSta->nScanAPNum >= 20)
+ nWiFiDurationAdjust = -10;
+
+ if (!pCoexSta->bForceLpsOn) //only for A2DP-only case 1/2/9/11
+ {
+ psTdmaByte0Val = 0x61; //no null-pkt
+ psTdmaByte3Val = 0x11; // no tx-pause at BT-slot
+ psTdmaByte4Val = 0x10; // 0x778 = d/1 toggle
+ }
+
+
if(bTurnOn)
{
+ if (pBtLinkInfo->bSlaveRole == TRUE)
+ {
+ psTdmaByte4Val = psTdmaByte4Val | 0x1; //0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts)
+ }
+
+
switch(type)
{
default:
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, 0x50);
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val);
break;
case 1:
- //if(bWifiBusy)
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x3a, 0x03, 0x10, 0x50);
- //else
- // halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x3a, 0x03, 0x10, 0x51);
-
- rssiAdjustVal = 11;
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x3a+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);
break;
case 2:
- //if(bWifiBusy)
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x2b, 0x03, 0x10, 0x50);
- //else
- // halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x2b, 0x03, 0x10, 0x51);
- rssiAdjustVal = 14;
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x2d+nWiFiDurationAdjust, 0x03, psTdmaByte3Val, psTdmaByte4Val);
break;
case 3:
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x52);
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x10);
break;
case 4:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);
- rssiAdjustVal = 17;
break;
case 5:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x10);
break;
case 6:
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x13);
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11);
break;
case 7:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);
@@ -1362,45 +1591,34 @@ halbtc8723b1ant_PsTdma(
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);
break;
case 9:
- //if(bWifiBusy)
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x50);
- //else
- // halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x50);
- rssiAdjustVal = 18;
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x3, psTdmaByte3Val, psTdmaByte4Val);
break;
case 10:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);
break;
case 11:
- //if(bWifiBusy)
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);
- //else
- // halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);
- rssiAdjustVal = 20;
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, psTdmaByte0Val, 0x21, 0x03, psTdmaByte3Val, psTdmaByte4Val);
break;
case 12:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);
break;
case 13:
- //halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x15, 0x0, 0x50);
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, 0x50);
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, 0x10);
break;
case 14:
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x52);
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, psTdmaByte4Val);
break;
case 15:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);
break;
case 16:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0);
- rssiAdjustVal = 18;
break;
case 18:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0);
- rssiAdjustVal = 14;
break;
case 20:
- halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x03, 0x11, 0x10);
+ halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10);
break;
case 21:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);
@@ -1410,23 +1628,18 @@ halbtc8723b1ant_PsTdma(
break;
case 23:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);
- rssiAdjustVal = 22;
break;
case 24:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);
- rssiAdjustVal = 22;
break;
case 25:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);
- rssiAdjustVal = 22;
break;
case 26:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);
- rssiAdjustVal = 22;
break;
case 27:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);
- rssiAdjustVal = 22;
break;
case 28:
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0);
@@ -1441,7 +1654,6 @@ halbtc8723b1ant_PsTdma(
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);
break;
case 32:
- //halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0xa, 0x3, 0x10, 0x0);
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);
break;
case 33:
@@ -1464,22 +1676,24 @@ halbtc8723b1ant_PsTdma(
}
else
{
- //pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); // [31:16]=fw ver, [15:0]=fw sub ver
// disable PS tdma
switch(type)
{
case 8: //PTA Control
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0);
+ //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_PTA, BTC_WIFI_STAT_NORMAL);
halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, FALSE, FALSE);
break;
case 0:
default: //Software control, Antenna at BT side
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);
+ //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL);
halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, FALSE);
break;
case 9: //Software control, Antenna at WiFi side
halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0);
+ //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_NORMAL);
halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, FALSE, FALSE);
break;
}
@@ -1519,7 +1733,7 @@ halbtc8723b1ant_IsCommonAction(
{
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n"));
- halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
+ //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
bCommon = TRUE;
}
@@ -1528,7 +1742,7 @@ halbtc8723b1ant_IsCommonAction(
{
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n"));
- halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
+ //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
bCommon = TRUE;
}
@@ -1537,7 +1751,7 @@ halbtc8723b1ant_IsCommonAction(
{
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n"));
- halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
+ //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
bCommon = TRUE;
}
@@ -1546,7 +1760,7 @@ halbtc8723b1ant_IsCommonAction(
{
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n"));
- halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
+ //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
bCommon = TRUE;
}
@@ -1555,7 +1769,7 @@ halbtc8723b1ant_IsCommonAction(
{
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n"));
- halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
+ //halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
bCommon = TRUE;
}
@@ -1641,6 +1855,10 @@ halbtc8723b1ant_TdmaDurationAdjustForAcl(
//BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount));
//BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n",
// up, dn, m, n, WaitCount));
+
+ if ( (pCoexSta->lowPriorityTx) > 1050 || (pCoexSta->lowPriorityRx) > 1250 )
+ retryCount++;
+
result = 0;
WaitCount++;
@@ -1832,6 +2050,7 @@ halbtc8723b1ant_PowerSaveState(
bLowPwrDisable = FALSE;
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
+ pCoexSta->bForceLpsOn = FALSE;
break;
case BTC_PS_LPS_ON:
halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, TRUE);
@@ -1841,10 +2060,12 @@ halbtc8723b1ant_PowerSaveState(
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
// power save must executed before psTdma.
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);
+ pCoexSta->bForceLpsOn = TRUE;
break;
case BTC_PS_LPS_OFF:
halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, FALSE);
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
+ pCoexSta->bForceLpsOn = FALSE;
break;
default:
break;
@@ -1929,6 +2150,8 @@ halbtc8723b1ant_MonitorBtEnableDisable(
//=============================================
// SCO only or SCO+PAN(HS)
+
+/*
VOID
halbtc8723b1ant_ActionSco(
IN PBTC_COEXIST pBtCoexist
@@ -2014,6 +2237,8 @@ halbtc8723b1ant_ActionHidA2dp(
halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);
}
+*/
+
//=============================================
//
// Non-Software Coex Mechanism start
@@ -2052,7 +2277,6 @@ halbtc8723b1ant_ActionBtInquiry(
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);
-
if ( (!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask) )
{
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
@@ -2060,18 +2284,16 @@ halbtc8723b1ant_ActionBtInquiry(
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
}
- else if( (pBtLinkInfo->bScoExist) ||
- (pBtLinkInfo->bHidExist) )
+ else if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) )
{
- // SCO/HID-only busy
+ // SCO/HID/A2DP busy
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
}
- else if ( (pBtLinkInfo->bA2dpExist) || (pBtLinkInfo->bPanExist) || (bWifiBusy) )
+ else if ( (pBtLinkInfo->bPanExist) || (bWifiBusy) )
{
-
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
@@ -2084,7 +2306,6 @@ halbtc8723b1ant_ActionBtInquiry(
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
}
-
}
VOID
@@ -2104,35 +2325,13 @@ halbtc8723b1ant_ActionBtScoHidOnlyBusy(
if(pBtLinkInfo->bScoExist)
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);
}
else //HID
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);
}
-/*
- if(pBtLinkInfo->bScoExist || pBtLinkInfo->bHidExist)
- {
- if(bWifiConnected)
- {
- wifiRssiState = halbtc8723b1ant_WifiRssiState(pBtCoexist, 0, 2, 30, 0);
- if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
- (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
- {
- halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 2, 1, 1, 1);
- }
- else
- {
- halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);
- }
- }
- else
- {
- halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
- }
- }
-*/
}
VOID
@@ -2146,6 +2345,15 @@ halbtc8723b1ant_ActionWifiConnectedBtAclBusy(
PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;
btRssiState = halbtc8723b1ant_BtRssiState(2, 28, 0);
+ if ( (pCoexSta->lowPriorityRx >= 1000) && (pCoexSta->lowPriorityRx != 65535) )
+ {
+ pBtLinkInfo->bSlaveRole = TRUE;
+ }
+ else
+ {
+ pBtLinkInfo->bSlaveRole = FALSE;
+ }
+
if(pBtLinkInfo->bHidOnly) //HID
{
halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus);
@@ -2156,58 +2364,47 @@ halbtc8723b1ant_ActionWifiConnectedBtAclBusy(
{
if(BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)
{
- //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
- //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
pCoexDm->bAutoTdmaAdjust = FALSE;
}
- else if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
- (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ else
{
halbtc8723b1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
- }
- else //for low BT RSSI
- {
- halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
- pCoexDm->bAutoTdmaAdjust = FALSE;
+#if 0
+ if (pCoexSta->bCCKLock)
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);
+ else
+#endif
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ pCoexDm->bAutoTdmaAdjust = TRUE;
}
}
else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist) //HID+A2DP
{
- if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
- (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
- {
- halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
- pCoexDm->bAutoTdmaAdjust = FALSE;
- }
- else //for low BT RSSI
- {
- halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
- pCoexDm->bAutoTdmaAdjust = FALSE;
- }
+ halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->bAutoTdmaAdjust = FALSE;
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
}
else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
pCoexDm->bAutoTdmaAdjust = FALSE;
}
else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||
(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist&&pBtLinkInfo->bPanExist) ) //A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
pCoexDm->bAutoTdmaAdjust = FALSE;
}
else
{
- halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ //BT no-profile busy (0x9)
+ halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
pCoexDm->bAutoTdmaAdjust = FALSE;
}
}
@@ -2221,7 +2418,7 @@ halbtc8723b1ant_ActionWifiNotConnected(
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
// tdma and coex table
- halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+ halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
}
@@ -2233,25 +2430,24 @@ halbtc8723b1ant_ActionWifiNotConnectedScan(
PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
- halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);
// tdma and coex table
if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)
{
- if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)
- {
+ if (pBtLinkInfo->bA2dpExist)
+ {
+ halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)
+ {
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
- }
- else if(pBtLinkInfo->bPanOnly)
- {
- halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
- }
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
else
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
}
}
else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||
@@ -2262,9 +2458,6 @@ halbtc8723b1ant_ActionWifiNotConnectedScan(
}
else
{
- //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
-
//Bryant Add
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
@@ -2281,12 +2474,12 @@ halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
// tdma and coex table
- if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) )
+ if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) )
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
}
- else if( (pBtLinkInfo->bA2dpExist) || (pBtLinkInfo->bPanExist) )
+ else if (pBtLinkInfo->bPanExist)
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
@@ -2296,7 +2489,6 @@ halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
}
-
}
VOID
@@ -2311,20 +2503,20 @@ halbtc8723b1ant_ActionWifiConnectedScan(
// tdma and coex table
if(BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)
{
- if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)
- {
+ if (pBtLinkInfo->bA2dpExist)
+ {
+ halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)
+ {
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
- }
- else if(pBtLinkInfo->bPanOnly)
- {
- halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
- }
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
else
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
}
}
else if( (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||
@@ -2335,9 +2527,6 @@ halbtc8723b1ant_ActionWifiConnectedScan(
}
else
{
- //halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- //halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
-
//Bryant Add
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
@@ -2354,12 +2543,12 @@ halbtc8723b1ant_ActionWifiConnectedSpecialPacket(
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
// tdma and coex table
- if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) )
+ if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist) )
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
- halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 3);
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
}
- else if( (pBtLinkInfo->bA2dpExist) || (pBtLinkInfo->bPanExist) )
+ else if(pBtLinkInfo->bPanExist)
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
@@ -2406,11 +2595,28 @@ halbtc8723b1ant_ActionWifiConnected(
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
+
// power save state
if(!bApEnable && BT_8723B_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)
{
- if(!bWifiBusy && pBtCoexist->btLinkInfo.bA2dpOnly) //A2DP
+ if(pBtCoexist->btLinkInfo.bA2dpOnly) //A2DP
+ {
+ if(!bWifiBusy)
+ halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+ else //busy
+ {
+ if (pCoexSta->nScanAPNum >= BT_8723B_1ANT_WIFI_NOISY_THRESH) //no force LPS, no PS-TDMA, use pure TDMA
+ {
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+ }
+ else
+ {
+ halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);
+ }
+ }
+ }
+ else if ((pCoexSta->bPanExist == FALSE) && (pCoexSta->bA2dpExist == FALSE) && (pCoexSta->bHidExist == FALSE))
+ halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
else
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);
}
@@ -2434,7 +2640,11 @@ halbtc8723b1ant_ActionWifiConnected(
else
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+
+ if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
+ else
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
}
}
else
@@ -2453,7 +2663,11 @@ halbtc8723b1ant_ActionWifiConnected(
else
{
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+
+ if ( (pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60 )
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
+ else
+ halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
}
}
}
@@ -2478,43 +2692,43 @@ halbtc8723b1ant_RunSwCoexistMechanism(
{
case BT_8723B_1ANT_COEX_ALGO_SCO:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = SCO.\n"));
- halbtc8723b1ant_ActionSco(pBtCoexist);
+ //halbtc8723b1ant_ActionSco(pBtCoexist);
break;
case BT_8723B_1ANT_COEX_ALGO_HID:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID.\n"));
- halbtc8723b1ant_ActionHid(pBtCoexist);
+ //halbtc8723b1ant_ActionHid(pBtCoexist);
break;
case BT_8723B_1ANT_COEX_ALGO_A2DP:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP.\n"));
- halbtc8723b1ant_ActionA2dp(pBtCoexist);
+ //halbtc8723b1ant_ActionA2dp(pBtCoexist);
break;
case BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n"));
- halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist);
+ //halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist);
break;
case BT_8723B_1ANT_COEX_ALGO_PANEDR:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR).\n"));
- halbtc8723b1ant_ActionPanEdr(pBtCoexist);
+ //halbtc8723b1ant_ActionPanEdr(pBtCoexist);
break;
case BT_8723B_1ANT_COEX_ALGO_PANHS:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HS mode.\n"));
- halbtc8723b1ant_ActionPanHs(pBtCoexist);
+ //halbtc8723b1ant_ActionPanHs(pBtCoexist);
break;
case BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN+A2DP.\n"));
- halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist);
+ //halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist);
break;
case BT_8723B_1ANT_COEX_ALGO_PANEDR_HID:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n"));
- halbtc8723b1ant_ActionPanEdrHid(pBtCoexist);
+ //halbtc8723b1ant_ActionPanEdrHid(pBtCoexist);
break;
case BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n"));
- halbtc8723b1ant_ActionHidA2dpPanEdr(pBtCoexist);
+ //halbtc8723b1ant_ActionHidA2dpPanEdr(pBtCoexist);
break;
case BT_8723B_1ANT_COEX_ALGO_HID_A2DP:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP.\n"));
- halbtc8723b1ant_ActionHidA2dp(pBtCoexist);
+ //halbtc8723b1ant_ActionHidA2dp(pBtCoexist);
break;
default:
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = coexist All Off!!\n"));
@@ -2571,62 +2785,50 @@ halbtc8723b1ant_RunCoexistMechanism(
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
numOfWifiLink = wifiLinkStatus>>16;
- if(numOfWifiLink >= 2)
+
+ if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))
{
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], Multi-Port numOfWifiLink = %d, wifiLinkStatus = 0x%x\n", numOfWifiLink,wifiLinkStatus) );
halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);
+
+ if ( (pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage) )
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], BT Is Inquirying \n") );
+ halbtc8723b1ant_ActionBtInquiry(pBtCoexist);
+ }
+ else
halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);
+
return;
}
- if(!pBtLinkInfo->bScoExist && !pBtLinkInfo->bHidExist)
+ if ( (pBtLinkInfo->bBtLinkExist) && (bWifiConnected) )
{
- halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
+ halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 0, 1);
+
+ if(pBtLinkInfo->bScoExist)
+ halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5);
+ else
+ halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x8);
+
+ halbtc8723b1ant_SwMechanism(pBtCoexist, TRUE);
+ halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); //just print debug message
}
else
{
- if(bWifiConnected)
- {
- wifiRssiState = halbtc8723b1ant_WifiRssiState(pBtCoexist, 1, 2, 30, 0);
- if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
- (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
- {
- halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);
- }
- else
- {
- halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 1, 1, 1, 1);
- }
- }
- else
- {
- halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
- }
+ halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
- }
+ halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x5);
- if(pBtLinkInfo->bScoExist)
- {
- bBtCtrlAggBufSize = TRUE;
- aggBufSize = 0x3;
- }
- else if(pBtLinkInfo->bHidExist)
- {
- bBtCtrlAggBufSize = TRUE;
- aggBufSize = 0x5;
- }
- else if(pBtLinkInfo->bA2dpExist || pBtLinkInfo->bPanExist)
- {
- bBtCtrlAggBufSize = TRUE;
- aggBufSize = 0x8;
+ halbtc8723b1ant_SwMechanism(pBtCoexist, FALSE);
+ halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); ////just print debug message
}
- halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);
-
- halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
if(pCoexSta->bC2hBtInquiryPage)
{
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], BT Is Inquirying \n") );
halbtc8723b1ant_ActionBtInquiry(pBtCoexist);
return;
}
@@ -2675,23 +2877,25 @@ halbtc8723b1ant_InitCoexDm(
//halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);
+
+ pCoexSta->popEventCnt = 0;
}
VOID
halbtc8723b1ant_InitHwConfig(
IN PBTC_COEXIST pBtCoexist,
- IN BOOLEAN bBackUp
+ IN BOOLEAN bBackUp,
+ IN BOOLEAN bWifiOnly
)
{
PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
u4Byte u4Tmp=0;//, fwVer;
u2Byte u2Tmp=0;
- u1Byte u1Tmp=0;
+ u1Byte u1Tmp=0, u1Tmpa=0, u1Tmpb=0;
u1Byte H2C_Parameter[2] ={0};
- u4Byte cntBtCalChk=0;
BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n"));
-
+#if 0//move to BTC_MEDIA_CONNECT
if(bBackUp)
{
pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);
@@ -2699,60 +2903,65 @@ halbtc8723b1ant_InitHwConfig(
pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);
pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);
}
+#endif
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x550, 0x8, 0x1); //enable TBTT nterrupt
+
+ // 0x790[5:0]=0x5
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, 0x5);
- pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1
- //pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0
+ // Enable counter statistics
+ //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);
- pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);
- pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);
//pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi
- // BT calibration check
- while(cntBtCalChk <= 20)
+ //Antenna config
+#if 1
+ if(bWifiOnly)
{
- u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x49d);
- cntBtCalChk++;
- if(u4Tmp & BIT0)
- {
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ########### BT calibration(cnt=%d) ###########\n", cntBtCalChk));
- delay_ms(50);
- }
- else
- {
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ********** BT NOT calibration (cnt=%d)**********\n", cntBtCalChk));
- break;
- }
+ halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, TRUE, FALSE);
+ halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 9);
}
+ else
+ halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);
+#endif
+
+
+#if 0
+ if(bWifiOnly)
+ {
+ halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_WIFI, BTC_WIFI_STAT_INIT);
+ halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 9);
+ }
+ else
+ halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_INIT);
+#endif
- // 0x790[5:0]=0x5
- u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);
- u1Tmp &= 0xc0;
- u1Tmp |= 0x5;
- pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);
-
- // Enable counter statistics
- pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA
- pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);
- //Antenna config
- //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);
- halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);
// PTA parameter
halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);
+
+ u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);
+ u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);
+ u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);
+
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
+ u4Tmp, u1Tmpa, u1Tmpb));
}
+/*
VOID
halbtc8723b1ant_WifiOffHwCfg(
IN PBTC_COEXIST pBtCoexist
)
{
// set wlan_act to low
- pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
+ //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
}
+*/
//============================================================
// work around function start with wa_halbtc8723b1ant_
@@ -2761,11 +2970,77 @@ halbtc8723b1ant_WifiOffHwCfg(
// extern function start with EXhalbtc8723b1ant_
//============================================================
VOID
-EXhalbtc8723b1ant_InitHwConfig(
+EXhalbtc8723b1ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
- halbtc8723b1ant_InitHwConfig(pBtCoexist, TRUE);
+ PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
+ u1Byte u1Tmp=0x0;
+ u2Byte u2Tmp=0x0;
+
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);
+
+ // enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.
+ u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);
+ pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);
+
+ // set GRAN_BT = 1
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
+ // set WLAN_ACT = 0
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
+
+ //
+ // S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)
+ // Local setting bit define
+ // BIT0: "0" for no antenna inverse; "1" for antenna inverse
+ // BIT1: "0" for internal switch; "1" for external switch
+ // BIT2: "0" for one antenna; "1" for two antenna
+ // NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0
+ if(pBtCoexist->chipInterface == BTC_INTF_USB)
+ {
+ // fixed at S0 for USB interface
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
+
+ u1Tmp |= 0x1; // antenna inverse
+ pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);
+
+ pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
+ }
+ else
+ {
+ // for PCIE and SDIO interface, we check efuse 0xc3[6]
+ if(pBoardInfo->singleAntPath == 0)
+ {
+ // set to S1
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);
+ pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+ }
+ else if(pBoardInfo->singleAntPath == 1)
+ {
+ // set to S0
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
+ u1Tmp |= 0x1; // antenna inverse
+ pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
+ }
+
+ if(pBtCoexist->chipInterface == BTC_INTF_PCI)
+ {
+ pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);
+ }
+ else if(pBtCoexist->chipInterface == BTC_INTF_SDIO)
+ {
+ pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);
+ }
+ }
+}
+
+VOID
+EXhalbtc8723b1ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
+ halbtc8723b1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);
}
VOID
@@ -2794,12 +3069,13 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
u1Byte u1Tmp[4], i, btInfoExt, psTdmaCase=0;
u2Byte u2Tmp[4];
u4Byte u4Tmp[4];
- BOOLEAN bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;
+ BOOLEAN bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE, bWifiUnderBMode = FALSE;
BOOLEAN bBtHsOn=FALSE, bWifiBusy=FALSE;
s4Byte wifiRssi=0, btHsRssi=0;
u4Byte wifiBw, wifiTrafficDir, faOfdm, faCck, wifiLinkStatus;
- u1Byte wifiDot11Chnl, wifiHsChnl;
+ u1Byte wifiDot11Chnl, wifiHsChnl, apNum;
u4Byte fwVer=0, btPatchVer=0;
+ static u1Byte PopReportIn10s = 0;
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
CL_PRINTF(cliBuf);
@@ -2819,13 +3095,6 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
CL_PRINTF(cliBuf);
}
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Ant PG Num/ Ant Mech/ Ant Pos:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos);
CL_PRINTF(cliBuf);
@@ -2855,24 +3124,26 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \
- wifiRssi, btHsRssi);
+ wifiRssi-100, btHsRssi-100);
CL_PRINTF(cliBuf);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \
- bLink, bRoam, bScan);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %s", "Wifi bLink/ bRoam/ bScan/ bHi-Pri", \
+ bLink, bRoam, bScan,((pCoexSta->bWiFiIsHighPriTask)? "1":"0"));
CL_PRINTF(cliBuf);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s/ AP=%d/ %s ", "Wifi status", \
(bWifiUnder5G? "5G":"2.4G"),
- ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),
- ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));
+ ((bWifiUnderBMode)? "11b": ((BTC_WIFI_BW_LEGACY==wifiBw)? "11bg": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20")))),
+ ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")), pCoexSta->nScanAPNum,( pCoexSta->bCCKLock)? "Lock":"noLock");
CL_PRINTF(cliBuf);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
@@ -2882,17 +3153,36 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
((wifiLinkStatus&WIFI_P2P_GC_CONNECTED)? 1:0) );
CL_PRINTF(cliBuf);
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \
+
+ PopReportIn10s++;
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d/ %d] ", "BT [status/ rssi/ retryCnt/ popCnt]", \
((pBtCoexist->btInfo.bBtDisabled)? ("disabled"): ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":
( (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),
- pCoexSta->btRssi, pCoexSta->btRetryCnt);
+ pCoexSta->btRssi, pCoexSta->btRetryCnt, pCoexSta->popEventCnt);
CL_PRINTF(cliBuf);
+ if (PopReportIn10s >= 5)
+ {
+ pCoexSta->popEventCnt = 0;
+ PopReportIn10s = 0;
+ }
+
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \
pBtLinkInfo->bScoExist, pBtLinkInfo->bHidExist, pBtLinkInfo->bPanExist, pBtLinkInfo->bA2dpExist);
CL_PRINTF(cliBuf);
+
+ if (pStackInfo->bProfileNotified)
+ {
pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);
+ }
+ else
+ {
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Role", \
+ (pBtLinkInfo->bSlaveRole )? "Slave":"Master");
+ CL_PRINTF(cliBuf);
+ }
+
btInfoExt = pCoexSta->btInfoExt;
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \
@@ -2948,13 +3238,19 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
pCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);
CL_PRINTF(cliBuf);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Coex Table Type", \
+ pCoexSta->nCoexTableType);
+ CL_PRINTF(cliBuf);
+
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "IgnWlanAct", \
pCoexDm->bCurIgnoreWlanAct);
CL_PRINTF(cliBuf);
+ /*
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \
pCoexDm->errorCondition);
CL_PRINTF(cliBuf);
+ */
}
// Hw setting
@@ -2982,9 +3278,10 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);
u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);
- u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x948/ 0x67[5] / 0x765", \
- u4Tmp[0], ((u1Tmp[0]&0x20)>> 5), u1Tmp[1]);
+ u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x764);
+ u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x948/ 0x67[5] / 0x764 / 0x76e", \
+ u4Tmp[0], ((u1Tmp[0]&0x20)>> 5), (u4Tmp[1] & 0xffff), u1Tmp[1]);
CL_PRINTF(cliBuf);
u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x92c);
@@ -3030,6 +3327,15 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
u4Tmp[0]&0xffff, faOfdm, faCck);
CL_PRINTF(cliBuf);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_OK CCK/11g/11n/11n-Agg", \
+ pCoexSta->nCRCOK_CCK, pCoexSta->nCRCOK_11g, pCoexSta->nCRCOK_11n, pCoexSta->nCRCOK_11nAgg);
+ CL_PRINTF(cliBuf);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_Err CCK/11g/11n/11n-Agg", \
+ pCoexSta->nCRCErr_CCK, pCoexSta->nCRCErr_11g, pCoexSta->nCRCErr_11n, pCoexSta->nCRCErr_11nAgg);
+ CL_PRINTF(cliBuf);
+
u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);
u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);
u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);
@@ -3044,7 +3350,7 @@ EXhalbtc8723b1ant_DisplayCoexInfo(
pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);
CL_PRINTF(cliBuf);
#if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 1)
- halbtc8723b1ant_MonitorBtCtr(pBtCoexist);
+ //halbtc8723b1ant_MonitorBtCtr(pBtCoexist);
#endif
pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);
}
@@ -3065,19 +3371,18 @@ EXhalbtc8723b1ant_IpsNotify(
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));
pCoexSta->bUnderIps = TRUE;
- halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
+
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
- halbtc8723b1ant_WifiOffHwCfg(pBtCoexist);
+ halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
+ //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);
}
else if(BTC_IPS_LEAVE == type)
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));
pCoexSta->bUnderIps = FALSE;
- //halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);
- //halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);
- halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE);
+ halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);
halbtc8723b1ant_InitCoexDm(pBtCoexist);
halbtc8723b1ant_QueryBtInfo(pBtCoexist);
}
@@ -3116,25 +3421,41 @@ EXhalbtc8723b1ant_ScanNotify(
BOOLEAN bBtCtrlAggBufSize=FALSE;
u1Byte aggBufSize=5;
+ u1Byte u1Tmpa, u1Tmpb;
+ u4Byte u4Tmp;
+
if(pBtCoexist->bManualControl ||
- pBtCoexist->bStopCoexDm ||
- pBtCoexist->btInfo.bBtDisabled )
+ pBtCoexist->bStopCoexDm )
return;
- pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
- pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
-
if(BTC_SCAN_START == type)
{
pCoexSta->bWiFiIsHighPriTask = TRUE;
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));
+
+ halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue
+ u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);
+ u1Tmpa = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);
+ u1Tmpb = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);
+
+
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
+ u4Tmp, u1Tmpa, u1Tmpb));
}
else
{
pCoexSta->bWiFiIsHighPriTask = FALSE;
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum);
}
+ if(pBtCoexist->btInfo.bBtDisabled)
+ return;
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
+
halbtc8723b1ant_QueryBtInfo(pBtCoexist);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
@@ -3205,11 +3526,13 @@ EXhalbtc8723b1ant_ConnectNotify(
{
pCoexSta->bWiFiIsHighPriTask = TRUE;
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));
+ pCoexDm->nArpCnt = 0;
}
else
{
pCoexSta->bWiFiIsHighPriTask = FALSE;
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));
+ //pCoexDm->nArpCnt = 0;
}
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
@@ -3264,6 +3587,7 @@ EXhalbtc8723b1ant_MediaStatusNotify(
u1Byte H2C_Parameter[3] ={0};
u4Byte wifiBw;
u1Byte wifiCentralChnl;
+ BOOLEAN bWifiUnderBMode = FALSE;
if(pBtCoexist->bManualControl ||
pBtCoexist->bStopCoexDm ||
@@ -3273,10 +3597,33 @@ EXhalbtc8723b1ant_MediaStatusNotify(
if(BTC_MEDIA_CONNECT == type)
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n"));
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);
+
+ //Set CCK Tx/Rx high Pri except 11b mode
+ if (bWifiUnderBMode)
+ {
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); //CCK Tx
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); //CCK Rx
+ }
+ else
+ {
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); //CCK Tx
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); //CCK Rx
+ }
+
+ pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);
+ pCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);
+ pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);
+ pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);
}
else
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));
+ pCoexDm->nArpCnt = 0;
+
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); //CCK Tx
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); //CCK Rx
}
// only 2.4G we need to inform bt the chnl mask
@@ -3321,16 +3668,29 @@ EXhalbtc8723b1ant_SpecialPacketNotify(
pBtCoexist->btInfo.bBtDisabled )
return;
- if( BTC_PACKET_DHCP == type || BTC_PACKET_EAPOL == type ||BTC_PACKET_ARP == type)
+ if( BTC_PACKET_DHCP == type ||
+ BTC_PACKET_EAPOL == type ||
+ BTC_PACKET_ARP == type )
{
- pCoexSta->bWiFiIsHighPriTask = TRUE;
-
if (BTC_PACKET_ARP == type)
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet ARP notify\n"));
+
+ pCoexDm->nArpCnt++;
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt));
+
+ if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist)
+ {
+ pCoexSta->bWiFiIsHighPriTask = FALSE;
+ }
+ else
+ {
+ pCoexSta->bWiFiIsHighPriTask = TRUE;
+ }
}
else
{
+ pCoexSta->bWiFiIsHighPriTask = TRUE;
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet DHCP or EAPOL notify\n"));
}
}
@@ -3365,9 +3725,9 @@ EXhalbtc8723b1ant_SpecialPacketNotify(
}
if( BTC_PACKET_DHCP == type ||
- BTC_PACKET_EAPOL == type || BTC_PACKET_ARP == type)
- {
- //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));
+ BTC_PACKET_EAPOL == type ||
+ ( (BTC_PACKET_ARP == type ) && (pCoexSta->bWiFiIsHighPriTask) ) )
+ {
halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);
}
}
@@ -3398,7 +3758,6 @@ EXhalbtc8723b1ant_BtInfoNotify(
pCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];
if(i == 1)
btInfo = tmpBuf[i];
-
if(i == length-1)
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i]));
@@ -3407,7 +3766,6 @@ EXhalbtc8723b1ant_BtInfoNotify(
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i]));
}
-
}
if(BT_INFO_SRC_8723B_1ANT_WIFI_FW != rspSource)
@@ -3415,22 +3773,28 @@ EXhalbtc8723b1ant_BtInfoNotify(
pCoexSta->btRetryCnt = // [3:0]
pCoexSta->btInfoC2h[rspSource][2]&0xf;
+ if (pCoexSta->btRetryCnt >= 1)
+ pCoexSta->popEventCnt++;
+
if (pCoexSta->btInfoC2h[rspSource][2]&0x20)
pCoexSta->bC2hBtPage = TRUE;
else
pCoexSta->bC2hBtPage = FALSE;
pCoexSta->btRssi =
- pCoexSta->btInfoC2h[rspSource][3]*2+10;
+ pCoexSta->btInfoC2h[rspSource][3]*2-90;
+ //pCoexSta->btInfoC2h[rspSource][3]*2+10;
pCoexSta->btInfoExt =
pCoexSta->btInfoC2h[rspSource][4];
- if (!(pCoexSta->btInfoC2h[rspSource][2] & 0x40))
+ pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);
+ if(!pCoexSta->bBtTxRxMask)
{
- /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch GNT_BT */
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch GNT_BT since BT RF REG 0x3C != 0x15\n"));
- pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x15);
+ /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n"));
+ pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);
}
// Here we need to resend some wifi info to BT
@@ -3511,6 +3875,8 @@ EXhalbtc8723b1ant_BtInfoNotify(
halbtc8723b1ant_UpdateBtLinkInfo(pBtCoexist);
+ btInfo = btInfo & 0x1f; //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)
+
if(!(btInfo&BT_INFO_8723B_1ANT_B_CONNECTION))
{
pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
@@ -3552,6 +3918,33 @@ EXhalbtc8723b1ant_BtInfoNotify(
}
VOID
+EXhalbtc8723b1ant_RfStatusNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ )
+{
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF Status notify\n"));
+
+ if(BTC_RF_ON == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF is turned ON!!\n"));
+ pBtCoexist->bStopCoexDm = FALSE;
+ }
+ else if(BTC_RF_OFF == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], RF is turned OFF!!\n"));
+
+ halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+ halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);
+ halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
+ //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);
+
+ halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
+ pBtCoexist->bStopCoexDm = TRUE;
+ }
+}
+
+VOID
EXhalbtc8723b1ant_HaltNotify(
IN PBTC_COEXIST pBtCoexist
)
@@ -3560,16 +3953,16 @@ EXhalbtc8723b1ant_HaltNotify(
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));
- pBtCoexist->bStopCoexDm = TRUE;
-
- halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
- halbtc8723b1ant_WifiOffHwCfg(pBtCoexist);
- halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
-
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);
+ halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
+ //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);
+
+ halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
EXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
+
+ pBtCoexist->bStopCoexDm = TRUE;
}
VOID
@@ -3583,24 +3976,20 @@ EXhalbtc8723b1ant_PnpNotify(
if(BTC_WIFI_PNP_SLEEP == pnpState)
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));
- pBtCoexist->bStopCoexDm = TRUE;
- /*
- halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
- halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
- halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);
- */
- halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);
halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
- halbtc8723b1ant_WifiOffHwCfg(pBtCoexist);
+ halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
+ //halbtc8723b1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);
+
+ pBtCoexist->bStopCoexDm = TRUE;
}
else if(BTC_WIFI_PNP_WAKE_UP == pnpState)
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));
pBtCoexist->bStopCoexDm = FALSE;
- halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE);
+ halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);
halbtc8723b1ant_InitCoexDm(pBtCoexist);
halbtc8723b1ant_QueryBtInfo(pBtCoexist);
}
@@ -3613,9 +4002,9 @@ EXhalbtc8723b1ant_CoexDmReset(
{
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], *****************Coex DM Reset*****************\n"));
- halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE);
- pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
- pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0);
+ halbtc8723b1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);
+ //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x2, 0xfffff, 0x0);
halbtc8723b1ant_InitCoexDm(pBtCoexist);
}
@@ -3648,16 +4037,16 @@ EXhalbtc8723b1ant_Periodical(
#if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 0)
halbtc8723b1ant_QueryBtInfo(pBtCoexist);
- halbtc8723b1ant_MonitorBtCtr(pBtCoexist);
halbtc8723b1ant_MonitorBtEnableDisable(pBtCoexist);
#else
+ halbtc8723b1ant_MonitorBtCtr(pBtCoexist);
+ halbtc8723b1ant_MonitorWiFiCtr(pBtCoexist);
+
if( halbtc8723b1ant_IsWifiStatusChanged(pBtCoexist) ||
pCoexDm->bAutoTdmaAdjust )
{
- //if(pCoexSta->specialPktPeriodCnt > 2)
- //{
- halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);
- //}
+
+ halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);
}
pCoexSta->specialPktPeriodCnt++;
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h
index f6db10a..9ebec68 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b1Ant.h
@@ -17,6 +17,8 @@
#define BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT 2
+#define BT_8723B_1ANT_WIFI_NOISY_THRESH 30 //max: 255
+
typedef enum _BT_INFO_SRC_8723B_1ANT{
BT_INFO_SRC_8723B_1ANT_WIFI_FW = 0x0,
BT_INFO_SRC_8723B_1ANT_BT_RSP = 0x1,
@@ -109,6 +111,7 @@ typedef struct _COEX_DM_8723B_1ANT{
u1Byte curRetryLimitType;
u1Byte preAmpduTimeType;
u1Byte curAmpduTimeType;
+ u4Byte nArpCnt;
u1Byte errorCondition;
} COEX_DM_8723B_1ANT, *PCOEX_DM_8723B_1ANT;
@@ -127,27 +130,51 @@ typedef struct _COEX_STA_8723B_1ANT{
u4Byte highPriorityRx;
u4Byte lowPriorityTx;
u4Byte lowPriorityRx;
- u1Byte btRssi;
+ s1Byte btRssi;
+ BOOLEAN bBtTxRxMask;
u1Byte preBtRssiState;
u1Byte preWifiRssiState[4];
BOOLEAN bC2hBtInfoReqSent;
u1Byte btInfoC2h[BT_INFO_SRC_8723B_1ANT_MAX][10];
u4Byte btInfoC2hCnt[BT_INFO_SRC_8723B_1ANT_MAX];
BOOLEAN bC2hBtInquiryPage;
+ BOOLEAN bC2hBtPage; //Add for win8.1 page out issue
+ BOOLEAN bWiFiIsHighPriTask; //Add for win8.1 page out issue
u1Byte btRetryCnt;
u1Byte btInfoExt;
- BOOLEAN bWiFiIsHighPriTask;
- BOOLEAN bC2hBtPage;
+ u4Byte popEventCnt;
+ u1Byte nScanAPNum;
+
+ u4Byte nCRCOK_CCK;
+ u4Byte nCRCOK_11g;
+ u4Byte nCRCOK_11n;
+ u4Byte nCRCOK_11nAgg;
+
+ u4Byte nCRCErr_CCK;
+ u4Byte nCRCErr_11g;
+ u4Byte nCRCErr_11n;
+ u4Byte nCRCErr_11nAgg;
+
+ BOOLEAN bCCKLock;
+ BOOLEAN bPreCCKLock;
+ u1Byte nCoexTableType;
+
+ BOOLEAN bForceLpsOn;
}COEX_STA_8723B_1ANT, *PCOEX_STA_8723B_1ANT;
//===========================================
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8723b1ant_InitHwConfig(
+EXhalbtc8723b1ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8723b1ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8723b1ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
@@ -188,6 +215,11 @@ EXhalbtc8723b1ant_BtInfoNotify(
IN u1Byte length
);
VOID
+EXhalbtc8723b1ant_RfStatusNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ );
+VOID
EXhalbtc8723b1ant_HaltNotify(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c
index dc29ba2..34795bd 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.c
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8723b2Ant[]={
"BT Info[bt auto report]",
};
-u4Byte GLCoexVerDate8723b2Ant=20131113;
-u4Byte GLCoexVer8723b2Ant=0x3f;
+u4Byte GLCoexVerDate8723b2Ant=20131211;
+u4Byte GLCoexVer8723b2Ant=0x40;
//============================================================
// local function proto type if needed
@@ -304,6 +304,31 @@ halbtc8723b2ant_MonitorBtEnableDisable(
}
VOID
+halbtc8723b2ant_LimitedRx(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bRejApAggPkt,
+ IN BOOLEAN bBtCtrlAggBufSize,
+ IN u1Byte aggBufSize
+ )
+{
+ BOOLEAN bRejectRxAgg=bRejApAggPkt;
+ BOOLEAN bBtCtrlRxAggSize=bBtCtrlAggBufSize;
+ u1Byte rxAggSize=aggBufSize;
+
+ //============================================
+ // Rx Aggregation related setting
+ //============================================
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);
+ // decide BT control aggregation buf size or not
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);
+ // aggregation buf size, only work when BT control Rx aggregation size.
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);
+ // real update aggregation setting
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
+}
+
+VOID
halbtc8723b2ant_MonitorBtCtr(
IN PBTC_COEXIST pBtCoexist
)
@@ -685,50 +710,6 @@ halbtc8723b2ant_ActionAlgorithm(
return algorithm;
}
-BOOLEAN
-halbtc8723b2ant_NeedToDecBtPwr(
- IN PBTC_COEXIST pBtCoexist
- )
-{
- BOOLEAN bRet=FALSE;
- BOOLEAN bBtHsOn=FALSE, bWifiConnected=FALSE;
- s4Byte btHsRssi=0;
- u1Byte btRssiState;
-
- if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))
- return FALSE;
- if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected))
- return FALSE;
- if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))
- return FALSE;
-
- btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
-
- if(bWifiConnected)
- {
- if(bBtHsOn)
- {
- if(btHsRssi > 37)
- {
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n"));
- bRet = TRUE;
- }
- }
- else
- {
- if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
- (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
- {
-
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n"));
- bRet = TRUE;
- }
- }
- }
-
- return bRet;
-}
-
VOID
halbtc8723b2ant_SetFwDacSwingLevel(
IN PBTC_COEXIST pBtCoexist,
@@ -750,20 +731,15 @@ halbtc8723b2ant_SetFwDacSwingLevel(
VOID
halbtc8723b2ant_SetFwDecBtPwr(
IN PBTC_COEXIST pBtCoexist,
- IN BOOLEAN bDecBtPwr
+ IN u1Byte decBtPwrLvl
)
{
u1Byte H2C_Parameter[1] ={0};
- H2C_Parameter[0] = 0;
-
- if(bDecBtPwr)
- {
- H2C_Parameter[0] |= BIT1;
- }
+ H2C_Parameter[0] = decBtPwrLvl;
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n",
- (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0]));
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power level = %d, FW write 0x62=0x%x\n",
+ decBtPwrLvl, H2C_Parameter[0]));
pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);
}
@@ -772,24 +748,24 @@ VOID
halbtc8723b2ant_DecBtPwr(
IN PBTC_COEXIST pBtCoexist,
IN BOOLEAN bForceExec,
- IN BOOLEAN bDecBtPwr
+ IN u1Byte decBtPwrLvl
)
{
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n",
- (bForceExec? "force to":""), ((bDecBtPwr)? "ON":"OFF")));
- pCoexDm->bCurDecBtPwr = bDecBtPwr;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power level = %d\n",
+ (bForceExec? "force to":""), decBtPwrLvl));
+ pCoexDm->curBtDecPwrLvl = decBtPwrLvl;
if(!bForceExec)
{
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n",
- pCoexDm->bPreDecBtPwr, pCoexDm->bCurDecBtPwr));
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n",
+ pCoexDm->preBtDecPwrLvl, pCoexDm->curBtDecPwrLvl));
- if(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr)
+ if(pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl)
return;
}
- halbtc8723b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->bCurDecBtPwr);
+ halbtc8723b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);
- pCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;
+ pCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;
}
VOID
@@ -1249,7 +1225,7 @@ halbtc8723b2ant_CoexTableWithType(
halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);
break;
case 7:
- halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);
+ halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0xfafafafa, 0xffff, 0x3);
break;
case 8:
halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);
@@ -1401,26 +1377,33 @@ halbtc8723b2ant_SetAntPath(
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); // [31:16]=fw ver, [15:0]=fw sub ver
- if((fwVer<0xc0000) || bPgExtSwitch)
+ if((fwVer>0 && fwVer<0xc0000) || bPgExtSwitch)
bUseExtSwitch = TRUE;
if(bInitHwCfg)
{
- // 0x4c[23]=0, 0x4c[24]=1 Antenna control by WL/BT
- u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
- u4Tmp &=~BIT23;
- u4Tmp |= BIT24;
- pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
-
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);
pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);
pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1);
- //Force GNT_BT to low
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0);
+ if(fwVer >= 0x180000)
+ {
+ /* Use H2C to set GNT_BT to LOW */
+ H2C_Parameter[0] = 0;
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
+ }
+ else
+ {
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);
+ }
+
pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi TRx Mask off
+ pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); //BT TRx Mask off
+
if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
{
//tell firmware "no antenna inverse"
@@ -1445,10 +1428,18 @@ halbtc8723b2ant_SetAntPath(
pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
}
-
// ext switch setting
if(bUseExtSwitch)
{
+ if (bInitHwCfg)
+ {
+ // 0x4c[23]=0, 0x4c[24]=1 Antenna control by WL/BT
+ u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
+ u4Tmp &=~BIT23;
+ u4Tmp |= BIT24;
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
+ }
+
pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); // fixed internal switch S1->WiFi, S0->BT
switch(antPosType)
{
@@ -1462,8 +1453,16 @@ halbtc8723b2ant_SetAntPath(
}
else // internal switch
{
- // fixed ext switch
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);
+ if (bInitHwCfg)
+ {
+ // 0x4c[23]=0, 0x4c[24]=1 Antenna control by WL/BT
+ u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
+ u4Tmp |= BIT23;
+ u4Tmp &=~BIT24;
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
+ }
+
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //fixed external switch S1->Main, S0->Aux
switch(antPosType)
{
case BTC_ANT_WIFI_AT_MAIN:
@@ -1606,7 +1605,7 @@ halbtc8723b2ant_CoexAllOff(
// fw all off
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
// sw all off
halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
@@ -1626,7 +1625,7 @@ halbtc8723b2ant_InitCoexDm(
halbtc8723b2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);
- halbtc8723b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);
halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
@@ -1654,7 +1653,7 @@ halbtc8723b2ant_ActionBtInquiry(
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
}
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
@@ -1669,6 +1668,7 @@ halbtc8723b2ant_IsCommonAction(
IN PBTC_COEXIST pBtCoexist
)
{
+ u1Byte btRssiState=BTC_RSSI_STATE_HIGH;
BOOLEAN bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;
BOOLEAN bBtHsOn=FALSE, bLowPwrDisable=FALSE;
@@ -1680,6 +1680,7 @@ halbtc8723b2ant_IsCommonAction(
{
bLowPwrDisable = FALSE;
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-connected idle!!\n"));
@@ -1687,7 +1688,7 @@ halbtc8723b2ant_IsCommonAction(
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
@@ -1700,6 +1701,7 @@ halbtc8723b2ant_IsCommonAction(
{
bLowPwrDisable = FALSE;
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n"));
@@ -1707,7 +1709,7 @@ halbtc8723b2ant_IsCommonAction(
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
@@ -1722,12 +1724,13 @@ halbtc8723b2ant_IsCommonAction(
if(bBtHsOn)
return FALSE;
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n"));
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
@@ -1750,15 +1753,17 @@ halbtc8723b2ant_IsCommonAction(
return FALSE;
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n"));
+ btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
halbtc8723b2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
bCommon = TRUE;
@@ -2685,19 +2690,22 @@ halbtc8723b2ant_ActionSco(
IN PBTC_COEXIST pBtCoexist
)
{
- u1Byte wifiRssiState;
+ u1Byte wifiRssiState, btRssiState;
u4Byte wifiBw;
wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
+
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
@@ -2757,12 +2765,14 @@ halbtc8723b2ant_ActionHid(
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
+
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
@@ -2837,8 +2847,9 @@ halbtc8723b2ant_ActionA2dp(
{
//DbgPrint(" AP#>10(%d)\n", apNum);
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
@@ -2858,13 +2869,14 @@ halbtc8723b2ant_ActionA2dp(
}
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
@@ -2915,19 +2927,22 @@ halbtc8723b2ant_ActionA2dpPanHs(
IN PBTC_COEXIST pBtCoexist
)
{
- u1Byte wifiRssiState;
+ u1Byte wifiRssiState, btRssiState;
u4Byte wifiBw;
wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
+
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
@@ -2978,12 +2993,14 @@ halbtc8723b2ant_ActionPanEdr(
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
+
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 10);
@@ -3036,24 +3053,22 @@ halbtc8723b2ant_ActionPanHs(
IN PBTC_COEXIST pBtCoexist
)
{
- u1Byte wifiRssiState;
+ u1Byte wifiRssiState, btRssiState;
u4Byte wifiBw;
wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
+
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
- (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
- {
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
- }
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- {
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
- }
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
@@ -3104,12 +3119,14 @@ halbtc8723b2ant_ActionPanEdrA2dp(
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
+
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
@@ -3171,10 +3188,12 @@ halbtc8723b2ant_ActionPanEdrHid(
btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
+
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
@@ -3246,12 +3265,14 @@ halbtc8723b2ant_ActionHidA2dpPanEdr(
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 0x8);
+
halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
@@ -3308,20 +3329,44 @@ halbtc8723b2ant_ActionHidA2dp(
{
u1Byte wifiRssiState, btRssiState;
u4Byte wifiBw;
+ u1Byte apNum=0;
wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
- btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
+ //btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
+ btRssiState = halbtc8723b2ant_BtRssiState(3, 29, 37);
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
- halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+ halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, TRUE, 0x5);
- if(halbtc8723b2ant_NeedToDecBtPwr(pBtCoexist))
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
- else
- halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+ if(BTC_WIFI_BW_LEGACY == wifiBw)
+ {
+ if(BTC_RSSI_HIGH(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
+ else if(BTC_RSSI_MEDIUM(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
+ else
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
+ }
+ else
+ { // only 802.11N mode we have to dec bt power to 4 degree
+ if(BTC_RSSI_HIGH(btRssiState))
+ {
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
+ // need to check ap Number of Not
+ if(apNum < 10)
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);
+ else
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
+ }
+ else if(BTC_RSSI_MEDIUM(btRssiState))
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
+ else
+ halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
+ }
halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
@@ -3477,29 +3522,37 @@ halbtc8723b2ant_WifiOffHwCfg(
IN PBTC_COEXIST pBtCoexist
)
{
- PADAPTER padapter=pBtCoexist->Adapter;
+ BOOLEAN bIsInMpMode = FALSE;
+ u1Byte H2C_Parameter[2] ={0};
+ u4Byte fwVer=0;
+
// set wlan_act to low
pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); //WiFi goto standby while GNT_BT 0-->1
-
- //Force GNT_BT to High
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);
- if(padapter->registrypriv.mp_mode ==0)
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
+ if(fwVer >= 0x180000)
+ {
+ /* Use H2C to set GNT_BT to HIGH */
+ H2C_Parameter[0] = 1;
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
+ }
+ else
+ {
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
+ }
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);
+ if(!bIsInMpMode)
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); //BT select s0/s1 is controlled by BT
else
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); //BT select s0/s1 is controlled by WiFi
}
-//============================================================
-// work around function start with wa_halbtc8723b2ant_
-//============================================================
-//============================================================
-// extern function start with EXhalbtc8723b2ant_
-//============================================================
VOID
-EXhalbtc8723b2ant_InitHwConfig(
- IN PBTC_COEXIST pBtCoexist
+halbtc8723b2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bBackUp
)
{
PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
@@ -3511,9 +3564,6 @@ EXhalbtc8723b2ant_InitHwConfig(
BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));
- //pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi goto standby while GNT_BT 0-->1
- //pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x1); //BT goto standby while GNT_BT 1-->0
-
// backup rf 0x1e value
pCoexDm->btRf0x1eBackup =
pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);
@@ -3534,8 +3584,86 @@ EXhalbtc8723b2ant_InitHwConfig(
pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA
pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);
+}
- pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); //WiFi goto standby while GNT_BT 0-->1
+//============================================================
+// work around function start with wa_halbtc8723b2ant_
+//============================================================
+//============================================================
+// extern function start with EXhalbtc8723b2ant_
+//============================================================
+VOID
+EXhalbtc8723b2ant_PowerOnSetting(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
+ u1Byte u1Tmp=0x4; /* Set BIT2 by default since it's 2ant case */
+ u2Byte u2Tmp=0x0;
+
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);
+
+ // enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly.
+ u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);
+ pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);
+
+ // set GRAN_BT = 1
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
+ // set WLAN_ACT = 0
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
+
+ //
+ // S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info)
+ // Local setting bit define
+ // BIT0: "0" for no antenna inverse; "1" for antenna inverse
+ // BIT1: "0" for internal switch; "1" for external switch
+ // BIT2: "0" for one antenna; "1" for two antenna
+ // NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0
+ if(pBtCoexist->chipInterface == BTC_INTF_USB)
+ {
+ // fixed at S0 for USB interface
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
+
+ u1Tmp |= 0x1; // antenna inverse
+ pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);
+
+ pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
+ }
+ else
+ {
+ // for PCIE and SDIO interface, we check efuse 0xc3[6]
+ if(pBoardInfo->singleAntPath == 0)
+ {
+ // set to S1
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);
+ pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+ }
+ else if(pBoardInfo->singleAntPath == 1)
+ {
+ // set to S0
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
+ u1Tmp |= 0x1; // antenna inverse
+ pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
+ }
+
+ if(pBtCoexist->chipInterface == BTC_INTF_PCI)
+ {
+ pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);
+ }
+ else if(pBtCoexist->chipInterface == BTC_INTF_SDIO)
+ {
+ pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);
+ }
+ }
+}
+
+VOID
+EXhalbtc8723b2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
+ halbtc8723b2ant_InitHwConfig(pBtCoexist, TRUE);
}
VOID
@@ -3578,13 +3706,6 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
CL_PRINTF(cliBuf);
}
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
@@ -3692,7 +3813,7 @@ EXhalbtc8723b2ant_DisplayCoexInfo(
CL_PRINTF(cliBuf);
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \
- pCoexDm->bCurDecBtPwr, pCoexDm->bCurIgnoreWlanAct);
+ pCoexDm->curBtDecPwrLvl, pCoexDm->bCurIgnoreWlanAct);
CL_PRINTF(cliBuf);
// Hw setting
@@ -3800,7 +3921,7 @@ EXhalbtc8723b2ant_IpsNotify(
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));
pCoexSta->bUnderIps = FALSE;
- EXhalbtc8723b2ant_InitHwConfig(pBtCoexist);
+ halbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);
halbtc8723b2ant_InitCoexDm(pBtCoexist);
halbtc8723b2ant_QueryBtInfo(pBtCoexist);
}
@@ -3865,6 +3986,7 @@ EXhalbtc8723b2ant_MediaStatusNotify(
u1Byte H2C_Parameter[3] ={0};
u4Byte wifiBw;
u1Byte wifiCentralChnl;
+ u1Byte apNum=0;
if(BTC_MEDIA_CONNECT == type)
{
@@ -3886,7 +4008,13 @@ EXhalbtc8723b2ant_MediaStatusNotify(
if(BTC_WIFI_BW_HT40 == wifiBw)
H2C_Parameter[2] = 0x30;
else
- H2C_Parameter[2] = 0x20;
+ {
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
+ if(apNum < 10)
+ H2C_Parameter[2] = 0x30;
+ else
+ H2C_Parameter[2] = 0x20;
+ }
}
pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];
@@ -3966,11 +4094,13 @@ EXhalbtc8723b2ant_BtInfoNotify(
pCoexSta->btInfoExt =
pCoexSta->btInfoC2h[rspSource][4];
- if (pCoexSta->btInfoC2h[rspSource][2] & 0x40)
+ pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);
+ if (pCoexSta->bBtTxRxMask)
{
- /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch GNT_BT */
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch GNT_BT since BT RF REG 0x3C != 0x01\n"));
- pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x01);
+ /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n"));
+ pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01);
}
// Here we need to resend some wifi info to BT
@@ -4104,13 +4234,34 @@ EXhalbtc8723b2ant_HaltNotify(
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));
halbtc8723b2ant_WifiOffHwCfg(pBtCoexist);
- pBtCoexist->fBtcSetBtReg(pBtCoexist, 0, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0
+ pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); //BT goto standby while GNT_BT 1-->0
halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
EXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
}
VOID
+EXhalbtc8723b2ant_PnpNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte pnpState
+ )
+{
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));
+
+ if(BTC_WIFI_PNP_SLEEP == pnpState)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));
+ }
+ else if(BTC_WIFI_PNP_WAKE_UP == pnpState)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));
+ halbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);
+ halbtc8723b2ant_InitCoexDm(pBtCoexist);
+ halbtc8723b2ant_QueryBtInfo(pBtCoexist);
+ }
+}
+
+VOID
EXhalbtc8723b2ant_Periodical(
IN PBTC_COEXIST pBtCoexist
)
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h
index b894db0..d16466d 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8723b2Ant.h
@@ -49,8 +49,8 @@ typedef enum _BT_8723B_2ANT_COEX_ALGO{
typedef struct _COEX_DM_8723B_2ANT{
// fw mechanism
- BOOLEAN bPreDecBtPwr;
- BOOLEAN bCurDecBtPwr;
+ u1Byte preBtDecPwrLvl;
+ u1Byte curBtDecPwrLvl;
u1Byte preFwDacSwingLvl;
u1Byte curFwDacSwingLvl;
BOOLEAN bCurIgnoreWlanAct;
@@ -114,6 +114,7 @@ typedef struct _COEX_STA_8723B_2ANT{
u4Byte lowPriorityTx;
u4Byte lowPriorityRx;
u1Byte btRssi;
+ BOOLEAN bBtTxRxMask;
u1Byte preBtRssiState;
u1Byte preWifiRssiState[4];
BOOLEAN bC2hBtInfoReqSent;
@@ -128,10 +129,15 @@ typedef struct _COEX_STA_8723B_2ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8723b2ant_InitHwConfig(
+EXhalbtc8723b2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8723b2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8723b2ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
@@ -176,6 +182,11 @@ EXhalbtc8723b2ant_HaltNotify(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8723b2ant_PnpNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte pnpState
+ );
+VOID
EXhalbtc8723b2ant_Periodical(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c
index 9f4e49a..d705431 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.c
@@ -2092,10 +2092,18 @@ halbtc8812a1ant_InitCoexDm(
// extern function start with EXhalbtc8812a1ant_
//============================================================
VOID
-EXhalbtc8812a1ant_InitHwConfig(
+EXhalbtc8812a1ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
+}
+
+VOID
+EXhalbtc8812a1ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
u4Byte u4Tmp=0;
u2Byte u2Tmp=0;
u1Byte u1Tmp=0;
@@ -2185,13 +2193,6 @@ EXhalbtc8812a1ant_DisplayCoexInfo(
CL_PRINTF(cliBuf);
}
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h
index 652e723..4f2df7a 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a1Ant.h
@@ -132,10 +132,15 @@ typedef struct _COEX_STA_8812A_1ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8812a1ant_InitHwConfig(
+EXhalbtc8812a1ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8812a1ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8812a1ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c
index c7add94..e073709 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.c
@@ -4126,10 +4126,18 @@ halbtc8812a2ant_InitHwConfig(
// extern function start with EXhalbtc8812a2ant_
//============================================================
VOID
-EXhalbtc8812a2ant_InitHwConfig(
+EXhalbtc8812a2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
+}
+
+VOID
+EXhalbtc8812a2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
halbtc8812a2ant_InitHwConfig(pBtCoexist, TRUE);
}
@@ -4173,13 +4181,6 @@ EXhalbtc8812a2ant_DisplayCoexInfo(
CL_PRINTF(cliBuf);
}
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h
index 31c78d3..4f6f5d1 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8812a2Ant.h
@@ -148,10 +148,15 @@ typedef struct _COEX_STA_8812A_2ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8812a2ant_InitHwConfig(
+EXhalbtc8812a2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8812a2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8812a2ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c
index 8728a47..130566a 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.c
@@ -1,7 +1,7 @@
//============================================================
// Description:
//
-// This file is for RTL8821A Co-exist mechanism
+// This file is for 8821A_1ANT Co-exist mechanism
//
// History
// 2012/11/15 Cosa first check in.
@@ -27,8 +27,8 @@ const char *const GLBtInfoSrc8821a1Ant[]={
"BT Info[bt auto report]",
};
-u4Byte GLCoexVerDate8821a1Ant=20130816;
-u4Byte GLCoexVer8821a1Ant=0x41;
+u4Byte GLCoexVerDate8821a1Ant=20140306;
+u4Byte GLCoexVer8821a1Ant=0x4b;
//============================================================
// local function proto type if needed
@@ -420,7 +420,17 @@ halbtc8821a1ant_MonitorBtCtr(
u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;
u1Byte u1Tmp, u1Tmp1;
s4Byte wifiRssi;
-
+#if 0
+ //to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS
+ if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8) )
+ {
+ pCoexSta->highPriorityTx = 65535;
+ pCoexSta->highPriorityRx = 65535;
+ pCoexSta->lowPriorityTx = 65535;
+ pCoexSta->lowPriorityRx = 65535;
+ return;
+ }
+#endif
regHPTxRx = 0x770;
regLPTxRx = 0x774;
@@ -915,6 +925,8 @@ halbtc8821a1ant_CoexTableWithType(
IN u1Byte type
)
{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** CoexTable(%d) **********\n", type));
+
switch(type)
{
case 0:
@@ -927,19 +939,19 @@ halbtc8821a1ant_CoexTableWithType(
halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);
break;
case 3:
- halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);
+ halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaaaaaa, 0xffffff, 0x3);
break;
case 4:
- halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffffff, 0x3);
+ halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);
break;
case 5:
- halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3);
+ halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3);
break;
case 6:
- halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3);
+ halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3);
break;
case 7:
- halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0x5afa5afa, 0x5afa5afa, 0xffffff, 0x3);
+ halbtc8821a1ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);
break;
default:
break;
@@ -1000,18 +1012,35 @@ halbtc8821a1ant_SetFwPstdma(
)
{
u1Byte H2C_Parameter[5] ={0};
+ u1Byte realByte1=byte1, realByte5=byte5;
+ BOOLEAN bApEnable=FALSE;
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
+
+ if(bApEnable)
+ {
+ if(byte1&BIT4 && !(byte1&BIT5))
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], FW for 1Ant AP mode\n"));
+ realByte1 &= ~BIT4;
+ realByte1 |= BIT5;
- H2C_Parameter[0] = byte1;
+ realByte5 |= BIT5;
+ realByte5 &= ~BIT6;
+ }
+ }
+
+ H2C_Parameter[0] = realByte1;
H2C_Parameter[1] = byte2;
H2C_Parameter[2] = byte3;
H2C_Parameter[3] = byte4;
- H2C_Parameter[4] = byte5;
+ H2C_Parameter[4] = realByte5;
- pCoexDm->psTdmaPara[0] = byte1;
+ pCoexDm->psTdmaPara[0] = realByte1;
pCoexDm->psTdmaPara[1] = byte2;
pCoexDm->psTdmaPara[2] = byte3;
pCoexDm->psTdmaPara[3] = byte4;
- pCoexDm->psTdmaPara[4] = byte5;
+ pCoexDm->psTdmaPara[4] = realByte5;
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
H2C_Parameter[0],
@@ -1075,7 +1104,8 @@ halbtc8821a1ant_SwMechanism(
IN BOOLEAN bLowPenaltyRA
)
{
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], SM[LpRA] = %d \n", bLowPenaltyRA));
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], SM[LpRA] = %d\n",
+ bLowPenaltyRA));
halbtc8821a1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);
}
@@ -1100,8 +1130,8 @@ halbtc8821a1ant_SetAntPath(
u4Tmp |= BIT24;
pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x975, 0x3, 0x3);
- pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);
+ //0x765 = 0x18
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);
if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
{
@@ -1110,7 +1140,7 @@ halbtc8821a1ant_SetAntPath(
H2C_Parameter[1] = 1;
pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to BT for IPS case 0x4c[23]=1
+ //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x1); //Main Ant to BT for IPS case 0x4c[23]=1
}
else
{
@@ -1119,7 +1149,7 @@ halbtc8821a1ant_SetAntPath(
H2C_Parameter[1] = 1;
pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
- pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to BT for IPS case 0x4c[23]=1
+ //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); //Aux Ant to BT for IPS case 0x4c[23]=1
}
}
else if(bWifiOff)
@@ -1129,18 +1159,28 @@ halbtc8821a1ant_SetAntPath(
u4Tmp &= ~BIT23;
u4Tmp &= ~BIT24;
pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
+
+ //0x765 = 0x18
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x3);
+ }
+ else
+ {
+ //0x765 = 0x0
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x765, 0x18, 0x0);
}
// ext switch setting
switch(antPosType)
{
case BTC_ANT_PATH_WIFI:
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);
if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);
else
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);
break;
case BTC_ANT_PATH_BT:
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);
if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);
else
@@ -1148,6 +1188,7 @@ halbtc8821a1ant_SetAntPath(
break;
default:
case BTC_ANT_PATH_PTA:
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x66);
if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);
else
@@ -1167,25 +1208,24 @@ halbtc8821a1ant_PsTdma(
PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
BOOLEAN bTurnOnByCnt=FALSE;
u1Byte psTdmaTypeByCnt=0, rssiAdjustVal=0;
- u4Byte fwVer=0;
+ //u4Byte fwVer=0;
pCoexDm->bCurPsTdmaOn = bTurnOn;
pCoexDm->curPsTdma = type;
- if(!bForceExec)
+ if (pCoexDm->bCurPsTdmaOn)
{
- if (pCoexDm->bCurPsTdmaOn)
- {
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(on, %d) **********\n",
- pCoexDm->curPsTdma));
- }
- else
- {
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], ********** TDMA(off, %d) **********\n",
- pCoexDm->curPsTdma));
- }
-
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(on, %d) **********\n",
+ pCoexDm->curPsTdma));
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ********** TDMA(off, %d) **********\n",
+ pCoexDm->curPsTdma));
+ }
+ if(!bForceExec)
+ {
if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&
(pCoexDm->prePsTdma == pCoexDm->curPsTdma) )
return;
@@ -1206,7 +1246,7 @@ halbtc8821a1ant_PsTdma(
rssiAdjustVal = 14;
break;
case 3:
- halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x10);
+ halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x52);
break;
case 4:
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0);
@@ -1216,7 +1256,7 @@ halbtc8821a1ant_PsTdma(
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x10);
break;
case 6:
- halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x0, 0x0);
+ halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x13);
break;
case 7:
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0);
@@ -1232,17 +1272,17 @@ halbtc8821a1ant_PsTdma(
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40);
break;
case 11:
- halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x14, 0x03, 0x10, 0x10);
+ halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x15, 0x03, 0x10, 0x50);
rssiAdjustVal = 20;
break;
case 12:
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);
break;
case 13:
- halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x18, 0x18, 0x0, 0x10);
+ halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x12, 0x12, 0x0, 0x50);
break;
case 14:
- halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x10);
+ halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x21, 0x3, 0x10, 0x52);
break;
case 15:
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0);
@@ -1259,7 +1299,7 @@ halbtc8821a1ant_PsTdma(
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x03, 0x11, 0x10);
break;
case 21:
- halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x15, 0x03, 0x11, 0x10);
+ halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11);
break;
case 22:
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10);
@@ -1291,13 +1331,13 @@ halbtc8821a1ant_PsTdma(
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);
break;
case 30:
- halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x14, 0x3, 0x10, 0x50);
+ halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10);
break;
case 31:
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);
break;
case 32:
- halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0xa, 0x3, 0x10, 0x0);
+ halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11);
break;
case 33:
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90);
@@ -1311,6 +1351,10 @@ halbtc8821a1ant_PsTdma(
case 36:
halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 0x50);
break;
+ case 40: // SoftAP only with no sta associated,BT disable ,TDMA mode for power saving
+ /* here softap mode screen off will cost 70-80mA for phone */
+ halbtc8821a1ant_SetFwPstdma(pBtCoexist, 0x23, 0x18, 0x00, 0x10, 0x24);
+ break;
}
}
else
@@ -1702,29 +1746,6 @@ halbtc8821a1ant_CoexUnder5G(
halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, FALSE, 5);
}
-#define WIFI_ONLY_CHECK_UNDER_5G
-#ifdef WIFI_ONLY_CHECK_UNDER_5G
-VOID
-halbtc8821a1ant_ActionWifiOnly(
- IN PBTC_COEXIST pBtCoexist
- )
-{
- BOOLEAN bWifiUnder5G=FALSE;
-
- pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);
-
- if (bWifiUnder5G)
- {
- halbtc8821a1ant_CoexUnder5G(pBtCoexist);
- return;
- }
- else
- {
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);
- }
-}
-#else
VOID
halbtc8821a1ant_ActionWifiOnly(
IN PBTC_COEXIST pBtCoexist
@@ -1733,7 +1754,6 @@ halbtc8821a1ant_ActionWifiOnly(
halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);
}
-#endif
VOID
halbtc8821a1ant_MonitorBtEnableDisable(
@@ -1893,6 +1913,16 @@ halbtc8821a1ant_ActionHidA2dp(
// Non-Software Coex Mechanism start
//
//=============================================
+VOID
+halbtc8821a1ant_ActionWifiMultiPort(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
+}
VOID
halbtc8821a1ant_ActionHs(
@@ -1900,38 +1930,50 @@ halbtc8821a1ant_ActionHs(
)
{
halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 2);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
}
VOID
halbtc8821a1ant_ActionBtInquiry(
IN PBTC_COEXIST pBtCoexist
)
-{
+{
PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;
- BOOLEAN bWifiConnected=FALSE;
-
+ BOOLEAN bWifiConnected=FALSE, bApEnable=FALSE, bWifiBusy=FALSE, bBtBusy=FALSE;
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);
- if(!bWifiConnected)
+ if((!bWifiConnected) && (!pCoexSta->bWiFiIsHighPriTask))
{
halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
}
- else if( (pBtLinkInfo->bScoExist) ||
- (pBtLinkInfo->bHidOnly) )
+ else if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))
{
- // SCO/HID-only busy
+ // SCO/HID/A2DP busy
halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ else if ((pBtLinkInfo->bPanExist) || (bWifiBusy))
+ {
+ halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
+
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
}
else
{
- halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 30);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
}
}
@@ -1941,13 +1983,24 @@ halbtc8821a1ant_ActionBtScoHidOnlyBusy(
IN u1Byte wifiStatus
)
{
+ PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;
+ BOOLEAN bWifiConnected=FALSE;
+ u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH;
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
+
// tdma and coex table
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
- if(BT_8821A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifiStatus)
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
- else
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ if(pBtLinkInfo->bScoExist)
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
+ }
+ else //HID
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5);
+ }
}
VOID
@@ -1969,18 +2022,26 @@ halbtc8821a1ant_ActionWifiConnectedBtAclBusy(
}
else if(pBtLinkInfo->bA2dpOnly) //A2DP
{
- if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ if(BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifiStatus)
+ {
+ //halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+ //halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ pCoexDm->bAutoTdmaAdjust = FALSE;
+ }
+ else if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
(btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
{
- halbtc8821a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);
+ halbtc8821a1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
}
else //for low BT RSSI
{
halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
pCoexDm->bAutoTdmaAdjust = FALSE;
- }
-
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ }
}
else if(pBtLinkInfo->bHidExist&&pBtLinkInfo->bA2dpExist) //HID+A2DP
{
@@ -1992,16 +2053,16 @@ halbtc8821a1ant_ActionWifiConnectedBtAclBusy(
}
else //for low BT RSSI
{
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
pCoexDm->bAutoTdmaAdjust = FALSE;
}
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);
}
else if( (pBtLinkInfo->bPanOnly) || (pBtLinkInfo->bHidExist&&pBtLinkInfo->bPanExist) ) //PAN(OPP,FTP), HID+PAN(OPP,FTP)
{
halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 6);
pCoexDm->bAutoTdmaAdjust = FALSE;
}
else if ( ((pBtLinkInfo->bA2dpExist) && (pBtLinkInfo->bPanExist)) ||
@@ -2028,20 +2089,80 @@ halbtc8821a1ant_ActionWifiNotConnected(
halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
// tdma and coex table
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+ halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);
halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
}
VOID
-halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(
+halbtc8821a1ant_ActionWifiNotConnectedScan(
IN PBTC_COEXIST pBtCoexist
)
{
+ PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;
+
halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+
+ // tdma and coex table
+ if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)
+ {
+ if (pBtLinkInfo->bA2dpExist)
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ else
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ }
+ else if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||
+ (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )
+ {
+ halbtc8821a1ant_ActionBtScoHidOnlyBusy(pBtCoexist,
+ BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
+ }
+ else
+ {
+ //halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
+ //halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ //Bryant Add
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
+ }
+}
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+VOID
+halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;
+
+ halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+
+ // tdma and coex table
+ if( (pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) )
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ else if( (pBtLinkInfo->bA2dpExist) || (pBtLinkInfo->bPanExist) )
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ else
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
+ }
}
VOID
@@ -2051,22 +2172,26 @@ halbtc8821a1ant_ActionWifiConnectedScan(
{
PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;
- // power save state
halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
// tdma and coex table
if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)
{
- if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)
+ if (pBtLinkInfo->bA2dpExist)
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)
{
halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
}
else
{
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
- }
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
}
else if( (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||
(BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus) )
@@ -2076,8 +2201,12 @@ halbtc8821a1ant_ActionWifiConnectedScan(
}
else
{
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ //halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
+ //halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+
+ //Bryant Add
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
}
}
@@ -2086,31 +2215,25 @@ halbtc8821a1ant_ActionWifiConnectedSpecialPacket(
IN PBTC_COEXIST pBtCoexist
)
{
- BOOLEAN bHsConnecting=FALSE;
PBTC_BT_LINK_INFO pBtLinkInfo=&pBtCoexist->btLinkInfo;
- pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_CONNECTING, &bHsConnecting);
-
halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
// tdma and coex table
- if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)
+ if((pBtLinkInfo->bScoExist) || (pBtLinkInfo->bHidExist) || (pBtLinkInfo->bA2dpExist))
{
- if(pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)
- {
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 22);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
- }
- else
- {
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
- }
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 32);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
}
- else
+ else if(pBtLinkInfo->bPanExist)
{
halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 20);
- halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 1);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4);
+ }
+ else
+ {
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
}
}
@@ -2121,7 +2244,7 @@ halbtc8821a1ant_ActionWifiConnected(
{
BOOLEAN bWifiBusy=FALSE;
BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE;
- BOOLEAN bUnder4way=FALSE;
+ BOOLEAN bUnder4way=FALSE, bApEnable=FALSE;
u4Byte wifiBw;
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect()===>\n"));
@@ -2139,19 +2262,28 @@ halbtc8821a1ant_ActionWifiConnected(
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
if(bScan || bLink || bRoam)
{
- halbtc8821a1ant_ActionWifiConnectedScan(pBtCoexist);
+ if(bScan)
+ halbtc8821a1ant_ActionWifiConnectedScan(pBtCoexist);
+ else
+ halbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n"));
return;
}
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
// power save state
- if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)
- halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);
+ if(!bApEnable && BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus && !pBtCoexist->btLinkInfo.bHidOnly)
+ {
+ if(!bWifiBusy && pBtCoexist->btLinkInfo.bA2dpOnly) //A2DP
+ halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
+ else
+ halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4);
+ }
else
halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
// tdma and coex table
- pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
if(!bWifiBusy)
{
if(BT_8821A_1ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus)
@@ -2167,7 +2299,7 @@ halbtc8821a1ant_ActionWifiConnected(
}
else
{
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
}
}
@@ -2186,7 +2318,7 @@ halbtc8821a1ant_ActionWifiConnected(
}
else
{
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
}
}
@@ -2270,6 +2402,8 @@ halbtc8821a1ant_RunCoexistMechanism(
BOOLEAN bBtCtrlAggBufSize=FALSE;
u1Byte aggBufSize=5;
u1Byte wifiRssiState=BTC_RSSI_STATE_HIGH;
+ u4Byte wifiLinkStatus=0;
+ u4Byte numOfWifiLink=0;
BOOLEAN bWifiUnder5G=FALSE;
BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n"));
@@ -2308,9 +2442,18 @@ halbtc8821a1ant_RunCoexistMechanism(
}
pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_INC_SCAN_DEV_NUM, &bIncreaseScanDevNum);
-
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
+ numOfWifiLink = wifiLinkStatus>>16;
+ if((numOfWifiLink>=2) || (wifiLinkStatus&WIFI_P2P_GO_CONNECTED))
+ {
+ halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
+ halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);
+ halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);
+ return;
+ }
+
if(!pBtLinkInfo->bScoExist && !pBtLinkInfo->bHidExist)
{
halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
@@ -2380,7 +2523,12 @@ halbtc8821a1ant_RunCoexistMechanism(
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
if(bScan || bLink || bRoam)
- halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist);
+ {
+ if (bScan)
+ halbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist);
+ else
+ halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);
+ }
else
halbtc8821a1ant_ActionWifiNotConnected(pBtCoexist);
}
@@ -2399,14 +2547,15 @@ halbtc8821a1ant_InitCoexDm(
// sw all off
halbtc8821a1ant_SwMechanism(pBtCoexist, FALSE);
- halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);
+ //halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8);
halbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);
}
VOID
halbtc8821a1ant_InitHwConfig(
IN PBTC_COEXIST pBtCoexist,
- IN BOOLEAN bBackUp
+ IN BOOLEAN bBackUp,
+ IN BOOLEAN bWifiOnly
)
{
PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
@@ -2416,9 +2565,12 @@ halbtc8821a1ant_InitHwConfig(
u1Byte H2C_Parameter[2] ={0};
BOOLEAN bWifiUnder5G=FALSE;
-
+
BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n"));
+ if(bWifiOnly)
+ return;
+
if(bBackUp)
{
pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);
@@ -2440,6 +2592,7 @@ halbtc8821a1ant_InitHwConfig(
halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, TRUE, FALSE);
else
halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_PTA, TRUE, FALSE);
+
// PTA parameter
halbtc8821a1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);
@@ -2456,11 +2609,19 @@ halbtc8821a1ant_InitHwConfig(
// extern function start with EXhalbtc8821a1ant_
//============================================================
VOID
-EXhalbtc8821a1ant_InitHwConfig(
+EXhalbtc8821a1ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
- halbtc8821a1ant_InitHwConfig(pBtCoexist, TRUE);
+}
+
+VOID
+EXhalbtc8821a1ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
+ halbtc8821a1ant_InitHwConfig(pBtCoexist, TRUE, bWifiOnly);
}
VOID
@@ -2492,7 +2653,7 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
BOOLEAN bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;
BOOLEAN bBtHsOn=FALSE, bWifiBusy=FALSE;
s4Byte wifiRssi=0, btHsRssi=0;
- u4Byte wifiBw, wifiTrafficDir;
+ u4Byte wifiBw, wifiTrafficDir, faOfdm, faCck, wifiLinkStatus;
u1Byte wifiDot11Chnl, wifiHsChnl;
u4Byte fwVer=0, btPatchVer=0;
@@ -2514,13 +2675,6 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
CL_PRINTF(cliBuf);
}
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d", "Ant PG Num/ Ant Mech/ Ant Pos:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos);
CL_PRINTF(cliBuf);
@@ -2569,6 +2723,14 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),
((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));
CL_PRINTF(cliBuf);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "sta/vwifi/hs/p2pGo/p2pGc", \
+ ((wifiLinkStatus&WIFI_STA_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_AP_CONNECTED)? 1:0),
+ ((wifiLinkStatus&WIFI_HS_CONNECTED)? 1:0), ((wifiLinkStatus&WIFI_P2P_GO_CONNECTED)? 1:0),
+ ((wifiLinkStatus&WIFI_P2P_GC_CONNECTED)? 1:0) );
+ CL_PRINTF(cliBuf);
+
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \
((pBtCoexist->btInfo.bBtDisabled)? ("disabled"): ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus)? "non-connected idle":
( (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy")))),
@@ -2634,13 +2796,13 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
pCoexDm->psTdmaPara[4], psTdmaCase, pCoexDm->bAutoTdmaAdjust);
CL_PRINTF(cliBuf);
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \
- pCoexDm->errorCondition);
- CL_PRINTF(cliBuf);
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ", "IgnWlanAct", \
pCoexDm->bCurIgnoreWlanAct);
CL_PRINTF(cliBuf);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \
+ pCoexDm->errorCondition);
+ CL_PRINTF(cliBuf);
}
// Hw setting
@@ -2705,9 +2867,8 @@ EXhalbtc8821a1ant_DisplayCoexInfo(
u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);
u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);
u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);
- u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \
- u4Tmp[0], u4Tmp[1], u4Tmp[2], u1Tmp[0]);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8(coexTable)", \
+ u4Tmp[0], u4Tmp[1], u4Tmp[2]);
CL_PRINTF(cliBuf);
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x770(high-pri rx/tx)", \
@@ -2738,17 +2899,20 @@ EXhalbtc8821a1ant_IpsNotify(
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));
pCoexSta->bUnderIps = TRUE;
- halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
- //set PTA control
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 8);
+
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);
halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
+ halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
+ //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);
}
else if(BTC_IPS_LEAVE == type)
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));
pCoexSta->bUnderIps = FALSE;
- halbtc8821a1ant_RunCoexistMechanism(pBtCoexist);
+ halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);
+ halbtc8821a1ant_InitCoexDm(pBtCoexist);
+ halbtc8821a1ant_QueryBtInfo(pBtCoexist);
}
}
@@ -2780,10 +2944,29 @@ EXhalbtc8821a1ant_ScanNotify(
)
{
BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;
+ u4Byte wifiLinkStatus=0;
+ u4Byte numOfWifiLink=0;
+ BOOLEAN bBtCtrlAggBufSize=FALSE;
+ u1Byte aggBufSize=5;
if(pBtCoexist->bManualControl ||
- pBtCoexist->bStopCoexDm ||
- pBtCoexist->btInfo.bBtDisabled )
+ pBtCoexist->bStopCoexDm )
+ return;
+
+ if(BTC_SCAN_START == type)
+ {
+ pCoexSta->bWiFiIsHighPriTask = TRUE;
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));
+
+ halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 8); //Force antenna setup for no scan result issue
+ }
+ else
+ {
+ pCoexSta->bWiFiIsHighPriTask = FALSE;
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));
+ }
+
+ if(pBtCoexist->btInfo.bBtDisabled)
return;
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
@@ -2791,6 +2974,16 @@ EXhalbtc8821a1ant_ScanNotify(
halbtc8821a1ant_QueryBtInfo(pBtCoexist);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
+ numOfWifiLink = wifiLinkStatus>>16;
+ if(numOfWifiLink >= 2)
+ {
+ halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
+ halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);
+ halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);
+ return;
+ }
+
if(pCoexSta->bC2hBtInquiryPage)
{
halbtc8821a1ant_ActionBtInquiry(pBtCoexist);
@@ -2804,10 +2997,10 @@ EXhalbtc8821a1ant_ScanNotify(
if(BTC_SCAN_START == type)
{
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));
+ //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));
if(!bWifiConnected) // non-connected scan
{
- halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist);
+ halbtc8821a1ant_ActionWifiNotConnectedScan(pBtCoexist);
}
else // wifi is connected
{
@@ -2816,7 +3009,7 @@ EXhalbtc8821a1ant_ScanNotify(
}
else if(BTC_SCAN_FINISH == type)
{
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));
+ //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));
if(!bWifiConnected) // non-connected scan
{
halbtc8821a1ant_ActionWifiNotConnected(pBtCoexist);
@@ -2835,12 +3028,39 @@ EXhalbtc8821a1ant_ConnectNotify(
)
{
BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;
+ u4Byte wifiLinkStatus=0;
+ u4Byte numOfWifiLink=0;
+ BOOLEAN bBtCtrlAggBufSize=FALSE;
+ u1Byte aggBufSize=5;
if(pBtCoexist->bManualControl ||
pBtCoexist->bStopCoexDm ||
pBtCoexist->btInfo.bBtDisabled )
return;
+ if(BTC_ASSOCIATE_START == type)
+ {
+ pCoexSta->bWiFiIsHighPriTask = TRUE;
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));
+ pCoexDm->nArpCnt = 0;
+ }
+ else
+ {
+ pCoexSta->bWiFiIsHighPriTask = FALSE;
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));
+ pCoexDm->nArpCnt = 0;
+ }
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
+ numOfWifiLink = wifiLinkStatus>>16;
+ if(numOfWifiLink >= 2)
+ {
+ halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
+ halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);
+ halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);
+ return;
+ }
+
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
if(pCoexSta->bC2hBtInquiryPage)
{
@@ -2855,12 +3075,12 @@ EXhalbtc8821a1ant_ConnectNotify(
if(BTC_ASSOCIATE_START == type)
{
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));
- halbtc8821a1ant_ActionWifiNotConnectedAssoAuthScan(pBtCoexist);
+ //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));
+ halbtc8821a1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);
}
else if(BTC_ASSOCIATE_FINISH == type)
{
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));
+ //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
if(!bWifiConnected) // non-connected scan
@@ -2896,6 +3116,7 @@ EXhalbtc8821a1ant_MediaStatusNotify(
else
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));
+ pCoexDm->nArpCnt = 0;
}
// only 2.4G we need to inform bt the chnl mask
@@ -2930,14 +3151,49 @@ EXhalbtc8821a1ant_SpecialPacketNotify(
)
{
BOOLEAN bBtHsOn=FALSE;
+ u4Byte wifiLinkStatus=0;
+ u4Byte numOfWifiLink=0;
+ BOOLEAN bBtCtrlAggBufSize=FALSE;
+ u1Byte aggBufSize=5;
if(pBtCoexist->bManualControl ||
pBtCoexist->bStopCoexDm ||
pBtCoexist->btInfo.bBtDisabled )
return;
+ if( BTC_PACKET_DHCP == type ||
+ BTC_PACKET_EAPOL == type ||
+ BTC_PACKET_ARP == type )
+ {
+ pCoexSta->bWiFiIsHighPriTask = TRUE;
+
+ if(BTC_PACKET_ARP == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet ARP notify\n"));
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet DHCP or EAPOL notify\n"));
+ }
+ }
+ else
+ {
+ pCoexSta->bWiFiIsHighPriTask = FALSE;
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet [Type = %d] notify\n", type));
+ }
+
pCoexSta->specialPktPeriodCnt = 0;
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
+ numOfWifiLink = wifiLinkStatus>>16;
+ if(numOfWifiLink >= 2)
+ {
+ halbtc8821a1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0);
+ halbtc8821a1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, FALSE, bBtCtrlAggBufSize, aggBufSize);
+ halbtc8821a1ant_ActionWifiMultiPort(pBtCoexist);
+ return;
+ }
+
pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
if(pCoexSta->bC2hBtInquiryPage)
{
@@ -2951,9 +3207,18 @@ EXhalbtc8821a1ant_SpecialPacketNotify(
}
if( BTC_PACKET_DHCP == type ||
- BTC_PACKET_EAPOL == type )
+ BTC_PACKET_EAPOL == type ||
+ BTC_PACKET_ARP == type )
{
- BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));
+ //BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));
+ if(BTC_PACKET_ARP == type)
+ {
+ pCoexDm->nArpCnt++;
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], ARP Packet Count = %d\n", pCoexDm->nArpCnt));
+ if(pCoexDm->nArpCnt >= 10) // if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist)
+ return;
+ }
+
halbtc8821a1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);
}
}
@@ -3002,12 +3267,26 @@ EXhalbtc8821a1ant_BtInfoNotify(
pCoexSta->btRetryCnt = // [3:0]
pCoexSta->btInfoC2h[rspSource][2]&0xf;
+ if (pCoexSta->btInfoC2h[rspSource][2]&0x20)
+ pCoexSta->bC2hBtPage = TRUE;
+ else
+ pCoexSta->bC2hBtPage = FALSE;
+
pCoexSta->btRssi =
pCoexSta->btInfoC2h[rspSource][3]*2+10;
pCoexSta->btInfoExt =
pCoexSta->btInfoC2h[rspSource][4];
+ pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);
+ if(!pCoexSta->bBtTxRxMask)
+ {
+ /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n"));
+ pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);
+ }
+
// Here we need to resend some wifi info to BT
// because bt is reset and loss of the info.
if(pCoexSta->btInfoExt & BIT1)
@@ -3043,7 +3322,6 @@ EXhalbtc8821a1ant_BtInfoNotify(
}
else
{
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit4 check, set BT to enable Auto Report!!\n"));
halbtc8821a1ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);
}
#endif
@@ -3087,6 +3365,8 @@ EXhalbtc8821a1ant_BtInfoNotify(
halbtc8821a1ant_UpdateBtLinkInfo(pBtCoexist);
+ btInfo = btInfo & 0x1f; //mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41)
+
if(!(btInfo&BT_INFO_8821A_1ANT_B_CONNECTION))
{
pCoexDm->btStatus = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
@@ -3136,15 +3416,16 @@ EXhalbtc8821a1ant_HaltNotify(
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));
- pBtCoexist->bStopCoexDm = TRUE;
-
- halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
- halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
-
halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
halbtc8821a1ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 0);
+ halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
+ //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);
+
+ halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
EXhalbtc8821a1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
+
+ pBtCoexist->bStopCoexDm = TRUE;
}
VOID
@@ -3158,16 +3439,20 @@ EXhalbtc8821a1ant_PnpNotify(
if(BTC_WIFI_PNP_SLEEP == pnpState)
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));
- pBtCoexist->bStopCoexDm = TRUE;
- halbtc8821a1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
+
halbtc8821a1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
- halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 9);
+ halbtc8821a1ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0);
+ halbtc8821a1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
+ halbtc8821a1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, FALSE, TRUE);
+ //halbtc8821a1ant_SetAntPathDCut(pBtCoexist, FALSE, FALSE, FALSE, BTC_ANT_PATH_BT, BTC_WIFI_STAT_NORMAL_OFF);
+
+ pBtCoexist->bStopCoexDm = TRUE;
}
else if(BTC_WIFI_PNP_WAKE_UP == pnpState)
{
BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));
pBtCoexist->bStopCoexDm = FALSE;
- halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE);
+ halbtc8821a1ant_InitHwConfig(pBtCoexist, FALSE, FALSE);
halbtc8821a1ant_InitCoexDm(pBtCoexist);
halbtc8821a1ant_QueryBtInfo(pBtCoexist);
}
@@ -3208,10 +3493,10 @@ EXhalbtc8821a1ant_Periodical(
if( halbtc8821a1ant_IsWifiStatusChanged(pBtCoexist) ||
pCoexDm->bAutoTdmaAdjust )
{
- if(pCoexSta->specialPktPeriodCnt > 2)
- {
+ //if(pCoexSta->specialPktPeriodCnt > 2)
+ //{
halbtc8821a1ant_RunCoexistMechanism(pBtCoexist);
- }
+ //}
}
pCoexSta->specialPktPeriodCnt++;
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.h
index a9656ab..4c7469e 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a1Ant.h
@@ -1,7 +1,7 @@
//===========================================
// The following is for 8821A 1ANT BT Co-exist definition
//===========================================
-#define BT_AUTO_REPORT_ONLY_8821A_1ANT 0
+#define BT_AUTO_REPORT_ONLY_8821A_1ANT 1
#define BT_INFO_8821A_1ANT_B_FTP BIT7
#define BT_INFO_8821A_1ANT_B_A2DP BIT6
@@ -108,6 +108,7 @@ typedef struct _COEX_DM_8821A_1ANT{
u1Byte curRetryLimitType;
u1Byte preAmpduTimeType;
u1Byte curAmpduTimeType;
+ u4Byte nArpCnt;
u1Byte errorCondition;
} COEX_DM_8821A_1ANT, *PCOEX_DM_8821A_1ANT;
@@ -127,12 +128,15 @@ typedef struct _COEX_STA_8821A_1ANT{
u4Byte lowPriorityTx;
u4Byte lowPriorityRx;
u1Byte btRssi;
+ BOOLEAN bBtTxRxMask;
u1Byte preBtRssiState;
u1Byte preWifiRssiState[4];
BOOLEAN bC2hBtInfoReqSent;
u1Byte btInfoC2h[BT_INFO_SRC_8821A_1ANT_MAX][10];
u4Byte btInfoC2hCnt[BT_INFO_SRC_8821A_1ANT_MAX];
BOOLEAN bC2hBtInquiryPage;
+ BOOLEAN bC2hBtPage; //Add for win8.1 page out issue
+ BOOLEAN bWiFiIsHighPriTask; //Add for win8.1 page out issue
u1Byte btRetryCnt;
u1Byte btInfoExt;
}COEX_STA_8821A_1ANT, *PCOEX_STA_8821A_1ANT;
@@ -141,10 +145,15 @@ typedef struct _COEX_STA_8821A_1ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8821a1ant_InitHwConfig(
+EXhalbtc8821a1ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8821a1ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8821a1ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
@@ -201,10 +210,4 @@ VOID
EXhalbtc8821a1ant_DisplayCoexInfo(
IN PBTC_COEXIST pBtCoexist
);
-VOID
-EXhalbtc8821a1ant_DbgControl(
- IN PBTC_COEXIST pBtCoexist,
- IN u1Byte opCode,
- IN u1Byte opLen,
- IN pu1Byte pData
- );
+
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c
index 0d51379..520c769 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.c
@@ -687,97 +687,6 @@ halbtc8821a2ant_DecBtPwr(
}
VOID
-halbtc8821a2ant_SetFwBtLnaConstrain(
- IN PBTC_COEXIST pBtCoexist,
- IN BOOLEAN bBtLnaConsOn
- )
-{
- u1Byte H2C_Parameter[2] ={0};
-
- H2C_Parameter[0] = 0x3; // opCode, 0x3=BT_SET_LNA_CONSTRAIN
-
- if(bBtLnaConsOn)
- {
- H2C_Parameter[1] |= BIT0;
- }
-
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT LNA Constrain: %s, FW write 0x69=0x%x\n",
- (bBtLnaConsOn? "ON!!":"OFF!!"),
- H2C_Parameter[0]<<8|H2C_Parameter[1]));
-
- pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 2, H2C_Parameter);
-}
-
-VOID
-halbtc8821a2ant_SetBtLnaConstrain(
- IN PBTC_COEXIST pBtCoexist,
- IN BOOLEAN bForceExec,
- IN BOOLEAN bBtLnaConsOn
- )
-{
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Constrain = %s\n",
- (bForceExec? "force":""), ((bBtLnaConsOn)? "ON":"OFF")));
- pCoexDm->bCurBtLnaConstrain = bBtLnaConsOn;
-
- if(!bForceExec)
- {
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtLnaConstrain=%d, bCurBtLnaConstrain=%d\n",
- pCoexDm->bPreBtLnaConstrain, pCoexDm->bCurBtLnaConstrain));
-
- if(pCoexDm->bPreBtLnaConstrain == pCoexDm->bCurBtLnaConstrain)
- return;
- }
- halbtc8821a2ant_SetFwBtLnaConstrain(pBtCoexist, pCoexDm->bCurBtLnaConstrain);
-
- pCoexDm->bPreBtLnaConstrain = pCoexDm->bCurBtLnaConstrain;
-}
-
-VOID
-halbtc8821a2ant_SetFwBtPsdMode(
- IN PBTC_COEXIST pBtCoexist,
- IN u1Byte btPsdMode
- )
-{
- u1Byte H2C_Parameter[2] ={0};
-
- H2C_Parameter[0] = 0x2; // opCode, 0x2=BT_SET_PSD_MODE
-
- H2C_Parameter[1] = btPsdMode;
-
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT PSD mode=0x%x, FW write 0x69=0x%x\n",
- H2C_Parameter[1],
- H2C_Parameter[0]<<8|H2C_Parameter[1]));
-
- pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 2, H2C_Parameter);
-}
-
-
-VOID
-halbtc8821a2ant_SetBtPsdMode(
- IN PBTC_COEXIST pBtCoexist,
- IN BOOLEAN bForceExec,
- IN u1Byte btPsdMode
- )
-{
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT PSD mode = 0x%x\n",
- (bForceExec? "force":""), btPsdMode));
- pCoexDm->bCurBtPsdMode = btPsdMode;
-
- if(!bForceExec)
- {
- BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtPsdMode=0x%x, bCurBtPsdMode=0x%x\n",
- pCoexDm->bPreBtPsdMode, pCoexDm->bCurBtPsdMode));
-
- if(pCoexDm->bPreBtPsdMode == pCoexDm->bCurBtPsdMode)
- return;
- }
- halbtc8821a2ant_SetFwBtPsdMode(pBtCoexist, pCoexDm->bCurBtPsdMode);
-
- pCoexDm->bPreBtPsdMode = pCoexDm->bCurBtPsdMode;
-}
-
-
-VOID
halbtc8821a2ant_SetBtAutoReport(
IN PBTC_COEXIST pBtCoexist,
IN BOOLEAN bEnableAutoReport
@@ -1470,6 +1379,8 @@ halbtc8821a2ant_CoexUnder5G(
)
{
halbtc8821a2ant_CoexAllOff(pBtCoexist);
+
+ halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);
}
VOID
@@ -3598,10 +3509,18 @@ halbtc8821a2ant_RunCoexistMechanism(
// extern function start with EXhalbtc8821a2ant_
//============================================================
VOID
-EXhalbtc8821a2ant_InitHwConfig(
+EXhalbtc8821a2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
)
{
+}
+
+VOID
+EXhalbtc8821a2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
u4Byte u4Tmp=0;
u2Byte u2Tmp=0;
@@ -3663,13 +3582,6 @@ EXhalbtc8821a2ant_DisplayCoexInfo(
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
CL_PRINTF(cliBuf);
- if(!pBoardInfo->bBtExist)
- {
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
- CL_PRINTF(cliBuf);
- return;
- }
-
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
CL_PRINTF(cliBuf);
@@ -3766,8 +3678,8 @@ EXhalbtc8821a2ant_DisplayCoexInfo(
// Sw mechanism
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");
CL_PRINTF(cliBuf);
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig/ btLna]", \
- pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig, pCoexDm->bCurBtLnaConstrain);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig]", \
+ pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);
CL_PRINTF(cliBuf);
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ", "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \
pCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);
@@ -4000,11 +3912,11 @@ EXhalbtc8821a2ant_BtInfoNotify(
{
u1Byte btInfo=0;
u1Byte i, rspSource=0;
- static u4Byte setBtLnaCnt=0, setBtPsdMode=0;
BOOLEAN bBtBusy=FALSE, bLimitedDig=FALSE;
- BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE;
+ BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE, bWifiUnder5G=FALSE;
pCoexSta->bC2hBtInfoReqSent = FALSE;
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);
rspSource = tmpBuf[0]&0xf;
if(rspSource >= BT_INFO_SRC_8821A_2ANT_MAX)
@@ -4027,6 +3939,7 @@ EXhalbtc8821a2ant_BtInfoNotify(
}
}
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
if(BT_INFO_SRC_8821A_2ANT_WIFI_FW != rspSource)
{
pCoexSta->btRetryCnt = // [3:0]
@@ -4037,12 +3950,12 @@ EXhalbtc8821a2ant_BtInfoNotify(
pCoexSta->btInfoExt =
pCoexSta->btInfoC2h[rspSource][4];
-
+
// Here we need to resend some wifi info to BT
// because bt is reset and loss of the info.
if( (pCoexSta->btInfoExt & BIT1) )
{
- pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
+
if(bWifiConnected)
{
EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);
@@ -4051,42 +3964,28 @@ EXhalbtc8821a2ant_BtInfoNotify(
{
EXhalbtc8821a2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
}
-
- setBtPsdMode = 0;
- }
- if(setBtPsdMode <= 3)
- {
- halbtc8821a2ant_SetBtPsdMode(pBtCoexist, FORCE_EXEC, 0x0); //fix CH-BW mode
- setBtPsdMode++;
}
-
- if(pCoexDm->bCurBtLnaConstrain)
+
+ if(!pBtCoexist->bManualControl && !bWifiUnder5G)
{
- if( (pCoexSta->btInfoExt & BIT2) )
+ if( (pCoexSta->btInfoExt&BIT3) )
{
+ if(bWifiConnected)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"));
+ halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);
+ }
}
else
{
- if(setBtLnaCnt <= 3)
+ // BT already NOT ignore Wlan active, do nothing here.
+ if(!bWifiConnected)
{
- halbtc8821a2ant_SetBtLnaConstrain(pBtCoexist, FORCE_EXEC, TRUE);
- setBtLnaCnt++;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n"));
+ halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
}
}
}
- else
- {
- setBtLnaCnt = 0;
- }
-
- if( (pCoexSta->btInfoExt & BIT3) )
- {
- halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);
- }
- else
- {
- // BT already NOT ignore Wlan active, do nothing here.
- }
if( (pCoexSta->btInfoExt & BIT4) )
{
@@ -4186,6 +4085,25 @@ EXhalbtc8821a2ant_HaltNotify(
}
VOID
+EXhalbtc8821a2ant_PnpNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte pnpState
+ )
+{
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));
+
+ if(BTC_WIFI_PNP_SLEEP == pnpState)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));
+ halbtc8821a2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
+ }
+ else if(BTC_WIFI_PNP_WAKE_UP == pnpState)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));
+ }
+}
+
+VOID
EXhalbtc8821a2ant_Periodical(
IN PBTC_COEXIST pBtCoexist
)
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h
index 95266a1..3da5517 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821a2Ant.h
@@ -45,10 +45,6 @@ typedef struct _COEX_DM_8821A_2ANT{
// fw mechanism
BOOLEAN bPreDecBtPwr;
BOOLEAN bCurDecBtPwr;
- BOOLEAN bPreBtLnaConstrain;
- BOOLEAN bCurBtLnaConstrain;
- u1Byte bPreBtPsdMode;
- u1Byte bCurBtPsdMode;
u1Byte preFwDacSwingLvl;
u1Byte curFwDacSwingLvl;
BOOLEAN bCurIgnoreWlanAct;
@@ -122,10 +118,15 @@ typedef struct _COEX_STA_8821A_2ANT{
// The following is interface which will notify coex module.
//===========================================
VOID
-EXhalbtc8821a2ant_InitHwConfig(
+EXhalbtc8821a2ant_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8821a2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtc8821a2ant_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
@@ -170,6 +171,11 @@ EXhalbtc8821a2ant_HaltNotify(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtc8821a2ant_PnpNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte pnpState
+ );
+VOID
EXhalbtc8821a2ant_Periodical(
IN PBTC_COEXIST pBtCoexist
);
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c
new file mode 100755
index 0000000..5fc7bb4
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.c
@@ -0,0 +1,4140 @@
+//============================================================
+// Description:
+//
+// This file is for RTL8821A_CSR_CSR Co-exist mechanism
+//
+// History
+// 2012/08/22 Cosa first check in.
+// 2012/11/14 Cosa Revise for 8821A_CSR 2Ant out sourcing.
+//
+//============================================================
+
+//============================================================
+// include files
+//============================================================
+#include "Mp_Precomp.h"
+#if(BT_30_SUPPORT == 1)
+//============================================================
+// Global variables, these are static variables
+//============================================================
+static COEX_DM_8821A_CSR_2ANT GLCoexDm8821aCsr2Ant;
+static PCOEX_DM_8821A_CSR_2ANT pCoexDm=&GLCoexDm8821aCsr2Ant;
+static COEX_STA_8821A_CSR_2ANT GLCoexSta8821aCsr2Ant;
+static PCOEX_STA_8821A_CSR_2ANT pCoexSta=&GLCoexSta8821aCsr2Ant;
+
+const char *const GLBtInfoSrc8821aCsr2Ant[]={
+ "BT Info[wifi fw]",
+ "BT Info[bt rsp]",
+ "BT Info[bt auto report]",
+};
+
+u4Byte GLCoexVerDate8821aCsr2Ant=20130618;
+u4Byte GLCoexVer8821aCsr2Ant=0x5050;
+
+//============================================================
+// local function proto type if needed
+//============================================================
+//============================================================
+// local function start with halbtc8821aCsr2ant_
+//============================================================
+u1Byte
+halbtc8821aCsr2ant_BtRssiState(
+ u1Byte levelNum,
+ u1Byte rssiThresh,
+ u1Byte rssiThresh1
+ )
+{
+ s4Byte btRssi=0;
+ u1Byte btRssiState=pCoexSta->preBtRssiState;
+
+ btRssi = pCoexSta->btRssi;
+
+ if(levelNum == 2)
+ {
+ if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||
+ (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))
+ {
+ if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))
+ {
+ btRssiState = BTC_RSSI_STATE_HIGH;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));
+ }
+ else
+ {
+ btRssiState = BTC_RSSI_STATE_STAY_LOW;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));
+ }
+ }
+ else
+ {
+ if(btRssi < rssiThresh)
+ {
+ btRssiState = BTC_RSSI_STATE_LOW;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));
+ }
+ else
+ {
+ btRssiState = BTC_RSSI_STATE_STAY_HIGH;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));
+ }
+ }
+ }
+ else if(levelNum == 3)
+ {
+ if(rssiThresh > rssiThresh1)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n"));
+ return pCoexSta->preBtRssiState;
+ }
+
+ if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||
+ (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW))
+ {
+ if(btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))
+ {
+ btRssiState = BTC_RSSI_STATE_MEDIUM;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));
+ }
+ else
+ {
+ btRssiState = BTC_RSSI_STATE_STAY_LOW;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));
+ }
+ }
+ else if( (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||
+ (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM))
+ {
+ if(btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))
+ {
+ btRssiState = BTC_RSSI_STATE_HIGH;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));
+ }
+ else if(btRssi < rssiThresh)
+ {
+ btRssiState = BTC_RSSI_STATE_LOW;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));
+ }
+ else
+ {
+ btRssiState = BTC_RSSI_STATE_STAY_MEDIUM;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n"));
+ }
+ }
+ else
+ {
+ if(btRssi < rssiThresh1)
+ {
+ btRssiState = BTC_RSSI_STATE_MEDIUM;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));
+ }
+ else
+ {
+ btRssiState = BTC_RSSI_STATE_STAY_HIGH;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));
+ }
+ }
+ }
+
+ pCoexSta->preBtRssiState = btRssiState;
+
+ return btRssiState;
+}
+
+u1Byte
+halbtc8821aCsr2ant_WifiRssiState(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte index,
+ IN u1Byte levelNum,
+ IN u1Byte rssiThresh,
+ IN u1Byte rssiThresh1
+ )
+{
+ s4Byte wifiRssi=0;
+ u1Byte wifiRssiState=pCoexSta->preWifiRssiState[index];
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
+
+ if(levelNum == 2)
+ {
+ if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||
+ (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))
+ {
+ if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))
+ {
+ wifiRssiState = BTC_RSSI_STATE_HIGH;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));
+ }
+ else
+ {
+ wifiRssiState = BTC_RSSI_STATE_STAY_LOW;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));
+ }
+ }
+ else
+ {
+ if(wifiRssi < rssiThresh)
+ {
+ wifiRssiState = BTC_RSSI_STATE_LOW;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));
+ }
+ else
+ {
+ wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));
+ }
+ }
+ }
+ else if(levelNum == 3)
+ {
+ if(rssiThresh > rssiThresh1)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n"));
+ return pCoexSta->preWifiRssiState[index];
+ }
+
+ if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||
+ (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW))
+ {
+ if(wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))
+ {
+ wifiRssiState = BTC_RSSI_STATE_MEDIUM;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));
+ }
+ else
+ {
+ wifiRssiState = BTC_RSSI_STATE_STAY_LOW;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));
+ }
+ }
+ else if( (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||
+ (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM))
+ {
+ if(wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT))
+ {
+ wifiRssiState = BTC_RSSI_STATE_HIGH;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));
+ }
+ else if(wifiRssi < rssiThresh)
+ {
+ wifiRssiState = BTC_RSSI_STATE_LOW;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));
+ }
+ else
+ {
+ wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n"));
+ }
+ }
+ else
+ {
+ if(wifiRssi < rssiThresh1)
+ {
+ wifiRssiState = BTC_RSSI_STATE_MEDIUM;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));
+ }
+ else
+ {
+ wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));
+ }
+ }
+ }
+
+ pCoexSta->preWifiRssiState[index] = wifiRssiState;
+
+ return wifiRssiState;
+}
+
+VOID
+halbtc8821aCsr2ant_MonitorBtEnableDisable(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ static BOOLEAN bPreBtDisabled=FALSE;
+ static u4Byte btDisableCnt=0;
+ BOOLEAN bBtActive=TRUE, bBtDisabled=FALSE;
+
+ // This function check if bt is disabled
+
+ if( pCoexSta->highPriorityTx == 0 &&
+ pCoexSta->highPriorityRx == 0 &&
+ pCoexSta->lowPriorityTx == 0 &&
+ pCoexSta->lowPriorityRx == 0)
+ {
+ bBtActive = FALSE;
+ }
+ if( pCoexSta->highPriorityTx == 0xffff &&
+ pCoexSta->highPriorityRx == 0xffff &&
+ pCoexSta->lowPriorityTx == 0xffff &&
+ pCoexSta->lowPriorityRx == 0xffff)
+ {
+ bBtActive = FALSE;
+ }
+ if(bBtActive)
+ {
+ btDisableCnt = 0;
+ bBtDisabled = FALSE;
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n"));
+ }
+ else
+ {
+ btDisableCnt++;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n",
+ btDisableCnt));
+ if(btDisableCnt >= 2)
+ {
+ bBtDisabled = TRUE;
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_DISABLE, &bBtDisabled);
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n"));
+ }
+ }
+ if(bPreBtDisabled != bBtDisabled)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n",
+ (bPreBtDisabled ? "disabled":"enabled"),
+ (bBtDisabled ? "disabled":"enabled")));
+ bPreBtDisabled = bBtDisabled;
+ if(!bBtDisabled)
+ {
+ }
+ else
+ {
+ }
+ }
+}
+
+VOID
+halbtc8821aCsr2ant_MonitorBtCtr(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u4Byte regHPTxRx, regLPTxRx, u4Tmp;
+ u4Byte regHPTx=0, regHPRx=0, regLPTx=0, regLPRx=0;
+ u1Byte u1Tmp;
+
+ regHPTxRx = 0x770;
+ regLPTxRx = 0x774;
+
+ u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);
+ regHPTx = u4Tmp & bMaskLWord;
+ regHPRx = (u4Tmp & bMaskHWord)>>16;
+
+ u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);
+ regLPTx = u4Tmp & bMaskLWord;
+ regLPRx = (u4Tmp & bMaskHWord)>>16;
+
+ pCoexSta->highPriorityTx = regHPTx;
+ pCoexSta->highPriorityRx = regHPRx;
+ pCoexSta->lowPriorityTx = regLPTx;
+ pCoexSta->lowPriorityRx = regLPRx;
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
+ regHPTxRx, regHPTx, regHPTx, regHPRx, regHPRx));
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
+ regLPTxRx, regLPTx, regLPTx, regLPRx, regLPRx));
+
+ // reset counter
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);
+}
+
+VOID
+halbtc8821aCsr2ant_QueryBtInfo(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte H2C_Parameter[1] ={0};
+
+ pCoexSta->bC2hBtInfoReqSent = TRUE;
+
+ H2C_Parameter[0] |= BIT0; // trigger
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Query Bt Info, FW write 0x61=0x%x\n",
+ H2C_Parameter[0]));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);
+}
+u1Byte
+halbtc8821aCsr2ant_ActionAlgorithm(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo;
+ BOOLEAN bBtHsOn=FALSE;
+ u1Byte algorithm=BT_8821A_CSR_2ANT_COEX_ALGO_UNDEFINED;
+ u1Byte numOfDiffProfile=0;
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
+
+ //for win-8 stack HID report error
+ if(!pStackInfo->bHidExist)
+ pStackInfo->bHidExist = pCoexSta->bHidExist; //sync BTInfo with BT firmware and stack
+ // when stack HID report error, here we use the info from bt fw.
+ if(!pStackInfo->bBtLinkExist)
+ pStackInfo->bBtLinkExist = pCoexSta->bBtLinkExist;
+
+ if(!pStackInfo->bBtLinkExist)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n"));
+ return algorithm;
+ }
+
+ if(pStackInfo->bScoExist)
+ numOfDiffProfile++;
+ if(pStackInfo->bHidExist)
+ numOfDiffProfile++;
+ if(pStackInfo->bPanExist)
+ numOfDiffProfile++;
+ if(pStackInfo->bA2dpExist)
+ numOfDiffProfile++;
+
+ if(numOfDiffProfile == 1)
+ {
+ if(pStackInfo->bScoExist)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO;
+ }
+ else
+ {
+ if(pStackInfo->bHidExist)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID;
+ }
+ else if(pStackInfo->bA2dpExist)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP;
+ }
+ else if(pStackInfo->bPanExist)
+ {
+ if(bBtHsOn)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANHS;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR;
+ }
+ }
+ }
+ }
+ else if(numOfDiffProfile == 2)
+ {
+ if(pStackInfo->bScoExist)
+ {
+ if(pStackInfo->bHidExist)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ else if(pStackInfo->bA2dpExist)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ else if(pStackInfo->bPanExist)
+ {
+ if(bBtHsOn)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_SCO;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ }
+ }
+ else
+ {
+ if( pStackInfo->bHidExist &&
+ pStackInfo->bA2dpExist )
+ {
+ if(pStackInfo->numOfHid >= 2)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID*2 + A2DP\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP;
+ }
+ }
+ else if( pStackInfo->bHidExist &&
+ pStackInfo->bPanExist )
+ {
+ if(bBtHsOn)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ }
+ else if( pStackInfo->bPanExist &&
+ pStackInfo->bA2dpExist )
+ {
+ if(bBtHsOn)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP;
+ }
+ }
+ }
+ }
+ else if(numOfDiffProfile == 3)
+ {
+ if(pStackInfo->bScoExist)
+ {
+ if( pStackInfo->bHidExist &&
+ pStackInfo->bA2dpExist )
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ else if( pStackInfo->bHidExist &&
+ pStackInfo->bPanExist )
+ {
+ if(bBtHsOn)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ }
+ else if( pStackInfo->bPanExist &&
+ pStackInfo->bA2dpExist )
+ {
+ if(bBtHsOn)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ }
+ }
+ else
+ {
+ if( pStackInfo->bHidExist &&
+ pStackInfo->bPanExist &&
+ pStackInfo->bA2dpExist )
+ {
+ if(bBtHsOn)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
+ }
+ }
+ }
+ }
+ else if(numOfDiffProfile >= 3)
+ {
+ if(pStackInfo->bScoExist)
+ {
+ if( pStackInfo->bHidExist &&
+ pStackInfo->bPanExist &&
+ pStackInfo->bA2dpExist )
+ {
+ if(bBtHsOn)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"));
+
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n"));
+ algorithm = BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID;
+ }
+ }
+ }
+ }
+
+ return algorithm;
+}
+
+BOOLEAN
+halbtc8821aCsr2ant_NeedToDecBtPwr(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ BOOLEAN bRet=FALSE;
+ BOOLEAN bBtHsOn=FALSE, bWifiConnected=FALSE;
+ s4Byte btHsRssi=0;
+ u1Byte btRssiState;
+
+ if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn))
+ return FALSE;
+ if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected))
+ return FALSE;
+ if(!pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi))
+ return FALSE;
+
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ if(bWifiConnected)
+ {
+ if(bBtHsOn)
+ {
+ if(btHsRssi > 37)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n"));
+ bRet = TRUE;
+ }
+ }
+ else
+ {
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n"));
+ bRet = TRUE;
+ }
+ }
+ }
+
+ return bRet;
+}
+
+VOID
+halbtc8821aCsr2ant_SetFwDacSwingLevel(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte dacSwingLvl
+ )
+{
+ u1Byte H2C_Parameter[1] ={0};
+
+ // There are several type of dacswing
+ // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6
+ H2C_Parameter[0] = dacSwingLvl;
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dacSwingLvl));
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", H2C_Parameter[0]));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);
+}
+
+VOID
+halbtc8821aCsr2ant_SetFwDecBtPwr(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bDecBtPwr
+ )
+{
+ u1Byte H2C_Parameter[1] ={0};
+
+ H2C_Parameter[0] = 0;
+
+ if(bDecBtPwr)
+ {
+ H2C_Parameter[0] |= BIT1;
+ }
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n",
+ (bDecBtPwr? "Yes!!":"No!!"), H2C_Parameter[0]));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);
+}
+
+VOID
+halbtc8821aCsr2ant_DecBtPwr(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bDecBtPwr
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n",
+ (bForceExec? "force to":""), ((bDecBtPwr)? "ON":"OFF")));
+ pCoexDm->bCurDecBtPwr = bDecBtPwr;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n",
+ pCoexDm->bPreDecBtPwr, pCoexDm->bCurDecBtPwr));
+
+ if(pCoexDm->bPreDecBtPwr == pCoexDm->bCurDecBtPwr)
+ return;
+ }
+ halbtc8821aCsr2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->bCurDecBtPwr);
+
+ pCoexDm->bPreDecBtPwr = pCoexDm->bCurDecBtPwr;
+}
+
+VOID
+halbtc8821aCsr2ant_SetBtAutoReport(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bEnableAutoReport
+ )
+{
+ u1Byte H2C_Parameter[1] ={0};
+
+ H2C_Parameter[0] = 0;
+
+ if(bEnableAutoReport)
+ {
+ H2C_Parameter[0] |= BIT0;
+ }
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n",
+ (bEnableAutoReport? "Enabled!!":"Disabled!!"), H2C_Parameter[0]));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x68, 1, H2C_Parameter);
+}
+
+VOID
+halbtc8821aCsr2ant_BtAutoReport(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bEnableAutoReport
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n",
+ (bForceExec? "force to":""), ((bEnableAutoReport)? "Enabled":"Disabled")));
+ pCoexDm->bCurBtAutoReport = bEnableAutoReport;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtAutoReport=%d, bCurBtAutoReport=%d\n",
+ pCoexDm->bPreBtAutoReport, pCoexDm->bCurBtAutoReport));
+
+ if(pCoexDm->bPreBtAutoReport == pCoexDm->bCurBtAutoReport)
+ return;
+ }
+ halbtc8821aCsr2ant_SetBtAutoReport(pBtCoexist, pCoexDm->bCurBtAutoReport);
+
+ pCoexDm->bPreBtAutoReport = pCoexDm->bCurBtAutoReport;
+}
+
+VOID
+halbtc8821aCsr2ant_FwDacSwingLvl(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN u1Byte fwDacSwingLvl
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n",
+ (bForceExec? "force to":""), fwDacSwingLvl));
+ pCoexDm->curFwDacSwingLvl = fwDacSwingLvl;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
+ pCoexDm->preFwDacSwingLvl, pCoexDm->curFwDacSwingLvl));
+
+ if(pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl)
+ return;
+ }
+
+ halbtc8821aCsr2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);
+
+ pCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;
+}
+
+VOID
+halbtc8821aCsr2ant_SetSwRfRxLpfCorner(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bRxRfShrinkOn
+ )
+{
+ if(bRxRfShrinkOn)
+ {
+ //Shrink RF Rx LPF corner
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n"));
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);
+ }
+ else
+ {
+ //Resume RF Rx LPF corner
+ // After initialized, we can use pCoexDm->btRf0x1eBackup
+ if(pBtCoexist->bInitilized)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n"));
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);
+ }
+ }
+}
+
+VOID
+halbtc8821aCsr2ant_RfShrink(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bRxRfShrinkOn
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n",
+ (bForceExec? "force to":""), ((bRxRfShrinkOn)? "ON":"OFF")));
+ pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n",
+ pCoexDm->bPreRfRxLpfShrink, pCoexDm->bCurRfRxLpfShrink));
+
+ if(pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink)
+ return;
+ }
+ halbtc8821aCsr2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);
+
+ pCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;
+}
+
+VOID
+halbtc8821aCsr2ant_SetSwPenaltyTxRateAdaptive(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bLowPenaltyRa
+ )
+{
+ u1Byte H2C_Parameter[6] ={0};
+
+ H2C_Parameter[0] = 0x6; // opCode, 0x6= Retry_Penalty
+
+ if(bLowPenaltyRa)
+ {
+ H2C_Parameter[1] |= BIT0;
+ H2C_Parameter[2] = 0x00; //normal rate except MCS7/6/5, OFDM54/48/36
+ H2C_Parameter[3] = 0xf7; //MCS7 or OFDM54
+ H2C_Parameter[4] = 0xf8; //MCS6 or OFDM48
+ H2C_Parameter[5] = 0xf9; //MCS5 or OFDM36
+ }
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set WiFi Low-Penalty Retry: %s",
+ (bLowPenaltyRa? "ON!!":"OFF!!") ));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);
+}
+
+VOID
+halbtc8821aCsr2ant_LowPenaltyRa(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bLowPenaltyRa
+ )
+{
+ //return;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n",
+ (bForceExec? "force to":""), ((bLowPenaltyRa)? "ON":"OFF")));
+ pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n",
+ pCoexDm->bPreLowPenaltyRa, pCoexDm->bCurLowPenaltyRa));
+
+ if(pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa)
+ return;
+ }
+ halbtc8821aCsr2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);
+
+ pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;
+}
+
+VOID
+halbtc8821aCsr2ant_SetDacSwingReg(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u4Byte level
+ )
+{
+ u1Byte val=(u1Byte)level;
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level));
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xc5b, 0x3e, val);
+}
+
+VOID
+halbtc8821aCsr2ant_SetSwFullTimeDacSwing(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bSwDacSwingOn,
+ IN u4Byte swDacSwingLvl
+ )
+{
+ if(bSwDacSwingOn)
+ {
+ halbtc8821aCsr2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SetDacSwingReg(pBtCoexist, 0x18);
+ }
+}
+
+
+VOID
+halbtc8821aCsr2ant_DacSwing(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bDacSwingOn,
+ IN u4Byte dacSwingLvl
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dacSwingLvl=0x%x\n",
+ (bForceExec? "force to":""), ((bDacSwingOn)? "ON":"OFF"), dacSwingLvl));
+ pCoexDm->bCurDacSwingOn = bDacSwingOn;
+ pCoexDm->curDacSwingLvl = dacSwingLvl;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n",
+ pCoexDm->bPreDacSwingOn, pCoexDm->preDacSwingLvl,
+ pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl));
+
+ if( (pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&
+ (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl) )
+ return;
+ }
+ delay_ms(30);
+ halbtc8821aCsr2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);
+
+ pCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;
+ pCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;
+}
+
+VOID
+halbtc8821aCsr2ant_SetAdcBackOff(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bAdcBackOff
+ )
+{
+ if(bAdcBackOff)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n"));
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x3);
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n"));
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x8db, 0x60, 0x1);
+ }
+}
+
+VOID
+halbtc8821aCsr2ant_AdcBackOff(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bAdcBackOff
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n",
+ (bForceExec? "force to":""), ((bAdcBackOff)? "ON":"OFF")));
+ pCoexDm->bCurAdcBackOff = bAdcBackOff;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n",
+ pCoexDm->bPreAdcBackOff, pCoexDm->bCurAdcBackOff));
+
+ if(pCoexDm->bPreAdcBackOff == pCoexDm->bCurAdcBackOff)
+ return;
+ }
+ halbtc8821aCsr2ant_SetAdcBackOff(pBtCoexist, pCoexDm->bCurAdcBackOff);
+
+ pCoexDm->bPreAdcBackOff = pCoexDm->bCurAdcBackOff;
+}
+
+VOID
+halbtc8821aCsr2ant_SetAgcTable(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bAgcTableEn
+ )
+{
+ u1Byte rssiAdjustVal=0;
+
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);
+ if(bAgcTableEn)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n"));
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28F4B);
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x10AB2);
+ rssiAdjustVal = 8;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n"));
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x2884B);
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x104B2);
+ }
+ pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);
+
+ // set rssiAdjustVal for wifi module.
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);
+}
+
+VOID
+halbtc8821aCsr2ant_AgcTable(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bAgcTableEn
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n",
+ (bForceExec? "force to":""), ((bAgcTableEn)? "Enable":"Disable")));
+ pCoexDm->bCurAgcTableEn = bAgcTableEn;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
+ pCoexDm->bPreAgcTableEn, pCoexDm->bCurAgcTableEn));
+
+ if(pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn)
+ return;
+ }
+ halbtc8821aCsr2ant_SetAgcTable(pBtCoexist, bAgcTableEn);
+
+ pCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;
+}
+
+VOID
+halbtc8821aCsr2ant_SetCoexTable(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u4Byte val0x6c0,
+ IN u4Byte val0x6c4,
+ IN u4Byte val0x6c8,
+ IN u1Byte val0x6cc
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0));
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4));
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8));
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc));
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);
+}
+
+VOID
+halbtc8821aCsr2ant_CoexTable(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN u4Byte val0x6c0,
+ IN u4Byte val0x6c4,
+ IN u4Byte val0x6c8,
+ IN u1Byte val0x6cc
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n",
+ (bForceExec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc));
+ pCoexDm->curVal0x6c0 = val0x6c0;
+ pCoexDm->curVal0x6c4 = val0x6c4;
+ pCoexDm->curVal0x6c8 = val0x6c8;
+ pCoexDm->curVal0x6cc = val0x6cc;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n",
+ pCoexDm->preVal0x6c0, pCoexDm->preVal0x6c4, pCoexDm->preVal0x6c8, pCoexDm->preVal0x6cc));
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n",
+ pCoexDm->curVal0x6c0, pCoexDm->curVal0x6c4, pCoexDm->curVal0x6c8, pCoexDm->curVal0x6cc));
+
+ if( (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&
+ (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&
+ (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&
+ (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc) )
+ return;
+ }
+ halbtc8821aCsr2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);
+
+ pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;
+ pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;
+ pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;
+ pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;
+}
+
+VOID
+halbtc8821aCsr2ant_SetFwIgnoreWlanAct(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bEnable
+ )
+{
+ u1Byte H2C_Parameter[1] ={0};
+
+ if(bEnable)
+ {
+ H2C_Parameter[0] |= BIT0; // function enable
+ }
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n",
+ H2C_Parameter[0]));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);
+}
+
+VOID
+halbtc8821aCsr2ant_IgnoreWlanAct(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bEnable
+ )
+{
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n",
+ (bForceExec? "force to":""), (bEnable? "ON":"OFF")));
+ pCoexDm->bCurIgnoreWlanAct = bEnable;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
+ pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct));
+
+ if(pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)
+ return;
+ }
+ halbtc8821aCsr2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);
+
+ pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;
+}
+
+VOID
+halbtc8821aCsr2ant_SetFwPstdma(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte byte1,
+ IN u1Byte byte2,
+ IN u1Byte byte3,
+ IN u1Byte byte4,
+ IN u1Byte byte5
+ )
+{
+ u1Byte H2C_Parameter[5] ={0};
+
+ H2C_Parameter[0] = byte1;
+ H2C_Parameter[1] = byte2;
+ H2C_Parameter[2] = byte3;
+ H2C_Parameter[3] = byte4;
+ H2C_Parameter[4] = byte5;
+
+ pCoexDm->psTdmaPara[0] = byte1;
+ pCoexDm->psTdmaPara[1] = byte2;
+ pCoexDm->psTdmaPara[2] = byte3;
+ pCoexDm->psTdmaPara[3] = byte4;
+ pCoexDm->psTdmaPara[4] = byte5;
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n",
+ H2C_Parameter[0],
+ H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4]));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);
+}
+
+VOID
+halbtc8821aCsr2ant_SwMechanism1(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bShrinkRxLPF,
+ IN BOOLEAN bLowPenaltyRA,
+ IN BOOLEAN bLimitedDIG,
+ IN BOOLEAN bBTLNAConstrain
+ )
+{
+ u4Byte wifiBw;
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if(BTC_WIFI_BW_HT40 != wifiBw) //only shrink RF Rx LPF for HT40
+ {
+ if (bShrinkRxLPF)
+ bShrinkRxLPF = FALSE;
+ }
+
+ halbtc8821aCsr2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);
+ halbtc8821aCsr2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);
+
+ //no limited DIG
+ //halbtc8821aCsr2ant_SetBtLnaConstrain(pBtCoexist, NORMAL_EXEC, bBTLNAConstrain);
+}
+
+VOID
+halbtc8821aCsr2ant_SwMechanism2(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bAGCTableShift,
+ IN BOOLEAN bADCBackOff,
+ IN BOOLEAN bSWDACSwing,
+ IN u4Byte dacSwingLvl
+ )
+{
+ //halbtc8821aCsr2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);
+ halbtc8821aCsr2ant_AdcBackOff(pBtCoexist, NORMAL_EXEC, bADCBackOff);
+ halbtc8821aCsr2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);
+}
+
+VOID
+halbtc8821aCsr2ant_SetAntPath(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte antPosType,
+ IN BOOLEAN bInitHwCfg,
+ IN BOOLEAN bWifiOff
+ )
+{
+ PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
+ u4Byte u4Tmp=0;
+ u1Byte H2C_Parameter[2] ={0};
+
+ if(bInitHwCfg)
+ {
+ // 0x4c[23]=0, 0x4c[24]=1 Antenna control by WL/BT
+ u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
+ u4Tmp &=~BIT23;
+ u4Tmp |= BIT24;
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
+
+ pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x974, 0x3ff);
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0xcb4, 0x77);
+
+ if(pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
+ {
+ //tell firmware "antenna inverse" ==> WRONG firmware antenna control code.==>need fw to fix
+ H2C_Parameter[0] = 1;
+ H2C_Parameter[1] = 1;
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
+ }
+ else
+ {
+ //tell firmware "no antenna inverse" ==> WRONG firmware antenna control code.==>need fw to fix
+ H2C_Parameter[0] = 0;
+ H2C_Parameter[1] = 1;
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
+ }
+ }
+
+ // ext switch setting
+ switch(antPosType)
+ {
+ case BTC_ANT_WIFI_AT_MAIN:
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x1);
+ break;
+ case BTC_ANT_WIFI_AT_AUX:
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xcb7, 0x30, 0x2);
+ break;
+ }
+}
+
+VOID
+halbtc8821aCsr2ant_PsTdma(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bForceExec,
+ IN BOOLEAN bTurnOn,
+ IN u1Byte type
+ )
+{
+ BOOLEAN bTurnOnByCnt=FALSE;
+ u1Byte psTdmaTypeByCnt=0;
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n",
+ (bForceExec? "force to":""), (bTurnOn? "ON":"OFF"), type));
+ pCoexDm->bCurPsTdmaOn = bTurnOn;
+ pCoexDm->curPsTdma = type;
+
+ if(!bForceExec)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
+ pCoexDm->bPrePsTdmaOn, pCoexDm->bCurPsTdmaOn));
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
+ pCoexDm->prePsTdma, pCoexDm->curPsTdma));
+
+ if( (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&
+ (pCoexDm->prePsTdma == pCoexDm->curPsTdma) )
+ return;
+ }
+ if(bTurnOn)
+ {
+ switch(type)
+ {
+ case 1:
+ default:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
+ break;
+ case 2:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);
+ break;
+ case 3:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);
+ break;
+ case 4:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90);
+ break;
+ case 5:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);
+ break;
+ case 6:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);
+ break;
+ case 7:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);
+ break;
+ case 8:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90);
+ break;
+ case 9:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
+ break;
+ case 10:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);
+ break;
+ case 11:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);
+ break;
+ case 12:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);
+ break;
+ case 13:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);
+ break;
+ case 14:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);
+ break;
+ case 15:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);
+ break;
+ case 16:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);
+ break;
+ case 17:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);
+ break;
+ case 18:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);
+ break;
+ case 19:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);
+ break;
+ case 20:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);
+ break;
+ case 21:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);
+ break;
+ case 71:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
+ break;
+ }
+ }
+ else
+ {
+ // disable PS tdma
+ switch(type)
+ {
+ case 0:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);
+ break;
+ case 1:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);
+ break;
+ default:
+ halbtc8821aCsr2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);
+ break;
+ }
+ }
+
+ // update pre state
+ pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;
+ pCoexDm->prePsTdma = pCoexDm->curPsTdma;
+}
+
+VOID
+halbtc8821aCsr2ant_CoexAllOff(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ // fw all off
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ // sw all off
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+
+ // hw all off
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
+}
+
+VOID
+halbtc8821aCsr2ant_CoexUnder5G(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ halbtc8821aCsr2ant_CoexAllOff(pBtCoexist);
+
+ halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, NORMAL_EXEC, TRUE);
+}
+
+VOID
+halbtc8821aCsr2ant_InitCoexDm(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ // force to reset coex mechanism
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
+
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, FORCE_EXEC, FALSE, 1);
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, FALSE);
+
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+}
+
+VOID
+halbtc8821aCsr2ant_BtInquiryPage(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ BOOLEAN bLowPwrDisable=TRUE;
+
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
+
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+}
+BOOLEAN
+halbtc8821aCsr2ant_IsCommonAction(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ BOOLEAN bCommon=FALSE, bWifiConnected=FALSE, bWifiBusy=FALSE;
+ BOOLEAN bLowPwrDisable=FALSE;
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
+
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);
+
+ if(!bWifiConnected &&
+ BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)
+ {
+ bLowPwrDisable = FALSE;
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT IPS!!\n"));
+
+
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+
+ bCommon = TRUE;
+ }
+ else if(bWifiConnected &&
+ (BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus) )
+ {
+ bLowPwrDisable = FALSE;
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
+
+ if(bWifiBusy)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT IPS!!\n"));
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT IPS!!\n"));
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ }
+
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+
+ bCommon = TRUE;
+ }
+ else if(!bWifiConnected &&
+ (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )
+ {
+ bLowPwrDisable = TRUE;
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT LPS!!\n"));
+
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+
+ bCommon = TRUE;
+ }
+ else if(bWifiConnected &&
+ (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) )
+ {
+ bLowPwrDisable = TRUE;
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
+
+ if(bWifiBusy)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT LPS!!\n"));
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT LPS!!\n"));
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ }
+
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+
+ bCommon = TRUE;
+ }
+ else if(!bWifiConnected &&
+ (BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus) )
+ {
+ bLowPwrDisable = FALSE;
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi IPS + BT Busy!!\n"));
+
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+
+ bCommon = TRUE;
+ }
+ else
+ {
+ bLowPwrDisable = TRUE;
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
+
+ if(bWifiBusy)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Busy + BT Busy!!\n"));
+ bCommon = FALSE;
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi LPS + BT Busy!!\n"));
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 21);
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ bCommon = TRUE;
+ }
+
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,TRUE,TRUE);
+ }
+
+ return bCommon;
+}
+VOID
+halbtc8821aCsr2ant_TdmaDurationAdjust(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bScoHid,
+ IN BOOLEAN bTxPause,
+ IN u1Byte maxInterval
+ )
+{
+ static s4Byte up,dn,m,n,WaitCount;
+ s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration
+ u1Byte retryCount=0;
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n"));
+
+ if(pCoexDm->bResetTdmaAdjust)
+ {
+ pCoexDm->bResetTdmaAdjust = FALSE;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n"));
+ {
+ if(bScoHid)
+ {
+ if(bTxPause)
+ {
+ if(maxInterval == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);
+ pCoexDm->psTdmaDuAdjType = 13;
+ }
+ else if(maxInterval == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->psTdmaDuAdjType = 14;
+ }
+ else if(maxInterval == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ }
+ else
+ {
+ if(maxInterval == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);
+ pCoexDm->psTdmaDuAdjType = 9;
+ }
+ else if(maxInterval == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ pCoexDm->psTdmaDuAdjType = 10;
+ }
+ else if(maxInterval == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ }
+ }
+ else
+ {
+ if(bTxPause)
+ {
+ if(maxInterval == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+ pCoexDm->psTdmaDuAdjType = 5;
+ }
+ else if(maxInterval == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ pCoexDm->psTdmaDuAdjType = 6;
+ }
+ else if(maxInterval == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ }
+ else
+ {
+ if(maxInterval == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);
+ pCoexDm->psTdmaDuAdjType = 1;
+ }
+ else if(maxInterval == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);
+ pCoexDm->psTdmaDuAdjType = 2;
+ }
+ else if(maxInterval == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ }
+ }
+ }
+ //============
+ up = 0;
+ dn = 0;
+ m = 1;
+ n= 3;
+ result = 0;
+ WaitCount = 0;
+ }
+ else
+ {
+ //accquire the BT TRx retry count from BT_Info byte2
+ retryCount = pCoexSta->btRetryCnt;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount));
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, WaitCount=%d\n",
+ up, dn, m, n, WaitCount));
+ result = 0;
+ WaitCount++;
+
+ if(retryCount == 0) // no retry in the last 2-second duration
+ {
+ up++;
+ dn--;
+
+ if (dn <= 0)
+ dn = 0;
+
+ if(up >= n) // if ³sÄò n ­Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration
+ {
+ WaitCount = 0;
+ n = 3;
+ up = 0;
+ dn = 0;
+ result = 1;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n"));
+ }
+ }
+ else if (retryCount <= 3) // <=3 retry in the last 2-second duration
+ {
+ up--;
+ dn++;
+
+ if (up <= 0)
+ up = 0;
+
+ if (dn == 2) // if ³sÄò 2 ­Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration
+ {
+ if (WaitCount <= 2)
+ m++; // ÁקK¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^
+ else
+ m = 1;
+
+ if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
+ m = 20;
+
+ n = 3*m;
+ up = 0;
+ dn = 0;
+ WaitCount = 0;
+ result = -1;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n"));
+ }
+ }
+ else //retry count > 3, ¥u­n1¦¸ retry count > 3, «h½Õ¯¶WiFi duration
+ {
+ if (WaitCount == 1)
+ m++; // ÁקK¤@ª½¦b¨â­Ólevel¤¤¨Ó¦^
+ else
+ m = 1;
+
+ if ( m >= 20) //m ³Ì¤j­È = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
+ m = 20;
+
+ n = 3*m;
+ up = 0;
+ dn = 0;
+ WaitCount = 0;
+ result = -1;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n"));
+ }
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval));
+ if(maxInterval == 1)
+ {
+ if(bTxPause)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));
+
+ if(pCoexDm->curPsTdma == 71)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+ pCoexDm->psTdmaDuAdjType = 5;
+ }
+ else if(pCoexDm->curPsTdma == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+ pCoexDm->psTdmaDuAdjType = 5;
+ }
+ else if(pCoexDm->curPsTdma == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ pCoexDm->psTdmaDuAdjType = 6;
+ }
+ else if(pCoexDm->curPsTdma == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 4)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);
+ pCoexDm->psTdmaDuAdjType = 8;
+ }
+ if(pCoexDm->curPsTdma == 9)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);
+ pCoexDm->psTdmaDuAdjType = 13;
+ }
+ else if(pCoexDm->curPsTdma == 10)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->psTdmaDuAdjType = 14;
+ }
+ else if(pCoexDm->curPsTdma == 11)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 12)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);
+ pCoexDm->psTdmaDuAdjType = 16;
+ }
+
+ if(result == -1)
+ {
+ if(pCoexDm->curPsTdma == 5)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ pCoexDm->psTdmaDuAdjType = 6;
+ }
+ else if(pCoexDm->curPsTdma == 6)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 7)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);
+ pCoexDm->psTdmaDuAdjType = 8;
+ }
+ else if(pCoexDm->curPsTdma == 13)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->psTdmaDuAdjType = 14;
+ }
+ else if(pCoexDm->curPsTdma == 14)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 15)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);
+ pCoexDm->psTdmaDuAdjType = 16;
+ }
+ }
+ else if (result == 1)
+ {
+ if(pCoexDm->curPsTdma == 8)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 7)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ pCoexDm->psTdmaDuAdjType = 6;
+ }
+ else if(pCoexDm->curPsTdma == 6)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+ pCoexDm->psTdmaDuAdjType = 5;
+ }
+ else if(pCoexDm->curPsTdma == 16)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 15)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->psTdmaDuAdjType = 14;
+ }
+ else if(pCoexDm->curPsTdma == 14)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);
+ pCoexDm->psTdmaDuAdjType = 13;
+ }
+ }
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));
+ if(pCoexDm->curPsTdma == 5)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);
+ pCoexDm->psTdmaDuAdjType = 71;
+ }
+ else if(pCoexDm->curPsTdma == 6)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);
+ pCoexDm->psTdmaDuAdjType = 2;
+ }
+ else if(pCoexDm->curPsTdma == 7)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 8)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);
+ pCoexDm->psTdmaDuAdjType = 4;
+ }
+ if(pCoexDm->curPsTdma == 13)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);
+ pCoexDm->psTdmaDuAdjType = 9;
+ }
+ else if(pCoexDm->curPsTdma == 14)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ pCoexDm->psTdmaDuAdjType = 10;
+ }
+ else if(pCoexDm->curPsTdma == 15)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 16)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);
+ pCoexDm->psTdmaDuAdjType = 12;
+ }
+
+ if(result == -1)
+ {
+ if(pCoexDm->curPsTdma == 71)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);
+ pCoexDm->psTdmaDuAdjType = 1;
+ }
+ else if(pCoexDm->curPsTdma == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);
+ pCoexDm->psTdmaDuAdjType = 2;
+ }
+ else if(pCoexDm->curPsTdma == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);
+ pCoexDm->psTdmaDuAdjType = 4;
+ }
+ else if(pCoexDm->curPsTdma == 9)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ pCoexDm->psTdmaDuAdjType = 10;
+ }
+ else if(pCoexDm->curPsTdma == 10)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 11)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);
+ pCoexDm->psTdmaDuAdjType = 12;
+ }
+ }
+ else if (result == 1)
+ {
+ if(pCoexDm->curPsTdma == 4)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);
+ pCoexDm->psTdmaDuAdjType = 2;
+ }
+ else if(pCoexDm->curPsTdma == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);
+ pCoexDm->psTdmaDuAdjType = 1;
+ }
+ else if(pCoexDm->curPsTdma == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 71);
+ pCoexDm->psTdmaDuAdjType = 71;
+ }
+ else if(pCoexDm->curPsTdma == 12)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 11)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ pCoexDm->psTdmaDuAdjType = 10;
+ }
+ else if(pCoexDm->curPsTdma == 10)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);
+ pCoexDm->psTdmaDuAdjType = 9;
+ }
+ }
+ }
+ }
+ else if(maxInterval == 2)
+ {
+ if(bTxPause)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));
+ if(pCoexDm->curPsTdma == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ pCoexDm->psTdmaDuAdjType = 6;
+ }
+ else if(pCoexDm->curPsTdma == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ pCoexDm->psTdmaDuAdjType = 6;
+ }
+ else if(pCoexDm->curPsTdma == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 4)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);
+ pCoexDm->psTdmaDuAdjType = 8;
+ }
+ if(pCoexDm->curPsTdma == 9)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->psTdmaDuAdjType = 14;
+ }
+ else if(pCoexDm->curPsTdma == 10)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->psTdmaDuAdjType = 14;
+ }
+ else if(pCoexDm->curPsTdma == 11)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 12)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);
+ pCoexDm->psTdmaDuAdjType = 16;
+ }
+ if(result == -1)
+ {
+ if(pCoexDm->curPsTdma == 5)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ pCoexDm->psTdmaDuAdjType = 6;
+ }
+ else if(pCoexDm->curPsTdma == 6)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 7)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);
+ pCoexDm->psTdmaDuAdjType = 8;
+ }
+ else if(pCoexDm->curPsTdma == 13)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->psTdmaDuAdjType = 14;
+ }
+ else if(pCoexDm->curPsTdma == 14)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 15)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);
+ pCoexDm->psTdmaDuAdjType = 16;
+ }
+ }
+ else if (result == 1)
+ {
+ if(pCoexDm->curPsTdma == 8)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 7)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ pCoexDm->psTdmaDuAdjType = 6;
+ }
+ else if(pCoexDm->curPsTdma == 6)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 6);
+ pCoexDm->psTdmaDuAdjType = 6;
+ }
+ else if(pCoexDm->curPsTdma == 16)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 15)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->psTdmaDuAdjType = 14;
+ }
+ else if(pCoexDm->curPsTdma == 14)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ pCoexDm->psTdmaDuAdjType = 14;
+ }
+ }
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));
+ if(pCoexDm->curPsTdma == 5)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);
+ pCoexDm->psTdmaDuAdjType = 2;
+ }
+ else if(pCoexDm->curPsTdma == 6)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);
+ pCoexDm->psTdmaDuAdjType = 2;
+ }
+ else if(pCoexDm->curPsTdma == 7)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 8)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);
+ pCoexDm->psTdmaDuAdjType = 4;
+ }
+ if(pCoexDm->curPsTdma == 13)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ pCoexDm->psTdmaDuAdjType = 10;
+ }
+ else if(pCoexDm->curPsTdma == 14)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ pCoexDm->psTdmaDuAdjType = 10;
+ }
+ else if(pCoexDm->curPsTdma == 15)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 16)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);
+ pCoexDm->psTdmaDuAdjType = 12;
+ }
+ if(result == -1)
+ {
+ if(pCoexDm->curPsTdma == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);
+ pCoexDm->psTdmaDuAdjType = 2;
+ }
+ else if(pCoexDm->curPsTdma == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);
+ pCoexDm->psTdmaDuAdjType = 4;
+ }
+ else if(pCoexDm->curPsTdma == 9)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ pCoexDm->psTdmaDuAdjType = 10;
+ }
+ else if(pCoexDm->curPsTdma == 10)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 11)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);
+ pCoexDm->psTdmaDuAdjType = 12;
+ }
+ }
+ else if (result == 1)
+ {
+ if(pCoexDm->curPsTdma == 4)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);
+ pCoexDm->psTdmaDuAdjType = 2;
+ }
+ else if(pCoexDm->curPsTdma == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 2);
+ pCoexDm->psTdmaDuAdjType = 2;
+ }
+ else if(pCoexDm->curPsTdma == 12)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 11)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ pCoexDm->psTdmaDuAdjType = 10;
+ }
+ else if(pCoexDm->curPsTdma == 10)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ pCoexDm->psTdmaDuAdjType = 10;
+ }
+ }
+ }
+ }
+ else if(maxInterval == 3)
+ {
+ if(bTxPause)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));
+ if(pCoexDm->curPsTdma == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 4)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);
+ pCoexDm->psTdmaDuAdjType = 8;
+ }
+ if(pCoexDm->curPsTdma == 9)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 10)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 11)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 12)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);
+ pCoexDm->psTdmaDuAdjType = 16;
+ }
+ if(result == -1)
+ {
+ if(pCoexDm->curPsTdma == 5)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 6)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 7)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 8);
+ pCoexDm->psTdmaDuAdjType = 8;
+ }
+ else if(pCoexDm->curPsTdma == 13)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 14)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 15)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 16);
+ pCoexDm->psTdmaDuAdjType = 16;
+ }
+ }
+ else if (result == 1)
+ {
+ if(pCoexDm->curPsTdma == 8)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 7)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 6)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 7);
+ pCoexDm->psTdmaDuAdjType = 7;
+ }
+ else if(pCoexDm->curPsTdma == 16)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 15)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ else if(pCoexDm->curPsTdma == 14)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 15);
+ pCoexDm->psTdmaDuAdjType = 15;
+ }
+ }
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));
+ if(pCoexDm->curPsTdma == 5)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 6)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 7)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 8)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);
+ pCoexDm->psTdmaDuAdjType = 4;
+ }
+ if(pCoexDm->curPsTdma == 13)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 14)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 15)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 16)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);
+ pCoexDm->psTdmaDuAdjType = 12;
+ }
+ if(result == -1)
+ {
+ if(pCoexDm->curPsTdma == 1)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 4);
+ pCoexDm->psTdmaDuAdjType = 4;
+ }
+ else if(pCoexDm->curPsTdma == 9)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 10)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 11)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 12);
+ pCoexDm->psTdmaDuAdjType = 12;
+ }
+ }
+ else if (result == 1)
+ {
+ if(pCoexDm->curPsTdma == 4)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 3)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 2)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 3);
+ pCoexDm->psTdmaDuAdjType = 3;
+ }
+ else if(pCoexDm->curPsTdma == 12)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 11)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ else if(pCoexDm->curPsTdma == 10)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 11);
+ pCoexDm->psTdmaDuAdjType = 11;
+ }
+ }
+ }
+ }
+ }
+
+ // if current PsTdma not match with the recorded one (when scan, dhcp...),
+ // then we have to adjust it back to the previous record one.
+ if(pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType)
+ {
+ BOOLEAN bScan=FALSE, bLink=FALSE, bRoam=FALSE;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n",
+ pCoexDm->curPsTdma, pCoexDm->psTdmaDuAdjType));
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
+
+ if( !bScan && !bLink && !bRoam)
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, pCoexDm->psTdmaDuAdjType);
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"));
+ }
+ }
+
+ // when halbtc8821aCsr2ant_TdmaDurationAdjust() is called, fw dac swing is included in the function.
+ //if(pCoexDm->psTdmaDuAdjType == 71)
+ // halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xc); //Skip because A2DP get worse at HT40
+ //else
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0x6);
+}
+
+// SCO only or SCO+PAN(HS)
+VOID
+halbtc8821aCsr2ant_ActionSco(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState,btRssiState;
+ u4Byte wifiBw;
+
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if (BTC_WIFI_BW_LEGACY == wifiBw) //for SCO quality at 11b/g mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3);
+ }
+ else //for SCO quality & wifi performance balance at 11n mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);
+ }
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+
+ // fw mechanism
+ //halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+ else
+ {
+ // fw mechanism
+ //halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 0); //for voice quality
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+
+VOID
+halbtc8821aCsr2ant_ActionHid(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState, btRssiState;
+ u4Byte wifiBw;
+
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);
+ }
+ else //for HID quality & wifi performance balance at 11n mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aea5aea, 0xffff, 0x3);
+ }
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+ else
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 9);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 13);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+//A2DP only / PAN(EDR) only/ A2DP+PAN(HS)
+VOID
+halbtc8821aCsr2ant_ActionA2dp(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState, btRssiState;
+ u4Byte wifiBw;
+
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ //fw dac swing is called in halbtc8821aCsr2ant_TdmaDurationAdjust()
+ //halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+ else
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 1);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+VOID
+halbtc8821aCsr2ant_ActionA2dpPanHs(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState, btRssiState, btInfoExt;
+ u4Byte wifiBw;
+
+ btInfoExt = pCoexSta->btInfoExt;
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2,35, 0);
+
+ //fw dac swing is called in halbtc8821aCsr2ant_TdmaDurationAdjust()
+ //halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+ // fw mechanism
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+ else
+ {
+ // fw mechanism
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 2);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 1);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+VOID
+halbtc8821aCsr2ant_ActionPanEdr(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState, btRssiState;
+ u4Byte wifiBw;
+
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);
+ }
+ else //for HID quality & wifi performance balance at 11n mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);
+ }
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+ else
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 1);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 5);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+
+//PAN(HS) only
+VOID
+halbtc8821aCsr2ant_ActionPanHs(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState, btRssiState;
+ u4Byte wifiBw;
+
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+ // fw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ }
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+ else
+ {
+ // fw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+ }
+
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, FALSE, 1);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+//PAN(EDR)+A2DP
+VOID
+halbtc8821aCsr2ant_ActionPanEdrA2dp(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState, btRssiState, btInfoExt;
+ u4Byte wifiBw;
+
+ btInfoExt = pCoexSta->btInfoExt;
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);
+ }
+ else //for HID quality & wifi performance balance at 11n mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5afa5afa, 0xffff, 0x3);
+ }
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);
+ }
+ }
+ else
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);
+ }
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ };
+ }
+ else
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, FALSE, 3);
+ }
+ }
+ else
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, FALSE, TRUE, 3);
+ }
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,FALSE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+VOID
+halbtc8821aCsr2ant_ActionPanEdrHid(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState, btRssiState;
+ u4Byte wifiBw;
+
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);
+ }
+ else //for HID quality & wifi performance balance at 11n mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);
+ }
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+ else
+ {
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 10);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_PsTdma(pBtCoexist, NORMAL_EXEC, TRUE, 14);
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+// HID+A2DP+PAN(EDR)
+VOID
+halbtc8821aCsr2ant_ActionHidA2dpPanEdr(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState, btRssiState, btInfoExt;
+ u4Byte wifiBw;
+
+ btInfoExt = pCoexSta->btInfoExt;
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ halbtc8821aCsr2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);
+ }
+ else //for HID quality & wifi performance balance at 11n mode
+ {
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);
+ }
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);
+ }
+ }
+ else
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);
+ }
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+ else
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 3);
+ }
+ }
+ else
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 3);
+ }
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+VOID
+halbtc8821aCsr2ant_ActionHidA2dp(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ u1Byte wifiRssiState, btRssiState, btInfoExt;
+ u4Byte wifiBw;
+
+ btInfoExt = pCoexSta->btInfoExt;
+ wifiRssiState = halbtc8821aCsr2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
+ btRssiState = halbtc8821aCsr2ant_BtRssiState(2, 35, 0);
+
+ if(halbtc8821aCsr2ant_NeedToDecBtPwr(pBtCoexist))
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, TRUE);
+ else
+ halbtc8821aCsr2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, FALSE);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+
+ if (BTC_WIFI_BW_LEGACY == wifiBw) //for HID at 11b/g mode
+ {
+//Allen halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3);
+ }
+ else //for HID quality & wifi performance balance at 11n mode
+ {
+//Allen halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, NORMAL_EXEC, 0x55ff55ff, 0x5f5b5f5b, 0xffffff, 0x3);
+
+ }
+
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);
+ }
+ }
+ else
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);
+ }
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,TRUE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+ else
+ {
+ // fw mechanism
+ if( (btRssiState == BTC_RSSI_STATE_HIGH) ||
+ (btRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+// halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);
+
+ }
+ else //a2dp edr rate
+ {
+//Allen halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, FALSE, 2);
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);
+ }
+ }
+ else
+ {
+ if(btInfoExt&BIT0) //a2dp basic rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);
+ }
+ else //a2dp edr rate
+ {
+ halbtc8821aCsr2ant_TdmaDurationAdjust(pBtCoexist, TRUE, TRUE, 2);
+ }
+ }
+
+ // sw mechanism
+ if( (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
+ (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH) )
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,TRUE,FALSE,FALSE,0x18);
+ }
+ else
+ {
+ halbtc8821aCsr2ant_SwMechanism1(pBtCoexist,FALSE,TRUE,FALSE,FALSE);
+ halbtc8821aCsr2ant_SwMechanism2(pBtCoexist,FALSE,FALSE,FALSE,0x18);
+ }
+ }
+}
+
+VOID
+halbtc8821aCsr2ant_RunCoexistMechanism(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo;
+ BOOLEAN bWifiUnder5G=FALSE;
+ u1Byte btInfoOriginal=0, btRetryCnt=0;
+ u1Byte algorithm=0;
+
+ if(pBtCoexist->bManualControl)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Manual control!!!\n"));
+ return;
+ }
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);
+
+ if(bWifiUnder5G)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n"));
+ halbtc8821aCsr2ant_CoexUnder5G(pBtCoexist);
+ return;
+ }
+
+ if(pStackInfo->bProfileNotified)
+ {
+ algorithm = halbtc8821aCsr2ant_ActionAlgorithm(pBtCoexist);
+ if(pCoexSta->bC2hBtInquiryPage && (BT_8821A_CSR_2ANT_COEX_ALGO_PANHS!=algorithm))
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n"));
+ halbtc8821aCsr2ant_BtInquiryPage(pBtCoexist);
+ return;
+ }
+
+ pCoexDm->curAlgorithm = algorithm;
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", pCoexDm->curAlgorithm));
+
+ if(halbtc8821aCsr2ant_IsCommonAction(pBtCoexist))
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n"));
+ pCoexDm->bResetTdmaAdjust = TRUE;
+ }
+ else
+ {
+ if(pCoexDm->curAlgorithm != pCoexDm->preAlgorithm)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n",
+ pCoexDm->preAlgorithm, pCoexDm->curAlgorithm));
+ pCoexDm->bResetTdmaAdjust = TRUE;
+ }
+ switch(pCoexDm->curAlgorithm)
+ {
+ case BT_8821A_CSR_2ANT_COEX_ALGO_SCO:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n"));
+ halbtc8821aCsr2ant_ActionSco(pBtCoexist);
+ break;
+ case BT_8821A_CSR_2ANT_COEX_ALGO_HID:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n"));
+ halbtc8821aCsr2ant_ActionHid(pBtCoexist);
+ break;
+ case BT_8821A_CSR_2ANT_COEX_ALGO_A2DP:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n"));
+ halbtc8821aCsr2ant_ActionA2dp(pBtCoexist);
+ break;
+ case BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n"));
+ halbtc8821aCsr2ant_ActionA2dpPanHs(pBtCoexist);
+ break;
+ case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n"));
+ halbtc8821aCsr2ant_ActionPanEdr(pBtCoexist);
+ break;
+ case BT_8821A_CSR_2ANT_COEX_ALGO_PANHS:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n"));
+ halbtc8821aCsr2ant_ActionPanHs(pBtCoexist);
+ break;
+ case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n"));
+ halbtc8821aCsr2ant_ActionPanEdrA2dp(pBtCoexist);
+ break;
+ case BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n"));
+ halbtc8821aCsr2ant_ActionPanEdrHid(pBtCoexist);
+ break;
+ case BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n"));
+ halbtc8821aCsr2ant_ActionHidA2dpPanEdr(pBtCoexist);
+ break;
+ case BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n"));
+ halbtc8821aCsr2ant_ActionHidA2dp(pBtCoexist);
+ break;
+ default:
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n"));
+ halbtc8821aCsr2ant_CoexAllOff(pBtCoexist);
+ break;
+ }
+ pCoexDm->preAlgorithm = pCoexDm->curAlgorithm;
+ }
+ }
+ else
+ { // stack doesn't notify profile info.
+ // use the following profile info from bt fw.
+ //pCoexSta->bBtLinkExist
+ //pCoexSta->bScoExist
+ //pCoexSta->bA2dpExist
+ //pCoexSta->bHidExist
+ //pCoexSta->bPanExist
+}
+}
+
+
+
+//============================================================
+// work around function start with wa_halbtc8821aCsr2ant_
+//============================================================
+//============================================================
+// extern function start with EXhalbtc8821aCsr2ant_
+//============================================================
+VOID
+EXhalbtc8821aCsr2ant_PowerOnSetting(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+}
+
+VOID
+EXhalbtc8821aCsr2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ )
+{
+ PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
+ u4Byte u4Tmp=0;
+ u2Byte u2Tmp=0;
+ u1Byte u1Tmp=0;
+ u1Byte H2C_Parameter[2] ={0};
+
+
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));
+
+ // backup rf 0x1e value
+ pCoexDm->btRf0x1eBackup =
+ pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);
+
+ // 0x790[5:0]=0x5
+ u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);
+ u1Tmp &= 0xc0;
+ u1Tmp |= 0x5;
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);
+
+ //Antenna config
+ halbtc8821aCsr2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, TRUE, FALSE);
+
+ // PTA parameter
+ halbtc8821aCsr2ant_CoexTable(pBtCoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
+
+ // Enable counter statistics
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); //0x76e[3] =1, WLAN_Act control by PTA
+ pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);
+ pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);
+}
+
+VOID
+EXhalbtc8821aCsr2ant_InitCoexDm(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n"));
+
+ halbtc8821aCsr2ant_InitCoexDm(pBtCoexist);
+}
+
+VOID
+EXhalbtc8821aCsr2ant_DisplayCoexInfo(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
+ PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo;
+ pu1Byte cliBuf=pBtCoexist->cliBuf;
+ u1Byte u1Tmp[4], i, btInfoExt, psTdmaCase=0;
+ u4Byte u4Tmp[4];
+ BOOLEAN bRoam=FALSE, bScan=FALSE, bLink=FALSE, bWifiUnder5G=FALSE;
+ BOOLEAN bBtHsOn=FALSE, bWifiBusy=FALSE;
+ s4Byte wifiRssi=0, btHsRssi=0;
+ u4Byte wifiBw, wifiTrafficDir;
+ u1Byte wifiDot11Chnl, wifiHsChnl;
+ u4Byte fwVer=0, btPatchVer=0;
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
+ CL_PRINTF(cliBuf);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
+ pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum);
+ CL_PRINTF(cliBuf);
+
+ if(pBtCoexist->bManualControl)
+ {
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "[Action Manual control]!!");
+ CL_PRINTF(cliBuf);
+ }
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \
+ ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion);
+ CL_PRINTF(cliBuf);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)", "CoexVer/ FwVer/ PatchVer", \
+ GLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer);
+ CL_PRINTF(cliBuf);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsMode(HsChnl)", \
+ wifiDot11Chnl, bBtHsOn, wifiHsChnl);
+ CL_PRINTF(cliBuf);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \
+ pCoexDm->wifiChnlInfo[0], pCoexDm->wifiChnlInfo[1],
+ pCoexDm->wifiChnlInfo[2]);
+ CL_PRINTF(cliBuf);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \
+ wifiRssi, btHsRssi);
+ CL_PRINTF(cliBuf);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \
+ bLink, bRoam, bScan);
+ CL_PRINTF(cliBuf);
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \
+ (bWifiUnder5G? "5G":"2.4G"),
+ ((BTC_WIFI_BW_LEGACY==wifiBw)? "Legacy": (((BTC_WIFI_BW_HT40==wifiBw)? "HT40":"HT20"))),
+ ((!bWifiBusy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));
+ CL_PRINTF(cliBuf);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \
+ ((pCoexSta->bC2hBtInquiryPage)?("inquiry/page scan"):((BT_8821A_CSR_2ANT_BT_STATUS_IDLE == pCoexDm->btStatus)? "idle":( (BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus)? "connected-idle":"busy"))),
+ pCoexSta->btRssi, pCoexSta->btRetryCnt);
+ CL_PRINTF(cliBuf);
+
+ if(pStackInfo->bProfileNotified)
+ {
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \
+ pStackInfo->bScoExist, pStackInfo->bHidExist, pStackInfo->bPanExist, pStackInfo->bA2dpExist);
+ CL_PRINTF(cliBuf);
+
+ pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);
+ }
+
+ btInfoExt = pCoexSta->btInfoExt;
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \
+ (btInfoExt&BIT0)? "Basic rate":"EDR rate");
+ CL_PRINTF(cliBuf);
+
+ for(i=0; i<BT_INFO_SRC_8821A_CSR_2ANT_MAX; i++)
+ {
+ if(pCoexSta->btInfoC2hCnt[i])
+ {
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8821aCsr2Ant[i], \
+ pCoexSta->btInfoC2h[i][0], pCoexSta->btInfoC2h[i][1],
+ pCoexSta->btInfoC2h[i][2], pCoexSta->btInfoC2h[i][3],
+ pCoexSta->btInfoC2h[i][4], pCoexSta->btInfoC2h[i][5],
+ pCoexSta->btInfoC2h[i][6], pCoexSta->btInfoC2hCnt[i]);
+ CL_PRINTF(cliBuf);
+ }
+ }
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s", "PS state, IPS/LPS", \
+ ((pCoexSta->bUnderIps? "IPS ON":"IPS OFF")),
+ ((pCoexSta->bUnderLps? "LPS ON":"LPS OFF")));
+ CL_PRINTF(cliBuf);
+ pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);
+
+ // Sw mechanism
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");
+ CL_PRINTF(cliBuf);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig]", \
+ pCoexDm->bCurRfRxLpfShrink, pCoexDm->bCurLowPenaltyRa, pCoexDm->bLimitedDig);
+ CL_PRINTF(cliBuf);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ", "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \
+ pCoexDm->bCurAgcTableEn, pCoexDm->bCurAdcBackOff, pCoexDm->bCurDacSwingOn, pCoexDm->curDacSwingLvl);
+ CL_PRINTF(cliBuf);
+
+ // Fw mechanism
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============");
+ CL_PRINTF(cliBuf);
+
+ if(!pBtCoexist->bManualControl)
+ {
+ psTdmaCase = pCoexDm->curPsTdma;
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d", "PS TDMA", \
+ pCoexDm->psTdmaPara[0], pCoexDm->psTdmaPara[1],
+ pCoexDm->psTdmaPara[2], pCoexDm->psTdmaPara[3],
+ pCoexDm->psTdmaPara[4], psTdmaCase);
+ CL_PRINTF(cliBuf);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \
+ pCoexDm->bCurDecBtPwr, pCoexDm->bCurIgnoreWlanAct);
+ CL_PRINTF(cliBuf);
+ }
+
+ // Hw setting
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============");
+ CL_PRINTF(cliBuf);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "RF-A, 0x1e initVal", \
+ pCoexDm->btRf0x1eBackup);
+ CL_PRINTF(cliBuf);
+
+ u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);
+ u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x ", "0x778 (W_Act)/ 0x6cc (CoTab Sel)", \
+ u1Tmp[0], u1Tmp[1]);
+ CL_PRINTF(cliBuf);
+
+ u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x8db);
+ u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xc5b);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x8db(ADC)/0xc5b[29:25](DAC)", \
+ ((u1Tmp[0]&0x60)>>5), ((u1Tmp[1]&0x3e)>>1));
+ CL_PRINTF(cliBuf);
+
+ u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcb4);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)", \
+ u4Tmp[0]&0xff, ((u4Tmp[0]&0x30000000)>>28));
+ CL_PRINTF(cliBuf);
+
+ u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);
+ u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
+ u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x974);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x40/ 0x4c[24:23]/ 0x974", \
+ u1Tmp[0], ((u4Tmp[0]&0x01800000)>>23), u4Tmp[1]);
+ CL_PRINTF(cliBuf);
+
+ u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);
+ u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522", \
+ u4Tmp[0], u1Tmp[0]);
+ CL_PRINTF(cliBuf);
+
+ u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);
+ u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa0a);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xc50(DIG)/0xa0a(CCK-TH)", \
+ u4Tmp[0], u1Tmp[0]);
+ CL_PRINTF(cliBuf);
+
+ u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf48);
+ u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);
+ u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA", \
+ u4Tmp[0], (u1Tmp[0]<<8) + u1Tmp[1] );
+ CL_PRINTF(cliBuf);
+
+ u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);
+ u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);
+ u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8", \
+ u4Tmp[0], u4Tmp[1], u4Tmp[2]);
+ CL_PRINTF(cliBuf);
+
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x770 (hi-pri Rx/Tx)", \
+ pCoexSta->highPriorityRx, pCoexSta->highPriorityTx);
+ CL_PRINTF(cliBuf);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x774(low-pri Rx/Tx)", \
+ pCoexSta->lowPriorityRx, pCoexSta->lowPriorityTx);
+ CL_PRINTF(cliBuf);
+
+ // Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang
+ u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x41b);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x41b (mgntQ hang chk == 0xf)", \
+ u1Tmp[0]);
+ CL_PRINTF(cliBuf);
+
+ pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);
+}
+
+
+VOID
+EXhalbtc8821aCsr2ant_IpsNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ )
+{
+ if(BTC_IPS_ENTER == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));
+ pCoexSta->bUnderIps = TRUE;
+ halbtc8821aCsr2ant_CoexAllOff(pBtCoexist);
+ }
+ else if(BTC_IPS_LEAVE == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));
+ pCoexSta->bUnderIps = FALSE;
+ //halbtc8821aCsr2ant_InitCoexDm(pBtCoexist);
+ }
+}
+
+VOID
+EXhalbtc8821aCsr2ant_LpsNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ )
+{
+ if(BTC_LPS_ENABLE == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n"));
+ pCoexSta->bUnderLps = TRUE;
+ }
+ else if(BTC_LPS_DISABLE == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n"));
+ pCoexSta->bUnderLps = FALSE;
+ }
+}
+
+VOID
+EXhalbtc8821aCsr2ant_ScanNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ )
+{
+ if(BTC_SCAN_START == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));
+ }
+ else if(BTC_SCAN_FINISH == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));
+ }
+}
+
+VOID
+EXhalbtc8821aCsr2ant_ConnectNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ )
+{
+ if(BTC_ASSOCIATE_START == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));
+ }
+ else if(BTC_ASSOCIATE_FINISH == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));
+ }
+}
+
+VOID
+EXhalbtc8821aCsr2ant_MediaStatusNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ )
+{
+ u1Byte H2C_Parameter[3] ={0};
+ u4Byte wifiBw;
+ u1Byte wifiCentralChnl;
+
+ if(BTC_MEDIA_CONNECT == type)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n"));
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));
+ }
+
+ // only 2.4G we need to inform bt the chnl mask
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);
+ if( (BTC_MEDIA_CONNECT == type) &&
+ (wifiCentralChnl <= 14) )
+ {
+ H2C_Parameter[0] = 0x1;
+ H2C_Parameter[1] = wifiCentralChnl;
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
+ if(BTC_WIFI_BW_HT40 == wifiBw)
+ H2C_Parameter[2] = 0x30;
+ else
+ H2C_Parameter[2] = 0x20;
+ }
+
+ pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];
+ pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];
+ pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x66=0x%x\n",
+ H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]));
+
+ pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);
+}
+
+VOID
+EXhalbtc8821aCsr2ant_SpecialPacketNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ )
+{
+ if(type == BTC_PACKET_DHCP)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n"));
+ }
+}
+
+VOID
+EXhalbtc8821aCsr2ant_BtInfoNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN pu1Byte tmpBuf,
+ IN u1Byte length
+ )
+{
+ u1Byte btInfo=0;
+ u1Byte i, rspSource=0;
+ BOOLEAN bBtBusy=FALSE, bLimitedDig=FALSE;
+ BOOLEAN bWifiConnected=FALSE, bBtHsOn=FALSE, bWifiUnder5G=FALSE;
+
+ pCoexSta->bC2hBtInfoReqSent = FALSE;
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);
+
+ rspSource = tmpBuf[0]&0xf;
+ if(rspSource >= BT_INFO_SRC_8821A_CSR_2ANT_MAX)
+ rspSource = BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW;
+ pCoexSta->btInfoC2hCnt[rspSource]++;
+
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rspSource, length));
+ for(i=0; i<length; i++)
+ {
+ pCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];
+ if(i == 1)
+ btInfo = tmpBuf[i];
+ if(i == length-1)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i]));
+ }
+ else
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i]));
+ }
+ }
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
+ if(BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW != rspSource)
+ {
+ pCoexSta->btRetryCnt = // [3:0]
+ pCoexSta->btInfoC2h[rspSource][2]&0xf;
+
+ pCoexSta->btRssi =
+ pCoexSta->btInfoC2h[rspSource][3]*2+10;
+
+ pCoexSta->btInfoExt =
+ pCoexSta->btInfoC2h[rspSource][4];
+
+ // Here we need to resend some wifi info to BT
+ // because bt is reset and loss of the info.
+ if( (pCoexSta->btInfoExt & BIT1) )
+ {
+
+ if(bWifiConnected)
+ {
+ EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);
+ }
+ else
+ {
+ EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
+ }
+ }
+
+ if(!pBtCoexist->bManualControl && !bWifiUnder5G)
+ {
+ if( (pCoexSta->btInfoExt&BIT3) )
+ {
+ if(bWifiConnected)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"));
+ halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, FALSE);
+ }
+ }
+ else
+ {
+ // BT already NOT ignore Wlan active, do nothing here.
+ if(!bWifiConnected)
+ {
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n"));
+ halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
+ }
+ }
+ }
+
+ if( (pCoexSta->btInfoExt & BIT4) )
+ {
+ // BT auto report already enabled, do nothing
+ }
+ else
+ {
+ halbtc8821aCsr2ant_BtAutoReport(pBtCoexist, FORCE_EXEC, TRUE);
+ }
+ }
+
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
+ // check BIT2 first ==> check if bt is under inquiry or page scan
+ if(btInfo & BT_INFO_8821A_CSR_2ANT_B_INQ_PAGE)
+ {
+ pCoexSta->bC2hBtInquiryPage = TRUE;
+ pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;
+ }
+ else
+ {
+ pCoexSta->bC2hBtInquiryPage = FALSE;
+ if(btInfo == 0x1) // connection exists but no busy
+ {
+ pCoexSta->bBtLinkExist = TRUE;
+ pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE;
+ }
+ else if(btInfo & BT_INFO_8821A_CSR_2ANT_B_CONNECTION) // connection exists and some link is busy
+ {
+ pCoexSta->bBtLinkExist = TRUE;
+ if(btInfo & BT_INFO_8821A_CSR_2ANT_B_FTP)
+ pCoexSta->bPanExist = TRUE;
+ else
+ pCoexSta->bPanExist = FALSE;
+ if(btInfo & BT_INFO_8821A_CSR_2ANT_B_A2DP)
+ pCoexSta->bA2dpExist = TRUE;
+ else
+ pCoexSta->bA2dpExist = FALSE;
+ if(btInfo & BT_INFO_8821A_CSR_2ANT_B_HID)
+ pCoexSta->bHidExist = TRUE;
+ else
+ pCoexSta->bHidExist = FALSE;
+ if(btInfo & BT_INFO_8821A_CSR_2ANT_B_SCO_ESCO)
+ pCoexSta->bScoExist = TRUE;
+ else
+ pCoexSta->bScoExist = FALSE;
+ pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;
+ }
+ else
+ {
+ pCoexSta->bBtLinkExist = FALSE;
+ pCoexSta->bPanExist = FALSE;
+ pCoexSta->bA2dpExist = FALSE;
+ pCoexSta->bHidExist = FALSE;
+ pCoexSta->bScoExist = FALSE;
+ pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_IDLE;
+ }
+
+ if(bBtHsOn)
+ {
+ pCoexDm->btStatus = BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE;
+ }
+ }
+
+ if(BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE == pCoexDm->btStatus)
+ {
+ bBtBusy = TRUE;
+ }
+ else
+ {
+ bBtBusy = FALSE;
+ }
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);
+
+ if(BT_8821A_CSR_2ANT_BT_STATUS_IDLE != pCoexDm->btStatus)
+ {
+ bLimitedDig = TRUE;
+ }
+ else
+ {
+ bLimitedDig = FALSE;
+ }
+ pCoexDm->bLimitedDig = bLimitedDig;
+ pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);
+
+ halbtc8821aCsr2ant_RunCoexistMechanism(pBtCoexist);
+}
+
+VOID
+EXhalbtc8821aCsr2ant_HaltNotify(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));
+
+ halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
+ EXhalbtc8821aCsr2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
+}
+
+VOID
+EXhalbtc8821aCsr2ant_PnpNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte pnpState
+ )
+{
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));
+
+ if(BTC_WIFI_PNP_SLEEP == pnpState)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));
+ halbtc8821aCsr2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, TRUE);
+ }
+ else if(BTC_WIFI_PNP_WAKE_UP == pnpState)
+ {
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));
+ }
+}
+
+VOID
+EXhalbtc8821aCsr2ant_Periodical(
+ IN PBTC_COEXIST pBtCoexist
+ )
+{
+ static u1Byte disVerInfoCnt=0;
+ u4Byte fwVer=0, btPatchVer=0;
+ PBTC_BOARD_INFO pBoardInfo=&pBtCoexist->boardInfo;
+ PBTC_STACK_INFO pStackInfo=&pBtCoexist->stackInfo;
+
+ BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical===========================\n"));
+
+ if(disVerInfoCnt <= 5)
+ {
+ disVerInfoCnt += 1;
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", \
+ pBoardInfo->pgAntNum, pBoardInfo->btdmAntNum, pBoardInfo->btdmAntPos));
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], BT stack/ hci ext ver = %s / %d\n", \
+ ((pStackInfo->bProfileNotified)? "Yes":"No"), pStackInfo->hciVersion));
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);
+ pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \
+ GLCoexVerDate8821aCsr2Ant, GLCoexVer8821aCsr2Ant, fwVer, btPatchVer, btPatchVer));
+ BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));
+ }
+
+ halbtc8821aCsr2ant_QueryBtInfo(pBtCoexist);
+ halbtc8821aCsr2ant_MonitorBtCtr(pBtCoexist);
+ halbtc8821aCsr2ant_MonitorBtEnableDisable(pBtCoexist);
+}
+
+
+#endif
+
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h
new file mode 100755
index 0000000..6e429bb
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtc8821aCsr2Ant.h
@@ -0,0 +1,186 @@
+//===========================================
+// The following is for 8821A_CSR 2Ant BT Co-exist definition
+//===========================================
+#define BT_INFO_8821A_CSR_2ANT_B_FTP BIT7
+#define BT_INFO_8821A_CSR_2ANT_B_A2DP BIT6
+#define BT_INFO_8821A_CSR_2ANT_B_HID BIT5
+#define BT_INFO_8821A_CSR_2ANT_B_SCO_BUSY BIT4
+#define BT_INFO_8821A_CSR_2ANT_B_ACL_BUSY BIT3
+#define BT_INFO_8821A_CSR_2ANT_B_INQ_PAGE BIT2
+#define BT_INFO_8821A_CSR_2ANT_B_SCO_ESCO BIT1
+#define BT_INFO_8821A_CSR_2ANT_B_CONNECTION BIT0
+
+#define BTC_RSSI_COEX_THRESH_TOL_8821A_CSR_2ANT 2
+
+typedef enum _BT_INFO_SRC_8821A_CSR_2ANT{
+ BT_INFO_SRC_8821A_CSR_2ANT_WIFI_FW = 0x0,
+ BT_INFO_SRC_8821A_CSR_2ANT_BT_RSP = 0x1,
+ BT_INFO_SRC_8821A_CSR_2ANT_BT_ACTIVE_SEND = 0x2,
+ BT_INFO_SRC_8821A_CSR_2ANT_MAX
+}BT_INFO_SRC_8821A_CSR_2ANT,*PBT_INFO_SRC_8821A_CSR_2ANT;
+
+typedef enum _BT_8821A_CSR_2ANT_BT_STATUS{
+ BT_8821A_CSR_2ANT_BT_STATUS_IDLE = 0x0,
+ BT_8821A_CSR_2ANT_BT_STATUS_CONNECTED_IDLE = 0x1,
+ BT_8821A_CSR_2ANT_BT_STATUS_NON_IDLE = 0x2,
+ BT_8821A_CSR_2ANT_BT_STATUS_MAX
+}BT_8821A_CSR_2ANT_BT_STATUS,*PBT_8821A_CSR_2ANT_BT_STATUS;
+
+typedef enum _BT_8821A_CSR_2ANT_COEX_ALGO{
+ BT_8821A_CSR_2ANT_COEX_ALGO_UNDEFINED = 0x0,
+ BT_8821A_CSR_2ANT_COEX_ALGO_SCO = 0x1,
+ BT_8821A_CSR_2ANT_COEX_ALGO_HID = 0x2,
+ BT_8821A_CSR_2ANT_COEX_ALGO_A2DP = 0x3,
+ BT_8821A_CSR_2ANT_COEX_ALGO_A2DP_PANHS = 0x4,
+ BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR = 0x5,
+ BT_8821A_CSR_2ANT_COEX_ALGO_PANHS = 0x6,
+ BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_A2DP = 0x7,
+ BT_8821A_CSR_2ANT_COEX_ALGO_PANEDR_HID = 0x8,
+ BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP_PANEDR = 0x9,
+ BT_8821A_CSR_2ANT_COEX_ALGO_HID_A2DP = 0xa,
+ BT_8821A_CSR_2ANT_COEX_ALGO_MAX = 0xb,
+}BT_8821A_CSR_2ANT_COEX_ALGO,*PBT_8821A_CSR_2ANT_COEX_ALGO;
+
+typedef struct _COEX_DM_8821A_CSR_2ANT{
+ // fw mechanism
+ BOOLEAN bPreDecBtPwr;
+ BOOLEAN bCurDecBtPwr;
+ u1Byte preFwDacSwingLvl;
+ u1Byte curFwDacSwingLvl;
+ BOOLEAN bCurIgnoreWlanAct;
+ BOOLEAN bPreIgnoreWlanAct;
+ u1Byte prePsTdma;
+ u1Byte curPsTdma;
+ u1Byte psTdmaPara[5];
+ u1Byte psTdmaDuAdjType;
+ BOOLEAN bResetTdmaAdjust;
+ BOOLEAN bPrePsTdmaOn;
+ BOOLEAN bCurPsTdmaOn;
+ BOOLEAN bPreBtAutoReport;
+ BOOLEAN bCurBtAutoReport;
+
+ // sw mechanism
+ BOOLEAN bPreRfRxLpfShrink;
+ BOOLEAN bCurRfRxLpfShrink;
+ u4Byte btRf0x1eBackup;
+ BOOLEAN bPreLowPenaltyRa;
+ BOOLEAN bCurLowPenaltyRa;
+ BOOLEAN bPreDacSwingOn;
+ u4Byte preDacSwingLvl;
+ BOOLEAN bCurDacSwingOn;
+ u4Byte curDacSwingLvl;
+ BOOLEAN bPreAdcBackOff;
+ BOOLEAN bCurAdcBackOff;
+ BOOLEAN bPreAgcTableEn;
+ BOOLEAN bCurAgcTableEn;
+ u4Byte preVal0x6c0;
+ u4Byte curVal0x6c0;
+ u4Byte preVal0x6c4;
+ u4Byte curVal0x6c4;
+ u4Byte preVal0x6c8;
+ u4Byte curVal0x6c8;
+ u1Byte preVal0x6cc;
+ u1Byte curVal0x6cc;
+ BOOLEAN bLimitedDig;
+
+ // algorithm related
+ u1Byte preAlgorithm;
+ u1Byte curAlgorithm;
+ u1Byte btStatus;
+ u1Byte wifiChnlInfo[3];
+} COEX_DM_8821A_CSR_2ANT, *PCOEX_DM_8821A_CSR_2ANT;
+
+typedef struct _COEX_STA_8821A_CSR_2ANT{
+ BOOLEAN bBtLinkExist;
+ BOOLEAN bScoExist;
+ BOOLEAN bA2dpExist;
+ BOOLEAN bHidExist;
+ BOOLEAN bPanExist;
+
+ BOOLEAN bUnderLps;
+ BOOLEAN bUnderIps;
+ u4Byte highPriorityTx;
+ u4Byte highPriorityRx;
+ u4Byte lowPriorityTx;
+ u4Byte lowPriorityRx;
+ u1Byte btRssi;
+ u1Byte preBtRssiState;
+ u1Byte preWifiRssiState[4];
+ BOOLEAN bC2hBtInfoReqSent;
+ u1Byte btInfoC2h[BT_INFO_SRC_8821A_CSR_2ANT_MAX][10];
+ u4Byte btInfoC2hCnt[BT_INFO_SRC_8821A_CSR_2ANT_MAX];
+ BOOLEAN bC2hBtInquiryPage;
+ u1Byte btRetryCnt;
+ u1Byte btInfoExt;
+}COEX_STA_8821A_CSR_2ANT, *PCOEX_STA_8821A_CSR_2ANT;
+
+//===========================================
+// The following is interface which will notify coex module.
+//===========================================
+VOID
+EXhalbtc8821aCsr2ant_PowerOnSetting(
+ IN PBTC_COEXIST pBtCoexist
+ );
+VOID
+EXhalbtc8821aCsr2ant_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
+EXhalbtc8821aCsr2ant_InitCoexDm(
+ IN PBTC_COEXIST pBtCoexist
+ );
+VOID
+EXhalbtc8821aCsr2ant_IpsNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ );
+VOID
+EXhalbtc8821aCsr2ant_LpsNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ );
+VOID
+EXhalbtc8821aCsr2ant_ScanNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ );
+VOID
+EXhalbtc8821aCsr2ant_ConnectNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ );
+VOID
+EXhalbtc8821aCsr2ant_MediaStatusNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ );
+VOID
+EXhalbtc8821aCsr2ant_SpecialPacketNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ );
+VOID
+EXhalbtc8821aCsr2ant_BtInfoNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN pu1Byte tmpBuf,
+ IN u1Byte length
+ );
+VOID
+EXhalbtc8821aCsr2ant_HaltNotify(
+ IN PBTC_COEXIST pBtCoexist
+ );
+VOID
+EXhalbtc8821aCsr2ant_PnpNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte pnpState
+ );
+VOID
+EXhalbtc8821aCsr2ant_Periodical(
+ IN PBTC_COEXIST pBtCoexist
+ );
+VOID
+EXhalbtc8821aCsr2ant_DisplayCoexInfo(
+ IN PBTC_COEXIST pBtCoexist
+ );
+
diff --git a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h
index 9a56381..8390379 100755
--- a/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h
+++ b/rtl8723BS/hal/OUTSRC-BTCoexist/HalBtcOutSrc.h
@@ -4,6 +4,9 @@
#define NORMAL_EXEC FALSE
#define FORCE_EXEC TRUE
+#define BTC_RF_OFF 0x0
+#define BTC_RF_ON 0x1
+
#define BTC_RF_A 0x0
#define BTC_RF_B 0x1
#define BTC_RF_C 0x2
@@ -42,6 +45,15 @@ typedef enum _BTC_POWERSAVE_TYPE{
BTC_PS_MAX
} BTC_POWERSAVE_TYPE, *PBTC_POWERSAVE_TYPE;
+typedef enum _BTC_BT_REG_TYPE{
+ BTC_BT_REG_RF = 0,
+ BTC_BT_REG_MODEM = 1,
+ BTC_BT_REG_BLUEWIZE = 2,
+ BTC_BT_REG_VENDOR = 3,
+ BTC_BT_REG_LE = 4,
+ BTC_BT_REG_MAX
+} BTC_BT_REG_TYPE, *PBTC_BT_REG_TYPE;
+
typedef enum _BTC_CHIP_INTERFACE{
BTC_INTF_UNKNOWN = 0,
BTC_INTF_PCI = 1,
@@ -156,7 +168,8 @@ typedef struct _BTC_BOARD_INFO{
u1Byte pgAntNum; // pg ant number
u1Byte btdmAntNum; // ant number for btdm
u1Byte btdmAntPos; //Bryant Add to indicate Antenna Position for (pgAntNum = 2) && (btdmAntNum =1) (DPDT+1Ant case)
- BOOLEAN bBtExist;
+ u1Byte singleAntPath; // current used for 8723b only, 1=>s0, 0=>s1
+ //BOOLEAN bBtExist;
} BTC_BOARD_INFO, *PBTC_BOARD_INFO;
typedef enum _BTC_DBG_OPCODE{
@@ -209,6 +222,17 @@ typedef enum _BTC_WIFI_PNP{
BTC_WIFI_PNP_MAX
}BTC_WIFI_PNP,*PBTC_WIFI_PNP;
+//for 8723b-d cut large current issue
+typedef enum _BT_WIFI_COEX_STATE{
+ BTC_WIFI_STAT_INIT,
+ BTC_WIFI_STAT_IQK,
+ BTC_WIFI_STAT_NORMAL_OFF,
+ BTC_WIFI_STAT_MP_OFF,
+ BTC_WIFI_STAT_NORMAL,
+ BTC_WIFI_STAT_ANT_DIV,
+ BTC_WIFI_STAT_MAX
+}BT_WIFI_COEX_STATE,*PBT_WIFI_COEX_STATE;
+
// defined for BFP_BTC_GET
typedef enum _BTC_GET_TYPE{
// type BOOLEAN
@@ -225,6 +249,7 @@ typedef enum _BTC_GET_TYPE{
BTC_GET_BL_WIFI_ENABLE_ENCRYPTION,
BTC_GET_BL_WIFI_UNDER_B_MODE,
BTC_GET_BL_EXT_SWITCH,
+ BTC_GET_BL_WIFI_IS_IN_MP_MODE,
// type s4Byte
BTC_GET_S4_WIFI_RSSI,
@@ -260,6 +285,7 @@ typedef enum _BTC_SET_TYPE{
BTC_SET_BL_TO_REJ_AP_AGG_PKT,
BTC_SET_BL_BT_CTRL_AGG_SIZE,
BTC_SET_BL_INC_SCAN_DEV_NUM,
+ BTC_SET_BL_BT_TX_RX_MASK,
// type u1Byte
BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON,
@@ -285,6 +311,7 @@ typedef enum _BTC_SET_TYPE{
// BT Coex related
BTC_SET_ACT_CTRL_BT_INFO,
BTC_SET_ACT_CTRL_BT_COEX,
+ BTC_SET_ACT_CTRL_8723B_ANT,
//=================
BTC_SET_MAX
}BTC_SET_TYPE,*PBTC_SET_TYPE;
@@ -382,6 +409,12 @@ typedef VOID
IN u4Byte Data
);
typedef VOID
+(*BFP_BTC_LOCAL_REG_W1)(
+ IN PVOID pBtcContext,
+ IN u4Byte RegAddr,
+ IN u1Byte Data
+ );
+typedef VOID
(*BFP_BTC_SET_BB_REG)(
IN PVOID pBtcContext,
IN u4Byte RegAddr,
@@ -410,13 +443,6 @@ typedef u4Byte
IN u4Byte BitMask
);
typedef VOID
-(*BFP_BTC_SET_BT_REG)(
- IN PVOID pBtcContext,
- IN u1Byte RegType,
- IN u4Byte RegAddr,
- IN u4Byte Data
- );
-typedef VOID
(*BFP_BTC_FILL_H2C)(
IN PVOID pBtcContext,
IN u1Byte elementId,
@@ -438,6 +464,19 @@ typedef BOOLEAN
OUT PVOID pInBuf
);
typedef VOID
+(*BFP_BTC_SET_BT_REG)(
+ IN PVOID pBtcContext,
+ IN u1Byte regType,
+ IN u4Byte offset,
+ IN u4Byte value
+ );
+typedef u4Byte
+(*BFP_BTC_GET_BT_REG)(
+ IN PVOID pBtcContext,
+ IN u1Byte regType,
+ IN u4Byte offset
+ );
+typedef VOID
(*BFP_BTC_DISP_DBG_MSG)(
IN PVOID pBtCoexist,
IN u1Byte dispType
@@ -451,6 +490,7 @@ typedef struct _BTC_BT_INFO{
BOOLEAN bBtCtrlAggBufSize;
BOOLEAN bRejectAggPkt;
BOOLEAN bIncreaseScanDevNum;
+ BOOLEAN bBtTxRxMask;
u1Byte preAggBufSize;
u1Byte aggBufSize;
BOOLEAN bBtBusy;
@@ -458,6 +498,7 @@ typedef struct _BTC_BT_INFO{
u2Byte btHciVer;
u2Byte btRealFwVer;
u1Byte btFwVer;
+ u4Byte getBtFwVerCnt;
BOOLEAN bBtDisableLowPwr;
@@ -494,10 +535,12 @@ typedef struct _BTC_BT_LINK_INFO{
BOOLEAN bHidOnly;
BOOLEAN bPanExist;
BOOLEAN bPanOnly;
+ BOOLEAN bSlaveRole;
} BTC_BT_LINK_INFO, *PBTC_BT_LINK_INFO;
typedef struct _BTC_STATISTICS{
u4Byte cntBind;
+ u4Byte cntPowerOn;
u4Byte cntInitHwConfig;
u4Byte cntInitCoexDm;
u4Byte cntIpsNotify;
@@ -507,6 +550,7 @@ typedef struct _BTC_STATISTICS{
u4Byte cntMediaStatusNotify;
u4Byte cntSpecialPacketNotify;
u4Byte cntBtInfoNotify;
+ u4Byte cntRfStatusNotify;
u4Byte cntPeriodical;
u4Byte cntCoexDmSwitch;
u4Byte cntStackOperationNotify;
@@ -538,6 +582,7 @@ typedef struct _BTC_COEXIST{
BFP_BTC_W2 fBtcWrite2Byte;
BFP_BTC_R4 fBtcRead4Byte;
BFP_BTC_W4 fBtcWrite4Byte;
+ BFP_BTC_LOCAL_REG_W1 fBtcWriteLocalReg1Byte;
// read/write bb related
BFP_BTC_SET_BB_REG fBtcSetBbReg;
BFP_BTC_GET_BB_REG fBtcGetBbReg;
@@ -546,9 +591,6 @@ typedef struct _BTC_COEXIST{
BFP_BTC_SET_RF_REG fBtcSetRfReg;
BFP_BTC_GET_RF_REG fBtcGetRfReg;
- //write bt reg related
- BFP_BTC_SET_BT_REG fBtcSetBtReg;
-
// fill h2c related
BFP_BTC_FILL_H2C fBtcFillH2c;
// other
@@ -556,19 +598,27 @@ typedef struct _BTC_COEXIST{
// normal get/set related
BFP_BTC_GET fBtcGet;
BFP_BTC_SET fBtcSet;
+
+ BFP_BTC_GET_BT_REG fBtcGetBtReg;
+ BFP_BTC_SET_BT_REG fBtcSetBtReg;
} BTC_COEXIST, *PBTC_COEXIST;
extern BTC_COEXIST GLBtCoexist;
BOOLEAN
EXhalbtcoutsrc_InitlizeVariables(
- IN PVOID Adapter
+ IN PVOID Adapter
);
VOID
-EXhalbtcoutsrc_InitHwConfig(
+EXhalbtcoutsrc_PowerOnSetting(
IN PBTC_COEXIST pBtCoexist
);
VOID
+EXhalbtcoutsrc_InitHwConfig(
+ IN PBTC_COEXIST pBtCoexist,
+ IN BOOLEAN bWifiOnly
+ );
+VOID
EXhalbtcoutsrc_InitCoexDm(
IN PBTC_COEXIST pBtCoexist
);
@@ -609,6 +659,11 @@ EXhalbtcoutsrc_BtInfoNotify(
IN u1Byte length
);
VOID
+EXhalbtcoutsrc_RfStatusNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ );
+VOID
EXhalbtcoutsrc_StackOperationNotify(
IN PBTC_COEXIST pBtCoexist,
IN u1Byte type
@@ -618,18 +673,13 @@ EXhalbtcoutsrc_HaltNotify(
IN PBTC_COEXIST pBtCoexist
);
VOID
-EXhalbtcoutsrc_SwitchGntBt(
- IN PBTC_COEXIST pBtCoexist
- );
-VOID
EXhalbtcoutsrc_PnpNotify(
IN PBTC_COEXIST pBtCoexist,
IN u1Byte pnpState
);
VOID
EXhalbtcoutsrc_CoexDmSwitch(
- IN PBTC_COEXIST pBtCoexist,
- IN BOOLEAN antInverse
+ IN PBTC_COEXIST pBtCoexist
);
VOID
EXhalbtcoutsrc_Periodical(
@@ -659,10 +709,12 @@ VOID
EXhalbtcoutsrc_UpdateMinBtRssi(
IN s1Byte btRssi
);
+#if 0
VOID
EXhalbtcoutsrc_SetBtExist(
IN BOOLEAN bBtExist
);
+#endif
VOID
EXhalbtcoutsrc_SetChipType(
IN u1Byte chipType
@@ -670,8 +722,11 @@ EXhalbtcoutsrc_SetChipType(
VOID
EXhalbtcoutsrc_SetAntNum(
IN u1Byte type,
- IN u1Byte antNum,
- IN BOOLEAN antInverse
+ IN u1Byte antNum
+ );
+VOID
+EXhalbtcoutsrc_SetSingleAntPath(
+ IN u1Byte singleAntPath
);
VOID
EXhalbtcoutsrc_DisplayBtCoexInfo(
diff --git a/rtl8723BS/hal/OUTSRC/odm.c b/rtl8723BS/hal/OUTSRC/odm.c
index fd6474e..1388d36 100755
--- a/rtl8723BS/hal/OUTSRC/odm.c
+++ b/rtl8723BS/hal/OUTSRC/odm.c
@@ -36,50 +36,6 @@ const u2Byte dB_Invert_Table[8][12] = {
{ 17783, 19953, 22387, 25119, 28184, 31623, 35481, 39811, 44668, 50119, 56234, 65535}};
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-static u4Byte edca_setting_UL[HT_IOT_PEER_MAX] =
-// UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU MARVELL 92U_AP SELF_AP(DownLink/Tx)
-{ 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322};
-
-
-static u4Byte edca_setting_DL[HT_IOT_PEER_MAX] =
-// UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU, MARVELL 92U_AP SELF_AP(UpLink/Rx)
-{ 0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b};
-
-static u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] =
-// UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU, MARVELL 92U_AP SELF_AP
-{ 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322, 0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b};
-
-
-//============================================================
-// EDCA Paramter for AP/ADSL by Mingzhi 2011-11-22
-//============================================================
-#elif (DM_ODM_SUPPORT_TYPE &ODM_ADSL)
-enum qos_prio { BK, BE, VI, VO, VI_AG, VO_AG };
-
-static const struct ParaRecord rtl_ap_EDCA[] =
-{
-//ACM,AIFSN, ECWmin, ECWmax, TXOplimit
- {0, 7, 4, 10, 0}, //BK
- {0, 3, 4, 6, 0}, //BE
- {0, 1, 3, 4, 188}, //VI
- {0, 1, 2, 3, 102}, //VO
- {0, 1, 3, 4, 94}, //VI_AG
- {0, 1, 2, 3, 47}, //VO_AG
-};
-
-static const struct ParaRecord rtl_sta_EDCA[] =
-{
-//ACM,AIFSN, ECWmin, ECWmax, TXOplimit
- {0, 7, 4, 10, 0},
- {0, 3, 4, 10, 0},
- {0, 2, 3, 4, 188},
- {0, 2, 2, 3, 102},
- {0, 2, 3, 4, 94},
- {0, 2, 2, 3, 47},
-};
-#endif
-
//============================================================
// Global var
//============================================================
@@ -440,58 +396,13 @@ odm_BasicDbgMessage
//END------------COMMON INFO RELATED---------------//
//START---------------DIG---------------------------//
-VOID
-odm_FalseAlarmCounterStatistics(
- IN PDM_ODM_T pDM_Odm
- );
-VOID
-odm_DIGInit(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_DIG(
- IN PDM_ODM_T pDM_Odm
- );
+//Remove by Yuchen
-BOOLEAN
-odm_DigAbort(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_CCKPacketDetectionThresh(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_AdaptivityInit(
- IN PDM_ODM_T pDM_Odm
-);
-
-VOID
-odm_Adaptivity(
- IN PDM_ODM_T pDM_Odm,
- IN u1Byte IGI
-);
//END---------------DIG---------------------------//
//START-------BB POWER SAVE-----------------------//
-VOID
-odm_DynamicBBPowerSavingInit(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_DynamicBBPowerSaving(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_1R_CCA(
- IN PDM_ODM_T pDM_Odm
- );
+//Remove BB power Saving by YuChen
//END---------BB POWER SAVE-----------------------//
//START-----------------PSD-----------------------//
@@ -499,36 +410,8 @@ odm_1R_CCA(
//============================================================
// Function predefine.
//============================================================
-VOID odm_PathDiversityInit_92C( IN PADAPTER Adapter);
-VOID odm_2TPathDiversityInit_92C( IN PADAPTER Adapter);
-VOID odm_1TPathDiversityInit_92C( IN PADAPTER Adapter);
-BOOLEAN odm_IsConnected_92C(IN PADAPTER Adapter);
-VOID odm_PathDiversityAfterLink_92C( IN PADAPTER Adapter);
-
-VOID
-odm_CCKTXPathDiversityCallback(
- PRT_TIMER pTimer
- );
-
-VOID
-odm_CCKTXPathDiversityWorkItemCallback(
- IN PVOID pContext
- );
-
-VOID
-odm_PathDivChkAntSwitchCallback(
- PRT_TIMER pTimer
- );
-
-VOID
-odm_PathDivChkAntSwitchWorkitemCallback(
- IN PVOID pContext
- );
-VOID odm_SetRespPath_92C( IN PADAPTER Adapter, IN u1Byte DefaultRespPath);
-VOID odm_OFDMTXPathDiversity_92C( IN PADAPTER Adapter);
-VOID odm_CCKTXPathDiversity_92C( IN PADAPTER Adapter);
-VOID odm_ResetPathDiversity_92C( IN PADAPTER Adapter);
+//Remove PathDiversity related funtion predefine to odm_PathDiv.h
//Start-------------------- RX High Power------------------------//
VOID odm_RXHPInit( IN PDM_ODM_T pDM_Odm);
@@ -566,69 +449,7 @@ odm_RefreshRateAdaptiveMaskAPADSL(
IN PDM_ODM_T pDM_Odm
);
-VOID
-ODM_DynamicATCSwitch_init(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-ODM_DynamicATCSwitch(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_Write_CrystalCap(
- IN PDM_ODM_T pDM_Odm,
- IN u1Byte CrystalCap
-);
-
-VOID
-odm_DynamicTxPowerInit(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_DynamicTxPowerRestorePowerIndex(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_DynamicTxPowerNIC(
- IN PDM_ODM_T pDM_Odm
- );
-
-#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-VOID
-odm_DynamicTxPowerSavePowerIndex(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_DynamicTxPowerWritePowerIndex(
- IN PDM_ODM_T pDM_Odm,
- IN u1Byte Value);
-
-VOID
-odm_DynamicTxPower_92C(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_DynamicTxPower_92D(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_MPT_DIGCallback(
- PRT_TIMER pTimer
-);
-
-VOID
-odm_MPT_DIGWorkItemCallback(
- IN PVOID pContext
- );
-#endif
-
+//Remove by YuChen
VOID
odm_RSSIMonitorInit(
@@ -655,16 +476,6 @@ VOID
odm_RSSIMonitorCheck(
IN PDM_ODM_T pDM_Odm
);
-VOID
-odm_DynamicTxPower(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_DynamicTxPowerAP(
- IN PDM_ODM_T pDM_Odm
- );
-
VOID
odm_SwAntDivInit(
@@ -740,12 +551,6 @@ odm_TXPowerTrackingCheckAP(
IN PDM_ODM_T pDM_Odm
);
-
-
-
-
-
-
VOID
odm_RateAdaptiveMaskInit(
IN PDM_ODM_T pDM_Odm
@@ -813,60 +618,7 @@ odm_TXPowerTrackingThermalMeterCheck(
#endif
-VOID
-odm_EdcaTurboCheck(
- IN PDM_ODM_T pDM_Odm
- );
-VOID
-ODM_EdcaTurboInit(
- IN PDM_ODM_T pDM_Odm
-);
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID
-odm_EdcaTurboCheckMP(
- IN PDM_ODM_T pDM_Odm
- );
-
-//check if edca turbo is disabled
-BOOLEAN
-odm_IsEdcaTurboDisable(
- IN PDM_ODM_T pDM_Odm
-);
-//choose edca paramter for special IOT case
-VOID
-ODM_EdcaParaSelByIot(
- IN PDM_ODM_T pDM_Odm,
- OUT u4Byte *EDCA_BE_UL,
- OUT u4Byte *EDCA_BE_DL
- );
-//check if it is UL or DL
-VOID
-odm_EdcaChooseTrafficIdx(
- IN PDM_ODM_T pDM_Odm,
- IN u8Byte cur_tx_bytes,
- IN u8Byte cur_rx_bytes,
- IN BOOLEAN bBiasOnRx,
- OUT BOOLEAN *pbIsCurRDLState
- );
-
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-VOID
-odm_EdcaTurboCheckCE(
- IN PDM_ODM_T pDM_Odm
- );
-#else
-VOID
-odm_IotEngine(
- IN PDM_ODM_T pDM_Odm
- );
-
-VOID
-odm_EdcaParaInit(
- IN PDM_ODM_T pDM_Odm
- );
-#endif
-
+//Remove Edca by Yu Chen
#define RxDefaultAnt1 0x65a9
@@ -901,10 +653,6 @@ odm_HwAntDiv(
IN PDM_ODM_T pDM_Odm
);
-VOID odm_PathDiversityInit(IN PDM_ODM_T pDM_Odm);
-VOID odm_PathDiversity( IN PDM_ODM_T pDM_Odm);
-
-
//============================================================
//3 Export Interface
@@ -919,88 +667,85 @@ ODM_DMInit(
)
{
- //2012.05.03 Luke: For all IC series
odm_CommonInfoSelfInit(pDM_Odm);
odm_CmnInfoInit_Debug(pDM_Odm);
- odm_DIGInit(pDM_Odm);
+ odm_DIGInit(pDM_Odm);
+ odm_NHMCounterStatisticsInit(pDM_Odm);
odm_AdaptivityInit(pDM_Odm);
odm_RateAdaptiveMaskInit(pDM_Odm);
+ ODM_CfoTrackingInit(pDM_Odm);
+ ODM_EdcaTurboInit(pDM_Odm);
odm_RSSIMonitorInit(pDM_Odm);
-
-#if (RTL8192E_SUPPORT == 1)
- if(pDM_Odm->SupportICType==ODM_RTL8192E)
- {
- odm_PrimaryCCA_Check_Init(pDM_Odm);
- }
-#endif
+ odm_TXPowerTrackingInit(pDM_Odm);
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ ODM_ClearTxPowerTrackingState(pDM_Odm);
-//#if (MP_DRIVER != 1)
if ( *(pDM_Odm->mp_mode) != 1)
- odm_PathDiversityInit(pDM_Odm);
-//#endif
- ODM_EdcaTurboInit(pDM_Odm);
+ odm_PathDiversityInit(pDM_Odm);
- if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+#endif
+
+#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
+ if ( *(pDM_Odm->mp_mode) != 1){
+ if(pDM_Odm->SupportICType==ODM_RTL8723A)
+ odm_SwAntDivInit(pDM_Odm);
+ else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
{
- odm_TXPowerTrackingInit(pDM_Odm);
-//#if (MP_DRIVER != 1)
- if ( *(pDM_Odm->mp_mode) != 1)
- ODM_AntDivInit(pDM_Odm);
-//#endif
+ if(pDM_Odm->AntDivType == HW_ANTDIV)
+ odm_InitHybridAntDiv(pDM_Odm);
+ else
+ odm_SwAntDivInit(pDM_Odm);
}
- else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ else
+ ODM_AntDivInit(pDM_Odm);
+ }
+#endif
+
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
{
odm_DynamicBBPowerSavingInit(pDM_Odm);
odm_DynamicTxPowerInit(pDM_Odm);
- odm_TXPowerTrackingInit(pDM_Odm);
- //ODM_EdcaTurboInit(pDM_Odm);
-//#if (MP_DRIVER != 1)
- if ( *(pDM_Odm->mp_mode) != 1) {
- if(pDM_Odm->SupportICType==ODM_RTL8723A)
- odm_SwAntDivInit(pDM_Odm);
- else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
+
+#if (RTL8188E_SUPPORT == 1)
+ if(pDM_Odm->SupportICType==ODM_RTL8188E)
{
- if(pDM_Odm->AntDivType == HW_ANTDIV)
- odm_InitHybridAntDiv(pDM_Odm);
- else
- odm_SwAntDivInit(pDM_Odm);
+ odm_PrimaryCCA_Init(pDM_Odm);
+ ODM_RAInfo_Init_all(pDM_Odm);
}
- else
- ODM_AntDivInit(pDM_Odm);
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ #if (RTL8723B_SUPPORT == 1)
if(pDM_Odm->SupportICType == ODM_RTL8723B)
odm_SwAntDetectInit(pDM_Odm);
- }
-//#endif
+ #endif
-//2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled,
-// so compile flags must be left here to prevent from compile errors
-#if (RTL8188E_SUPPORT == 1)
- if(pDM_Odm->SupportICType==ODM_RTL8188E)
- {
- odm_PrimaryCCA_Init(pDM_Odm); // Gary
- ODM_RAInfo_Init_all(pDM_Odm);
- }
-#endif
+ #if (RTL8192E_SUPPORT == 1)
+ if(pDM_Odm->SupportICType==ODM_RTL8192E)
+ odm_PrimaryCCA_Check_Init(pDM_Odm);
+ #endif
-//2010.05.30 LukeLee: Following are not incorporated into ODM structure yet.
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- if(pDM_Odm->SupportICType&ODM_RTL8723A)
+ #if (RTL8723A_SUPPORT == 1)
+ if(pDM_Odm->SupportICType == ODM_RTL8723A)
odm_PSDMonitorInit(pDM_Odm);
-
- if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E)))
- {
- odm_RXHPInit(pDM_Odm);
- }
+ #endif
+
+ #if (RTL8192D_SUPPORT == 1)
if(pDM_Odm->SupportICType==ODM_RTL8192D)
- {
- odm_PathDivInit_92D(pDM_Odm); //92D Path Div Init //Neil Chen
- }
+ odm_PathDivInit_92D(pDM_Odm);
+ #endif
+
+ #if ((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1))
+ if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
+ odm_RXHPInit(pDM_Odm);
+ #endif
+#endif
#endif
- }
- ODM_DynamicATCSwitch_init(pDM_Odm);
- ODM_ClearTxPowerTrackingState(pDM_Odm);
+ }
}
@@ -1026,6 +771,7 @@ ODM_DMWatchdog(
odm_CommonInfoSelfUpdate(pDM_Odm);
odm_BasicDbgMessage(pDM_Odm);
odm_FalseAlarmCounterStatistics(pDM_Odm);
+ odm_NHMCounterStatistics(pDM_Odm);
ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI=0x%x\n",pDM_Odm->RSSI_Min));
odm_RSSIMonitorCheck(pDM_Odm);
@@ -1069,7 +815,7 @@ ODM_DMWatchdog(
odm_DynamicBBPowerSaving(pDM_Odm);
odm_EdcaTurboCheck(pDM_Odm);
odm_PathDiversity(pDM_Odm);
- ODM_DynamicATCSwitch(pDM_Odm);
+ ODM_CfoTracking(pDM_Odm);
odm_DynamicTxPower(pDM_Odm);
#if (RTL8192E_SUPPORT == 1)
@@ -1483,8 +1229,8 @@ ODM_CmnInfoUpdate(
pDM_Odm->RateAdaptive.LowRSSIThresh = (u1Byte)Value;
break;
// The following is for BT HS mode and BT coexist mechanism.
- case ODM_CMNINFO_BT_DISABLED:
- pDM_Odm->bBtDisabled = (BOOLEAN)Value;
+ case ODM_CMNINFO_BT_ENABLED:
+ pDM_Odm->bBtEnabled = (BOOLEAN)Value;
break;
case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:
@@ -1967,1867 +1713,17 @@ odm_IsLinked(
* When Who Remark
*
*---------------------------------------------------------------------------*/
-VOID
-ODM_ChangeDynamicInitGainThresh(
- IN PDM_ODM_T pDM_Odm,
- IN u4Byte DM_Type,
- IN u4Byte DM_Value
- )
-{
- pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
-
- if (DM_Type == DIG_TYPE_THRESH_HIGH)
- {
- pDM_DigTable->RssiHighThresh = DM_Value;
- }
- else if (DM_Type == DIG_TYPE_THRESH_LOW)
- {
- pDM_DigTable->RssiLowThresh = DM_Value;
- }
- else if (DM_Type == DIG_TYPE_ENABLE)
- {
- pDM_DigTable->Dig_Enable_Flag = TRUE;
- }
- else if (DM_Type == DIG_TYPE_DISABLE)
- {
- pDM_DigTable->Dig_Enable_Flag = FALSE;
- }
- else if (DM_Type == DIG_TYPE_BACKOFF)
- {
- if(DM_Value > 30)
- DM_Value = 30;
- pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
- }
- else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
- {
- if(DM_Value == 0)
- DM_Value = 0x1;
- pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
- }
- else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
- {
- if(DM_Value > 0x50)
- DM_Value = 0x50;
- pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
- }
-} /* DM_ChangeDynamicInitGainThresh */
-
-int getIGIForDiff(int value_IGI)
-{
- #define ONERCCA_LOW_TH 0x30
- #define ONERCCA_LOW_DIFF 8
-
- if (value_IGI < ONERCCA_LOW_TH) {
- if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
- return ONERCCA_LOW_TH;
- else
- return value_IGI + ONERCCA_LOW_DIFF;
- } else {
- return value_IGI;
- }
-}
-
-
-VOID
-odm_AdaptivityInit(
-IN PDM_ODM_T pDM_Odm
-)
-{
- if(pDM_Odm->SupportICType == ODM_RTL8723B)
- {
- pDM_Odm->TH_L2H_ini = 0xf8; // -8
- }
- if((pDM_Odm->SupportICType == ODM_RTL8192E)&&(pDM_Odm->SupportInterface == ODM_ITRF_PCIE))
- {
- pDM_Odm->TH_L2H_ini = 0xf0; // -16
- }
- else
- {
- pDM_Odm->TH_L2H_ini = 0xf9; // -7
- }
-
- pDM_Odm->TH_EDCCA_HL_diff = 7;
- pDM_Odm->IGI_Base = 0x32;
- pDM_Odm->IGI_target = 0x1c;
- pDM_Odm->ForceEDCCA = 0;
- pDM_Odm->AdapEn_RSSI = 20;
-
- //Reg524[11]=0 is easily to transmit packets during adaptivity test
-
- //ODM_SetBBReg(pDM_Odm, 0x524, BIT11, 1);// stop counting if EDCCA is asserted
-}
-
-// Add by Neil Chen to enable edcca to MP Platform
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-VOID
-odm_EnableEDCCA(
- IN PDM_ODM_T pDM_Odm
-)
-{
-
- // This should be moved out of OUTSRC
- PADAPTER pAdapter = pDM_Odm->Adapter;
- // Enable EDCCA. The value is suggested by SD3 Wilson.
-
- //
- // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
- //
- if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
- {
- //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x00);
- ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x00);
- ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0xFD);
-
- }
- else
- {
- //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x03);
- ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x03);
- ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0x00);
- }
-
- //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold+2, 0x00);
-}
-
-VOID
-odm_DisableEDCCA(
- IN PDM_ODM_T pDM_Odm
-)
-{
- // Disable EDCCA..
- ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);
- ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 0x7f);
-}
-
-//
-// Description: According to initial gain value to determine to enable or disable EDCCA.
-//
-// Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
-//
-VOID
-odm_DynamicEDCCA(
- IN PDM_ODM_T pDM_Odm
-)
-{
- PADAPTER pAdapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
- u1Byte RegC50, RegC58;
- BOOLEAN bFwCurrentInPSMode=FALSE;
-
- pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));
-
- // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
- if(bFwCurrentInPSMode)
- return;
-
- RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
- RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0);
-
-
- if((RegC50 > 0x28 && RegC58 > 0x28) ||
- ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26)) ||
- (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28))
- {
- if(!pHalData->bPreEdccaEnable)
- {
- odm_EnableEDCCA(pDM_Odm);
- pHalData->bPreEdccaEnable = TRUE;
- }
-
- }
- else if((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25))
- {
- if(pHalData->bPreEdccaEnable)
- {
- odm_DisableEDCCA(pDM_Odm);
- pHalData->bPreEdccaEnable = FALSE;
- }
- }
-}
-
-
-#endif // end MP platform support
-
-VOID
-odm_Adaptivity(
- IN PDM_ODM_T pDM_Odm,
- IN u1Byte IGI
-)
-{
- s1Byte TH_L2H_dmc, TH_H2L_dmc;
- s1Byte Diff, IGI_target;
- BOOLEAN EDCCA_State = 0;
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- PADAPTER pAdapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
- BOOLEAN bFwCurrentInPSMode=FALSE;
- PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
-
- pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));
-
- // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
- if(bFwCurrentInPSMode)
- return;
-#endif
-
- if(!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY))
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA() \n"));
- // Add by Neil Chen to enable edcca to MP Platform
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- // Adjust EDCCA.
- if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
- odm_DynamicEDCCA(pDM_Odm);
-#endif
- return;
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_Adaptivity() =====> \n"));
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n",
- pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI));
-
- if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
- ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); //ADC_mask enable
-
- if((!pDM_Odm->bLinked)||(*pDM_Odm->pChannel > 149)) // Band4 doesn't need adaptivity
- {
- if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
- {
- ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
- ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
- }
- else
- ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f);
- return;
- }
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
- if(pMgntInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
- ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0a);
- else
- ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0e);
-#endif
- if(!pDM_Odm->ForceEDCCA)
- {
- if(pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI)
- EDCCA_State = 1;
- else if(pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5))
- EDCCA_State = 0;
- }
- else
- EDCCA_State = 1;
- //if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (*pDM_Odm->pBandType == BAND_ON_5G))
- //IGI_target = pDM_Odm->IGI_Base;
- //else
- {
-
- if(*pDM_Odm->pBandWidth == ODM_BW20M) //CHANNEL_WIDTH_20
- IGI_target = pDM_Odm->IGI_Base;
- else if(*pDM_Odm->pBandWidth == ODM_BW40M)
- IGI_target = pDM_Odm->IGI_Base + 2;
- else if(*pDM_Odm->pBandWidth == ODM_BW80M)
- IGI_target = pDM_Odm->IGI_Base + 6;
- else
- IGI_target = pDM_Odm->IGI_Base;
- }
-
- pDM_Odm->IGI_target = (u1Byte) IGI_target;
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d\n",
- (*pDM_Odm->pBandWidth==ODM_BW80M)?"80M":((*pDM_Odm->pBandWidth==ODM_BW40M)?"40M":"20M"), IGI_target, EDCCA_State));
-
- if(EDCCA_State == 1)
- {
- Diff = IGI_target -(s1Byte)IGI;
- TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
- if(TH_L2H_dmc > 10) TH_L2H_dmc = 10;
- TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
- }
- else
- {
- TH_L2H_dmc = 0x7f;
- TH_H2L_dmc = 0x7f;
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n",
- IGI, TH_L2H_dmc, TH_H2L_dmc));
-
- if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
- {
- ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
- ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
- }
- else
- ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
-}
-
-VOID
-ODM_DynamicATCSwitch_init(
- IN PDM_ODM_T pDM_Odm
-)
-{
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN )
-
- pDM_Odm->CrystalCap = pHalData->CrystalCap;
- pDM_Odm->bATCStatus = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11);
- pDM_Odm->CFOThreshold = CFO_Threshold_Xtal;
-
-#endif
-}
-
-VOID
-ODM_DynamicATCSwitch(
- IN PDM_ODM_T pDM_Odm
-)
-{
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- u1Byte CrystalCap,ATC_status_temp = 0;
- u4Byte packet_count;
- int CFO_kHz_A,CFO_kHz_B,CFO_ave = 0, Adjust_Xtal = 0;
- int CFO_ave_diff;
-
-#if (MP_DRIVER == 1)
- if ( *(pDM_Odm->mp_mode) == 1)
- pDM_Odm->bLinked = TRUE;
-#endif
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN )
-
- if(!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC))
- return;
-
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("=========> ODM_DynamicATCSwitch()\n"));
-
- //2 No link!
- //
- if(!pDM_Odm->bLinked)
- {
- //3
- //3 1.Enable ATC
- if(pDM_Odm->bATCStatus == ATC_Status_Off)
- {
- if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
- ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_On);
-
- if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
- ODM_SetBBReg(pDM_Odm, rFc_area_Jaguar, BIT14, ATC_Status_On);
-
- pDM_Odm->bATCStatus = ATC_Status_On;
- }
-
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): No link!!\n"));
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): ATCStatus = %d\n", pDM_Odm->bATCStatus));
-
- //3 2.Disable CFO tracking for BT
- if(!pDM_Odm->bBtDisabled)
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!!\n"));
- return;
- }
-
- //3 3.Reset Crystal Cap.
- if(pDM_Odm->CrystalCap != pHalData->CrystalCap)
- {
- pDM_Odm->CrystalCap = pHalData->CrystalCap;
- CrystalCap = pDM_Odm->CrystalCap & 0x3f;
- odm_Write_CrystalCap(pDM_Odm,CrystalCap);
- }
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): CrystalCap = 0x%x\n", pDM_Odm->CrystalCap));
-
- }
- else
- {
-
- //2 Initialization
- //
- //3 1. Calculate CFO for path-A & path-B
- CFO_kHz_A = (int)(pDM_Odm->CFO_tail[0] * 3125) / 1280;
- CFO_kHz_B = (int)(pDM_Odm->CFO_tail[1] * 3125) / 1280;
- packet_count = pDM_Odm->packetCount;
-
- //3 2.No new packet
- if(packet_count == pDM_Odm->packetCount_pre)
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): packet counter doesn't change\n"));
- return;
- }
- pDM_Odm->packetCount_pre = packet_count;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): packet counter = %d\n", pDM_Odm->packetCount));
-
- //3 3.Average CFO
- if(pDM_Odm->RFType == ODM_1T1R)
- CFO_ave = CFO_kHz_A;
- else
- CFO_ave = (int)(CFO_kHz_A + CFO_kHz_B) >> 1;
-
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): CFO_kHz_A = %dkHz, CFO_kHz_B = %dkHz, CFO_ave = %dkHz\n",
- CFO_kHz_A, CFO_kHz_B, CFO_ave));
-
- //3 4.Avoid abnormal large CFO
- CFO_ave_diff = (pDM_Odm->CFO_ave_pre >= CFO_ave)?(pDM_Odm->CFO_ave_pre - CFO_ave):(CFO_ave - pDM_Odm->CFO_ave_pre);
- if(CFO_ave_diff > 20 && pDM_Odm->largeCFOHit == 0)
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): first large CFO hit\n"));
- pDM_Odm->largeCFOHit = 1;
- return;
- }
- else
- pDM_Odm->largeCFOHit = 0;
- pDM_Odm->CFO_ave_pre = CFO_ave;
-
- //2 CFO tracking by adjusting Xtal cap.
- //
- if (pDM_Odm->bBtDisabled)
- {
- //3 1.Dynamic Xtal threshold
- if(CFO_ave >= -pDM_Odm->CFOThreshold && CFO_ave <= pDM_Odm->CFOThreshold && pDM_Odm->bIsfreeze == 0)
- {
- if (pDM_Odm->CFOThreshold == CFO_Threshold_Xtal)
- {
- pDM_Odm->CFOThreshold = CFO_Threshold_Xtal + 10;
- pDM_Odm->bIsfreeze = 1;
- }
- else
- pDM_Odm->CFOThreshold = CFO_Threshold_Xtal;
- }
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Dynamic threshold = %d\n", pDM_Odm->CFOThreshold));
-
- //3 2.Calculate Xtal offset
- if(CFO_ave > pDM_Odm->CFOThreshold && pDM_Odm->CrystalCap < 0x3f)
- Adjust_Xtal = ((CFO_ave - CFO_Threshold_Xtal) >> 2) + 1;
- else if(CFO_ave < (-pDM_Odm->CFOThreshold) && pDM_Odm->CrystalCap > 0)
- Adjust_Xtal = ((CFO_ave + CFO_Threshold_Xtal) >> 2) - 1;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Crystal cap = 0x%x, Crystal cap offset = %d\n", pDM_Odm->CrystalCap, Adjust_Xtal));
-
- //3 3.Adjudt Crystal Cap.
- if(Adjust_Xtal != 0)
- {
- pDM_Odm->bIsfreeze = 0;
- pDM_Odm->CrystalCap = pDM_Odm->CrystalCap + Adjust_Xtal;
-
- if(pDM_Odm->CrystalCap > 0x3f)
- pDM_Odm->CrystalCap = 0x3f;
- else if (pDM_Odm->CrystalCap < 0)
- pDM_Odm->CrystalCap = 0;
-
- CrystalCap = pDM_Odm->CrystalCap & 0x3f;
- odm_Write_CrystalCap(pDM_Odm,CrystalCap);
-
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): New crystal cap = 0x%x \n", pDM_Odm->CrystalCap));
- }
- }
- else if(pDM_Odm->CrystalCap != pHalData->CrystalCap)
- {
- //3 Reset Xtal Cap when BT is enable
- pDM_Odm->CrystalCap = pHalData->CrystalCap;
- CrystalCap = pDM_Odm->CrystalCap & 0x3f;
- odm_Write_CrystalCap(pDM_Odm,CrystalCap);
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!! (CrystalCap is reset)\n"));
- }
- else
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!! (CrystalCap is unchanged)\n"));
- if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES){
- //2 Dynamic ATC switch
- //
- //3 1.Enable ATC when CFO is larger then 80kHz
- if(CFO_ave < CFO_Threshold_ATC && CFO_ave > -CFO_Threshold_ATC)
- {
- if(pDM_Odm->bATCStatus == ATC_Status_On)
- {
- ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_Off);
- pDM_Odm->bATCStatus = ATC_Status_Off;
- }
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable ATC!!\n"));
- }
- else
- {
- if(pDM_Odm->bATCStatus == ATC_Status_Off)
- {
- ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_On);
- pDM_Odm->bATCStatus = ATC_Status_On;
- }
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Enable ATC!!\n"));
- }
- }
- }
-#endif
-}
-
-VOID
-odm_Write_CrystalCap(
- IN PDM_ODM_T pDM_Odm,
- IN u1Byte CrystalCap
-)
-{
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-
- if(IS_HARDWARE_TYPE_8192D(Adapter))
- {
- PHY_SetBBReg(Adapter, 0x24, 0xF0, CrystalCap & 0x0F);
- PHY_SetBBReg(Adapter, 0x28, 0xF0000000, ((CrystalCap & 0xF0) >> 4));
- }
-
- if(IS_HARDWARE_TYPE_8188E(Adapter))
- {
- // write 0x24[16:11] = 0x24[22:17] = CrystalCap
- PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, 0x7ff800, (CrystalCap | (CrystalCap << 6)));
- }
-
- if(IS_HARDWARE_TYPE_8812(Adapter))
- {
- // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap
- CrystalCap = CrystalCap & 0x3F;
- PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6)));
- }
-
- //only for B-cut
- if ((IS_HARDWARE_TYPE_8723A(Adapter) && pHalData->EEPROMVersion >= 0x01) ||
- IS_HARDWARE_TYPE_8723B(Adapter) ||IS_HARDWARE_TYPE_8192E(Adapter) || IS_HARDWARE_TYPE_8821(Adapter))
- {
- // 0x2C[23:18] = 0x2C[17:12] = CrystalCap
- CrystalCap = CrystalCap & 0x3F;
- PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));
- }
-
- if(IS_HARDWARE_TYPE_8723AE(Adapter))
- PHY_SetBBReg(Adapter, REG_LDOA15_CTRL, bMaskDWord, 0x01572505);
-
-}
+//Remove DIG by yuchen
-VOID
-ODM_Write_DIG(
- IN PDM_ODM_T pDM_Odm,
- IN u1Byte CurrentIGI
- )
-{
- pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+//Remove DIG and FA check by Yu Chen
- if(pDM_Odm->StopDIG)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n"));
- return;
- }
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x \n",
- ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));
-
- if(pDM_DigTable->CurIGValue != CurrentIGI)//if(pDM_DigTable->PreIGValue != CurrentIGI)
- {
- if(pDM_Odm->SupportPlatform & (ODM_CE|ODM_WIN))
- {
- ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
- if(pDM_Odm->RFType != ODM_1T1R)
- ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
- }
- else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
- {
- switch(*(pDM_Odm->pOnePathCCA))
- {
- case ODM_CCA_2R:
- ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
- if(pDM_Odm->RFType != ODM_1T1R)
- ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
- break;
- case ODM_CCA_1R_A:
- ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
- if(pDM_Odm->RFType != ODM_1T1R)
- ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
- break;
- case ODM_CCA_1R_B:
- ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
- if(pDM_Odm->RFType != ODM_1T1R)
- ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
- break;
- }
- }
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurrentIGI(0x%02x). \n",CurrentIGI));
- //pDM_DigTable->PreIGValue = pDM_DigTable->CurIGValue;
- pDM_DigTable->CurIGValue = CurrentIGI;
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG():CurrentIGI=0x%x \n",CurrentIGI));
-
-}
-
-VOID
-odm_DIGbyRSSI_LPS(
- IN PDM_ODM_T pDM_Odm
- )
-{
- //PADAPTER pAdapter =pDM_Odm->Adapter;
- //pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
- PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
-
-#if 0 //and 2.3.5 coding rule
- struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv);
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
- struct dm_priv *pdmpriv = &pHalData->dmpriv;
-#endif
-
- u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C
- u1Byte CurrentIGI=pDM_Odm->RSSI_Min;
-
- CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
-
-
- //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG_LPS, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
-
- // Using FW PS mode to make IGI
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Neil---odm_DIG is in LPS mode\n"));
- //Adjust by FA in LPS MODE
- if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
- CurrentIGI = CurrentIGI+2;
- else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
- CurrentIGI = CurrentIGI+1;
- else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
- CurrentIGI = CurrentIGI-1;
-
-
- //Lower bound checking
-
- //RSSI Lower bound check
- if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
- RSSI_Lower =(pDM_Odm->RSSI_Min-10);
- else
- RSSI_Lower =DM_DIG_MIN_NIC;
-
- //Upper and Lower Bound checking
- if(CurrentIGI > DM_DIG_MAX_NIC)
- CurrentIGI=DM_DIG_MAX_NIC;
- else if(CurrentIGI < RSSI_Lower)
- CurrentIGI =RSSI_Lower;
-
- ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
-
-}
-
-VOID
-odm_DIGInit(
- IN PDM_ODM_T pDM_Odm
- )
-{
- pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
-
- //pDM_DigTable->Dig_Enable_Flag = TRUE;
- //pDM_DigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
- pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
- //pDM_DigTable->PreIGValue = 0x0;
- //pDM_DigTable->CurSTAConnectState = pDM_DigTable->PreSTAConnectState = DIG_STA_DISCONNECT;
- //pDM_DigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT;
- pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW;
- pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH;
- pDM_DigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW;
- pDM_DigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH;
- if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))
- {
- pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
- pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
- }
- else
- {
- pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
- pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
- }
- pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
- pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
- pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
- pDM_DigTable->PreCCK_CCAThres = 0xFF;
- pDM_DigTable->CurCCK_CCAThres = 0x83;
- pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
- pDM_DigTable->LargeFAHit = 0;
- pDM_DigTable->Recover_cnt = 0;
- pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
- pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
- pDM_DigTable->bMediaConnect_0 = FALSE;
- pDM_DigTable->bMediaConnect_1 = FALSE;
-
- //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
- pDM_Odm->bDMInitialGainEnable = TRUE;
-
- //To Initi BT30 IGI
- pDM_DigTable->BT30_CurIGI=0x32;
-
-}
-
-VOID
-odm_DigForBtHsMode(
- IN PDM_ODM_T pDM_Odm
- )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- pDIG_T pDM_DigTable=&pDM_Odm->DM_DigTable;
- u1Byte digForBtHs=0;
- u1Byte digUpBound=0x5a;
-
- if(pDM_Odm->bBtConnectProcess)
- {
- if(pDM_Odm->SupportICType&(ODM_RTL8723A))
- digForBtHs = 0x28;
- else
- digForBtHs = 0x22;
- }
- else
- {
- //
- // Decide DIG value by BT HS RSSI.
- //
- digForBtHs = pDM_Odm->btHsRssi+4;
-
- //DIG Bound
- if(pDM_Odm->SupportICType&(ODM_RTL8723A))
- digUpBound = 0x3e;
-
- if(digForBtHs > digUpBound)
- digForBtHs = digUpBound;
- if(digForBtHs < 0x1c)
- digForBtHs = 0x1c;
-
- // update Current IGI
- pDM_DigTable->BT30_CurIGI = digForBtHs;
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs));
-#endif
-}
-
-VOID
-odm_DIG(
- IN PDM_ODM_T pDM_Odm
- )
-{
- pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
- PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
- pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
- u1Byte DIG_Dynamic_MIN;
- u1Byte DIG_MaxOfMin;
- BOOLEAN FirstConnect, FirstDisConnect;
- u1Byte dm_dig_max, dm_dig_min, offset;
- u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
- u1Byte Adap_IGI_Upper = pDM_Odm->IGI_target + 30 + (u1Byte) pDM_Odm->TH_L2H_ini -(u1Byte) pDM_Odm->TH_EDCCA_HL_diff;
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-// This should be moved out of OUTSRC
- PADAPTER pAdapter = pDM_Odm->Adapter;
-#if OS_WIN_FROM_WIN7(OS_VERSION)
- if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Is AP mode or In HCT Test \n"));
- return;
- }
-#endif
-/*
- if (pDM_Odm->SupportICType==ODM_RTL8723B)
- return;
-*/
-
- if(pDM_Odm->bBtHsOperation)
- {
- odm_DigForBtHsMode(pDM_Odm);
- }
-
- if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))
- {
- if(pRX_HP_Table->RXHP_flag == 1)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In RXHP Operation \n"));
- return;
- }
- }
-#endif
-#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
- if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))
- {
- printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);
- ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
- return;
- }
-#endif
-#endif
-#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
- prtl8192cd_priv priv = pDM_Odm->priv;
- if (!((priv->up_time > 5) && (priv->up_time % 2)) )
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Not In DIG Operation Period \n"));
- return;
- }
-#endif
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
- //if(!(pDM_Odm->SupportAbility & (ODM_BB_DIG|ODM_BB_FA_CNT)))
- if((!(pDM_Odm->SupportAbility&ODM_BB_DIG)) ||(!(pDM_Odm->SupportAbility&ODM_BB_FA_CNT)))
- {
-#if 0
- if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
- {
- if ((pDM_Odm->SupportICType == ODM_RTL8192C) && (pDM_Odm->ExtLNA == 1))
- CurrentIGI = 0x30; //pDM_DigTable->CurIGValue = 0x30;
- else
- CurrentIGI = 0x20; //pDM_DigTable->CurIGValue = 0x20;
- ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
- }
-#endif
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n"));
- return;
- }
-
- if(*(pDM_Odm->pbScanInProcess))
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In Scan Progress \n"));
- return;
- }
-
- //add by Neil Chen to avoid PSD is processing
- if(pDM_Odm->SupportICType==ODM_RTL8723A)
- {
- if(pDM_Odm->bDMInitialGainEnable == FALSE)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: PSD is Processing \n"));
- return;
- }
- }
-
- if(pDM_Odm->SupportICType == ODM_RTL8192D)
- {
- if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
- {
- if(*(pDM_Odm->pbMasterOfDMSP))
- {
- DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
- FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
- FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
- }
- else
- {
- DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
- FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
- FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
- }
- }
- else
- {
- if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
- {
- DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
- FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
- FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
- }
- else
- {
- DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
- FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
- FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
- }
- }
- }
- else
- {
- DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
- FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
- FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
- }
-
- //1 Boundary Decision
- if(pDM_Odm->SupportICType & (ODM_RTL8192C) &&(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
- {
- if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
- {
-
- dm_dig_max = DM_DIG_MAX_AP_HP;
- dm_dig_min = DM_DIG_MIN_AP_HP;
- }
- else
- {
- dm_dig_max = DM_DIG_MAX_NIC_HP;
- dm_dig_min = DM_DIG_MIN_NIC_HP;
- }
- DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
- }
- else
- {
- if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
- {
-#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-#ifdef DFS
- if (!priv->pmib->dot11DFSEntry.disable_DFS &&
- (OPMODE & WIFI_AP_STATE) &&
- (((pDM_Odm->ControlChannel >= 52) &&
- (pDM_Odm->ControlChannel <= 64)) ||
- ((pDM_Odm->ControlChannel >= 100) &&
- (pDM_Odm->ControlChannel <= 140))))
- dm_dig_max = 0x24;
- else
-#endif
- if (priv->pmib->dot11RFEntry.tx2path) {
- if (*(pDM_Odm->pWirelessMode) == ODM_WM_B)//(priv->pmib->dot11BssType.net_work_type == WIRELESS_11B)
- dm_dig_max = 0x2A;
- else
- dm_dig_max = 0x32;
- }
- else
-#endif
- dm_dig_max = DM_DIG_MAX_AP;
- dm_dig_min = DM_DIG_MIN_AP;
- DIG_MaxOfMin = dm_dig_max;
- }
- else
- {
- if((pDM_Odm->SupportICType >= ODM_RTL8188E) && (pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))
- dm_dig_max = 0x5A;
- else
- dm_dig_max = DM_DIG_MAX_NIC;
-
- if(pDM_Odm->SupportICType != ODM_RTL8821)
- dm_dig_min = DM_DIG_MIN_NIC;
- else
- dm_dig_min = 0x1C;
-
- DIG_MaxOfMin = DM_DIG_MAX_AP;
- }
- }
-
- if(0 < *pDM_Odm->pu1ForcedIgiLb)
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): force IGI lb to: %u\n", *pDM_Odm->pu1ForcedIgiLb));
- dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
- dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
- }
-
- if(pDM_Odm->bLinked)
- {
- if(pDM_Odm->SupportICType&(ODM_RTL8723A/*|ODM_RTL8821*/))
- {
- //2 Upper Bound
- if(( pDM_Odm->RSSI_Min + 10) > DM_DIG_MAX_NIC )
- pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
- else if(( pDM_Odm->RSSI_Min + 10) < DM_DIG_MIN_NIC )
- pDM_DigTable->rx_gain_range_max = DM_DIG_MIN_NIC;
- else
- pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10;
-
- //BT is Concurrent
-
- if(pDM_Odm->bBtLimitedDig)
- {
- if(pDM_Odm->RSSI_Min>10)
- {
- if((pDM_Odm->RSSI_Min - 10) > DM_DIG_MAX_NIC)
- DIG_Dynamic_MIN = DM_DIG_MAX_NIC;
- else if((pDM_Odm->RSSI_Min - 10) < DM_DIG_MIN_NIC)
- DIG_Dynamic_MIN = DM_DIG_MIN_NIC;
- else
- DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - 10;
- }
- else
- DIG_Dynamic_MIN=DM_DIG_MIN_NIC;
- }
- else
- {
- if((pDM_Odm->RSSI_Min + 20) > dm_dig_max )
- pDM_DigTable->rx_gain_range_max = dm_dig_max;
- else if((pDM_Odm->RSSI_Min + 20) < dm_dig_min )
- pDM_DigTable->rx_gain_range_max = dm_dig_min;
- else
- pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 20;
-
- }
- }
- else
- {
- if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821)) && (pDM_Odm->bBtLimitedDig==1)){
- //2 Modify DIG upper bound for 92E, 8723B, 8821 & 8812 BT
- if((pDM_Odm->RSSI_Min + 10) > dm_dig_max )
- pDM_DigTable->rx_gain_range_max = dm_dig_max;
- else if((pDM_Odm->RSSI_Min + 10) < dm_dig_min )
- pDM_DigTable->rx_gain_range_max = dm_dig_min;
- else
- pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10;
- }
- else{
-
- //2 Modify DIG upper bound
- //2013.03.19 Luke: Modified upper bound for Netgear rental house test
- if(pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8192E)
- offset = 20;
- else
- offset = 10;
-
- if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )
- pDM_DigTable->rx_gain_range_max = dm_dig_max;
- else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )
- pDM_DigTable->rx_gain_range_max = dm_dig_min;
- else
- pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
-
- }
-
- //2 Modify DIG lower bound
- /*
- if((pFalseAlmCnt->Cnt_all > 500)&&(DIG_Dynamic_MIN < 0x25))
- DIG_Dynamic_MIN++;
- else if(((pFalseAlmCnt->Cnt_all < 500)||(pDM_Odm->RSSI_Min < 8))&&(DIG_Dynamic_MIN > dm_dig_min))
- DIG_Dynamic_MIN--;
- */
- if(pDM_Odm->bOneEntryOnly)
- {
- if(pDM_Odm->SupportICType != ODM_RTL8723B)
- offset = 0;
- else
- offset = 12;
-
- if(pDM_Odm->RSSI_Min - offset < dm_dig_min)
- DIG_Dynamic_MIN = dm_dig_min;
- else if (pDM_Odm->RSSI_Min - offset > DIG_MaxOfMin)
- DIG_Dynamic_MIN = DIG_MaxOfMin;
- else
- DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - offset;
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : bOneEntryOnly=TRUE, DIG_Dynamic_MIN=0x%x\n",DIG_Dynamic_MIN));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : pDM_Odm->RSSI_Min=%d",pDM_Odm->RSSI_Min));
- }
- //1 Lower Bound for 88E AntDiv
-#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
- else if( (pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) &&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) )
- //else if((pDM_Odm->SupportICType == ODM_RTL8188E)&&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
- {
- if((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)||(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV) ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
- {
- DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->AntDiv_RSSI_max=%d \n",pDM_DigTable->AntDiv_RSSI_max));
- }
- }
-#endif
- else
- {
- DIG_Dynamic_MIN=dm_dig_min;
- }
- }
- }
- else
- {
- pDM_DigTable->rx_gain_range_max = dm_dig_max;
- DIG_Dynamic_MIN = dm_dig_min;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : No Link\n"));
- }
-
- //1 Modify DIG lower bound, deal with abnorally large false alarm
- if(pFalseAlmCnt->Cnt_all > 10000)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n"));
-
- if(pDM_DigTable->LargeFAHit != 3)
- pDM_DigTable->LargeFAHit++;
- if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)
- {
- pDM_DigTable->ForbiddenIGI = (u1Byte)CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
- pDM_DigTable->LargeFAHit = 1;
- }
-
- if(pDM_DigTable->LargeFAHit >= 3)
- {
- if((pDM_DigTable->ForbiddenIGI+1) >pDM_DigTable->rx_gain_range_max)
- pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
- else
- pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
- pDM_DigTable->Recover_cnt = 3600; //3600=2hr
- }
-
- }
- else
- {
- //Recovery mechanism for IGI lower bound
- if(pDM_DigTable->Recover_cnt != 0)
- pDM_DigTable->Recover_cnt --;
- else
- {
- if(pDM_DigTable->LargeFAHit < 3)
- {
- if((pDM_DigTable->ForbiddenIGI -1) < DIG_Dynamic_MIN) //DM_DIG_MIN)
- {
- pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
- pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));
- }
- else
- {
- pDM_DigTable->ForbiddenIGI --;
- pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
- }
- }
- else
- {
- pDM_DigTable->LargeFAHit = 0;
- }
- }
- }
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->LargeFAHit=%d\n",pDM_DigTable->LargeFAHit));
-
- #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0])) //STA mode is linked to AP
- pDM_Odm->bsta_state = _TRUE;
- #endif
-
- if((pDM_Odm->SupportPlatform&(ODM_WIN|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2) && (pDM_Odm->bsta_state) )
- {
- pDM_DigTable->rx_gain_range_min = dm_dig_min;
- }
-
- if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
- pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
-
- //1 Adjust initial gain by false alarm
- if(pDM_Odm->bLinked)
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG AfterLink\n"));
- if(FirstConnect)
- {
- if(pDM_Odm->RSSI_Min <= DIG_MaxOfMin)
- CurrentIGI = pDM_Odm->RSSI_Min;
- else
- CurrentIGI = DIG_MaxOfMin;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG: First Connect\n"));
-
- ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);
- }
- else
- {
- if(pDM_Odm->SupportICType == ODM_RTL8192D)
- {
- if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_92D)
- CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
- else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_92D)
- CurrentIGI = CurrentIGI + 2; //pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
- else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_92D)
- CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
- }
- else
- {
- //FA for Combo IC--NeilChen--2012--09--28
- if(pDM_Odm->SupportICType == ODM_RTL8723A)
- {
- //WLAN and BT ConCurrent
- if(pDM_Odm->bBtLimitedDig)
- {
- if(pFalseAlmCnt->Cnt_all > 0x300)
- CurrentIGI = CurrentIGI + 4;
- else if (pFalseAlmCnt->Cnt_all > 0x250)
- CurrentIGI = CurrentIGI + 2;
- else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
- CurrentIGI = CurrentIGI -2;
- }
- else //Not Concurrent
- {
- if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2)
- CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
- else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1)
- CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
- else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
- CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
- }
- }
- else
- {
- if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2)
- CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
- else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1)
- CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
- else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
- CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
-
- #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0])) //STA mode is linked to AP
- pDM_Odm->bsta_state = _TRUE;
- #endif
-
- if((pDM_Odm->SupportPlatform&(ODM_WIN|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2)
- &&(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
- {
- CurrentIGI = pDM_DigTable->rx_gain_range_min;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Beacon is less than 10 and FA is less than 768, IGI GOES TO 0x1E!!!!!!!!!!!!\n"));
- }
- /*{
- u2Byte value16;
- value16 = (u2Byte) ODM_GetBBReg(pDM_Odm, 0x664, bMaskLWord);
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): NumQryBeaconPkt = %d, OFDM_OK_Cnt = %d\n",
- pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, value16));
- }*/
- }
- }
- }
- }
- else
- {
- //CurrentIGI = pDM_DigTable->rx_gain_range_min;//pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG BeforeLink\n"));
- if(FirstDisConnect)
- {
- CurrentIGI = pDM_DigTable->rx_gain_range_min;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First DisConnect \n"));
- }
- else
- {
- //2012.03.30 LukeLee: enable DIG before link but with very high thresholds
- if(pFalseAlmCnt->Cnt_all > 10000)
- CurrentIGI = CurrentIGI + 4;
- else if (pFalseAlmCnt->Cnt_all > 8000)
- CurrentIGI = CurrentIGI + 2;
- else if(pFalseAlmCnt->Cnt_all < 500)
- CurrentIGI = CurrentIGI - 2;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): England DIG \n"));
- }
- }
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG End Adjust IGI\n"));
- //1 Check initial gain by upper/lower bound
-
- if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
- CurrentIGI = pDM_DigTable->rx_gain_range_max;
- if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
- CurrentIGI = pDM_DigTable->rx_gain_range_min;
-
- if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)
- {
- if(CurrentIGI > Adap_IGI_Upper)
- CurrentIGI = Adap_IGI_Upper;
-
- if(pDM_Odm->IGI_LowerBound != 0)
- {
- if(CurrentIGI < pDM_Odm->IGI_LowerBound)
- CurrentIGI = pDM_Odm->IGI_LowerBound;
- }
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_Odm->IGI_LowerBound = %d\n", pDM_Odm->IGI_LowerBound));
- }
-
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): rx_gain_range_max=0x%x, rx_gain_range_min=0x%x\n",
- pDM_DigTable->rx_gain_range_max, pDM_DigTable->rx_gain_range_min));
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TotalFA=%d\n", pFalseAlmCnt->Cnt_all));
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x\n", CurrentIGI));
-
- //2 High power RSSI threshold
-#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
-{
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
- //PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
- // for LC issue to dymanic modify DIG lower bound----------LC Mocca Issue
- u8Byte curTxOkCnt=0, curRxOkCnt=0;
- static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
-
- //u8Byte OKCntAll=0;
- //static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
- //u8Byte CurByteCnt=0, PreByteCnt=0;
-
- curTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
- curRxOkCnt =pAdapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
- lastTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast;
- lastRxOkCnt = pAdapter->RxStats.NumRxBytesUnicast;
- //----------------------------------------------------------end for LC Mocca issue
- if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
- {
- // High power IGI lower bound
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
- if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue));
- //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
- CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
- }
- }
- if((pDM_Odm->SupportICType & ODM_RTL8723A) &&
- IS_WIRELESS_MODE_G(pAdapter))
- {
- if(pHalData->UndecoratedSmoothedPWDB > 0x28)
- {
- if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
- {
- //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
- CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
- }
- }
- }
-#if 0
- if((pDM_Odm->SupportICType & ODM_RTL8723A)&&(pMgntInfo->CustomerID = RT_CID_LENOVO_CHINA))
- {
- OKCntAll = (curTxOkCnt+curRxOkCnt);
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", CurrentIGI));
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): OKCntAll(%#x)\n", OKCntAll));
- //8723AS_VAU
- if(pDM_Odm->SupportInterface==ODM_ITRF_USB)
- {
- if(pHalData->UndecoratedSmoothedPWDB < 12)
- {
- if(CurrentIGI > DM_DIG_MIN_NIC)
- {
- if(OKCntAll >= 1500000) // >=6Mbps
- CurrentIGI=0x1B;
- else if(OKCntAll >= 1000000) //4Mbps
- CurrentIGI=0x1A;
- else if(OKCntAll >= 500000) //2Mbps
- CurrentIGI=0x19;
- else if(OKCntAll >= 250000) //1Mbps
- CurrentIGI=0x18;
- else
- {
- CurrentIGI=0x17; //SCAN mode
- }
- }
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Modify---->CurIGValue(%#x)\n", CurrentIGI));
- }
- }
- }
-#endif
-}
-#endif
-
-#if (RTL8192D_SUPPORT==1)
- if(pDM_Odm->SupportICType == ODM_RTL8192D)
- {
- //sherry delete DualMacSmartConncurrent 20110517
- if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
- {
- ODM_Write_DIG_DMSP(pDM_Odm, (u1Byte)CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
- if(*(pDM_Odm->pbMasterOfDMSP))
- {
- pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
- pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
- }
- else
- {
- pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
- pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
- }
- }
- else
- {
- ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
- if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
- {
- pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
- pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
- }
- else
- {
- pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
- pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
- }
- }
- }
- else
-#endif
- {
- if(pDM_Odm->bBtHsOperation)
- {
- if(pDM_Odm->bLinked)
- {
- if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
- {
- ODM_Write_DIG(pDM_Odm, CurrentIGI);
-
- }
- else
- {
- ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
- }
- pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
- pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
- }
- else
- {
- if(pDM_Odm->bLinkInProcess)
- {
- ODM_Write_DIG(pDM_Odm, 0x1c);
- }
- else if(pDM_Odm->bBtConnectProcess)
- {
- ODM_Write_DIG(pDM_Odm, 0x28);
- }
- else
- {
- ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
- }
- }
- }
- else // BT is not using
- {
- ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
- pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
- pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
- }
- }
-}
-
-
-BOOLEAN
-odm_DigAbort(
- IN PDM_ODM_T pDM_Odm
- )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-// This should be moved out of OUTSRC
- PADAPTER pAdapter = pDM_Odm->Adapter;
- pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
-
-#if OS_WIN_FROM_WIN7(OS_VERSION)
- if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Is AP mode or In HCT Test \n"));
- return TRUE;
- }
-#endif
-
- if(pRX_HP_Table->RXHP_flag == 1)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In RXHP Operation \n"));
- return TRUE;
- }
-
- return FALSE;
-#else // For Other team any special case for DIG?
- return FALSE;
-#endif
-
-
-}
-
-//3============================================================
-//3 FASLE ALARM CHECK
-//3============================================================
-
-VOID
-odm_FalseAlarmCounterStatistics(
- IN PDM_ODM_T pDM_Odm
- )
-{
- u4Byte ret_value;
- PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
- prtl8192cd_priv priv = pDM_Odm->priv;
- if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
- return;
-#endif
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- if((pDM_Odm->SupportICType == ODM_RTL8192D) &&
- (*(pDM_Odm->pMacPhyMode)==ODM_DMSP)&& ////modify by Guo.Mingzhi 2011-12-29
- (!(*(pDM_Odm->pbMasterOfDMSP))))
- {
- odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
- return;
- }
-#endif
-
- if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
- return;
-
- if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
- {
-
- //hold ofdm counter
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
-
- ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
- FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
- FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
- ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
- FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff);
- FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
- ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
- FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
- FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
- ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
- FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
-
- FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
- FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
- FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
-
-#if (RTL8188E_SUPPORT==1)
- if((pDM_Odm->SupportICType == ODM_RTL8188E)||(pDM_Odm->SupportICType == ODM_RTL8192E))
- {
- ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
- FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
- FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
- }
-#endif
-
-#if (RTL8192D_SUPPORT==1)
- if(pDM_Odm->SupportICType == ODM_RTL8192D)
- {
- odm_GetCCKFalseAlarm_92D(pDM_Odm);
- }
- else
-#endif
- {
- //hold cck counter
- ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1);
- ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1);
-
- ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
- FalseAlmCnt->Cnt_Cck_fail = ret_value;
- ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
- FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
-
- ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
- FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
- }
-
- FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Fast_Fsync +
- FalseAlmCnt->Cnt_SB_Search_fail +
- FalseAlmCnt->Cnt_Parity_Fail +
- FalseAlmCnt->Cnt_Rate_Illegal +
- FalseAlmCnt->Cnt_Crc8_fail +
- FalseAlmCnt->Cnt_Mcs_fail +
- FalseAlmCnt->Cnt_Cck_fail);
-
- FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
-
-#if (RTL8192C_SUPPORT==1)
- if(pDM_Odm->SupportICType == ODM_RTL8192C)
- odm_ResetFACounter_92C(pDM_Odm);
-#endif
-
-#if (RTL8192D_SUPPORT==1)
- if(pDM_Odm->SupportICType == ODM_RTL8192D)
- odm_ResetFACounter_92D(pDM_Odm);
-#endif
-
- if(pDM_Odm->SupportICType >=ODM_RTL8723A)
- {
- //reset false alarm counter registers
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
- //update ofdm counter
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
-
- //reset CCK CCA counter
- ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0);
- ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2);
- //reset CCK FA counter
- ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0);
- ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2);
- }
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
- FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
- FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
- FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
- }
- else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
- {
- u4Byte CCKenable;
- //read OFDM FA counter
- FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
- FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
-
- CCKenable = ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
- if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
- FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
- else
- FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
-
- // reset OFDM FA coutner
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
- ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
- // reset CCK FA counter
- ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
- ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n", FalseAlmCnt->Cnt_all));
-}
-
-//3============================================================
-//3 CCK Packet Detect Threshold
-//3============================================================
-
-VOID
-odm_CCKPacketDetectionThresh(
- IN PDM_ODM_T pDM_Odm
- )
-{
-
- u1Byte CurCCK_CCAThres;
- PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-//modify by Guo.Mingzhi 2011-12-29
- if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
-// if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
- return;
-
- if(pDM_Odm->bBtHsOperation)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
- ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
- return;
- }
-
-#endif
-
- if(!(pDM_Odm->SupportAbility & (ODM_BB_CCK_PD|ODM_BB_FA_CNT)))
- return;
-
- if(pDM_Odm->ExtLNA)
- return;
-
- if(pDM_Odm->bLinked)
- {
- if(pDM_Odm->RSSI_Min > 25)
- CurCCK_CCAThres = 0xcd;
- else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
- CurCCK_CCAThres = 0x83;
- else
- {
- if(FalseAlmCnt->Cnt_Cck_fail > 1000)
- CurCCK_CCAThres = 0x83;
- else
- CurCCK_CCAThres = 0x40;
- }
- }
- else
- {
- if(FalseAlmCnt->Cnt_Cck_fail > 1000)
- CurCCK_CCAThres = 0x83;
- else
- CurCCK_CCAThres = 0x40;
- }
-
-#if (RTL8192D_SUPPORT==1)
- if((pDM_Odm->SupportICType == ODM_RTL8192D)&&(*pDM_Odm->pBandType == ODM_BAND_2_4G))
- ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
- else
-#endif
- ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
-}
-
-VOID
-ODM_Write_CCK_CCA_Thres(
- IN PDM_ODM_T pDM_Odm,
- IN u1Byte CurCCK_CCAThres
- )
-{
- pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
-
- if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres) //modify by Guo.Mingzhi 2012-01-03
- {
- ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
- }
- pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
- pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
-
-}
//3============================================================
//3 BB Power Save
//3============================================================
-VOID
-odm_DynamicBBPowerSavingInit(
- IN PDM_ODM_T pDM_Odm
- )
-{
- pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
-
- pDM_PSTable->PreCCAState = CCA_MAX;
- pDM_PSTable->CurCCAState = CCA_MAX;
- pDM_PSTable->PreRFState = RF_MAX;
- pDM_PSTable->CurRFState = RF_MAX;
- pDM_PSTable->Rssi_val_min = 0;
- pDM_PSTable->initialize = 0;
-}
-
-
-VOID
-odm_DynamicBBPowerSaving(
- IN PDM_ODM_T pDM_Odm
- )
-{
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-
- if (pDM_Odm->SupportICType != ODM_RTL8723A)
- return;
- if(!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE))
- return;
- if(!(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))
- return;
-
- //1 2.Power Saving for 92C
- if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
- {
- odm_1R_CCA(pDM_Odm);
- }
-
- // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.
- // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns.
- //1 3.Power Saving for 88C
- else
- {
- ODM_RF_Saving(pDM_Odm, FALSE);
- }
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-}
-
-VOID
-odm_1R_CCA(
- IN PDM_ODM_T pDM_Odm
- )
-{
- pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
-
- if(pDM_Odm->RSSI_Min!= 0xFF)
- {
-
- if(pDM_PSTable->PreCCAState == CCA_2R)
- {
- if(pDM_Odm->RSSI_Min >= 35)
- pDM_PSTable->CurCCAState = CCA_1R;
- else
- pDM_PSTable->CurCCAState = CCA_2R;
-
- }
- else{
- if(pDM_Odm->RSSI_Min <= 30)
- pDM_PSTable->CurCCAState = CCA_2R;
- else
- pDM_PSTable->CurCCAState = CCA_1R;
- }
- }
- else{
- pDM_PSTable->CurCCAState=CCA_MAX;
- }
-
- if(pDM_PSTable->PreCCAState != pDM_PSTable->CurCCAState)
- {
- if(pDM_PSTable->CurCCAState == CCA_1R)
- {
- if( pDM_Odm->RFType ==ODM_2T2R )
- {
- ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x13);
- //PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);
- }
- else
- {
- ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x23);
- //PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100
- }
- }
- else
- {
- ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x33);
- //PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);
- }
- pDM_PSTable->PreCCAState = pDM_PSTable->CurCCAState;
- }
- //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, ("CCAStage = %s\n",(pDM_PSTable->CurCCAState==0)?"1RCCA":"2RCCA"));
-}
-
-void
-ODM_RF_Saving(
- IN PDM_ODM_T pDM_Odm,
- IN u1Byte bForceInNormal
- )
-{
-#if (DM_ODM_SUPPORT_TYPE != ODM_AP)
- pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
- u1Byte Rssi_Up_bound = 30 ;
- u1Byte Rssi_Low_bound = 25;
- #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
- if(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
- {
- Rssi_Up_bound = 50 ;
- Rssi_Low_bound = 45;
- }
- #endif
- if(pDM_PSTable->initialize == 0){
-
- pDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;
- pDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;
- pDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;
- pDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;
- //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
- pDM_PSTable->initialize = 1;
- }
-
- if(!bForceInNormal)
- {
- if(pDM_Odm->RSSI_Min != 0xFF)
- {
- if(pDM_PSTable->PreRFState == RF_Normal)
- {
- if(pDM_Odm->RSSI_Min >= Rssi_Up_bound)
- pDM_PSTable->CurRFState = RF_Save;
- else
- pDM_PSTable->CurRFState = RF_Normal;
- }
- else{
- if(pDM_Odm->RSSI_Min <= Rssi_Low_bound)
- pDM_PSTable->CurRFState = RF_Normal;
- else
- pDM_PSTable->CurRFState = RF_Save;
- }
- }
- else
- pDM_PSTable->CurRFState=RF_MAX;
- }
- else
- {
- pDM_PSTable->CurRFState = RF_Normal;
- }
-
- if(pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)
- {
- if(pDM_PSTable->CurRFState == RF_Save)
- {
- // <tynli_note> 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode.
- // Suggested by SD3 Yu-Nan. 2011.01.20.
- if(pDM_Odm->SupportICType == ODM_RTL8723A)
- {
- ODM_SetBBReg(pDM_Odm, 0x874 , BIT5, 0x1); //Reg874[5]=1b'1
- }
- ODM_SetBBReg(pDM_Odm, 0x874 , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
- ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0
- ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
- ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10
- ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
- ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
- ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
- //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Save"));
- }
- else
- {
- ODM_SetBBReg(pDM_Odm, 0x874 , 0x1CC000, pDM_PSTable->Reg874);
- ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70);
- ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);
- ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74);
- ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);
-
- if(pDM_Odm->SupportICType == ODM_RTL8723A)
- {
- ODM_SetBBReg(pDM_Odm,0x874 , BIT5, 0x0); //Reg874[5]=1b'0
- }
- //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Normal"));
- }
- pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
- }
-#endif
-}
+//Remove BB power saving by Yuchen
//3============================================================
//3 RATR MASK
@@ -4495,824 +2391,7 @@ ODM_RAStateCheck(
//3 Dynamic Tx Power
//3============================================================
-VOID
-odm_DynamicTxPowerInit(
- IN PDM_ODM_T pDM_Odm
- )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- PADAPTER Adapter = pDM_Odm->Adapter;
- PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-
- #if DEV_BUS_TYPE==RT_USB_INTERFACE
- if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)
- {
- odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
- pMgntInfo->bDynamicTxPowerEnable = TRUE;
- }
- else
- #else
- //so 92c pci do not need dynamic tx power? vivi check it later
- if(IS_HARDWARE_TYPE_8192D(Adapter))
- pMgntInfo->bDynamicTxPowerEnable = TRUE;
- else
- pMgntInfo->bDynamicTxPowerEnable = FALSE;
- #endif
-
-
- pHalData->LastDTPLvl = TxHighPwrLevel_Normal;
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- struct dm_priv *pdmpriv = &pHalData->dmpriv;
- pdmpriv->bDynamicTxPowerEnable = _FALSE;
-
- #if (RTL8192C_SUPPORT==1)
- #ifdef CONFIG_USB_HCI
-
- #ifdef CONFIG_INTEL_PROXIM
- if((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==_TRUE))
- #else
- if(pHalData->BoardType == BOARD_USB_High_PA)
- #endif
-
- {
- //odm_SavePowerIndex(Adapter);
- odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
- pdmpriv->bDynamicTxPowerEnable = _TRUE;
- }
- else
- #else
- pdmpriv->bDynamicTxPowerEnable = _FALSE;
- #endif
- #endif
-
- pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-
-#endif
-
-}
-
-VOID
-odm_DynamicTxPowerSavePowerIndex(
- IN PDM_ODM_T pDM_Odm
- )
-{
- u1Byte index;
- u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
-
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- for(index = 0; index< 6; index++)
- pHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- struct dm_priv *pdmpriv = &pHalData->dmpriv;
- for(index = 0; index< 6; index++)
- pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
-#endif
-}
-
-VOID
-odm_DynamicTxPowerRestorePowerIndex(
- IN PDM_ODM_T pDM_Odm
- )
-{
- u1Byte index;
- PADAPTER Adapter = pDM_Odm->Adapter;
-
-#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- for(index = 0; index< 6; index++)
- PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);
-#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)
- struct dm_priv *pdmpriv = &pHalData->dmpriv;
- for(index = 0; index< 6; index++)
- rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
-#endif
-#endif
-}
-
-VOID
-odm_DynamicTxPowerWritePowerIndex(
- IN PDM_ODM_T pDM_Odm,
- IN u1Byte Value)
-{
-
- u1Byte index;
- u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
-
- for(index = 0; index< 6; index++)
- //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);
- ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);
-
-}
-
-
-VOID
-odm_DynamicTxPower(
- IN PDM_ODM_T pDM_Odm
- )
-{
- //
- // For AP/ADSL use prtl8192cd_priv
- // For CE/NIC use PADAPTER
- //
- //PADAPTER pAdapter = pDM_Odm->Adapter;
-// prtl8192cd_priv priv = pDM_Odm->priv;
-
- if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
- return;
-
- //
- // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
- // at the same time. In the stage2/3, we need to prive universal interface and merge all
- // HW dynamic mechanism.
- //
- switch (pDM_Odm->SupportPlatform)
- {
- case ODM_WIN:
- case ODM_CE:
- odm_DynamicTxPowerNIC(pDM_Odm);
- break;
- case ODM_AP:
- odm_DynamicTxPowerAP(pDM_Odm);
- break;
-
- case ODM_ADSL:
- //odm_DIGAP(pDM_Odm);
- break;
- }
-
-
-}
-
-
-VOID
-odm_DynamicTxPowerNIC(
- IN PDM_ODM_T pDM_Odm
- )
-{
- if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
- return;
-
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
-
- if(pDM_Odm->SupportICType == ODM_RTL8192C)
- {
- odm_DynamicTxPower_92C(pDM_Odm);
- }
- else if(pDM_Odm->SupportICType == ODM_RTL8192D)
- {
- odm_DynamicTxPower_92D(pDM_Odm);
- }
- else if (pDM_Odm->SupportICType == ODM_RTL8821)
- {
-#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
- PADAPTER Adapter = pDM_Odm->Adapter;
- PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(Adapter);
-
- if (pMgntInfo->RegRspPwr == 1)
- {
- if(pDM_Odm->RSSI_Min > 60)
- {
- ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB
-
- }
- else if(pDM_Odm->RSSI_Min < 55)
- {
- ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB
- }
- }
-#endif
- }
-#endif
-}
-
-VOID
-odm_DynamicTxPowerAP(
- IN PDM_ODM_T pDM_Odm
-
- )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
- prtl8192cd_priv priv = pDM_Odm->priv;
- s4Byte i;
-
- if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)
- return;
-
-#ifdef HIGH_POWER_EXT_PA
- if(pDM_Odm->ExtPA)
- tx_power_control(priv);
-#endif
-
- /*
- * Check if station is near by to use lower tx power
- */
-
- if ((priv->up_time % 3) == 0 ) {
- for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
- PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
- if(IS_STA_VALID(pstat) ) {
- if ((pstat->hp_level == 0) && (pstat->rssi > TX_POWER_NEAR_FIELD_THRESH_AP+4))
- pstat->hp_level = 1;
- else if ((pstat->hp_level == 1) && (pstat->rssi < TX_POWER_NEAR_FIELD_THRESH_AP))
- pstat->hp_level = 0;
- }
- }
- }
-
-#endif
-}
-
-
-VOID
-odm_DynamicTxPower_92C(
- IN PDM_ODM_T pDM_Odm
- )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- PADAPTER Adapter = pDM_Odm->Adapter;
- PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- s4Byte UndecoratedSmoothedPWDB;
-
- // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
- if (pDM_Odm->ExtPA == FALSE)
- return;
-
- // STA not connected and AP not connected
- if((!pMgntInfo->bMediaConnect) &&
- (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
- {
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-
- //the LastDTPlvl should reset when disconnect,
- //otherwise the tx power level wouldn't change when disconnect and connect again.
- // Maddest 20091220.
- pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
- return;
- }
-
-#if (INTEL_PROXIMITY_SUPPORT == 1)
- // Intel set fixed tx power
- if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)
- {
- switch(pMgntInfo->IntelProximityModeInfo.PowerOutput){
- case 1:
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
- break;
- case 2:
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
- break;
- case 3:
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
- break;
- case 4:
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
- break;
- case 5:
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
- break;
- default:
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
- break;
- }
- }
- else
-#endif
- {
- if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
- (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
- pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- }
- else
- {
- if(pMgntInfo->bMediaConnect) // Default port
- {
- if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
- {
- UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
- else
- {
- UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
- }
- else // associated entry pwdb
- {
- UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
-
- if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
- }
- else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
- (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
- }
- else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
- }
- }
- }
- if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
- {
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d \n" , pHalData->CurrentChannel));
- PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
- if( (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&
- (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal
- odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
- else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
- odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
- else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
- odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
- }
- pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
-
-
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-
- #if (RTL8192C_SUPPORT==1)
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- struct dm_priv *pdmpriv = &pHalData->dmpriv;
- struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
- struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
- int UndecoratedSmoothedPWDB;
-
- if(!pdmpriv->bDynamicTxPowerEnable)
- return;
-
-#ifdef CONFIG_INTEL_PROXIM
- if(Adapter->proximity.proxim_on== _TRUE){
- struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
- // Intel set fixed tx power
- printk("\n %s Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d \n",__FUNCTION__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
- if(prox_priv!=NULL){
- if(prox_priv->proxim_modeinfo->power_output> 0)
- {
- switch(prox_priv->proxim_modeinfo->power_output)
- {
- case 1:
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
- printk("TxHighPwrLevel_100\n");
- break;
- case 2:
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
- printk("TxHighPwrLevel_70\n");
- break;
- case 3:
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
- printk("TxHighPwrLevel_50\n");
- break;
- case 4:
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
- printk("TxHighPwrLevel_35\n");
- break;
- case 5:
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
- printk("TxHighPwrLevel_15\n");
- break;
- default:
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
- printk("TxHighPwrLevel_100\n");
- break;
- }
- }
- }
- }
- else
-#endif
- {
- // STA not connected and AP not connected
- if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
- (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-
- //the LastDTPlvl should reset when disconnect,
- //otherwise the tx power level wouldn't change when disconnect and connect again.
- // Maddest 20091220.
- pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
- return;
- }
-
- if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
- {
- #if 0
- //todo: AP Mode
- if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
- (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
- {
- UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
- else
- {
- UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
- #else
- UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
- #endif
- }
- else // associated entry pwdb
- {
- UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
-
- if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
- }
- else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
- (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
- }
- else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
- }
- }
- if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
- {
- PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
- if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal
- odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
- else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
- odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
- else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
- odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
- }
- pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
- #endif
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-}
-
-
-VOID
-odm_DynamicTxPower_92D(
- IN PDM_ODM_T pDM_Odm
- )
-{
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
- PADAPTER Adapter = pDM_Odm->Adapter;
- PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- s4Byte UndecoratedSmoothedPWDB;
-
- PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
- BOOLEAN bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
- u1Byte HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
-
- // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
- if (pDM_Odm->ExtPA == FALSE)
- return;
-
- // If dynamic high power is disabled.
- if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
- (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
- pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- return;
- }
-
- // STA not connected and AP not connected
- if((!pMgntInfo->bMediaConnect) &&
- (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
- {
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
-
- //the LastDTPlvl should reset when disconnect,
- //otherwise the tx power level wouldn't change when disconnect and connect again.
- // Maddest 20091220.
- pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
- return;
- }
-
- if(pMgntInfo->bMediaConnect) // Default port
- {
- if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
- {
- UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
- else
- {
- UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
- }
- else // associated entry pwdb
- {
- UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
-
- if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){
- if(UndecoratedSmoothedPWDB >= 0x33)
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
- }
- else if((UndecoratedSmoothedPWDB <0x33) &&
- (UndecoratedSmoothedPWDB >= 0x2b) )
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
- }
- else if(UndecoratedSmoothedPWDB < 0x2b)
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
- }
-
- }
- else
-
- {
- if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
- }
- else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
- (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
- }
- else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
- {
- pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
- }
-
- }
-
-//sherry delete flag 20110517
- if(bGetValueFromBuddyAdapter)
- {
- ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
- if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
- {
- ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
- HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
- pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
- PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
- pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
- Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;
- }
- }
-
- if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
- {
- ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
- if(Adapter->DualMacSmartConcurrent == TRUE)
- {
- if(BuddyAdapter == NULL)
- {
- ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
- if(!Adapter->bSlaveOfDMSP)
- {
- PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
- }
- }
- else
- {
- if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
- {
- ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
- if(Adapter->bSlaveOfDMSP)
- {
- ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
- BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;
- BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
- }
- else
- {
- ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
- if(!bGetValueFromBuddyAdapter)
- {
- ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
- PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
- }
- }
- }
- else
- {
- ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
- PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
- }
- }
- }
- else
- {
- PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
- }
-
- }
- pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
-#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
-#if (RTL8192D_SUPPORT==1)
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
-
- struct dm_priv *pdmpriv = &pHalData->dmpriv;
- DM_ODM_T *podmpriv = &pHalData->odmpriv;
- int UndecoratedSmoothedPWDB;
- #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
- PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
- BOOLEAN bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
- u8 HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
- #endif
-
- // If dynamic high power is disabled.
- if( (pdmpriv->bDynamicTxPowerEnable != _TRUE) ||
- (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- return;
- }
-
- // STA not connected and AP not connected
- if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
- (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- //the LastDTPlvl should reset when disconnect,
- //otherwise the tx power level wouldn't change when disconnect and connect again.
- // Maddest 20091220.
- pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
- return;
- }
-
- if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
- {
- #if 0
- //todo: AP Mode
- if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
- (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
- {
- UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
- else
- {
- UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
- #else
- UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
- #endif
- }
- else // associated entry pwdb
- {
- UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
- }
-#if TX_POWER_FOR_5G_BAND == 1
- if(pHalData->CurrentBandType92D == BAND_ON_5G){
- if(UndecoratedSmoothedPWDB >= 0x33)
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
- }
- else if((UndecoratedSmoothedPWDB <0x33) &&
- (UndecoratedSmoothedPWDB >= 0x2b) )
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
- }
- else if(UndecoratedSmoothedPWDB < 0x2b)
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
- }
- }
- else
-#endif
- {
- if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
- }
- else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
- (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
- }
- else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
- {
- pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
- }
- }
-#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
- if(bGetValueFromBuddyAdapter)
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
- if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
- HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
- pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
- PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
- pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
- Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _FALSE;
- }
- }
-#endif
-
- if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
-#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
- if(BuddyAdapter == NULL)
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
- if(!Adapter->bSlaveOfDMSP)
- {
- PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
- }
- }
- else
- {
- if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
- if(Adapter->bSlaveOfDMSP)
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
- BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _TRUE;
- BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
- }
- else
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
- if(!bGetValueFromBuddyAdapter)
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
- PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
- }
- }
- }
- else
- {
- //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
- PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
- }
- }
-#else
- PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
-#endif
- }
- pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
-#endif
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-}
-
+//Remove BY YuChen
//3============================================================
//3 RSSI Monitor
@@ -6122,6 +3201,11 @@ odm_TXPowerTrackingInit(
IN PDM_ODM_T pDM_Odm
)
{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ if(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES)))
+ return;
+#endif
+
odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
}
@@ -6184,7 +3268,7 @@ odm_TXPowerTrackingThermalMeterInit(
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
#if MP_DRIVER != 1 //for mp driver, turn off txpwrtracking as default
- pHalData->TxPowerTrackControl = TRUE;
+ pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = pHalData->TxPowerTrackControl = TRUE;
#endif
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
PADAPTER Adapter = pDM_Odm->Adapter;
@@ -6196,10 +3280,12 @@ odm_TXPowerTrackingThermalMeterInit(
pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
- //#if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default
+
if ( *(pDM_Odm->mp_mode) != 1)
pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
- //#endif//#if (MP_DRIVER != 1)
+ else
+ pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;
+
MSG_8192C("pDM_Odm TxPowerTrackControl = %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl);
}
else
@@ -6213,7 +3299,9 @@ odm_TXPowerTrackingThermalMeterInit(
if (*(pDM_Odm->mp_mode) != 1)
pdmpriv->TxPowerTrackControl = _TRUE;
- //#endif//#if (MP_DRIVER != 1)
+ else
+ pdmpriv->TxPowerTrackControl = _FALSE;
+
//MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
}
@@ -6229,7 +3317,7 @@ odm_TXPowerTrackingThermalMeterInit(
#endif
#endif
- pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;
+ //pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;
pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
@@ -7183,101 +4271,8 @@ odm_SwAntDivChkAntSwitchNIC(
}
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-
-u1Byte
-odm_SwAntDivSelectScanChnl(
- IN PADAPTER Adapter
- )
-{
-#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
- PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
- PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
- PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
- u1Byte i, j, ScanChannel = 0, ChannelNum = 0;
- PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
- u1Byte EachChannelSTAs[MAX_SCAN_CHANNEL_NUM] = {0};
-
- if(pMgntInfo->tmpNumBssDesc == 0)
- return 0;
-
- for(i = 0; i < pMgntInfo->tmpNumBssDesc; i++)
- {
- ChannelNum = pMgntInfo->tmpbssDesc[i].ChannelNumber;
- for(j = 0; j < pChannelList->ChannelLen; j++)
- {
- if(pChannelList->ChnlListEntry[j].ChannelNum == ChannelNum)
- {
- EachChannelSTAs[j]++;
- break;
- }
- }
- }
-
- for(i = 0; i < MAX_SCAN_CHANNEL_NUM; i++)
- {
- if(EachChannelSTAs[i] > EachChannelSTAs[ScanChannel])
- ScanChannel = i;
- }
-
- if(EachChannelSTAs[ScanChannel] == 0)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("odm_SwAntDivSelectScanChnl(): Scan List is empty.\n"));
- return 0;
- }
-
- ScanChannel = pChannelList->ChnlListEntry[ScanChannel].ChannelNum;
-
-
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD,
- ("odm_SwAntDivSelectScanChnl(): Channel %d is select as scan channel.\n", ScanChannel));
-
- return ScanChannel;
-#else
- return 0;
-#endif
-}
-
-
-VOID
-odm_SwAntDivConstructScanChnl(
- IN PADAPTER Adapter,
- IN u1Byte ScanChnl
- )
-{
-
- PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
-
- if(ScanChnl == 0)
- {
- u1Byte i;
- PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
-
- // 20100519 Joseph: Original antenna scanned nothing.
- // Test antenna shall scan all channel with half period in this condition.
- RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, NULL, NULL);
- for(i = 0; i < pChannelList->ChannelLen; i++)
- pChannelList->ChnlListEntry[i].ScanPeriod /= 2;
- }
- else
- {
- // The using of this CustomizedScanRequest is a trick to rescan the two channels
- // under the NORMAL scanning process. It will not affect MGNT_INFO.CustomizedScanRequest.
- CUSTOMIZED_SCAN_REQUEST CustomScanReq;
-
- CustomScanReq.bEnabled = TRUE;
- CustomScanReq.Channels[0] = ScanChnl;
- CustomScanReq.Channels[1] = pMgntInfo->dot11CurrentChannelNumber;
- CustomScanReq.nChannels = 2;
- CustomScanReq.ScanType = SCAN_ACTIVE;
- CustomScanReq.Duration = DEFAULT_PASSIVE_SCAN_PERIOD;
-
- RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, &CustomScanReq, NULL);
- }
+// Remove odm_SwAntDivSelectScanChnl() and odm_SwAntDivConstructScanChnl() to odm_PathDiv.c
-}
-#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
//
// 20100514 Luke/Joseph:
@@ -8323,1690 +5318,8 @@ VOID ODM_SetTxAntByTxInfo_88C_92D( IN PDM_ODM_T pDM_Odm){ }
//============================================================
//EDCA Turbo
//============================================================
-VOID
-ODM_EdcaTurboInit(
- IN PDM_ODM_T pDM_Odm)
-{
-
-#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
- odm_EdcaParaInit(pDM_Odm);
-#elif (DM_ODM_SUPPORT_TYPE==ODM_WIN)
- PADAPTER Adapter = NULL;
- HAL_DATA_TYPE *pHalData = NULL;
-
- if(pDM_Odm->Adapter==NULL) {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));
- return;
- }
-
- Adapter=pDM_Odm->Adapter;
- pHalData=GET_HAL_DATA(Adapter);
-
- pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
- pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
- pHalData->bIsAnyNonBEPkts = FALSE;
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
- PADAPTER Adapter = pDM_Odm->Adapter;
- pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
- pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
- Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;
-
-#endif
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VO PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VO_PARAM)));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VI PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VI_PARAM)));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BK PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BK_PARAM)));
-
-
-} // ODM_InitEdcaTurbo
-
-VOID
-odm_EdcaTurboCheck(
- IN PDM_ODM_T pDM_Odm
- )
-{
- //
- // For AP/ADSL use prtl8192cd_priv
- // For CE/NIC use PADAPTER
- //
-
- //
- // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
- // at the same time. In the stage2/3, we need to prive universal interface and merge all
- // HW dynamic mechanism.
- //
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));
-
- if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
- return;
-
- switch (pDM_Odm->SupportPlatform)
- {
- case ODM_WIN:
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
- odm_EdcaTurboCheckMP(pDM_Odm);
-#endif
- break;
-
- case ODM_CE:
-#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
- odm_EdcaTurboCheckCE(pDM_Odm);
-#endif
- break;
-
- case ODM_AP:
- case ODM_ADSL:
-
-#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
- odm_IotEngine(pDM_Odm);
-#endif
- break;
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
-
-} // odm_CheckEdcaTurbo
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
-
-
-VOID
-odm_EdcaTurboCheckCE(
- IN PDM_ODM_T pDM_Odm
- )
-{
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
-
- PADAPTER Adapter = pDM_Odm->Adapter;
- u32 EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
- u32 EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
- u32 ICType=pDM_Odm->SupportICType;
- u32 IOTPeer=0;
- u8 WirelessMode=0xFF; //invalid value
- u32 trafficIndex;
- u32 edca_param;
- u64 cur_tx_bytes = 0;
- u64 cur_rx_bytes = 0;
- u8 bbtchange = _FALSE;
- u8 bBiasOnRx = _FALSE;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);
- struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
- struct recv_priv *precvpriv = &(Adapter->recvpriv);
- struct registry_priv *pregpriv = &Adapter->registrypriv;
- struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
- struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
-
- if(pDM_Odm->bLinked != _TRUE)
- goto dm_CheckEdcaTurbo_EXIT;
-
- if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
- {
- goto dm_CheckEdcaTurbo_EXIT;
- }
-
- if(pDM_Odm->pWirelessMode!=NULL)
- WirelessMode=*(pDM_Odm->pWirelessMode);
-
- IOTPeer = pmlmeinfo->assoc_AP_vendor;
-
- if (IOTPeer >= HT_IOT_PEER_MAX)
- {
- goto dm_CheckEdcaTurbo_EXIT;
- }
-
- if( (pDM_Odm->SupportICType == ODM_RTL8192C) ||
- (pDM_Odm->SupportICType == ODM_RTL8723A) ||
- (pDM_Odm->SupportICType == ODM_RTL8188E))
- {
- if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))
- bBiasOnRx = _TRUE;
- }
-
- // Check if the status needs to be changed.
- if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
- {
- cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;
- cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;
-
- //traffic, TX or RX
- if(bBiasOnRx)
- {
- if (cur_tx_bytes > (cur_rx_bytes << 2))
- { // Uplink TP is present.
- trafficIndex = UP_LINK;
- }
- else
- { // Balance TP is present.
- trafficIndex = DOWN_LINK;
- }
- }
- else
- {
- if (cur_rx_bytes > (cur_tx_bytes << 2))
- { // Downlink TP is present.
- trafficIndex = DOWN_LINK;
- }
- else
- { // Balance TP is present.
- trafficIndex = UP_LINK;
- }
- }
-
- //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
- {
- if(ICType==ODM_RTL8192D)
- {
- // Single PHY
- if(pDM_Odm->RFType==ODM_2T2R)
- {
- EDCA_BE_UL = 0x60a42b; //0x5ea42b;
- EDCA_BE_DL = 0x60a42b; //0x5ea42b;
- }
- else
- {
- EDCA_BE_UL = 0x6ea42b;
- EDCA_BE_DL = 0x6ea42b;
- }
- }
- else
- {
- if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {
- if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
- EDCA_BE_UL = 0x60a42b;
- EDCA_BE_DL = 0x60a42b;
- }
- else
- {
- EDCA_BE_UL = 0x6ea42b;
- EDCA_BE_DL = 0x6ea42b;
- }
- }
- }
-
- //92D txop can't be set to 0x3e for cisco1250
- if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
- {
- EDCA_BE_DL = edca_setting_DL[IOTPeer];
- EDCA_BE_UL = edca_setting_UL[IOTPeer];
- }
- //merge from 92s_92c_merge temp brunch v2445 20120215
- else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
- {
- EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];
- }
- else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
- {
- EDCA_BE_DL = 0xa630;
- }
- else if(IOTPeer == HT_IOT_PEER_MARVELL)
- {
- EDCA_BE_DL = edca_setting_DL[IOTPeer];
- EDCA_BE_UL = edca_setting_UL[IOTPeer];
- }
- else if(IOTPeer == HT_IOT_PEER_ATHEROS)
- {
- // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
- EDCA_BE_DL = edca_setting_DL[IOTPeer];
- }
-
- if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
- {
- EDCA_BE_UL = 0x5ea42b;
- EDCA_BE_DL = 0x5ea42b;
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x",EDCA_BE_UL,EDCA_BE_DL));
- }
-
- if (trafficIndex == DOWN_LINK)
- edca_param = EDCA_BE_DL;
- else
- edca_param = EDCA_BE_UL;
-
- rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
-
- pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
- }
-
- pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;
- }
- else
- {
- //
- // Turn Off EDCA turbo here.
- // Restore original EDCA according to the declaration of AP.
- //
- if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
- {
- rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
- pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
- }
- }
-
-dm_CheckEdcaTurbo_EXIT:
- // Set variables for next time.
- precvpriv->bIsAnyNonBEPkts = _FALSE;
-#endif
-}
-
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)
-VOID
-odm_EdcaTurboCheckMP(
- IN PDM_ODM_T pDM_Odm
- )
-{
-
-
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
-
- PADAPTER pDefaultAdapter = GetDefaultAdapter(Adapter);
- PADAPTER pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;
- PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
- PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
- //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn
- u8Byte Ext_curTxOkCnt = 0;
- u8Byte Ext_curRxOkCnt = 0;
- //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
- u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
-
- // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.
- u8Byte curTxOkCnt = 0;
- u8Byte curRxOkCnt = 0;
- u4Byte EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
- u4Byte EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
- u4Byte EDCA_BE = 0x5ea42b;
- u1Byte IOTPeer=0;
- BOOLEAN *pbIsCurRDLState=NULL;
- BOOLEAN bLastIsCurRDLState=FALSE;
- BOOLEAN bBiasOnRx=FALSE;
- BOOLEAN bEdcaTurboOn=FALSE;
- u1Byte TxRate = 0xFF;
- u8Byte value64;
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
-
-////===============================
-////list paramter for different platform
-////===============================
- bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;
- pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);
-
- //2012/09/14 MH Add
- if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)
- pHalData->bIsAnyNonBEPkts = TRUE;
-
- pMgntInfo->NumNonBePkt = 0;
-
- // Caculate TX/RX TP:
- //curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
- //curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
- curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;
- curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;
- pDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
- pDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
-
- if(pExtAdapter == NULL)
- pExtAdapter = pDefaultAdapter;
-
- Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;
- Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;
- GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
- //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
- if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
- {
- curTxOkCnt = Ext_curTxOkCnt ;
- curRxOkCnt = Ext_curRxOkCnt ;
- }
- //
- IOTPeer=pMgntInfo->IOTPeer;
- bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;
- bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts) && (!pMgntInfo->bDisableFrameBursting))?TRUE:FALSE;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx bDisableFrameBursting : 0x%lx \n",pHalData->bIsAnyNonBEPkts,pMgntInfo->bDisableFrameBursting));
-
-
-////===============================
-////check if edca turbo is disabled
-////===============================
- if(odm_IsEdcaTurboDisable(pDM_Odm))
- goto dm_CheckEdcaTurbo_EXIT;
-
-
-////===============================
-////remove iot case out
-////===============================
- ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);
-
-
-////===============================
-////Check if the status needs to be changed.
-////===============================
- if(bEdcaTurboOn)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));
- if(bBiasOnRx)
- odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, TRUE, pbIsCurRDLState);
- else
- odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, FALSE, pbIsCurRDLState);
-
-//modify by Guo.Mingzhi 2011-12-29
- EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;
- if(IS_HARDWARE_TYPE_8821U(Adapter))
- {
- if(pMgntInfo->RegTxDutyEnable)
- {
- //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)
- if(!pMgntInfo->ForcedDataRate) //auto rate
- {
- if(pDM_Odm->TxRate != 0xFF)
- TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
- }
- else //force rate
- {
- TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
- }
-
- value64 = (curRxOkCnt<<2);
- if(curTxOkCnt < value64) //Downlink
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
- else //Uplink
- {
- //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
- //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
- if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
- else
- {
- switch (TxRate)
- {
- case MGN_VHT1SS_MCS6:
- case MGN_VHT1SS_MCS5:
- case MGN_MCS6:
- case MGN_MCS5:
- case MGN_48M:
- case MGN_54M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);
- break;
- case MGN_VHT1SS_MCS4:
- case MGN_MCS4:
- case MGN_36M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);
- break;
- case MGN_VHT1SS_MCS3:
- case MGN_MCS3:
- case MGN_24M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);
- break;
- case MGN_VHT1SS_MCS2:
- case MGN_MCS2:
- case MGN_18M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);
- break;
- case MGN_VHT1SS_MCS1:
- case MGN_MCS1:
- case MGN_9M:
- case MGN_12M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);
- break;
- case MGN_VHT1SS_MCS0:
- case MGN_MCS0:
- case MGN_6M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
- break;
- default:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
- break;
- }
- }
- }
- }
- else
- {
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
- }
-
- }
- else if (IS_HARDWARE_TYPE_8812AU(Adapter)){
- if(pMgntInfo->RegTxDutyEnable)
- {
- //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)
- // it;s the same issue as 8811AU
- if(!pMgntInfo->ForcedDataRate) //auto rate
- {
- if(pDM_Odm->TxRate != 0xFF)
- TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
- }
- else //force rate
- {
- TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
- }
-
- value64 = (curRxOkCnt<<2);
- if(curTxOkCnt < value64) //Downlink
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
- else //Uplink
- {
- //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
- //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
- if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
- else
- {
- switch (TxRate)
- {
- case MGN_VHT2SS_MCS9:
- case MGN_VHT1SS_MCS9:
- case MGN_VHT1SS_MCS8:
- case MGN_MCS15:
- case MGN_MCS7:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);
- case MGN_VHT2SS_MCS8:
- case MGN_VHT1SS_MCS7:
- case MGN_MCS14:
- case MGN_MCS6:
- case MGN_54M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);
- case MGN_VHT2SS_MCS7:
- case MGN_VHT2SS_MCS6:
- case MGN_VHT1SS_MCS6:
- case MGN_VHT1SS_MCS5:
- case MGN_MCS13:
- case MGN_MCS5:
- case MGN_48M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);
- break;
- case MGN_VHT2SS_MCS5:
- case MGN_VHT2SS_MCS4:
- case MGN_VHT1SS_MCS4:
- case MGN_VHT1SS_MCS3:
- case MGN_MCS12:
- case MGN_MCS4:
- case MGN_MCS3:
- case MGN_36M:
- case MGN_24M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);
- break;
- case MGN_VHT2SS_MCS3:
- case MGN_VHT2SS_MCS2:
- case MGN_VHT2SS_MCS1:
- case MGN_VHT1SS_MCS2:
- case MGN_VHT1SS_MCS1:
- case MGN_MCS11:
- case MGN_MCS10:
- case MGN_MCS9:
- case MGN_MCS2:
- case MGN_MCS1:
- case MGN_18M:
- case MGN_12M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);
- break;
- case MGN_VHT2SS_MCS0:
- case MGN_VHT1SS_MCS0:
- case MGN_MCS0:
- case MGN_MCS8:
- case MGN_9M:
- case MGN_6M:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
- break;
- default:
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
- break;
- }
- }
- }
- }
- else
- {
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
- }
- }
- else
- ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));
-
- pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA_BE_DL : 0x%lx EDCA_BE_UL : 0x%lx EDCA_BE : 0x%lx \n",EDCA_BE_DL,EDCA_BE_UL,EDCA_BE));
-
- }
- else
- {
- // Turn Off EDCA turbo here.
- // Restore original EDCA according to the declaration of AP.
- if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
- {
- Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );
-
- pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx \n",pDM_Odm->WMMEDCA_BE));
-
- }
- }
-
-////===============================
-////Set variables for next time.
-////===============================
-dm_CheckEdcaTurbo_EXIT:
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
- pHalData->bIsAnyNonBEPkts = FALSE;
- pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
- pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
- pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;
- pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
- precvpriv->bIsAnyNonBEPkts = FALSE;
- pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes;
- precvpriv->last_rx_bytes = precvpriv->rx_bytes;
-#endif
-
-}
-
-
-//check if edca turbo is disabled
-BOOLEAN
-odm_IsEdcaTurboDisable(
- IN PDM_ODM_T pDM_Odm
-)
-{
- PADAPTER Adapter = pDM_Odm->Adapter;
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
- PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
- u4Byte IOTPeer=pMgntInfo->IOTPeer;
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
- struct registry_priv *pregpriv = &Adapter->registrypriv;
- struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
- struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
- u4Byte IOTPeer=pmlmeinfo->assoc_AP_vendor;
- u1Byte WirelessMode=0xFF; //invalid value
-
- if(pDM_Odm->pWirelessMode!=NULL)
- WirelessMode=*(pDM_Odm->pWirelessMode);
-
-#endif
-
- if(pDM_Odm->bBtDisableEdcaTurbo)
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));
- return TRUE;
- }
-
- if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||
- (pDM_Odm->bWIFITest)||
- (IOTPeer>= HT_IOT_PEER_MAX))
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));
- return TRUE;
- }
-
-
-#if (DM_ODM_SUPPORT_TYPE ==ODM_WIN)
- // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue
- // 2. User may disable EDCA Turbo mode with OID settings.
- if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));
- return TRUE;
- }
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
- //suggested by Jr.Luke: open TXOP for B/G/BG/A mode 2012-0215
- if((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G)||(WirelessMode==ODM_WM_G)||(WirelessMode=ODM_WM_A))
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, ODM_Read4Byte(pDM_Odm, ODM_EDCA_BE_PARAM)|0x5E0000);
-
- if(pDM_Odm->SupportICType==ODM_RTL8192D) {
- if ((pregpriv->wifi_spec == 1) || (pmlmeext->cur_wireless_mode == WIRELESS_11B)) {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("92D:EdcaTurboDisable\n"));
- return TRUE;
- }
- }
- else
- {
- if((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)){
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("Others:EdcaTurboDisable\n"));
- return TRUE;
- }
- }
-
-#endif
-
- return FALSE;
-
-
-}
-
-//add iot case here: for MP/CE
-VOID
-ODM_EdcaParaSelByIot(
- IN PDM_ODM_T pDM_Odm,
- OUT u4Byte *EDCA_BE_UL,
- OUT u4Byte *EDCA_BE_DL
- )
-{
-
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- u4Byte IOTPeer=0;
- u4Byte ICType=pDM_Odm->SupportICType;
- u1Byte WirelessMode=0xFF; //invalid value
- u4Byte RFType=pDM_Odm->RFType;
- u4Byte IOTPeerSubType=0;
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
- PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
- u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
- struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
- #ifdef CONFIG_BT_COEXIST
- struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
- #endif
- u1Byte bbtchange =FALSE;
-#endif
-
- if(pDM_Odm->pWirelessMode!=NULL)
- WirelessMode=*(pDM_Odm->pWirelessMode);
-
-///////////////////////////////////////////////////////////
-////list paramter for different platform
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
- IOTPeer=pMgntInfo->IOTPeer;
- IOTPeerSubType=pMgntInfo->IOTPeerSubtype;
- GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
-
-#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
- IOTPeer=pmlmeinfo->assoc_AP_vendor;
- #ifdef CONFIG_BT_COEXIST
- if(pbtpriv->BT_Coexist)
- {
- if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0))
- bbtchange = TRUE;
- }
- #endif
-
-#endif
-
- if(ICType==ODM_RTL8192D)
- {
- // Single PHY
- if(pDM_Odm->RFType==ODM_2T2R)
- {
- (*EDCA_BE_UL) = 0x60a42b; //0x5ea42b;
- (*EDCA_BE_DL) = 0x60a42b; //0x5ea42b;
-
- }
- else
- {
- (*EDCA_BE_UL) = 0x6ea42b;
- (*EDCA_BE_DL) = 0x6ea42b;
- }
-
- }
-////============================
-/// IOT case for MP
-////============================
-#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
- else
- {
-
- if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
- if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
- (*EDCA_BE_UL) = 0x60a42b;
- (*EDCA_BE_DL) = 0x60a42b;
- }
- else
- {
- (*EDCA_BE_UL) = 0x6ea42b;
- (*EDCA_BE_DL) = 0x6ea42b;
- }
- }
- }
-
- if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
- {
- (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];
- (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];
- }
-
- #if (INTEL_PROXIMITY_SUPPORT == 1)
- if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)
- {
- (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;
- }
- else
- #endif
- {
- if((!pMgntInfo->bDisableFrameBursting) &&
- (pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))
- {// To check whether we shall force turn on TXOP configuration.
- if(!((*EDCA_BE_UL) & 0xffff0000))
- (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.
- if(!((*EDCA_BE_DL) & 0xffff0000))
- (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.
- }
-
- //92D txop can't be set to 0x3e for cisco1250
- if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
- {
- (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
- (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
- }
- //merge from 92s_92c_merge temp brunch v2445 20120215
- else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
- {
- (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
- }
- else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
- {
- (*EDCA_BE_DL) = 0xa630;
- }
-
- else if(IOTPeer == HT_IOT_PEER_MARVELL)
- {
- (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
- (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
- }
- else if(IOTPeer == HT_IOT_PEER_ATHEROS)
- {
- // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
- (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
-
- if(ICType == ODM_RTL8821)
- (*EDCA_BE_DL) = 0x5ea630;
-
- }
- }
-
- if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))
- {
- (*EDCA_BE_DL) = 0x432b;
- (*EDCA_BE_UL) = 0x432b;
- }
-
-
-
- if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
- {
- (*EDCA_BE_UL) = 0x5ea42b;
- (*EDCA_BE_DL) = 0x5ea42b;
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));
- }
-
- // Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.
- if((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) &&
- (pMgntInfo->dot11CurrentChannelNumber == 6))
- {
- (*EDCA_BE_DL) = 0xa92b;
- }
-
-////============================
-/// IOT case for CE
-////============================
-#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
-
- if(RFType==ODM_RTL8192D)
- {
- if((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
- {
- (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
- (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
- }
- else if((IOTPeer == HT_IOT_PEER_AIRGO) &&
- ((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G))))
- (*EDCA_BE_DL)=0x00a630;
-
- else if((IOTPeer== HT_IOT_PEER_ATHEROS) &&
- (WirelessMode&ODM_WM_N5G) &&
- (Adapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))
- (*EDCA_BE_DL)=0xa42b;
-
- }
- //92C IOT case:
- else
- {
- #ifdef CONFIG_BT_COEXIST
- if(bbtchange)
- {
- (*EDCA_BE_UL) = pbtpriv->BT_EDCA[UP_LINK];
- (*EDCA_BE_DL) = pbtpriv->BT_EDCA[DOWN_LINK];
- }
- else
- #endif
- {
- if((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
- {
- (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
- (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
- }
- else
- {
- (*EDCA_BE_UL)=EDCAParam[HT_IOT_PEER_UNKNOWN][UP_LINK];
- (*EDCA_BE_DL)=EDCAParam[HT_IOT_PEER_UNKNOWN][DOWN_LINK];
- }
- }
- if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
- if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))
- {
- (*EDCA_BE_UL) = 0x60a42b;
- (*EDCA_BE_DL) = 0x60a42b;
- }
- else
- {
- (*EDCA_BE_UL) = 0x6ea42b;
- (*EDCA_BE_DL) = 0x6ea42b;
- }
- }
-
- }
-#endif
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Special: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));
-
-}
-
-
-VOID
-odm_EdcaChooseTrafficIdx(
- IN PDM_ODM_T pDM_Odm,
- IN u8Byte cur_tx_bytes,
- IN u8Byte cur_rx_bytes,
- IN BOOLEAN bBiasOnRx,
- OUT BOOLEAN *pbIsCurRDLState
- )
-{
-
-
- if(bBiasOnRx)
- {
-
- if(cur_tx_bytes>(cur_rx_bytes*4))
- {
- *pbIsCurRDLState=FALSE;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));
-
- }
- else
- {
- *pbIsCurRDLState=TRUE;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
-
- }
- }
- else
- {
- if(cur_rx_bytes>(cur_tx_bytes*4))
- {
- *pbIsCurRDLState=TRUE;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink Traffic\n"));
-
- }
- else
- {
- *pbIsCurRDLState=FALSE;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
- }
- }
-
- return ;
-}
-
-#endif
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
-
-void odm_EdcaParaInit(
- IN PDM_ODM_T pDM_Odm
- )
-{
- prtl8192cd_priv priv = pDM_Odm->priv;
- int mode=priv->pmib->dot11BssType.net_work_type;
-
- static unsigned int slot_time, VO_TXOP, VI_TXOP, sifs_time;
- struct ParaRecord EDCA[4];
-
- memset(EDCA, 0, 4*sizeof(struct ParaRecord));
-
- sifs_time = 10;
- slot_time = 20;
-
- if (mode & (ODM_WM_N24G|ODM_WM_N5G))
- sifs_time = 16;
-
- if (mode & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G|ODM_WM_A))
- slot_time = 9;
-
-
-#if((defined(RTL_MANUAL_EDCA))&&(DM_ODM_SUPPORT_TYPE==ODM_AP))
- if( priv->pmib->dot11QosEntry.ManualEDCA ) {
- if( OPMODE & WIFI_AP_STATE )
- memcpy(EDCA, priv->pmib->dot11QosEntry.AP_manualEDCA, 4*sizeof(struct ParaRecord));
- else
- memcpy(EDCA, priv->pmib->dot11QosEntry.STA_manualEDCA, 4*sizeof(struct ParaRecord));
-
- #ifdef WIFI_WMM
- if (QOS_ENABLE)
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
- else
- #endif
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
-
- }else
- #endif //RTL_MANUAL_EDCA
- {
-
- if(OPMODE & WIFI_AP_STATE)
- {
- memcpy(EDCA, rtl_ap_EDCA, 2*sizeof(struct ParaRecord));
-
- if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
- memcpy(&EDCA[VI], &rtl_ap_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
- else
- memcpy(&EDCA[VI], &rtl_ap_EDCA[VI], 2*sizeof(struct ParaRecord));
- }
- else
- {
- memcpy(EDCA, rtl_sta_EDCA, 2*sizeof(struct ParaRecord));
-
- if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
- memcpy(&EDCA[VI], &rtl_sta_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
- else
- memcpy(&EDCA[VI], &rtl_sta_EDCA[VI], 2*sizeof(struct ParaRecord));
- }
-
- #ifdef WIFI_WMM
- if (QOS_ENABLE)
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
- else
- #endif
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
-#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + 2* slot_time));
-#endif
-
-
- }
-
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_VO_PARAM, (EDCA[VO].TXOPlimit<< 16) | (EDCA[VO].ECWmax<< 12) | (EDCA[VO].ECWmin<< 8) | (sifs_time + EDCA[VO].AIFSN* slot_time));
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[BE].AIFSN* slot_time));
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[BK].AIFSN* slot_time));
-// ODM_Write1Byte(pDM_Odm,ACMHWCTRL, 0x00);
-
- priv->pshare->iot_mode_enable = 0;
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
- if (priv->pshare->rf_ft_var.wifi_beq_iot)
- priv->pshare->iot_mode_VI_exist = 0;
-
- #ifdef WMM_VIBE_PRI
- priv->pshare->iot_mode_BE_exist = 0;
- #endif
-
- #ifdef LOW_TP_TXOP
- priv->pshare->BE_cwmax_enhance = 0;
- #endif
-
-#elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
- priv->pshare->iot_mode_BE_exist = 0;
-#endif
- priv->pshare->iot_mode_VO_exist = 0;
-}
-
-BOOLEAN
-ODM_ChooseIotMainSTA(
- IN PDM_ODM_T pDM_Odm,
- IN PSTA_INFO_T pstat
- )
-{
- prtl8192cd_priv priv = pDM_Odm->priv;
- BOOLEAN bhighTP_found_pstat=FALSE;
-
- if ((GET_ROOT(priv)->up_time % 2) == 0) {
- unsigned int tx_2s_avg = 0;
- unsigned int rx_2s_avg = 0;
- int i=0, aggReady=0;
- unsigned long total_sum = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes);
-
- pstat->current_tx_bytes += pstat->tx_byte_cnt;
- pstat->current_rx_bytes += pstat->rx_byte_cnt;
-
- if (total_sum != 0) {
- if (total_sum <= 100) {
- tx_2s_avg = (unsigned int)((pstat->current_tx_bytes*100) / total_sum);
- rx_2s_avg = (unsigned int)((pstat->current_rx_bytes*100) / total_sum);
- } else {
- tx_2s_avg = (unsigned int)(pstat->current_tx_bytes / (total_sum / 100));
- rx_2s_avg = (unsigned int)(pstat->current_rx_bytes / (total_sum / 100));
- }
-
- }
-
-#if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
- if (pstat->ht_cap_len) {
- if ((tx_2s_avg + rx_2s_avg) >=25 /*50*/) {
-
- priv->pshare->highTP_found_pstat = pstat;
- bhighTP_found_pstat=TRUE;
- }
- }
-#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
- for(i=0; i<8; i++)
- aggReady += (pstat->ADDBA_ready[i]);
- if (pstat->ht_cap_len && aggReady)
- {
- if ((tx_2s_avg + rx_2s_avg >= 25)) {
- priv->pshare->highTP_found_pstat = pstat;
- }
-
- #ifdef CLIENT_MODE
- if (OPMODE & WIFI_STATION_STATE) {
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
- if ((pstat->IOTPeer==HT_IOT_PEER_RALINK) && ((tx_2s_avg + rx_2s_avg) >= 45))
-#else
- if(pstat->is_ralink_sta && ((tx_2s_avg + rx_2s_avg) >= 45))
-#endif
- priv->pshare->highTP_found_pstat = pstat;
- }
- #endif
- }
-#endif
- } else {
- pstat->current_tx_bytes = pstat->tx_byte_cnt;
- pstat->current_rx_bytes = pstat->rx_byte_cnt;
- }
-
- return bhighTP_found_pstat;
-}
-
-
-#ifdef WIFI_WMM
-VOID
-ODM_IotEdcaSwitch(
- IN PDM_ODM_T pDM_Odm,
- IN unsigned char enable
- )
-{
- prtl8192cd_priv priv = pDM_Odm->priv;
- int mode=priv->pmib->dot11BssType.net_work_type;
- unsigned int slot_time = 20, sifs_time = 10, BE_TXOP = 47, VI_TXOP = 94;
- unsigned int vi_cw_max = 4, vi_cw_min = 3, vi_aifs;
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
- if (!(!priv->pmib->dot11OperationEntry.wifi_specific ||
- ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
- #ifdef CLIENT_MODE
- || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
- #endif
- ))
- return;
-#endif
-
- if ((mode & (ODM_WM_N24G|ODM_WM_N5G)) && (priv->pshare->ht_sta_num
- #ifdef WDS
- || ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
- #endif
- ))
- sifs_time = 16;
-
- if (mode & (ODM_WM_N24G|ODM_WM_N5G|ODM_WM_G|ODM_WM_A)) {
- slot_time = 9;
- }
- else
- {
- BE_TXOP = 94;
- VI_TXOP = 188;
- }
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
- if (priv->pshare->iot_mode_VO_exist) {
- // to separate AC_VI and AC_BE to avoid using the same EDCA settings
- if (priv->pshare->iot_mode_BE_exist) {
- vi_cw_max = 5;
- vi_cw_min = 3;
- } else {
- vi_cw_max = 6;
- vi_cw_min = 4;
- }
- }
- vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
-
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);
-
-
-#elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
- if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) {
- if (priv->pshare->iot_mode_VO_exist) {
- #ifdef WMM_VIBE_PRI
- if (priv->pshare->iot_mode_BE_exist)
- {
- vi_cw_max = 5;
- vi_cw_min = 3;
- vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
- }
- else
- #endif
- {
- vi_cw_max = 6;
- vi_cw_min = 4;
- vi_aifs = 0x2b;
- }
- }
- else {
- vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
- }
-
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)
- | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);
- }
-#endif
-
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
- if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist)
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f);
- else if(!enable)
-#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
- if(!enable) //if iot is disable ,maintain original BEQ PARAM
-#endif
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)
- | (sifs_time + 3 * slot_time));
- else
- {
- int txop_enlarge;
- int txop;
- unsigned int cw_max;
- unsigned int txop_close;
-
- #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
- cw_max = ((priv->pshare->BE_cwmax_enhance) ? 10 : 6);
- txop_close = ((priv->pshare->rf_ft_var.low_tp_txop && priv->pshare->rf_ft_var.low_tp_txop_close) ? 1 : 0);
-
- if(priv->pshare->txop_enlarge == 0xe) //if intel case
- txop = (txop_close ? 0 : (BE_TXOP*2));
- else //if other case
- txop = (txop_close ? 0: (BE_TXOP*priv->pshare->txop_enlarge));
- #else
- cw_max=6;
- if((priv->pshare->txop_enlarge==0xe)||(priv->pshare->txop_enlarge==0xd))
- txop=BE_TXOP*2;
- else
- txop=BE_TXOP*priv->pshare->txop_enlarge;
-
- #endif
-
- if (priv->pshare->ht_sta_num
- #ifdef WDS
- || ((OPMODE & WIFI_AP_STATE) && (mode & (ODM_WM_N24G|ODM_WM_N5G)) &&
- priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
- #endif
- )
- {
-
- if (priv->pshare->txop_enlarge == 0xe) {
- // is intel client, use a different edca value
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop<< 16) | (cw_max<< 12) | (4 << 8) | 0x1f);
- priv->pshare->txop_enlarge = 2;
- }
-#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
- #ifndef LOW_TP_TXOP
- else if (priv->pshare->txop_enlarge == 0xd) {
- // is intel ralink, use a different edca value
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (4 << 12) | (3 << 8) | 0x19);
- priv->pshare->txop_enlarge = 2;
- }
- #endif
-#endif
- else
- {
- if (pDM_Odm->RFType==ODM_2T2R)
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
- (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
- else
- #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
- (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
- #else
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
- (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
-
- #endif
- }
- }
- else
- {
- #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
- #else
- #if defined(CONFIG_RTL_8196D) || defined(CONFIG_RTL_8196E) || (defined(CONFIG_RTL_8197D) && !defined(CONFIG_PORT0_EXT_GIGA))
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time));
- #else
- ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
- #endif
-
- #endif
- }
-
- }
-}
-#endif
-
-VOID
-odm_IotEngine(
- IN PDM_ODM_T pDM_Odm
- )
-{
-
- struct rtl8192cd_priv *priv=pDM_Odm->priv;
- PSTA_INFO_T pstat = NULL;
- u4Byte i;
-
-#ifdef WIFI_WMM
- unsigned int switch_turbo = 0;
-#endif
-////////////////////////////////////////////////////////
-// if EDCA Turbo function is not supported or Manual EDCA Setting
-// then return
-////////////////////////////////////////////////////////
- if(!(pDM_Odm->SupportAbility&ODM_MAC_EDCA_TURBO)){
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO NOT SUPPORTED\n"));
- return;
- }
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined(RTL_MANUAL_EDCA) && defined(WIFI_WMM))
- if(priv->pmib->dot11QosEntry.ManualEDCA){
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: MANUAL SETTING\n"));
- return ;
- }
-#endif
-
-#if !(DM_ODM_SUPPORT_TYPE &ODM_AP)
- //////////////////////////////////////////////////////
- //find high TP STA every 2s
-//////////////////////////////////////////////////////
- if ((GET_ROOT(priv)->up_time % 2) == 0)
- priv->pshare->highTP_found_pstat==NULL;
-
-#if 0
- phead = &priv->asoc_list;
- plist = phead->next;
- while(plist != phead) {
- pstat = list_entry(plist, struct stat_info, asoc_list);
-
- if(ODM_ChooseIotMainSTA(pDM_Odm, pstat)); //find the correct station
- break;
- if (plist == plist->next) //the last plist
- break;
- plist = plist->next;
- };
-#endif
-
- //find highTP STA
- for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
- pstat = pDM_Odm->pODM_StaInfo[i];
- if(IS_STA_VALID(pstat) && (ODM_ChooseIotMainSTA(pDM_Odm, pstat))) //find the correct station
- break;
- }
-
- //////////////////////////////////////////////////////
- //if highTP STA is not found, then return
- //////////////////////////////////////////////////////
- if(priv->pshare->highTP_found_pstat==NULL) {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: NO HT STA FOUND\n"));
- return;
- }
-#endif
-
- pstat=priv->pshare->highTP_found_pstat;
-
-
-#ifdef WIFI_WMM
- if (QOS_ENABLE) {
- if (!priv->pmib->dot11OperationEntry.wifi_specific
- #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
- ||((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
- #elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
- || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
- #endif
- ) {
- if (priv->pshare->iot_mode_enable &&
- ((priv->pshare->phw->VO_pkt_count > 50) ||
- (priv->pshare->phw->VI_pkt_count > 50) ||
- (priv->pshare->phw->BK_pkt_count > 50))) {
- priv->pshare->iot_mode_enable = 0;
- switch_turbo++;
- } else if ((!priv->pshare->iot_mode_enable) &&
- ((priv->pshare->phw->VO_pkt_count < 50) &&
- (priv->pshare->phw->VI_pkt_count < 50) &&
- (priv->pshare->phw->BK_pkt_count < 50))) {
- priv->pshare->iot_mode_enable++;
- switch_turbo++;
- }
- }
-
-
- #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
- if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific)
- #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
- if (priv->pmib->dot11OperationEntry.wifi_specific)
- #endif
- {
- if (!priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count > 50)) {
- priv->pshare->iot_mode_VO_exist++;
- switch_turbo++;
- } else if (priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count < 50)) {
- priv->pshare->iot_mode_VO_exist = 0;
- switch_turbo++;
- }
-#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
- if (priv->pshare->iot_mode_VO_exist) {
- //printk("[%s %d] BE_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BE_pkt_count);
- if (!priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count > 250)) {
- priv->pshare->iot_mode_BE_exist++;
- switch_turbo++;
- } else if (priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count < 250)) {
- priv->pshare->iot_mode_BE_exist = 0;
- switch_turbo++;
- }
- }
-#endif
-
-#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
- if (priv->pshare->rf_ft_var.wifi_beq_iot)
- {
- if (!priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count > 50)) {
- priv->pshare->iot_mode_VI_exist++;
- switch_turbo++;
- } else if (priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count < 50)) {
- priv->pshare->iot_mode_VI_exist = 0;
- switch_turbo++;
- }
- }
-#endif
-
- }
- else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) {
- if (priv->pshare->txop_enlarge) {
- priv->pshare->txop_enlarge = 0;
- if (priv->pshare->iot_mode_enable)
- switch_turbo++;
- }
- }
-
-#if(defined(CLIENT_MODE) && (DM_ODM_SUPPORT_TYPE==ODM_AP))
- if ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
- {
- if (priv->pshare->iot_mode_enable &&
- (((priv->pshare->phw->VO_pkt_count > 50) ||
- (priv->pshare->phw->VI_pkt_count > 50) ||
- (priv->pshare->phw->BK_pkt_count > 50)) ||
- (pstat && (!pstat->ADDBA_ready[0]) & (!pstat->ADDBA_ready[3]))))
- {
- priv->pshare->iot_mode_enable = 0;
- switch_turbo++;
- }
- else if ((!priv->pshare->iot_mode_enable) &&
- (((priv->pshare->phw->VO_pkt_count < 50) &&
- (priv->pshare->phw->VI_pkt_count < 50) &&
- (priv->pshare->phw->BK_pkt_count < 50)) &&
- (pstat && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3]))))
- {
- priv->pshare->iot_mode_enable++;
- switch_turbo++;
- }
- }
-#endif
-
- priv->pshare->phw->VO_pkt_count = 0;
- priv->pshare->phw->VI_pkt_count = 0;
- priv->pshare->phw->BK_pkt_count = 0;
-
- #if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
- priv->pshare->phw->BE_pkt_count = 0;
- #endif
-
- #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
- if (priv->pshare->rf_ft_var.wifi_beq_iot)
- priv->pshare->phw->VI_rx_pkt_count = 0;
- #endif
-
- }
-#endif
-
- if ((priv->up_time % 2) == 0) {
- /*
- * decide EDCA content for different chip vendor
- */
-#ifdef WIFI_WMM
- #if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
- if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
-
- #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
- if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific ||
- ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
- #ifdef CLIENT_MODE
- || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
- #endif
- #endif
- ))
-
- {
-
- if (pstat && pstat->rssi >= priv->pshare->rf_ft_var.txop_enlarge_upper) {
-#ifdef LOW_TP_TXOP
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
- if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
-#else
- if (pstat->is_intel_sta)
-#endif
- {
- if (priv->pshare->txop_enlarge != 0xe)
- {
- priv->pshare->txop_enlarge = 0xe;
-
- if (priv->pshare->iot_mode_enable)
- switch_turbo++;
- }
- }
- else if (priv->pshare->txop_enlarge != 2)
- {
- priv->pshare->txop_enlarge = 2;
- if (priv->pshare->iot_mode_enable)
- switch_turbo++;
- }
-#else
- if (priv->pshare->txop_enlarge != 2)
- {
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
- if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
-#else
- if (pstat->is_intel_sta)
-#endif
- priv->pshare->txop_enlarge = 0xe;
-#if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
- else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
-#else
- else if (pstat->is_ralink_sta)
-#endif
- priv->pshare->txop_enlarge = 0xd;
- else
- priv->pshare->txop_enlarge = 2;
-
- if (priv->pshare->iot_mode_enable)
- switch_turbo++;
- }
-#endif
-#if 0
- if (priv->pshare->txop_enlarge != 2)
- {
- #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
- if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
- #else
- if (pstat->is_intel_sta)
- #endif
- priv->pshare->txop_enlarge = 0xe;
- #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
- else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
- priv->pshare->txop_enlarge = 0xd;
- #endif
- else
- priv->pshare->txop_enlarge = 2;
- if (priv->pshare->iot_mode_enable)
- switch_turbo++;
- }
-#endif
- }
- else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower)
- {
- if (priv->pshare->txop_enlarge) {
- priv->pshare->txop_enlarge = 0;
- if (priv->pshare->iot_mode_enable)
- switch_turbo++;
- }
- }
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&( defined LOW_TP_TXOP))
- // for Intel IOT, need to enlarge CW MAX from 6 to 10
- if (pstat && pstat->is_intel_sta && (((pstat->tx_avarage+pstat->rx_avarage)>>10) <
- priv->pshare->rf_ft_var.cwmax_enhance_thd))
- {
- if (!priv->pshare->BE_cwmax_enhance && priv->pshare->iot_mode_enable)
- {
- priv->pshare->BE_cwmax_enhance = 1;
- switch_turbo++;
- }
- } else {
- if (priv->pshare->BE_cwmax_enhance) {
- priv->pshare->BE_cwmax_enhance = 0;
- switch_turbo++;
- }
- }
-#endif
- }
-#endif
- priv->pshare->current_tx_bytes = 0;
- priv->pshare->current_rx_bytes = 0;
- }
-
-#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE))
- if ((priv->assoc_num > 1) && (AMPDU_ENABLE))
- {
- if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){
- if ((priv->swq_en == 0)){
- switch_turbo++;
- if (priv->pshare->txop_enlarge == 0)
- priv->pshare->txop_enlarge = 2;
- priv->swq_en = 1;
- }
- else
- {
- if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))
- {
- priv->pshare->txop_enlarge = 2;
- switch_turbo--;
- }
- }
- }
- else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){
- priv->swq_en = 0;
- }
- else if ((priv->swq_en == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) {
- priv->pshare->txop_enlarge = 2;
- switch_turbo--;
- }
- }
-#if ((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined CONFIG_RTL_819XD))
- else if( (priv->assoc_num == 1) && (AMPDU_ENABLE)) {
- if (pstat) {
- int en_thd = 14417920>>(priv->up_time % 2);
- if ((priv->swq_en == 0) && (pstat->current_tx_bytes > en_thd) && (pstat->current_rx_bytes > en_thd) ) { //50Mbps
- priv->swq_en = 1;
- priv->swqen_keeptime = priv->up_time;
- }
- else if ((priv->swq_en == 1) && ((pstat->tx_avarage < 4587520) || (pstat->rx_avarage < 4587520))) { //35Mbps
- priv->swq_en = 0;
- priv->swqen_keeptime = 0;
- }
- }
- else {
- priv->swq_en = 0;
- priv->swqen_keeptime = 0;
- }
- }
-#endif
-#endif
-
-#ifdef WIFI_WMM
-#ifdef LOW_TP_TXOP
- if ((!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2))
- && QOS_ENABLE) {
- if (switch_turbo || priv->pshare->rf_ft_var.low_tp_txop) {
- unsigned int thd_tp;
- unsigned char under_thd;
- unsigned int curr_tp;
-
- if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G))
- {
- // Determine the upper bound throughput threshold.
- if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G)) {
- if (priv->assoc_num && priv->assoc_num != priv->pshare->ht_sta_num)
- thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
- else
- thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_n;
- }
- else
- thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
-
- // Determine to close txop.
- curr_tp = (unsigned int)(priv->ext_stats.tx_avarage>>17) + (unsigned int)(priv->ext_stats.rx_avarage>>17);
- if (curr_tp <= thd_tp && curr_tp >= priv->pshare->rf_ft_var.low_tp_txop_thd_low)
- under_thd = 1;
- else
- under_thd = 0;
- }
- else
- {
- under_thd = 0;
- }
-
- if (switch_turbo)
- {
- priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
- priv->pshare->rf_ft_var.low_tp_txop_count = 0;
- }
- else if (priv->pshare->iot_mode_enable && (priv->pshare->rf_ft_var.low_tp_txop_close != under_thd)) {
- priv->pshare->rf_ft_var.low_tp_txop_count++;
- if (priv->pshare->rf_ft_var.low_tp_txop_close) {
- priv->pshare->rf_ft_var.low_tp_txop_count = priv->pshare->rf_ft_var.low_tp_txop_delay;
- }
- if (priv->pshare->rf_ft_var.low_tp_txop_count ==priv->pshare->rf_ft_var.low_tp_txop_delay)
-
- {
- priv->pshare->rf_ft_var.low_tp_txop_count = 0;
- priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
- switch_turbo++;
- }
- }
- else
- {
- priv->pshare->rf_ft_var.low_tp_txop_count = 0;
- }
- }
- }
-#endif
-
- if (switch_turbo)
- ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable );
-#endif
-}
-#endif
+//Remove Edca by Yuchen
#if( DM_ODM_SUPPORT_TYPE == ODM_WIN)
@@ -10962,7 +6275,7 @@ ODM_PSDMonitor(
{
if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE)
{
- if(pDM_Odm->bBtDisabled) //need to check upper layer connection
+ if(!pDM_Odm->bBtEnabled) //need to check upper layer connection
{
pDM_Odm->bPSDactive=FALSE;
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor, return for BT is disabled!!!\n"));
@@ -11002,189 +6315,7 @@ odm_PSDMonitorWorkItemCallback(
ODM_PSDMonitor(pDM_Odm);
}
-// <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
-VOID
-odm_RFEControl(
- IN PDM_ODM_T pDM_Odm,
- IN u8Byte RSSIVal
- )
-{
- PADAPTER Adapter = (PADAPTER)pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- static u1Byte TRSW_HighPwr = 0;
-
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
- RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
-
- if (pHalData->RFEType == 3) {
-
- pDM_Odm->RSSI_TRSW = RSSIVal;
-
- if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H)
- {
- TRSW_HighPwr = 1; // Switch to
- PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
- PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); // Set ANTSW=1/ANTSWB=0 for SW control
-
- }
- else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L)
- {
- TRSW_HighPwr = 0; // Switched back
- PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
- PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0); // Set ANTSW=1/ANTSWB=0 for SW control
-
- }
- }
-
-
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\n", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n",
- RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));
-}
-
-VOID
-ODM_MPT_DIG(
- IN PDM_ODM_T pDM_Odm
- )
-{
- pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
- PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
- u1Byte CurrentIGI = (u1Byte)pDM_DigTable->CurIGValue;
- u1Byte DIG_Upper = 0x40, DIG_Lower = 0x20, C50, E50;
- u8Byte RXOK_cal;
- u1Byte IGI_A = 0x20, IGI_B = 0x20;
-
-#if ODM_FIX_2G_DIG
- IGI_A = 0x22;
- IGI_B = 0x24;
-#endif
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
-
- odm_FalseAlarmCounterStatistics( pDM_Odm);
- pDM_Odm->LastNumQryPhyStatusAll = pDM_Odm->NumQryPhyStatusAll;
- pDM_Odm->NumQryPhyStatusAll = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
- RXOK_cal = pDM_Odm->NumQryPhyStatusAll - pDM_Odm->LastNumQryPhyStatusAll;
-
- if (RXOK_cal == 0)
- pDM_Odm->RxPWDBAve_final= 0;
- else
- pDM_Odm->RxPWDBAve_final= pDM_Odm->RxPWDBAve/RXOK_cal;
-
- pDM_Odm->RxPWDBAve = 0;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("pDM_Odm->RxPWDBAve_final = %d\n", pDM_Odm->RxPWDBAve_final));
-
- // <20130315, Kordan> Except Cameo, we should always trun on 2.4G/5G DIG.
- // (Cameo fixes the IGI of 2.4G, so only DIG on 5G. Asked by James.)
-#if ODM_FIX_2G_DIG
- if (*pDM_Odm->pBandType == BAND_ON_5G){ // for 5G
-#else
- if (1){ // for both 2G/5G
-#endif
- pDM_Odm->MPDIG_2G = FALSE;
- pDM_Odm->Times_2G = 0;
-
- if (RXOK_cal >= 70 && pDM_Odm->RxPWDBAve_final<= 30)
- {
- if (CurrentIGI > 0x24){
- ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, 0x24);
- ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, 0x24);
- }
- }
- else
- {
- if(pFalseAlmCnt->Cnt_all > 1000){
- CurrentIGI = CurrentIGI + 8;
- }
- else if(pFalseAlmCnt->Cnt_all > 200){
- CurrentIGI = CurrentIGI + 4;
- }
- else if (pFalseAlmCnt->Cnt_all > 50){
- CurrentIGI = CurrentIGI + 2;
- }
- else if (pFalseAlmCnt->Cnt_all < 2){
- CurrentIGI = CurrentIGI - 2;
- }
-
- if (CurrentIGI < DIG_Lower ){
- CurrentIGI = DIG_Lower;
- }
- else if(CurrentIGI > DIG_Upper){
- CurrentIGI = DIG_Upper;
- }
-
- pDM_DigTable->CurIGValue = CurrentIGI;
-
- ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, (u1Byte)CurrentIGI);
- ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, (u1Byte)CurrentIGI);
-
- C50 = ODM_Read1Byte( pDM_Odm, 0xc50);
- E50 = ODM_Read1Byte( pDM_Odm, 0xe50);
- //pDM_Odm->MPDIG_2G = FALSE;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("DIG = (%x, %x), Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n", C50, E50, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
- }
-
- }
- else
- { //2G
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("MPDIG_2G = %d,\n", pDM_Odm->MPDIG_2G));
-
- if(pDM_Odm->MPDIG_2G == FALSE){
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("===> Fix IGI\n"));
- ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, (u1Byte)IGI_A);
- ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, (u1Byte)IGI_B);
- }
- if (pDM_Odm->Times_2G == 2)
- pDM_Odm->MPDIG_2G = TRUE;
- pDM_Odm->Times_2G++;
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("pDM_Odm->RxPWDBAve_final = %d\n", pDM_Odm->RxPWDBAve_final));
-
- if (pDM_Odm->SupportICType == ODM_RTL8812)
- odm_RFEControl(pDM_Odm, pDM_Odm->RxPWDBAve_final);
-
- ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);
-
-}
-
-VOID
-odm_MPT_DIGCallback(
- PRT_TIMER pTimer
-)
-{
- PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
-
-
- #if DEV_BUS_TYPE==RT_PCI_INTERFACE
- #if USE_WORKITEM
- PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
- #else
- ODM_MPT_DIG(pDM_Odm);
- #endif
- #else
- PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
- #endif
-
-}
-
-VOID
-odm_MPT_DIGWorkItemCallback(
- IN PVOID pContext
- )
-{
- PADAPTER Adapter = (PADAPTER)pContext;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
-
- ODM_MPT_DIG(pDM_Odm);
-}
-
-
-
+//Remove by Yuchen (seperate to odm_DIG.c)
//cosa debug tool need to modify
@@ -11958,1449 +7089,7 @@ odm_PSD_RXHPWorkitemCallback(
#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-VOID
-odm_PathDiversityInit(
- IN PDM_ODM_T pDM_Odm
-)
-{
- if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
- return;
- }
-
-#if RTL8812A_SUPPORT
-
- if(pDM_Odm->SupportICType & ODM_RTL8812)
- ODM_PathDiversityInit_8812A(pDM_Odm);
-#endif
-}
-
-
-VOID
-odm_PathDiversity(
- IN PDM_ODM_T pDM_Odm
-)
-{
- if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
- {
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
- return;
- }
-
-#if RTL8812A_SUPPORT
-
- if(pDM_Odm->SupportICType & ODM_RTL8812)
- ODM_PathDiversity_8812A(pDM_Odm);
-#endif
-}
-
-
-//
-// 2011/12/02 MH Copy from MP oursrc for temporarily test.
-//
-#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
-VOID
-odm_OFDMTXPathDiversity_92C(
- IN PADAPTER Adapter)
-{
-// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
- PRT_WLAN_STA pEntry;
- u1Byte i, DefaultRespPath = 0;
- s4Byte MinRSSI = 0xFF;
- pPD_T pDM_PDTable = &Adapter->DM_PDTable;
- pDM_PDTable->OFDMTXPath = 0;
-
- //1 Default Port
- if(pMgntInfo->mAssoc)
- {
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port RSSI[0]=%d, RSSI[1]=%d\n",
- Adapter->RxStats.RxRSSIPercentage[0], Adapter->RxStats.RxRSSIPercentage[1]));
- if(Adapter->RxStats.RxRSSIPercentage[0] > Adapter->RxStats.RxRSSIPercentage[1])
- {
- pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & (~BIT0);
- MinRSSI = Adapter->RxStats.RxRSSIPercentage[1];
- DefaultRespPath = 0;
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-0\n"));
- }
- else
- {
- pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT0;
- MinRSSI = Adapter->RxStats.RxRSSIPercentage[0];
- DefaultRespPath = 1;
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-1\n"));
- }
- //RT_TRACE( COMP_SWAS, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath));
- }
- //1 Extension Port
- for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
- {
- if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
- pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
- else
- pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
-
- if(pEntry!=NULL)
- {
- if(pEntry->bAssociated)
- {
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d, RSSI_0=%d, RSSI_1=%d\n",
- pEntry->AssociatedMacId, pEntry->rssi_stat.RxRSSIPercentage[0], pEntry->rssi_stat.RxRSSIPercentage[1]));
-
- if(pEntry->rssi_stat.RxRSSIPercentage[0] > pEntry->rssi_stat.RxRSSIPercentage[1])
- {
- pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & ~(BIT(pEntry->AssociatedMacId));
- //pHalData->TXPath = pHalData->TXPath & ~(1<<(pEntry->AssociatedMacId));
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-0\n", pEntry->AssociatedMacId));
- if(pEntry->rssi_stat.RxRSSIPercentage[1] < MinRSSI)
- {
- MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[1];
- DefaultRespPath = 0;
- }
- }
- else
- {
- pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT(pEntry->AssociatedMacId);
- //pHalData->TXPath = pHalData->TXPath | (1 << (pEntry->AssociatedMacId));
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-1\n", pEntry->AssociatedMacId));
- if(pEntry->rssi_stat.RxRSSIPercentage[0] < MinRSSI)
- {
- MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[0];
- DefaultRespPath = 1;
- }
- }
- }
- }
- else
- {
- break;
- }
- }
-
- pDM_PDTable->OFDMDefaultRespPath = DefaultRespPath;
-}
-
-
-BOOLEAN
-odm_IsConnected_92C(
- IN PADAPTER Adapter
-)
-{
- PRT_WLAN_STA pEntry;
- PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
- u4Byte i;
- BOOLEAN bConnected=FALSE;
-
- if(pMgntInfo->mAssoc)
- {
- bConnected = TRUE;
- }
- else
- {
- for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
- {
- if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
- pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
- else
- pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
-
- if(pEntry!=NULL)
- {
- if(pEntry->bAssociated)
- {
- bConnected = TRUE;
- break;
- }
- }
- else
- {
- break;
- }
- }
- }
- return bConnected;
-}
-
-
-VOID
-odm_ResetPathDiversity_92C(
- IN PADAPTER Adapter
-)
-{
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- pPD_T pDM_PDTable = &Adapter->DM_PDTable;
- PRT_WLAN_STA pEntry;
- u4Byte i,j;
-
- pHalData->RSSI_test = FALSE;
- pDM_PDTable->CCK_Pkt_Cnt = 0;
- pDM_PDTable->OFDM_Pkt_Cnt = 0;
- pHalData->CCK_Pkt_Cnt =0;
- pHalData->OFDM_Pkt_Cnt =0;
-
- if(pDM_PDTable->CCKPathDivEnable == TRUE)
- PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x01); //RX path = PathAB
-
- for(i=0; i<2; i++)
- {
- pDM_PDTable->RSSI_CCK_Path_cnt[i]=0;
- pDM_PDTable->RSSI_CCK_Path[i] = 0;
- }
- for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
- {
- if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
- pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
- else
- pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
-
- if(pEntry!=NULL)
- {
- pEntry->rssi_stat.CCK_Pkt_Cnt = 0;
- pEntry->rssi_stat.OFDM_Pkt_Cnt = 0;
- for(j=0; j<2; j++)
- {
- pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] = 0;
- pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
- }
- }
- else
- break;
- }
-}
-
-
-VOID
-odm_CCKTXPathDiversity_92C(
- IN PADAPTER Adapter
-)
-{
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
- PRT_WLAN_STA pEntry;
- s4Byte MinRSSI = 0xFF;
- u1Byte i, DefaultRespPath = 0;
-// BOOLEAN bBModePathDiv = FALSE;
- pPD_T pDM_PDTable = &Adapter->DM_PDTable;
-
- //1 Default Port
- if(pMgntInfo->mAssoc)
- {
- if(pHalData->OFDM_Pkt_Cnt == 0)
- {
- for(i=0; i<2; i++)
- {
- if(pDM_PDTable->RSSI_CCK_Path_cnt[i] > 1) //Because the first packet is discarded
- pDM_PDTable->RSSI_CCK_Path[i] = pDM_PDTable->RSSI_CCK_Path[i] / (pDM_PDTable->RSSI_CCK_Path_cnt[i]-1);
- else
- pDM_PDTable->RSSI_CCK_Path[i] = 0;
- }
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path[0]=%d, pDM_PDTable->RSSI_CCK_Path[1]=%d\n",
- pDM_PDTable->RSSI_CCK_Path[0], pDM_PDTable->RSSI_CCK_Path[1]));
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path_cnt[0]=%d, pDM_PDTable->RSSI_CCK_Path_cnt[1]=%d\n",
- pDM_PDTable->RSSI_CCK_Path_cnt[0], pDM_PDTable->RSSI_CCK_Path_cnt[1]));
-
- if(pDM_PDTable->RSSI_CCK_Path[0] > pDM_PDTable->RSSI_CCK_Path[1])
- {
- pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
- MinRSSI = pDM_PDTable->RSSI_CCK_Path[1];
- DefaultRespPath = 0;
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
- }
- else if(pDM_PDTable->RSSI_CCK_Path[0] < pDM_PDTable->RSSI_CCK_Path[1])
- {
- pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT0;
- MinRSSI = pDM_PDTable->RSSI_CCK_Path[0];
- DefaultRespPath = 1;
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-1\n"));
- }
- else
- {
- if((pDM_PDTable->RSSI_CCK_Path[0] != 0) && (pDM_PDTable->RSSI_CCK_Path[0] < MinRSSI))
- {
- pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
- MinRSSI = pDM_PDTable->RSSI_CCK_Path[1];
- DefaultRespPath = 0;
- }
- else
- {
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port unchange CCK Path\n"));
- }
- }
- }
- else //Follow OFDM decision
- {
- pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~BIT0)) | (pDM_PDTable->OFDMTXPath &BIT0);
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, Default port Select CCK Path-%d\n",
- pDM_PDTable->CCKTXPath &BIT0));
- }
- }
- //1 Extension Port
- for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
- {
- if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
- pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
- else
- pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
-
- if(pEntry!=NULL)
- {
- if(pEntry->bAssociated)
- {
- if(pEntry->rssi_stat.OFDM_Pkt_Cnt == 0)
- {
- u1Byte j=0;
- for(j=0; j<2; j++)
- {
- if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] > 1)
- pEntry->rssi_stat.RSSI_CCK_Path[j] = pEntry->rssi_stat.RSSI_CCK_Path[j] / (pEntry->rssi_stat.RSSI_CCK_Path_cnt[j]-1);
- else
- pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
- }
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d, RSSI_CCK0=%d, RSSI_CCK1=%d\n",
- pEntry->AssociatedMacId, pEntry->rssi_stat.RSSI_CCK_Path[0], pEntry->rssi_stat.RSSI_CCK_Path[1]));
-
- if(pEntry->rssi_stat.RSSI_CCK_Path[0] >pEntry->rssi_stat.RSSI_CCK_Path[1])
- {
- pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
- if(pEntry->rssi_stat.RSSI_CCK_Path[1] < MinRSSI)
- {
- MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
- DefaultRespPath = 0;
- }
- }
- else if(pEntry->rssi_stat.RSSI_CCK_Path[0] <pEntry->rssi_stat.RSSI_CCK_Path[1])
- {
- pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT(pEntry->AssociatedMacId);
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-1\n", pEntry->AssociatedMacId));
- if(pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI)
- {
- MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[0];
- DefaultRespPath = 1;
- }
- }
- else
- {
- if((pEntry->rssi_stat.RSSI_CCK_Path[0] != 0) && (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI))
- {
- pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
- MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
- DefaultRespPath = 0;
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
- }
- else
- {
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d unchange CCK Path\n", pEntry->AssociatedMacId));
- }
- }
- }
- else //Follow OFDM decision
- {
- pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~(BIT(pEntry->AssociatedMacId)))) | (pDM_PDTable->OFDMTXPath & BIT(pEntry->AssociatedMacId));
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, MACID=%d Select CCK Path-%d\n",
- pEntry->AssociatedMacId, (pDM_PDTable->CCKTXPath & BIT(pEntry->AssociatedMacId))>>(pEntry->AssociatedMacId)));
- }
- }
- }
- else
- {
- break;
- }
- }
-
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C:MinRSSI=%d\n",MinRSSI));
-
- if(MinRSSI == 0xFF)
- DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
-
- pDM_PDTable->CCKDefaultRespPath = DefaultRespPath;
-}
-
-
-
-VOID
-odm_PathDiversityAfterLink_92C(
- IN PADAPTER Adapter
-)
-{
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
- pPD_T pDM_PDTable = &Adapter->DM_PDTable;
- u1Byte DefaultRespPath=0;
-
- if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg != 1) || (pHalData->eRFPowerState == eRfOff))
- {
- if(pHalData->PathDivCfg == 0)
- {
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("No ODM_TXPathDiversity()\n"));
- }
- else
- {
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("2T ODM_TXPathDiversity()\n"));
- }
- return;
- }
- if(!odm_IsConnected_92C(Adapter))
- {
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity(): No Connections\n"));
- return;
- }
-
-
- if(pDM_PDTable->TrainingState == 0)
- {
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() ==>\n"));
- odm_OFDMTXPathDiversity_92C(Adapter);
-
- if((pDM_PDTable->CCKPathDivEnable == TRUE) && (pDM_PDTable->OFDM_Pkt_Cnt < 100))
- {
- //RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=0\n"));
-
- if(pDM_PDTable->CCK_Pkt_Cnt > 300)
- pDM_PDTable->Timer = 20;
- else if(pDM_PDTable->CCK_Pkt_Cnt > 100)
- pDM_PDTable->Timer = 60;
- else
- pDM_PDTable->Timer = 250;
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: timer=%d\n",pDM_PDTable->Timer));
-
- PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x00); // RX path = PathA
- pDM_PDTable->TrainingState = 1;
- pHalData->RSSI_test = TRUE;
- ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
- }
- else
- {
- pDM_PDTable->CCKTXPath = pDM_PDTable->OFDMTXPath;
- DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: Skip odm_CCKTXPathDiversity_92C, DefaultRespPath is OFDM\n"));
- odm_SetRespPath_92C(Adapter, DefaultRespPath);
- odm_ResetPathDiversity_92C(Adapter);
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
- }
- }
- else if(pDM_PDTable->TrainingState == 1)
- {
- //RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=1\n"));
- PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x05); // RX path = PathB
- pDM_PDTable->TrainingState = 2;
- ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
- }
- else
- {
- //RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n"));
- pDM_PDTable->TrainingState = 0;
- odm_CCKTXPathDiversity_92C(Adapter);
- if(pDM_PDTable->OFDM_Pkt_Cnt != 0)
- {
- DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is OFDM\n"));
- }
- else
- {
- DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is CCK\n"));
- }
- odm_SetRespPath_92C(Adapter, DefaultRespPath);
- odm_ResetPathDiversity_92C(Adapter);
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
- }
-
-}
-
-
-
-VOID
-odm_CCKTXPathDiversityCallback(
- PRT_TIMER pTimer
-)
-{
-#if USE_WORKITEM
- PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
-#else
- PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
-#endif
-
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-#if USE_WORKITEM
- PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
-#else
- odm_PathDiversityAfterLink_92C(Adapter);
-#endif
-#else
- PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
-#endif
-
-}
-
-
-VOID
-odm_CCKTXPathDiversityWorkItemCallback(
- IN PVOID pContext
- )
-{
- PADAPTER Adapter = (PADAPTER)pContext;
-
- odm_CCKTXPathDiversity_92C(Adapter);
-}
-
-
-VOID
-ODM_CCKPathDiversityChkPerPktRssi(
- PADAPTER Adapter,
- BOOLEAN bIsDefPort,
- BOOLEAN bMatchBSSID,
- PRT_WLAN_STA pEntry,
- PRT_RFD pRfd,
- pu1Byte pDesc
- )
-{
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- BOOLEAN bCount = FALSE;
- pPD_T pDM_PDTable = &Adapter->DM_PDTable;
- //BOOLEAN isCCKrate = RX_HAL_IS_CCK_RATE_92C(pDesc);
-#if DEV_BUS_TYPE != RT_SDIO_INTERFACE
- BOOLEAN isCCKrate = RX_HAL_IS_CCK_RATE(Adapter, pDesc);
-#else //below code would be removed if we have verified SDIO
- BOOLEAN isCCKrate = IS_HARDWARE_TYPE_8188E(Adapter) ? RX_HAL_IS_CCK_RATE_88E(pDesc) : RX_HAL_IS_CCK_RATE_92C(pDesc);
-#endif
-
- if((pHalData->PathDivCfg != 1) || (pHalData->RSSI_test == FALSE))
- return;
-
- if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
- bCount = TRUE;
- else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
- bCount = TRUE;
-
- if(bCount && isCCKrate)
- {
- if(pDM_PDTable->TrainingState == 1 )
- {
- if(pEntry)
- {
- if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[0] != 0)
- pEntry->rssi_stat.RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
- pEntry->rssi_stat.RSSI_CCK_Path_cnt[0]++;
- }
- else
- {
- if(pDM_PDTable->RSSI_CCK_Path_cnt[0] != 0)
- pDM_PDTable->RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
- pDM_PDTable->RSSI_CCK_Path_cnt[0]++;
- }
- }
- else if(pDM_PDTable->TrainingState == 2 )
- {
- if(pEntry)
- {
- if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[1] != 0)
- pEntry->rssi_stat.RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
- pEntry->rssi_stat.RSSI_CCK_Path_cnt[1]++;
- }
- else
- {
- if(pDM_PDTable->RSSI_CCK_Path_cnt[1] != 0)
- pDM_PDTable->RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
- pDM_PDTable->RSSI_CCK_Path_cnt[1]++;
- }
- }
- }
-}
-
-
-BOOLEAN
-ODM_PathDiversityBeforeLink92C(
- //IN PADAPTER Adapter
- IN PDM_ODM_T pDM_Odm
- )
-{
-#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE* pHalData = NULL;
- PMGNT_INFO pMgntInfo = NULL;
- //pSWAT_T pDM_SWAT_Table = &Adapter->DM_SWAT_Table;
- pPD_T pDM_PDTable = NULL;
-
- s1Byte Score = 0;
- PRT_WLAN_BSS pTmpBssDesc;
- PRT_WLAN_BSS pTestBssDesc;
-
- u1Byte target_chnl = 0;
- u1Byte index;
-
- if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413
- { // The ODM structure is not initialized.
- return FALSE;
- }
- pHalData = GET_HAL_DATA(Adapter);
- pMgntInfo = &Adapter->MgntInfo;
- pDM_PDTable = &Adapter->DM_PDTable;
-
- // Condition that does not need to use path diversity.
- if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest )
- {
- RT_TRACE(COMP_SWAS, DBG_LOUD,
- ("ODM_PathDiversityBeforeLink92C(): No PathDiv Mechanism before link.\n"));
- return FALSE;
- }
-
- // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
- PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
- if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
- {
- PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
-
- RT_TRACE(COMP_SWAS, DBG_LOUD,
- ("ODM_PathDiversityBeforeLink92C(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
- pMgntInfo->RFChangeInProgress,
- pHalData->eRFPowerState));
-
- //pDM_SWAT_Table->SWAS_NoLink_State = 0;
- pDM_PDTable->PathDiv_NoLink_State = 0;
-
- return FALSE;
- }
- else
- {
- PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
- }
-
- //1 Run AntDiv mechanism "Before Link" part.
- //if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
- if(pDM_PDTable->PathDiv_NoLink_State == 0)
- {
- //1 Prepare to do Scan again to check current antenna state.
-
- // Set check state to next step.
- //pDM_SWAT_Table->SWAS_NoLink_State = 1;
- pDM_PDTable->PathDiv_NoLink_State = 1;
-
- // Copy Current Scan list.
- Adapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc;
- PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
-
- // Switch Antenna to another one.
- if(pDM_PDTable->DefaultRespPath == 0)
- {
- PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x05); // TRX path = PathB
- odm_SetRespPath_92C(Adapter, 1);
- pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
- pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
- }
- else
- {
- PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x00); // TRX path = PathA
- odm_SetRespPath_92C(Adapter, 0);
- pDM_PDTable->OFDMTXPath = 0x0;
- pDM_PDTable->CCKTXPath = 0x0;
- }
-#if 0
-
- pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
- pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
-
- RT_TRACE(COMP_SWAS, DBG_LOUD,
- ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"));
- //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
- pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
- PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
-#endif
-
- // Go back to scan function again.
- RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Scan one more time\n"));
- pMgntInfo->ScanStep=0;
- target_chnl = odm_SwAntDivSelectScanChnl(Adapter);
- odm_SwAntDivConstructScanChnl(Adapter, target_chnl);
- PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
-
- return TRUE;
- }
- else
- {
- //1 ScanComple() is called after antenna swiched.
- //1 Check scan result and determine which antenna is going
- //1 to be used.
-
- for(index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)
- {
- pTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]);
- pTestBssDesc = &(pMgntInfo->bssDesc[index]);
-
- if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
- {
- RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\n"));
- continue;
- }
-
- if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
- {
- RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\n"));
- RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
- RT_TRACE(COMP_SWAS, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
-
- Score++;
- PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
- }
- else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
- {
- RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\n"));
- RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
- RT_TRACE(COMP_SWAS, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
- Score--;
- }
-
- }
-
- if(pMgntInfo->NumBssDesc!=0 && Score<=0)
- {
- RT_TRACE(COMP_SWAS, DBG_LOUD,
- ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
-
- //pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
- }
- else
- {
- RT_TRACE(COMP_SWAS, DBG_LOUD,
- ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
-
- if(pDM_PDTable->DefaultRespPath == 0)
- {
- pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
- pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
- odm_SetRespPath_92C(Adapter, 1);
- }
- else
- {
- pDM_PDTable->OFDMTXPath = 0x0;
- pDM_PDTable->CCKTXPath = 0x0;
- odm_SetRespPath_92C(Adapter, 0);
- }
- PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x01); // RX path = PathAB
-
- //pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
-
- //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
- //pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
- //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
- }
-
- // Check state reset to default and wait for next time.
- //pDM_SWAT_Table->SWAS_NoLink_State = 0;
- pDM_PDTable->PathDiv_NoLink_State = 0;
-
- return FALSE;
- }
-#else
- return FALSE;
-#endif
-
-}
-
-
-//Neil Chen---2011--06--22
-//----92D Path Diversity----//
-//#ifdef PathDiv92D
-//==================================
-//3 Path Diversity
-//==================================
-//
-// 20100514 Luke/Joseph:
-// Add new function for antenna diversity after link.
-// This is the main function of antenna diversity after link.
-// This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
-// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
-// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
-// After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
-// listened on the air with the RSSI of original antenna.
-// It chooses the antenna with better RSSI.
-// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting
-// penalty to get next try.
-//
-//
-// 20100503 Joseph:
-// Add new function SwAntDivCheck8192C().
-// This is the main function of Antenna diversity function before link.
-// Mainly, it just retains last scan result and scan again.
-// After that, it compares the scan result to see which one gets better RSSI.
-// It selects antenna with better receiving power and returns better scan result.
-//
-
-
-//
-// 20100514 Luke/Joseph:
-// This function is used to gather the RSSI information for antenna testing.
-// It selects the RSSI of the peer STA that we want to know.
-//
-VOID
-ODM_PathDivChkPerPktRssi(
- PADAPTER Adapter,
- BOOLEAN bIsDefPort,
- BOOLEAN bMatchBSSID,
- PRT_WLAN_STA pEntry,
- PRT_RFD pRfd
- )
-{
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- BOOLEAN bCount = FALSE;
- PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
- pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
- if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
- bCount = TRUE;
- else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
- bCount = TRUE;
-
- if(bCount)
- {
- //1 RSSI for SW Antenna Switch
- if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
- {
- pHalData->RSSI_sum_A += pRfd->Status.RxPWDBAll;
- pHalData->RSSI_cnt_A++;
- }
- else
- {
- pHalData->RSSI_sum_B += pRfd->Status.RxPWDBAll;
- pHalData->RSSI_cnt_B++;
-
- }
- }
-}
-
-
-
-//
-// 20100514 Luke/Joseph:
-// Add new function to reset antenna diversity state after link.
-//
-VOID
-ODM_PathDivRestAfterLink(
- IN PDM_ODM_T pDM_Odm
- )
-{
- PADAPTER Adapter=pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
-
- pHalData->RSSI_cnt_A = 0;
- pHalData->RSSI_cnt_B = 0;
- pHalData->RSSI_test = FALSE;
- pDM_SWAT_Table->try_flag = 0x0; // NOT 0xff
- pDM_SWAT_Table->RSSI_Trying = 0;
- pDM_SWAT_Table->SelectAntennaMap=0xAA;
- pDM_SWAT_Table->CurAntenna = MAIN_ANT;
-}
-
-
-//
-// 20100514 Luke/Joseph:
-// Callback function for 500ms antenna test trying.
-//
-VOID
-odm_PathDivChkAntSwitchCallback(
- PRT_TIMER pTimer
-)
-{
- PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
-
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
-
-#if USE_WORKITEM
- PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
-#else
- odm_PathDivChkAntSwitch(pDM_Odm);
-#endif
-#else
- PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
-#endif
-
-//odm_SwAntDivChkAntSwitch(Adapter, SWAW_STEP_DETERMINE);
-
-}
-
-
-VOID
-odm_PathDivChkAntSwitchWorkitemCallback(
- IN PVOID pContext
- )
-{
- PADAPTER pAdapter = (PADAPTER)pContext;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
- PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
-
- odm_PathDivChkAntSwitch(pDM_Odm);
-}
-
-
- //MAC0_ACCESS_PHY1
-
-// 2011-06-22 Neil Chen & Gary Hsin
-// Refer to Jr.Luke's SW ANT DIV
-// 92D Path Diversity Main function
-// refer to 88C software antenna diversity
-//
-VOID
-odm_PathDivChkAntSwitch(
- PDM_ODM_T pDM_Odm
- //PADAPTER Adapter,
- //u1Byte Step
-)
-{
- PADAPTER Adapter = pDM_Odm->Adapter;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
-
-
- pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
- s4Byte curRSSI=100, RSSI_A, RSSI_B;
- u1Byte nextAntenna=AUX_ANT;
- static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
- u8Byte curTxOkCnt, curRxOkCnt;
- static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
- u8Byte CurByteCnt=0, PreByteCnt=0;
- static u1Byte TrafficLoad = TRAFFIC_LOW;
- u1Byte Score_A=0, Score_B=0;
- u1Byte i=0x0;
- // Neil Chen
- static u1Byte pathdiv_para=0x0;
- static u1Byte switchfirsttime=0x00;
- // u1Byte regB33 = (u1Byte) PHY_QueryBBReg(Adapter, 0xB30,BIT27);
- u1Byte regB33 = (u1Byte)ODM_GetBBReg(pDM_Odm, PATHDIV_REG, BIT27);
-
-
- //u1Byte reg637 =0x0;
- static u1Byte fw_value=0x0;
- //u8Byte curTxOkCnt_tmp, curRxOkCnt_tmp;
- PADAPTER BuddyAdapter = Adapter->BuddyAdapter; // another adapter MAC
- // Path Diversity //Neil Chen--2011--06--22
-
- //u1Byte PathDiv_Trigger = (u1Byte) PHY_QueryBBReg(Adapter, 0xBA0,BIT31);
- u1Byte PathDiv_Trigger = (u1Byte) ODM_GetBBReg(pDM_Odm, PATHDIV_TRI,BIT31);
- u1Byte PathDiv_Enable = pHalData->bPathDiv_Enable;
-
-
- //DbgPrint("Path Div PG Value:%x \n",PathDiv_Enable);
- if((BuddyAdapter==NULL)||(!PathDiv_Enable)||(PathDiv_Trigger)||(pHalData->CurrentBandType == BAND_ON_2_4G))
- {
- return;
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD,("===================>odm_PathDivChkAntSwitch()\n"));
-
- // The first time to switch path excluding 2nd, 3rd, ....etc....
- if(switchfirsttime==0)
- {
- if(regB33==0)
- {
- pDM_SWAT_Table->CurAntenna = MAIN_ANT; // Default MAC0_5G-->Path A (current antenna)
- }
- }
-
- // Condition that does not need to use antenna diversity.
- if(pDM_Odm->SupportICType != ODM_RTL8192D)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDiversityMechanims(): No PathDiv Mechanism.\n"));
- return;
- }
-
- // Radio off: Status reset to default and return.
- if(pHalData->eRFPowerState==eRfOff)
- {
- //ODM_SwAntDivRestAfterLink(Adapter);
- return;
- }
-
- /*
- // Handling step mismatch condition.
- // Peak step is not finished at last time. Recover the variable and check again.
- if( Step != pDM_SWAT_Table->try_flag )
- {
- ODM_SwAntDivRestAfterLink(Adapter);
- } */
-
- if(pDM_SWAT_Table->try_flag == 0xff)
- {
- // Select RSSI checking target
- if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
- {
- // Target: Infrastructure mode AP.
- pHalData->RSSI_target = NULL;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDivMechanism(): RSSI_target is DEF AP!\n"));
- }
- else
- {
- u1Byte index = 0;
- PRT_WLAN_STA pEntry = NULL;
- PADAPTER pTargetAdapter = NULL;
-
- if( pMgntInfo->mIbss || ACTING_AS_AP(Adapter) )
- {
- // Target: AP/IBSS peer.
- pTargetAdapter = Adapter;
- }
- else if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
- {
- // Target: VWIFI peer.
- pTargetAdapter = GetFirstExtAdapter(Adapter);
- }
-
- if(pTargetAdapter != NULL)
- {
- for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
- {
- pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
- if(pEntry != NULL)
- {
- if(pEntry->bAssociated)
- break;
- }
- }
- }
-
- if(pEntry == NULL)
- {
- ODM_PathDivRestAfterLink(pDM_Odm);
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
- return;
- }
- else
- {
- pHalData->RSSI_target = pEntry;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
- }
- }
-
- pHalData->RSSI_cnt_A = 0;
- pHalData->RSSI_cnt_B = 0;
- pDM_SWAT_Table->try_flag = 0;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
- return;
- }
- else
- {
- // 1st step
- curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
- curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
- lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
- lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
-
- if(pDM_SWAT_Table->try_flag == 1) // Training State
- {
- if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
- {
- TXByteCnt_A += curTxOkCnt;
- RXByteCnt_A += curRxOkCnt;
- }
- else
- {
- TXByteCnt_B += curTxOkCnt;
- RXByteCnt_B += curRxOkCnt;
- }
-
- nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
- pDM_SWAT_Table->RSSI_Trying--;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
- if(pDM_SWAT_Table->RSSI_Trying == 0)
- {
- CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_A+RXByteCnt_A) : (TXByteCnt_B+RXByteCnt_B);
- PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_B+RXByteCnt_B) : (TXByteCnt_A+RXByteCnt_A);
-
- if(TrafficLoad == TRAFFIC_HIGH)
- {
- //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
- PreByteCnt =PreByteCnt*9;
- }
- else if(TrafficLoad == TRAFFIC_LOW)
- {
- //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
- PreByteCnt =PreByteCnt*2;
- }
- if(pHalData->RSSI_cnt_A > 0)
- RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
- else
- RSSI_A = 0;
- if(pHalData->RSSI_cnt_B > 0)
- RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
- else
- RSSI_B = 0;
- curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
- pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n",
- (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
- RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
- }
-
- }
- else // try_flag=0
- {
-
- if(pHalData->RSSI_cnt_A > 0)
- RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
- else
- RSSI_A = 0;
- if(pHalData->RSSI_cnt_B > 0)
- RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
- else
- RSSI_B = 0;
- curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
- pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n",
- (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
- RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
- //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
- //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
- }
-
- //1 Trying State
- if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
- {
-
- if(pDM_SWAT_Table->TestMode == TP_MODE)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = TP_MODE"));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:CurByteCnt = %"i64fmt"d,", CurByteCnt));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:PreByteCnt = %"i64fmt"d\n",PreByteCnt));
- if(CurByteCnt < PreByteCnt)
- {
- if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
- pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
- else
- pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
- }
- else
- {
- if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
- pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
- else
- pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
- }
- for (i= 0; i<8; i++)
- {
- if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
- Score_A++;
- else
- Score_B++;
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Score_A=%d, Score_B=%d\n", Score_A, Score_B));
-
- if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
- {
- nextAntenna = (Score_A >= Score_B)?MAIN_ANT:AUX_ANT;
- }
- else
- {
- nextAntenna = (Score_B >= Score_A)?AUX_ANT:MAIN_ANT;
- }
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: nextAntenna=%s\n",(nextAntenna==MAIN_ANT)?"MAIN":"AUX"));
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: preAntenna= %s, curAntenna= %s \n",
- (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
-
- if(nextAntenna != pDM_SWAT_Table->CurAntenna)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Switch back to another antenna"));
- }
- else
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: current anntena is good\n"));
- }
- }
-
-
- if(pDM_SWAT_Table->TestMode == RSSI_MODE)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = RSSI_MODE"));
- pDM_SWAT_Table->SelectAntennaMap=0xAA;
- if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
- {
- //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: Switch back to another antenna"));
- nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)?AUX_ANT : MAIN_ANT;
- }
- else // current anntena is good
- {
- nextAntenna =pDM_SWAT_Table->CurAntenna;
- //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: current anntena is good\n"));
- }
- }
-
- pDM_SWAT_Table->try_flag = 0;
- pHalData->RSSI_test = FALSE;
- pHalData->RSSI_sum_A = 0;
- pHalData->RSSI_cnt_A = 0;
- pHalData->RSSI_sum_B = 0;
- pHalData->RSSI_cnt_B = 0;
- TXByteCnt_A = 0;
- TXByteCnt_B = 0;
- RXByteCnt_A = 0;
- RXByteCnt_B = 0;
-
- }
-
- //1 Normal State
- else if(pDM_SWAT_Table->try_flag == 0)
- {
- if(TrafficLoad == TRAFFIC_HIGH)
- {
- if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
- TrafficLoad = TRAFFIC_HIGH;
- else
- TrafficLoad = TRAFFIC_LOW;
- }
- else if(TrafficLoad == TRAFFIC_LOW)
- {
- if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
- TrafficLoad = TRAFFIC_HIGH;
- else
- TrafficLoad = TRAFFIC_LOW;
- }
- if(TrafficLoad == TRAFFIC_HIGH)
- pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
- //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
-
- //Prepare To Try Antenna
- nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
- pDM_SWAT_Table->try_flag = 1;
- pHalData->RSSI_test = TRUE;
- if((curRxOkCnt+curTxOkCnt) > 1000)
- {
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
- pDM_SWAT_Table->RSSI_Trying = 4;
-#else
- pDM_SWAT_Table->RSSI_Trying = 2;
-#endif
- pDM_SWAT_Table->TestMode = TP_MODE;
- }
- else
- {
- pDM_SWAT_Table->RSSI_Trying = 2;
- pDM_SWAT_Table->TestMode = RSSI_MODE;
-
- }
-
- //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
- pHalData->RSSI_sum_A = 0;
- pHalData->RSSI_cnt_A = 0;
- pHalData->RSSI_sum_B = 0;
- pHalData->RSSI_cnt_B = 0;
- } // end of try_flag=0
- }
-
- //1 4.Change TRX antenna
- if(nextAntenna != pDM_SWAT_Table->CurAntenna)
- {
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Change TX Antenna!\n "));
- //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna); for 88C
- if(nextAntenna==MAIN_ANT)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH A\n "));
- pathdiv_para = 0x02; //02 to switchback to RF path A
- fw_value = 0x03;
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
- odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
-#else
- ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
-#endif
- }
- else if(nextAntenna==AUX_ANT)
- {
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH B\n "));
- if(switchfirsttime==0) // First Time To Enter Path Diversity
- {
- switchfirsttime=0x01;
- pathdiv_para = 0x00;
- fw_value=0x00; // to backup RF Path A Releated Registers
-
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
- odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
-#else
- ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
- //for(u1Byte n=0; n<80,n++)
- //{
- //delay_us(500);
- ODM_delay_ms(500);
- odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
-
- fw_value=0x01; // to backup RF Path A Releated Registers
- ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
-#endif
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: FIRST TIME To DO PATH SWITCH!\n "));
- }
- else
- {
- pathdiv_para = 0x01;
- fw_value = 0x02;
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
- odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
-#else
- ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
-#endif
- }
- }
- // odm_PathDiversity_8192D(Adapter, pathdiv_para);
- }
-
- //1 5.Reset Statistics
- pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
- pDM_SWAT_Table->CurAntenna = nextAntenna;
- pDM_SWAT_Table->PreRSSI = curRSSI;
-
- //1 6.Set next timer
-
- if(pDM_SWAT_Table->RSSI_Trying == 0)
- return;
-
- if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
- {
- if(pDM_SWAT_Table->TestMode == TP_MODE)
- {
- if(TrafficLoad == TRAFFIC_HIGH)
- {
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
- ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 10 ); //ms
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 10 ms\n"));
-#else
- ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 20 ); //ms
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 20 ms\n"));
-#endif
- }
- else if(TrafficLoad == TRAFFIC_LOW)
- {
- ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 50 ); //ms
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 50 ms\n"));
- }
- }
- else // TestMode == RSSI_MODE
- {
- ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 500 ms\n"));
- }
- }
- else
- {
- if(pDM_SWAT_Table->TestMode == TP_MODE)
- {
- if(TrafficLoad == TRAFFIC_HIGH)
-
-#if DEV_BUS_TYPE==RT_PCI_INTERFACE
- ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 90 ); //ms
- //ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 90 ms\n"));
-#else
- ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 180); //ms
-#endif
- else if(TrafficLoad == TRAFFIC_LOW)
- ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 100 ); //ms
- }
- else
- ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
- }
-}
-
-//==================================================
-//3 PathDiv End
-//==================================================
-
-VOID
-odm_SetRespPath_92C(
- IN PADAPTER Adapter,
- IN u1Byte DefaultRespPath
- )
-{
- pPD_T pDM_PDTable = &Adapter->DM_PDTable;
-
- RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: Select Response Path=%d\n",DefaultRespPath));
- if(DefaultRespPath != pDM_PDTable->DefaultRespPath)
- {
- if(DefaultRespPath == 0)
- {
- PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x15);
- }
- else
- {
- PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x2A);
- }
- }
- pDM_PDTable->DefaultRespPath = DefaultRespPath;
-}
-
-
-VOID
-ODM_FillTXPathInTXDESC(
- IN PADAPTER Adapter,
- IN PRT_TCB pTcb,
- IN pu1Byte pDesc
-)
-{
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
- u4Byte TXPath;
- pPD_T pDM_PDTable = &Adapter->DM_PDTable;
-
- //2011.09.05 Add by Luke Lee for path diversity
- if(pHalData->PathDivCfg == 1)
- {
- TXPath = (pDM_PDTable->OFDMTXPath >> pTcb->macId) & BIT0;
- //RT_TRACE( COMP_SWAS, DBG_LOUD, ("Fill TXDESC: macID=%d, TXPath=%d\n", pTcb->macId, TXPath));
- //SET_TX_DESC_TX_ANT_CCK(pDesc,TXPath);
- if(TXPath == 0)
- {
- SET_TX_DESC_TX_ANTL_92C(pDesc,1);
- SET_TX_DESC_TX_ANT_HT_92C(pDesc,1);
- }
- else
- {
- SET_TX_DESC_TX_ANTL_92C(pDesc,2);
- SET_TX_DESC_TX_ANT_HT_92C(pDesc,2);
- }
- TXPath = (pDM_PDTable->CCKTXPath >> pTcb->macId) & BIT0;
- if(TXPath == 0)
- {
- SET_TX_DESC_TX_ANT_CCK_92C(pDesc,1);
- }
- else
- {
- SET_TX_DESC_TX_ANT_CCK_92C(pDesc,2);
- }
- }
-}
-
-//Only for MP //Neil Chen--2012--0502--
-VOID
-odm_PathDivInit_92D(
-IN PDM_ODM_T pDM_Odm)
-{
- pPATHDIV_PARA pathIQK = &pDM_Odm->pathIQK;
-
- pathIQK->org_2g_RegC14=0x0;
- pathIQK->org_2g_RegC4C=0x0;
- pathIQK->org_2g_RegC80=0x0;
- pathIQK->org_2g_RegC94=0x0;
- pathIQK->org_2g_RegCA0=0x0;
- pathIQK->org_5g_RegC14=0x0;
- pathIQK->org_5g_RegCA0=0x0;
- pathIQK->org_5g_RegE30=0x0;
- pathIQK->swt_2g_RegC14=0x0;
- pathIQK->swt_2g_RegC4C=0x0;
- pathIQK->swt_2g_RegC80=0x0;
- pathIQK->swt_2g_RegC94=0x0;
- pathIQK->swt_2g_RegCA0=0x0;
- pathIQK->swt_5g_RegC14=0x0;
- pathIQK->swt_5g_RegCA0=0x0;
- pathIQK->swt_5g_RegE30=0x0;
-
-}
-
-#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+//Remove PathDiversity related function to odm_PathDiv.c
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))
@@ -13625,7 +7314,7 @@ ODM_SingleDualAntennaDetection(
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0xFFFFF, 0x50008);
//IQK Single tone start
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
@@ -13679,7 +7368,7 @@ ODM_SingleDualAntennaDetection(
}
//Close IQK Single Tone function
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
//1 Return to antanna A
if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
diff --git a/rtl8723BS/hal/OUTSRC/odm.h b/rtl8723BS/hal/OUTSRC/odm.h
index 5b19860..345d675 100755
--- a/rtl8723BS/hal/OUTSRC/odm.h
+++ b/rtl8723BS/hal/OUTSRC/odm.h
@@ -22,6 +22,15 @@
#ifndef __HALDMOUTSRC_H__
#define __HALDMOUTSRC_H__
+
+#include "odm_EdcaTurboCheck.h"
+#include "odm_DIG.h"
+#include "odm_PathDiv.h"
+#include "odm_DynamicBBPowerSaving.h"
+#include "odm_DynamicTxPower.h"
+#include "odm_CfoTracking.h"
+#include "odm_NoiseMonitor.h"
+
//============================================================
// Definition
//============================================================
@@ -110,14 +119,6 @@
#define ANTTESTA 0x01 //Ant A will be Testing
#define ANTTESTB 0x02 //Ant B will be testing
-// LPS define
-#define DM_DIG_FA_TH0_LPS 4 //-> 4 in lps
-#define DM_DIG_FA_TH1_LPS 15 //-> 15 lps
-#define DM_DIG_FA_TH2_LPS 30 //-> 30 lps
-#define RSSI_OFFSET_DIG 0x05;
-
-
-
//for 8723A Ant Definition--2012--06--07 due to different IC may be different ANT define
#define MAIN_ANT 1 //Ant A or Ant Main
#define AUX_ANT 2 //AntB or Ant Aux
@@ -161,82 +162,11 @@ typedef struct _WLAN_STA{
#endif
-typedef struct _Dynamic_Initial_Gain_Threshold_
-{
- u1Byte Dig_Enable_Flag;
- u1Byte Dig_Ext_Port_Stage;
-
- int RssiLowThresh;
- int RssiHighThresh;
-
- u4Byte FALowThresh;
- u4Byte FAHighThresh;
-
- u1Byte CurSTAConnectState;
- u1Byte PreSTAConnectState;
- u1Byte CurMultiSTAConnectState;
-
- u1Byte PreIGValue;
- u1Byte CurIGValue;
- u1Byte BT30_CurIGI;
- u1Byte BackupIGValue;
-
- s1Byte BackoffVal;
- s1Byte BackoffVal_range_max;
- s1Byte BackoffVal_range_min;
- u1Byte rx_gain_range_max;
- u1Byte rx_gain_range_min;
- u1Byte Rssi_val_min;
-
- u1Byte PreCCK_CCAThres;
- u1Byte CurCCK_CCAThres;
- u1Byte PreCCKPDState;
- u1Byte CurCCKPDState;
-
- u1Byte LargeFAHit;
- u1Byte ForbiddenIGI;
- u4Byte Recover_cnt;
-
- u1Byte DIG_Dynamic_MIN_0;
- u1Byte DIG_Dynamic_MIN_1;
- BOOLEAN bMediaConnect_0;
- BOOLEAN bMediaConnect_1;
-
- u4Byte AntDiv_RSSI_max;
- u4Byte RSSI_max;
-}DIG_T,*pDIG_T;
-
-typedef struct _Dynamic_Power_Saving_
-{
- u1Byte PreCCAState;
- u1Byte CurCCAState;
+//Remove DIG by Yuchen
- u1Byte PreRFState;
- u1Byte CurRFState;
+//Remoce BB power saving by Yuchn
- int Rssi_val_min;
-
- u1Byte initialize;
- u4Byte Reg874,RegC70,Reg85C,RegA74;
-
-}PS_T,*pPS_T;
-
-typedef struct _FALSE_ALARM_STATISTICS{
- u4Byte Cnt_Parity_Fail;
- u4Byte Cnt_Rate_Illegal;
- u4Byte Cnt_Crc8_fail;
- u4Byte Cnt_Mcs_fail;
- u4Byte Cnt_Ofdm_fail;
- u4Byte Cnt_Cck_fail;
- u4Byte Cnt_all;
- u4Byte Cnt_Fast_Fsync;
- u4Byte Cnt_SB_Search_fail;
- u4Byte Cnt_OFDM_CCA;
- u4Byte Cnt_CCK_CCA;
- u4Byte Cnt_CCA_all;
- u4Byte Cnt_BW_USC; //Gary
- u4Byte Cnt_BW_LSC; //Gary
-}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;
+//Remove DIG by yuchen
typedef struct _Dynamic_Primary_CCA{
u1Byte PriCCA_flag;
@@ -382,16 +312,8 @@ typedef struct _SW_Antenna_Switch_
}SWAT_T, *pSWAT_T;
//#endif
-typedef struct _EDCA_TURBO_
-{
- BOOLEAN bCurrentTurboEDCA;
- BOOLEAN bIsCurRDLState;
-
- #if(DM_ODM_SUPPORT_TYPE == ODM_CE )
- u4Byte prv_traffic_idx; // edca turbo
- #endif
+//Remove Edca by YuChen
-}EDCA_T,*pEDCA_T;
typedef struct _ODM_RATE_ADAPTIVE
{
@@ -520,9 +442,9 @@ typedef struct _ODM_Phy_Dbg_Info_
{
//ODM Write,debug info
s1Byte RxSNRdB[4];
- u8Byte NumQryPhyStatus;
- u8Byte NumQryPhyStatusCCK;
- u8Byte NumQryPhyStatusOFDM;
+ u4Byte NumQryPhyStatus;
+ u4Byte NumQryPhyStatusCCK;
+ u4Byte NumQryPhyStatusOFDM;
u1Byte NumQryBeaconPkt;
//Others
s4Byte RxEVM[4];
@@ -705,7 +627,7 @@ typedef enum _ODM_Common_Info_Definition
ODM_CMNINFO_RA_THRESHOLD_HIGH, // u1Byte
ODM_CMNINFO_RA_THRESHOLD_LOW, // u1Byte
ODM_CMNINFO_RF_ANTENNA_TYPE, // u1Byte
- ODM_CMNINFO_BT_DISABLED,
+ ODM_CMNINFO_BT_ENABLED,
ODM_CMNINFO_BT_HS_CONNECT_PROCESS,
ODM_CMNINFO_BT_HS_RSSI,
ODM_CMNINFO_BT_OPERATION,
@@ -747,7 +669,7 @@ typedef enum _ODM_Support_Ability_Definition
ODM_BB_PSD = BIT11,
ODM_BB_RXHP = BIT12,
ODM_BB_ADAPTIVITY = BIT13,
- ODM_BB_DYNAMIC_ATC = BIT14,
+ ODM_BB_CFO_TRACKING = BIT14,
//
// MAC DM section BIT 16-23
@@ -785,12 +707,13 @@ typedef enum tag_ODM_Support_IC_Type_Definition
ODM_RTL8821 = BIT6,
ODM_RTL8192E = BIT7,
ODM_RTL8723B = BIT8,
- ODM_RTL8813A = BIT9,
- ODM_RTL8881A = BIT10
+ ODM_RTL8814A = BIT9,
+ ODM_RTL8881A = BIT10,
+ ODM_RTL8821B = BIT11
}ODM_IC_TYPE_E;
#define ODM_IC_11N_SERIES (ODM_RTL8192S|ODM_RTL8192C|ODM_RTL8192D|ODM_RTL8723A|ODM_RTL8188E|ODM_RTL8192E|ODM_RTL8723B)
-#define ODM_IC_11AC_SERIES (ODM_RTL8812|ODM_RTL8821|ODM_RTL8813A|ODM_RTL8881A)
+#define ODM_IC_11AC_SERIES (ODM_RTL8812|ODM_RTL8821|ODM_RTL8814A|ODM_RTL8881A)
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
#ifdef RTK_AC_SUPPORT
@@ -1067,30 +990,8 @@ typedef struct _IQK_MATRIX_REGS_SETTING{
BOOLEAN bBWIqkResultSaved[3];
}IQK_MATRIX_REGS_SETTING,*PIQK_MATRIX_REGS_SETTING;
-#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
-typedef struct _PathDiv_Parameter_define_
-{
- u4Byte org_5g_RegE30;
- u4Byte org_5g_RegC14;
- u4Byte org_5g_RegCA0;
- u4Byte swt_5g_RegE30;
- u4Byte swt_5g_RegC14;
- u4Byte swt_5g_RegCA0;
- //for 2G IQK information
- u4Byte org_2g_RegC80;
- u4Byte org_2g_RegC4C;
- u4Byte org_2g_RegC94;
- u4Byte org_2g_RegC14;
- u4Byte org_2g_RegCA0;
-
- u4Byte swt_2g_RegC80;
- u4Byte swt_2g_RegC4C;
- u4Byte swt_2g_RegC94;
- u4Byte swt_2g_RegC14;
- u4Byte swt_2g_RegCA0;
-}PATHDIV_PARA,*pPATHDIV_PARA;
-#endif
+//Remove PATHDIV_PARA struct to odm_PathDiv.h
typedef struct ODM_RF_Calibration_Structure
{
@@ -1306,10 +1207,9 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure
u8Byte DebugComponents;
u4Byte DebugLevel;
- u8Byte NumQryPhyStatusAll; //CCK + OFDM
- u8Byte LastNumQryPhyStatusAll;
- u8Byte RxPWDBAve;
- u8Byte RxPWDBAve_final;
+ u4Byte NumQryPhyStatusAll; //CCK + OFDM
+ u4Byte LastNumQryPhyStatusAll;
+ u4Byte RxPWDBAve;
BOOLEAN MPDIG_2G; //off MPDIG
u1Byte Times_2G;
@@ -1434,7 +1334,7 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure
BOOLEAN bIsMPChip;
BOOLEAN bOneEntryOnly;
// Common info for BTDM
- BOOLEAN bBtDisabled; // BT is disabled
+ BOOLEAN bBtEnabled; // BT is disabled
BOOLEAN bBtConnectProcess; // BT HS is under connection progress.
u1Byte btHsRssi; // BT HS mode wifi rssi value.
BOOLEAN bBtHsOperation; // BT HS mode is under progress
@@ -1449,7 +1349,6 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure
u8Byte RSSI_TRSW_iso;
u1Byte RxRate;
- BOOLEAN StopDIG;
BOOLEAN bNoisyState;
u1Byte TxRate;
u1Byte LinkedInterval;
@@ -1478,6 +1377,28 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure
u1Byte pre_AntType;
u1Byte antdiv_period;
u1Byte antdiv_select;
+ u1Byte NdpaPeriod;
+
+ // add by Yu Cehn for adaptivtiy
+ BOOLEAN adaptivity_flag;
+ BOOLEAN NHM_disable;
+ BOOLEAN TxHangFlg;
+ BOOLEAN Carrier_Sense_enable;
+ u1Byte tolerance_cnt;
+ u8Byte NHMCurTxOkcnt;
+ u8Byte NHMCurRxOkcnt;
+ u8Byte NHMLastTxOkcnt;
+ u8Byte NHMLastRxOkcnt;
+ u1Byte txEdcca1;
+ u1Byte txEdcca0;
+ s1Byte H2L_lb;
+ s1Byte L2H_lb;
+ u1Byte Adaptivity_IGI_upper;
+ u1Byte NHM_cnt_0;
+
+
+ ODM_NOISE_MONITOR noise_level;//[ODM_MAX_CHANNEL_NUM];
+ //
//2 Define STA info.
// _ODM_STA_INFO
// 2012/01/12 MH For MP, we need to reduce one array pointer for default port.??
@@ -1513,17 +1434,18 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure
//
//ODM Structure
//
- FAT_T DM_FatTable;
- DIG_T DM_DigTable;
- PS_T DM_PSTable;
- Pri_CCA_T DM_PriCCA;
- RXHP_T DM_RXHP_Table;
- RA_T DM_RA_Table;
- FALSE_ALARM_STATISTICS FalseAlmCnt;
- FALSE_ALARM_STATISTICS FlaseAlmCntBuddyAdapter;
+ FAT_T DM_FatTable;
+ DIG_T DM_DigTable;
+ PS_T DM_PSTable;
+ Pri_CCA_T DM_PriCCA;
+ RXHP_T DM_RXHP_Table;
+ RA_T DM_RA_Table;
+ FALSE_ALARM_STATISTICS FalseAlmCnt;
+ FALSE_ALARM_STATISTICS FlaseAlmCntBuddyAdapter;
//#ifdef CONFIG_ANTENNA_DIVERSITY
- SWAT_T DM_SWAT_Table;
- BOOLEAN RSSI_test;
+ SWAT_T DM_SWAT_Table;
+ BOOLEAN RSSI_test;
+ CFO_TRACKING DM_CfoTrack;
//#endif
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
@@ -1595,19 +1517,6 @@ typedef struct DM_Out_Source_Dynamic_Mechanism_Structure
BOOLEAN Modify_TxAGC_Flag_PathA;
BOOLEAN Modify_TxAGC_Flag_PathB;
BOOLEAN Modify_TxAGC_Flag_PathA_CCK;
-
- //
- // Dynamic ATC switch
- //
- BOOLEAN bATCStatus;
- BOOLEAN largeCFOHit;
- BOOLEAN bIsfreeze;
- int CFO_tail[2];
- int CFO_ave_pre;
- int CrystalCap;
- u1Byte CFOThreshold;
- u4Byte packetCount;
- u4Byte packetCount_pre;
//
// ODM system resource.
@@ -1725,88 +1634,7 @@ typedef enum _RT_STATUS{
//3 DIG
//3===========================================================
-typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition
-{
- DIG_TYPE_THRESH_HIGH = 0,
- DIG_TYPE_THRESH_LOW = 1,
- DIG_TYPE_BACKOFF = 2,
- DIG_TYPE_RX_GAIN_MIN = 3,
- DIG_TYPE_RX_GAIN_MAX = 4,
- DIG_TYPE_ENABLE = 5,
- DIG_TYPE_DISABLE = 6,
- DIG_OP_TYPE_MAX
-}DM_DIG_OP_E;
-/*
-typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition
-{
- CCK_PD_STAGE_LowRssi = 0,
- CCK_PD_STAGE_HighRssi = 1,
- CCK_PD_STAGE_MAX = 3,
-}DM_CCK_PDTH_E;
-
-typedef enum tag_DIG_EXT_PORT_ALGO_Definition
-{
- DIG_EXT_PORT_STAGE_0 = 0,
- DIG_EXT_PORT_STAGE_1 = 1,
- DIG_EXT_PORT_STAGE_2 = 2,
- DIG_EXT_PORT_STAGE_3 = 3,
- DIG_EXT_PORT_STAGE_MAX = 4,
-}DM_DIG_EXT_PORT_ALG_E;
-
-typedef enum tag_DIG_Connect_Definition
-{
- DIG_STA_DISCONNECT = 0,
- DIG_STA_CONNECT = 1,
- DIG_STA_BEFORE_CONNECT = 2,
- DIG_MultiSTA_DISCONNECT = 3,
- DIG_MultiSTA_CONNECT = 4,
- DIG_CONNECT_MAX
-}DM_DIG_CONNECT_E;
-
-
-#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;}
-
-#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER) \
- DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT)
-
-#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER) \
- DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT)
-*/
-#define DM_DIG_THRESH_HIGH 40
-#define DM_DIG_THRESH_LOW 35
-
-#define DM_FALSEALARM_THRESH_LOW 400
-#define DM_FALSEALARM_THRESH_HIGH 1000
-
-#define DM_DIG_MAX_NIC 0x3e
-#define DM_DIG_MIN_NIC 0x1e //0x22//0x1c
-
-#define DM_DIG_MAX_AP 0x32
-#define DM_DIG_MIN_AP 0x20
-
-#define DM_DIG_MAX_NIC_HP 0x46
-#define DM_DIG_MIN_NIC_HP 0x2e
-
-#define DM_DIG_MAX_AP_HP 0x42
-#define DM_DIG_MIN_AP_HP 0x30
-
-//vivi 92c&92d has different definition, 20110504
-//this is for 92c
-#ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
-#define DM_DIG_FA_TH0 0x80//0x20
-#else
-#define DM_DIG_FA_TH0 0x200//0x20
-#endif
-#define DM_DIG_FA_TH1 0x300//0x100
-#define DM_DIG_FA_TH2 0x400//0x200
-//this is for 92d
-#define DM_DIG_FA_TH0_92D 0x100
-#define DM_DIG_FA_TH1_92D 0x400
-#define DM_DIG_FA_TH2_92D 0x600
-
-#define DM_DIG_BACKOFF_MAX 12
-#define DM_DIG_BACKOFF_MIN -4
-#define DM_DIG_BACKOFF_DEFAULT 10
+//Remove DIG by Yuchen
//3===========================================================
//3 AGC RX High Power Mode
@@ -1829,20 +1657,8 @@ typedef enum tag_DIG_Connect_Definition
//3 Dynamic Tx Power
//3===========================================================
//Dynamic Tx Power Control Threshold
-#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
-#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
-#define TX_POWER_NEAR_FIELD_THRESH_AP 0x3F
-
-#define TxHighPwrLevel_Normal 0
-#define TxHighPwrLevel_Level1 1
-#define TxHighPwrLevel_Level2 2
-#define TxHighPwrLevel_BT1 3
-#define TxHighPwrLevel_BT2 4
-#define TxHighPwrLevel_15 5
-#define TxHighPwrLevel_35 6
-#define TxHighPwrLevel_50 7
-#define TxHighPwrLevel_70 8
-#define TxHighPwrLevel_100 9
+
+//Remove By YuChen
//3===========================================================
//3 Tx Power Tracking
@@ -1865,15 +1681,6 @@ typedef enum tag_DIG_Connect_Definition
//3 BB Power Save
//3===========================================================
-
-//3===========================================================
-//3 Dynamic ATC switch
-//3===========================================================
-#define ATC_Status_Off 0x0 // enable
-#define ATC_Status_On 0x1 // disable
-#define CFO_Threshold_Xtal 10 // kHz
-#define CFO_Threshold_ATC 80 // kHz
-
typedef enum tag_1R_CCA_Type_Definition
{
CCA_1R =0,
@@ -1937,8 +1744,7 @@ static u1Byte DeltaSwingTableIdx_2GA_N_8188E[] = {0, 0, 0, 2, 2, 3, 3, 4, 4, 4,
#define SWAW_STEP_PEAK 0
#define SWAW_STEP_DETERMINE 1
-VOID ODM_Write_DIG(IN PDM_ODM_T pDM_Odm, IN u1Byte CurrentIGI);
-VOID ODM_Write_CCK_CCA_Thres(IN PDM_ODM_T pDM_Odm, IN u1Byte CurCCK_CCAThres);
+//Remove DIG by yuchen
VOID
ODM_SetAntenna(
@@ -1946,9 +1752,7 @@ ODM_SetAntenna(
IN u1Byte Antenna);
-#define dm_RF_Saving ODM_RF_Saving
-void ODM_RF_Saving( IN PDM_ODM_T pDM_Odm,
- IN u1Byte bForceInNormal );
+//Remove BB power saving by Yuchen
#define SwAntDivRestAfterLink ODM_SwAntDivRestAfterLink
VOID ODM_SwAntDivRestAfterLink( IN PDM_ODM_T pDM_Odm);
@@ -1975,12 +1779,9 @@ ODM_RAStateCheck(
//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter,
// IN INT32 DM_Type,
// IN INT32 DM_Value);
-VOID
-ODM_ChangeDynamicInitGainThresh(
- IN PDM_ODM_T pDM_Odm,
- IN u4Byte DM_Type,
- IN u4Byte DM_Value
- );
+
+//Remove DIG by yuchen
+
BOOLEAN
ODM_CheckPowerStatus(
@@ -1997,22 +1798,7 @@ ODM_RateAdaptiveStateApInit(
#endif
#define AP_InitRateAdaptiveState ODM_RateAdaptiveStateApInit
-
-#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
-#ifdef WIFI_WMM
-VOID
-ODM_IotEdcaSwitch(
- IN PDM_ODM_T pDM_Odm,
- IN unsigned char enable
- );
-#endif
-
-BOOLEAN
-ODM_ChooseIotMainSTA(
- IN PDM_ODM_T pDM_Odm,
- IN PSTA_INFO_T pstat
- );
-#endif
+//Remove Edca by Yuchen
#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
#ifdef HW_ANT_SWITCH
@@ -2058,10 +1844,6 @@ GetPSDData(
#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
-VOID
-odm_DIGbyRSSI_LPS(
- IN PDM_ODM_T pDM_Odm
- );
u4Byte ODM_Get_Rate_Bitmap(
IN PDM_ODM_T pDM_Odm,
@@ -2082,11 +1864,6 @@ odm_PSDMonitorWorkItemCallback(
);
VOID
-ODM_MPT_DIG(
- IN PDM_ODM_T pDM_Odm
-);
-
-VOID
PatchDCTone(
IN PDM_ODM_T pDM_Odm,
pu4Byte PSD_report,
@@ -2117,7 +1894,10 @@ Beamforming_GetEntryBeamCapByMacId(
);
#endif
-
+VOID
+odm_TXPowerTrackingInit(
+ IN PDM_ODM_T pDM_Odm
+ );
VOID ODM_DMInit( IN PDM_ODM_T pDM_Odm);
@@ -2180,11 +1960,6 @@ ODM_ResetIQKResult(
VOID ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm );
VOID ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm );
-VOID odm_PathDivChkAntSwitch(PDM_ODM_T pDM_Odm);
-VOID ODM_PathDivRestAfterLink(
- IN PDM_ODM_T pDM_Odm
- );
-
//===========================================//
// Neil Chen----2011--06--15--
@@ -2198,18 +1973,7 @@ VOID ODM_PathDivRestAfterLink(
#define TRAFFIC_HIGH 1
//#define PATHDIV_ENABLE 1
-
-//VOID odm_PathDivChkAntSwitch(PADAPTER Adapter,u1Byte Step);
-VOID ODM_PathDivRestAfterLink(
- IN PDM_ODM_T pDM_Odm
- );
-
-#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi
-VOID ODM_PathDivChkPerPktRssi(PADAPTER Adapter,
- BOOLEAN bIsDefPort,
- BOOLEAN bMatchBSSID,
- PRT_WLAN_STA pEntry,
- PRT_RFD pRfd );
+//#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi
u8Byte
PlatformDivision64(
@@ -2230,12 +1994,7 @@ PlatformDivision64(
//3 PathDiV End
//====================================================
-#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C
-BOOLEAN
-ODM_PathDiversityBeforeLink92C(
- //IN PADAPTER Adapter
- IN PDM_ODM_T pDM_Odm
- );
+//#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C
#define DM_ChangeDynamicInitGainThresh ODM_ChangeDynamicInitGainThresh
//void ODM_ChangeDynamicInitGainThresh(IN PADAPTER pAdapter,
@@ -2244,17 +2003,6 @@ ODM_PathDiversityBeforeLink92C(
//
-VOID
-ODM_CCKPathDiversityChkPerPktRssi(
- PADAPTER Adapter,
- BOOLEAN bIsDefPort,
- BOOLEAN bMatchBSSID,
- PRT_WLAN_STA pEntry,
- PRT_RFD pRfd,
- pu1Byte pDesc
- );
-
-
typedef enum tag_DIG_Connect_Definition
{
DIG_STA_DISCONNECT = 0,
@@ -2266,14 +2014,6 @@ typedef enum tag_DIG_Connect_Definition
}DM_DIG_CONNECT_E;
-VOID
-ODM_FillTXPathInTXDESC(
- IN PADAPTER Adapter,
- IN PRT_TCB pTcb,
- IN pu1Byte pDesc
-);
-
-
#define dm_SWAW_RSSI_Check ODM_SwAntDivChkPerPktRssi
//
@@ -2324,12 +2064,6 @@ ODM_SingleDualAntennaDetection(
IN u1Byte mode
);
-VOID
-ODM_DynamicATCSwitch(
- IN PDM_ODM_T pDM_Odm
-);
-
-
#endif // #if((DM_ODM_SUPPORT_TYPE==ODM_WIN)||(DM_ODM_SUPPORT_TYPE==ODM_CE))
VOID
ODM_UpdateNoisyState(
diff --git a/rtl8723BS/hal/OUTSRC/odm_AntDiv.c b/rtl8723BS/hal/OUTSRC/odm_AntDiv.c
index 4b361e2..1f21d6c 100755
--- a/rtl8723BS/hal/OUTSRC/odm_AntDiv.c
+++ b/rtl8723BS/hal/OUTSRC/odm_AntDiv.c
@@ -163,12 +163,12 @@ odm_RX_HWAntDiv_Init_88E(
pDM_Odm->AntType = ODM_AUTO_ANT;
- #if (MP_DRIVER == 1)
+#if (MP_DRIVER == 1)
pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv
ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1); // 1:CG, 0:CS
return;
- #endif
+#else
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CGCS_RX_HW_ANTDIV]\n"));
@@ -188,6 +188,7 @@ odm_RX_HWAntDiv_Init_88E(
ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , 0xFFFF, 0x0102); //antenna mapping table
+#endif
}
VOID
@@ -197,12 +198,12 @@ odm_TRX_HWAntDiv_Init_88E(
{
u4Byte value32;
- #if (MP_DRIVER == 1)
+#if (MP_DRIVER == 1)
pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv
ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT5|BIT4|BIT3, 0); //Default RX (0/1)
return;
- #endif
+#else
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV (SPDT)]\n"));
@@ -228,6 +229,7 @@ odm_TRX_HWAntDiv_Init_88E(
}
else //MPchip
ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , bMaskDWord, 0x0201); //Reg914=3'b010, Reg915=3'b001
+#endif
}
VOID
@@ -244,7 +246,7 @@ odm_Smart_HWAntDiv_Init_88E(
#if (MP_DRIVER == 1)
ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->AntDivType: %d\n", pDM_Odm->AntDivType));
return;
-#endif
+#else
for(i=0; i<6; i++)
{
@@ -335,6 +337,8 @@ odm_Smart_HWAntDiv_Init_88E(
//PHY_SetBBReg(Adapter, 0x864 , BIT11, 1);
//PHY_SetBBReg(Adapter, 0x860 , BIT9, 0);
//PHY_SetBBReg(Adapter, 0x860 , BIT8, 0);
+
+#endif
}
#endif //#if (RTL8188E_SUPPORT == 1)
@@ -2017,7 +2021,7 @@ ODM_AntDiv(
#if (RTL8821A_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8821)
{
- if(pDM_Odm->bBtDisabled) //BT disabled
+ if(!pDM_Odm->bBtEnabled) //BT disabled
{
if(pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
{
diff --git a/rtl8723BS/hal/OUTSRC/odm_CfoTracking.c b/rtl8723BS/hal/OUTSRC/odm_CfoTracking.c
new file mode 100755
index 0000000..e0c2a58
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_CfoTracking.c
@@ -0,0 +1,363 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#include "odm_precomp.h"
+
+VOID
+odm_SetCrystalCap(
+ IN PVOID pDM_VOID,
+ IN u1Byte CrystalCap
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PCFO_TRACKING pCfoTrack = &pDM_Odm->DM_CfoTrack;
+ BOOLEAN bEEPROMCheck;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+
+ bEEPROMCheck = (pHalData->EEPROMVersion >= 0x01)?TRUE:FALSE;
+#else
+ bEEPROMCheck = TRUE;
+#endif
+
+ if(pCfoTrack->CrystalCap == CrystalCap)
+ return;
+
+ pCfoTrack->CrystalCap = CrystalCap;
+
+ if(pDM_Odm->SupportICType & ODM_RTL8192D)
+ {
+ ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x000000F0, CrystalCap & 0x0F);
+ ODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0xF0000000, ((CrystalCap & 0xF0) >> 4));
+ }
+ else if(pDM_Odm->SupportICType & ODM_RTL8188E)
+ {
+ // write 0x24[22:17] = 0x24[16:11] = CrystalCap
+ CrystalCap = CrystalCap & 0x3F;
+ ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x007ff800, (CrystalCap | (CrystalCap << 6)));
+ }
+ else if(pDM_Odm->SupportICType & ODM_RTL8812)
+ {
+ // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap
+ CrystalCap = CrystalCap & 0x3F;
+ ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6)));
+ }
+ else if (((pDM_Odm->SupportICType & ODM_RTL8723A) && bEEPROMCheck) ||
+ (pDM_Odm->SupportICType & ODM_RTL8723B) ||(pDM_Odm->SupportICType & ODM_RTL8192E) ||
+ (pDM_Odm->SupportICType & ODM_RTL8821))
+ {
+ // 0x2C[23:18] = 0x2C[17:12] = CrystalCap
+ CrystalCap = CrystalCap & 0x3F;
+ ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x00FFF000, (CrystalCap | (CrystalCap << 6)));
+ }
+ else if(pDM_Odm->SupportICType & ODM_RTL8821B)
+ {
+ // write 0x28[6:1] = 0x24[30:25] = CrystalCap
+ CrystalCap = CrystalCap & 0x3F;
+ ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x7E000000, CrystalCap);
+ ODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0x7E, CrystalCap);
+ }
+ else if(pDM_Odm->SupportICType & ODM_RTL8814A)
+ {
+ // write 0x2C[26:21] = 0x2C[20:15] = CrystalCap
+ CrystalCap = CrystalCap & 0x3F;
+ ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x07FF8000, (CrystalCap | (CrystalCap << 6)));
+ }
+ else
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("odm_SetCrystalCap(): Use default setting.\n"));
+ ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));
+ }
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("odm_SetCrystalCap(): CrystalCap = 0x%x\n", CrystalCap));
+}
+
+u1Byte
+odm_GetDefaultCrytaltalCap(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ u1Byte CrystalCap = 0x20;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+
+ CrystalCap = pHalData->CrystalCap;
+#else
+ prtl8192cd_priv priv = pDM_Odm->priv;
+
+ if(priv->pmib->dot11RFEntry.xcap > 0)
+ CrystalCap = priv->pmib->dot11RFEntry.xcap;
+#endif
+
+ CrystalCap = CrystalCap & 0x3f;
+
+ return CrystalCap;
+}
+
+VOID
+odm_SetATCStatus(
+ IN PVOID pDM_VOID,
+ IN BOOLEAN ATCStatus
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PCFO_TRACKING pCfoTrack = &pDM_Odm->DM_CfoTrack;
+
+ if(pCfoTrack->bATCStatus == ATCStatus)
+ return;
+
+ ODM_SetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm), ATCStatus);
+ pCfoTrack->bATCStatus = ATCStatus;
+}
+
+BOOLEAN
+odm_GetATCStatus(
+ IN PVOID pDM_VOID
+)
+{
+ BOOLEAN ATCStatus;
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+ ATCStatus = (BOOLEAN)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm));
+ return ATCStatus;
+}
+
+VOID
+ODM_CfoTrackingReset(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PCFO_TRACKING pCfoTrack = &pDM_Odm->DM_CfoTrack;
+ u1Byte CrystalCap;
+
+ pCfoTrack->DefXCap = odm_GetDefaultCrytaltalCap(pDM_Odm);
+ pCfoTrack->bAdjust = TRUE;
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ odm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);
+ odm_SetATCStatus(pDM_Odm, TRUE);
+#else
+ if(pCfoTrack->CrystalCap > pCfoTrack->DefXCap)
+ {
+ for(CrystalCap = pCfoTrack->CrystalCap; CrystalCap >= pCfoTrack->DefXCap; CrystalCap--)
+ odm_SetCrystalCap(pDM_Odm, CrystalCap);
+ }
+ else
+ {
+ for(CrystalCap = pCfoTrack->CrystalCap; CrystalCap <= pCfoTrack->DefXCap; CrystalCap++)
+ odm_SetCrystalCap(pDM_Odm, CrystalCap);
+ }
+#endif
+}
+
+VOID
+ODM_CfoTrackingInit(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PCFO_TRACKING pCfoTrack = &pDM_Odm->DM_CfoTrack;
+
+ pCfoTrack->DefXCap = pCfoTrack->CrystalCap = odm_GetDefaultCrytaltalCap(pDM_Odm);
+ pCfoTrack->bATCStatus = odm_GetATCStatus(pDM_Odm);
+ pCfoTrack->bAdjust = TRUE;
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking_init()=========> \n"));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking_init(): bATCStatus = %d, CrystalCap = 0x%x \n",pCfoTrack->bATCStatus, pCfoTrack->DefXCap));
+}
+
+VOID
+ODM_CfoTracking(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PCFO_TRACKING pCfoTrack = &pDM_Odm->DM_CfoTrack;
+ int CFO_kHz_A, CFO_kHz_B, CFO_ave = 0;
+ int CFO_ave_diff;
+ int CrystalCap = (int)pCfoTrack->CrystalCap;
+ u1Byte Adjust_Xtal = 1;
+
+ //4 Support ability
+ if(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Return: SupportAbility ODM_BB_CFO_TRACKING is disabled\n"));
+ return;
+ }
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking()=========> \n"));
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN && MP_DRIVER == 1)
+ if(0)
+#else
+ if(!pDM_Odm->bLinked || !pDM_Odm->bOneEntryOnly)
+#endif
+ {
+ //4 No link or more than one entry
+ ODM_CfoTrackingReset(pDM_Odm);
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Reset: bLinked = %d, bOneEntryOnly = %d\n",
+ pDM_Odm->bLinked, pDM_Odm->bOneEntryOnly));
+ }
+ else
+ {
+ //3 1. CFO Tracking
+ //4 1.1 No new packet
+ if(pCfoTrack->packetCount == pCfoTrack->packetCount_pre)
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): packet counter doesn't change\n"));
+ return;
+ }
+ pCfoTrack->packetCount_pre = pCfoTrack->packetCount;
+
+ //4 1.2 Calculate CFO
+ CFO_kHz_A = (int)(pCfoTrack->CFO_tail[0] * 3125) / 1280;
+ CFO_kHz_B = (int)(pCfoTrack->CFO_tail[1] * 3125) / 1280;
+
+ if(pDM_Odm->RFType < ODM_2T2R)
+ CFO_ave = CFO_kHz_A;
+ else
+ CFO_ave = (int)(CFO_kHz_A + CFO_kHz_B) >> 1;
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): CFO_kHz_A = %dkHz, CFO_kHz_B = %dkHz, CFO_ave = %dkHz\n",
+ CFO_kHz_A, CFO_kHz_B, CFO_ave));
+
+ //4 1.3 Avoid abnormal large CFO
+ CFO_ave_diff = (pCfoTrack->CFO_ave_pre >= CFO_ave)?(pCfoTrack->CFO_ave_pre - CFO_ave):(CFO_ave - pCfoTrack->CFO_ave_pre);
+ if(CFO_ave_diff > 20 && pCfoTrack->largeCFOHit == 0 && !pCfoTrack->bAdjust)
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): first large CFO hit\n"));
+ pCfoTrack->largeCFOHit = 1;
+ return;
+ }
+ else
+ pCfoTrack->largeCFOHit = 0;
+ pCfoTrack->CFO_ave_pre = CFO_ave;
+
+ //4 1.4 Dynamic Xtal threshold
+ if(pCfoTrack->bAdjust == FALSE)
+ {
+ if(CFO_ave > CFO_TH_XTAL_HIGH || CFO_ave < (-CFO_TH_XTAL_HIGH))
+ pCfoTrack->bAdjust = TRUE;
+ }
+ else
+ {
+ if(CFO_ave < CFO_TH_XTAL_LOW && CFO_ave > (-CFO_TH_XTAL_LOW))
+ pCfoTrack->bAdjust = FALSE;
+ }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ //4 1.5 BT case: Disable CFO tracking
+ if(pDM_Odm->bBtEnabled)
+ {
+ pCfoTrack->bAdjust = FALSE;
+ odm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Disable CFO tracking for BT!!\n"));
+ }
+
+ //4 1.6 Big jump
+ if(pCfoTrack->bAdjust)
+ {
+ if(CFO_ave > CFO_TH_XTAL_LOW)
+ Adjust_Xtal = Adjust_Xtal + ((CFO_ave - CFO_TH_XTAL_LOW) >> 2);
+ else if(CFO_ave < (-CFO_TH_XTAL_LOW))
+ Adjust_Xtal = Adjust_Xtal + ((CFO_TH_XTAL_LOW - CFO_ave) >> 2);
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Crystal cap offset = %d\n", Adjust_Xtal));
+ }
+#endif
+
+ //4 1.7 Adjust Crystal Cap.
+ if(pCfoTrack->bAdjust)
+ {
+ if(CFO_ave > CFO_TH_XTAL_LOW)
+ CrystalCap = CrystalCap + Adjust_Xtal;
+ else if(CFO_ave < (-CFO_TH_XTAL_LOW))
+ CrystalCap = CrystalCap - Adjust_Xtal;
+
+ if(CrystalCap > 0x3f)
+ CrystalCap = 0x3f;
+ else if (CrystalCap < 0)
+ CrystalCap = 0;
+
+ odm_SetCrystalCap(pDM_Odm, (u1Byte)CrystalCap);
+ }
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Crystal cap = 0x%x, Default Crystal cap = 0x%x\n",
+ pCfoTrack->CrystalCap, pCfoTrack->DefXCap));
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+ return;
+
+ //3 2. Dynamic ATC switch
+ if(CFO_ave < CFO_TH_ATC && CFO_ave > -CFO_TH_ATC)
+ {
+ odm_SetATCStatus(pDM_Odm, FALSE);
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Disable ATC!!\n"));
+ }
+ else
+ {
+ odm_SetATCStatus(pDM_Odm, TRUE);
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Enable ATC!!\n"));
+ }
+#endif
+ }
+}
+
+VOID
+ODM_ParsingCFO(
+ IN PVOID pDM_VOID,
+ IN PVOID pPktinfo_VOID,
+ IN s1Byte* pcfotail
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PODM_PACKET_INFO_T pPktinfo = (PODM_PACKET_INFO_T)pPktinfo_VOID;
+ PCFO_TRACKING pCfoTrack = &pDM_Odm->DM_CfoTrack;
+ u1Byte i;
+
+ if(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))
+ return;
+
+#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN) && (MP_DRIVER == 1))
+ if(1)
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ if(pPktinfo->bPacketMatchBSSID)
+#else
+ if(pPktinfo->StationID != 0)
+#endif
+ {
+ //3 Update CFO report for path-A & path-B
+ // Only paht-A and path-B have CFO tail and short CFO
+ for(i = ODM_RF_PATH_A; i <= ODM_RF_PATH_B; i++)
+ {
+ pCfoTrack->CFO_tail[i] = (int)pcfotail[i];
+ }
+
+ //3 Update packet counter
+ if(pCfoTrack->packetCount == 0xffffffff)
+ pCfoTrack->packetCount = 0;
+ else
+ pCfoTrack->packetCount++;
+ }
+}
+
diff --git a/rtl8723BS/hal/OUTSRC/odm_CfoTracking.h b/rtl8723BS/hal/OUTSRC/odm_CfoTracking.h
new file mode 100755
index 0000000..48ead72
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_CfoTracking.h
@@ -0,0 +1,66 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#ifndef __ODMCFOTRACK_H__
+#define __ODMCFOTRACK_H__
+
+#define CFO_TH_XTAL_HIGH 20 // kHz
+#define CFO_TH_XTAL_LOW 10 // kHz
+#define CFO_TH_ATC 80 // kHz
+
+typedef struct _CFO_TRACKING_
+{
+ BOOLEAN bATCStatus;
+ BOOLEAN largeCFOHit;
+ BOOLEAN bAdjust;
+ u1Byte CrystalCap;
+ u1Byte DefXCap;
+ int CFO_tail[2];
+ int CFO_ave_pre;
+ u4Byte packetCount;
+ u4Byte packetCount_pre;
+
+ BOOLEAN bForceXtalCap;
+ BOOLEAN bReset;
+}CFO_TRACKING, *PCFO_TRACKING;
+
+VOID
+ODM_CfoTrackingReset(
+ IN PVOID pDM_VOID
+);
+
+VOID
+ODM_CfoTrackingInit(
+ IN PVOID pDM_VOID
+);
+
+VOID
+ODM_CfoTracking(
+ IN PVOID pDM_VOID
+);
+
+VOID
+ODM_ParsingCFO(
+ IN PVOID pDM_VOID,
+ IN PVOID pPktinfo_VOID,
+ IN s1Byte* pcfotail
+);
+
+#endif \ No newline at end of file
diff --git a/rtl8723BS/hal/OUTSRC/odm_DIG.c b/rtl8723BS/hal/OUTSRC/odm_DIG.c
new file mode 100755
index 0000000..67f9606
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_DIG.c
@@ -0,0 +1,2591 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+//============================================================
+// include files
+//============================================================
+
+#include "odm_precomp.h"
+#define ADAPTIVITY_VERSION "5.0"
+
+
+VOID
+ODM_ChangeDynamicInitGainThresh(
+ IN PVOID pDM_VOID,
+ IN u4Byte DM_Type,
+ IN u4Byte DM_Value
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+ if (DM_Type == DIG_TYPE_THRESH_HIGH)
+ {
+ pDM_DigTable->RssiHighThresh = DM_Value;
+ }
+ else if (DM_Type == DIG_TYPE_THRESH_LOW)
+ {
+ pDM_DigTable->RssiLowThresh = DM_Value;
+ }
+ else if (DM_Type == DIG_TYPE_ENABLE)
+ {
+ pDM_DigTable->Dig_Enable_Flag = TRUE;
+ }
+ else if (DM_Type == DIG_TYPE_DISABLE)
+ {
+ pDM_DigTable->Dig_Enable_Flag = FALSE;
+ }
+ else if (DM_Type == DIG_TYPE_BACKOFF)
+ {
+ if(DM_Value > 30)
+ DM_Value = 30;
+ pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
+ }
+ else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
+ {
+ if(DM_Value == 0)
+ DM_Value = 0x1;
+ pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
+ }
+ else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
+ {
+ if(DM_Value > 0x50)
+ DM_Value = 0x50;
+ pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
+ }
+} // DM_ChangeDynamicInitGainThresh //
+
+VOID
+odm_NHMCounterStatisticsInit(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+ if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+ {
+ //PHY parameters initialize for ac series
+ ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC+2, 0x2710); //0x990[31:16]=0x2710 Time duration for NHM unit: 4us, 0x2710=40ms
+ ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC+2, 0xffff); //0x994[31:16]=0xffff th_9, th_10
+ //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff5c); //0x998=0xffffff5c th_3, th_2, th_1, th_0
+ ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff52); //0x998=0xffffff52 th_3, th_2, th_1, th_0
+ ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff); //0x99c=0xffffffff th_7, th_6, th_5, th_4
+ ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff); //0x9a0[7:0]=0xff th_8
+ ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, 0x7); //0x994[9:8]=3 enable CCX
+ ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1); //0x9e8[7]=1 max power among all RX ants
+
+ //panic_printk("RTL8812AU phy parameters init %s,%d\n", __FUNCTION__, __LINE__);
+ }
+ else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ {
+ //PHY parameters initialize for n series
+ ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x2710); //0x894[31:16]=0x2710 Time duration for NHM unit: 4us, 0x2710=40ms
+ //ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x4e20); //0x894[31:16]=0x4e20 Time duration for NHM unit: 4us, 0x4e20=80ms
+ ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N+2, 0xffff); //0x890[31:16]=0xffff th_9, th_10
+ //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff5c); //0x898=0xffffff5c th_3, th_2, th_1, th_0
+ ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff52); //0x898=0xffffff52 th_3, th_2, th_1, th_0
+ ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff); //0x89c=0xffffffff th_7, th_6, th_5, th_4
+ ODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff); //0xe28[7:0]=0xff th_8
+ ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x7); //0x890[9:8]=3 enable CCX
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1); //0xc0c[7]=1 max power among all RX ants
+ }
+}
+
+VOID
+odm_NHMCounterStatistics(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+ // Get NHM report
+ odm_GetNHMCounterStatistics(pDM_Odm);
+
+ // Reset NHM counter
+ odm_NHMCounterStatisticsReset(pDM_Odm);
+}
+
+VOID
+odm_GetNHMCounterStatistics(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ u4Byte value32 = 0;
+
+ if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+ value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11AC, bMaskDWord);
+ else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11N, bMaskDWord);
+
+ pDM_Odm->NHM_cnt_0 = (u1Byte)(value32 & bMaskByte0);
+}
+
+VOID
+odm_NHMCounterStatisticsReset(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+ if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+ {
+ ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1);
+ }
+ else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ {
+ ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1);
+ }
+}
+
+VOID
+odm_NHMBBInit(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+ pDM_Odm->adaptivity_flag = 0;
+ pDM_Odm->tolerance_cnt = 3;
+ pDM_Odm->NHMLastTxOkcnt = 0;
+ pDM_Odm->NHMLastRxOkcnt = 0;
+ pDM_Odm->NHMCurTxOkcnt = 0;
+ pDM_Odm->NHMCurRxOkcnt = 0;
+}
+
+//
+VOID
+odm_NHMBB(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ u4Byte value32;
+ //u1Byte test_status;
+ //PFALSE_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+
+ pDM_Odm->NHMCurTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_Odm->NHMLastTxOkcnt;
+ pDM_Odm->NHMCurRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_Odm->NHMLastRxOkcnt;
+ pDM_Odm->NHMLastTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast);
+ pDM_Odm->NHMLastRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NHM_cnt_0=%d, NHMCurTxOkcnt = %llu, NHMCurRxOkcnt = %llu\n",
+ pDM_Odm->NHM_cnt_0, pDM_Odm->NHMCurTxOkcnt, pDM_Odm->NHMCurRxOkcnt));
+
+
+ if ( (pDM_Odm->NHMCurTxOkcnt) + 1 > (u8Byte)(pDM_Odm->NHMCurRxOkcnt<<2) + 1) //Tx > 4*Rx possible for adaptivity test
+ {
+ if(pDM_Odm->NHM_cnt_0 >= 190 || pDM_Odm->adaptivity_flag == TRUE)
+ {
+ //Enable EDCCA since it is possible running Adaptivity testing
+ //test_status = 1;
+ pDM_Odm->adaptivity_flag = TRUE;
+ ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0); //don't ignore EDCCA reg520[15]=0
+ ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); //reg524[11]=1
+ pDM_Odm->tolerance_cnt = 0;
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;
+ pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ;
+#endif
+ }
+ else
+ {
+ if(pDM_Odm->tolerance_cnt<3)
+ pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1;
+ else
+ pDM_Odm->tolerance_cnt = 4;
+ //test_status = 5;
+ if(pDM_Odm->tolerance_cnt > 3)
+ {
+ //test_status = 3;
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;
+ pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ;
+#else
+ ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1); //ignore EDCCA reg520[15]=1
+ ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0); //reg524[11]=0
+#endif
+ pDM_Odm->adaptivity_flag = FALSE;
+ }
+ }
+ }
+ else // TX<RX
+ {
+ if(pDM_Odm->adaptivity_flag == TRUE && pDM_Odm->NHM_cnt_0 <= 200)
+ {
+ //test_status = 2;
+ ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0); //don't ignore EDCCA reg520[15]=0
+ ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); //reg524[11]=1
+ pDM_Odm->tolerance_cnt = 0;
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;
+ pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ;
+#endif
+ }
+ else
+ {
+ if(pDM_Odm->tolerance_cnt<3)
+ pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1;
+ else
+ pDM_Odm->tolerance_cnt = 4;
+ //test_status = 5;
+ if(pDM_Odm->tolerance_cnt >3)
+ {
+ //test_status = 4;
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;
+ pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ;
+#else
+ ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1); //ignore EDCCA reg520[15]=1
+ ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0); //reg524[11]=0
+#endif
+ pDM_Odm->adaptivity_flag = FALSE;
+ }
+ }
+ }
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("adaptivity_flag = %d\n ", pDM_Odm->adaptivity_flag));
+}
+
+VOID
+odm_SearchPwdBLowerBound(
+ IN PVOID pDM_VOID,
+ IN u1Byte IGI_target
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ u4Byte value32 =0;
+ u1Byte cnt, IGI;
+ BOOLEAN bAdjust=TRUE;
+ s1Byte TH_L2H_dmc, TH_H2L_dmc;
+ s1Byte TH_L2H, TH_H2L, Diff;
+
+ IGI = 0x50; // find H2L, L2H lower bound
+ ODM_Write_DIG(pDM_Odm, IGI);
+
+
+ Diff = IGI_target -(s1Byte)IGI;
+ TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
+ if(TH_L2H_dmc > 10)
+ TH_L2H_dmc = 10;
+ TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ {
+ ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
+ ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
+ }
+ else
+ ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
+
+ ODM_delay_ms(5);
+
+ while(bAdjust)
+ {
+ for(cnt=0; cnt<20; cnt ++)
+ {
+ if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11N, bMaskDWord);
+ else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+ value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11AC, bMaskDWord);
+
+ if (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8723B|ODM_RTL8188E)))
+ pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1;
+ else if(value32 & BIT29)
+ pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1;
+ else
+ pDM_Odm->txEdcca0 = pDM_Odm->txEdcca0 + 1;
+ }
+ //DbgPrint("txEdcca1 = %d, txEdcca0 = %d\n", pDM_Odm->txEdcca1, pDM_Odm->txEdcca0);
+
+ if(pDM_Odm->txEdcca1 > 5 )
+ {
+ IGI = IGI -1;
+ TH_L2H_dmc = TH_L2H_dmc + 1;
+ if(TH_L2H_dmc > 10)
+ TH_L2H_dmc = 10;
+ TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ {
+ ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
+ ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
+ }
+ else
+ ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
+
+ pDM_Odm->TxHangFlg = TRUE;
+ pDM_Odm->txEdcca1 = 0;
+ pDM_Odm->txEdcca0 = 0;
+
+ if(TH_L2H_dmc == 10)
+ {
+ bAdjust = FALSE;
+ pDM_Odm->TxHangFlg = FALSE;
+ pDM_Odm->txEdcca1 = 0;
+ pDM_Odm->txEdcca0 = 0;
+ pDM_Odm->H2L_lb = TH_H2L_dmc;
+ pDM_Odm->L2H_lb = TH_L2H_dmc;
+ pDM_Odm->Adaptivity_IGI_upper = IGI;
+ }
+ }
+ else
+ {
+ bAdjust = FALSE;
+ pDM_Odm->TxHangFlg = FALSE;
+ pDM_Odm->txEdcca1 = 0;
+ pDM_Odm->txEdcca0 = 0;
+ pDM_Odm->H2L_lb = TH_H2L_dmc;
+ pDM_Odm->L2H_lb = TH_L2H_dmc;
+ pDM_Odm->Adaptivity_IGI_upper = IGI;
+ }
+ }
+
+
+ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI = 0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\n", IGI, pDM_Odm->H2L_lb , pDM_Odm->L2H_lb));
+
+}
+
+VOID
+odm_AdaptivityInit(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ PADAPTER pAdapter = pDM_Odm->Adapter;
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+ pDM_Odm->Carrier_Sense_enable = (BOOLEAN)pMgntInfo->RegEnableCarrierSense;
+#endif
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+
+ if(pDM_Odm->Carrier_Sense_enable == FALSE)
+ {
+ pDM_Odm->TH_L2H_ini = 0xf7; // -7
+ }
+ else
+ pDM_Odm->TH_L2H_ini = 0xa;
+
+ pDM_Odm->AdapEn_RSSI = 20;
+ pDM_Odm->TH_EDCCA_HL_diff = 7;
+
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+ if(pDM_Odm->Carrier_Sense_enable){
+ pDM_Odm->TH_L2H_ini = 10;
+ pDM_Odm->TH_EDCCA_HL_diff = 3;
+ pDM_Odm->AdapEn_RSSI = 30;
+ }
+ else
+ {
+ pDM_Odm->TH_L2H_ini = 0xf7;
+ pDM_Odm->TH_EDCCA_HL_diff = 7;
+ pDM_Odm->AdapEn_RSSI = 20;
+ }
+
+ pDM_Odm->TH_L2H_ini_mode2 = 20;
+ pDM_Odm->TH_EDCCA_HL_diff_mode2 = 8;
+ pDM_Odm->TH_L2H_ini_backup = pDM_Odm->TH_L2H_ini;
+ pDM_Odm->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff ;
+
+#endif
+
+ pDM_Odm->IGI_Base = 0x32;
+ pDM_Odm->IGI_target = 0x1c;
+ pDM_Odm->ForceEDCCA = 0;
+ pDM_Odm->NHM_disable = FALSE;
+ pDM_Odm->TxHangFlg = TRUE;
+ pDM_Odm->txEdcca0 = 0;
+ pDM_Odm->txEdcca1 = 0;
+ pDM_Odm->H2L_lb= 0;
+ pDM_Odm->L2H_lb= 0;
+ pDM_Odm->Adaptivity_IGI_upper = 0;
+ odm_NHMBBInit(pDM_Odm);
+
+ ODM_SetBBReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); // stop counting if EDCCA is asserted
+}
+
+
+VOID
+odm_Adaptivity(
+ IN PVOID pDM_VOID,
+ IN u1Byte IGI
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ s1Byte TH_L2H_dmc, TH_H2L_dmc;
+ s1Byte Diff, IGI_target;
+ BOOLEAN EDCCA_State = FALSE;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ PADAPTER pAdapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
+ BOOLEAN bFwCurrentInPSMode=FALSE;
+ PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
+
+ pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));
+
+ // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
+ if(bFwCurrentInPSMode)
+ return;
+#endif
+
+ if(!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA() \n"));
+ // Add by Neil Chen to enable edcca to MP Platform
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ // Adjust EDCCA.
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ odm_DynamicEDCCA(pDM_Odm);
+#endif
+ return;
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_Adaptivity() =====> \n"));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n",
+ pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI));
+
+ if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+ ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); //ADC_mask enable
+
+ if(*pDM_Odm->pBandWidth == ODM_BW20M) //CHANNEL_WIDTH_20
+ IGI_target = pDM_Odm->IGI_Base;
+ else if(*pDM_Odm->pBandWidth == ODM_BW40M)
+ IGI_target = pDM_Odm->IGI_Base + 2;
+ else if(*pDM_Odm->pBandWidth == ODM_BW80M)
+ IGI_target = pDM_Odm->IGI_Base + 2;
+ else
+ IGI_target = pDM_Odm->IGI_Base;
+ pDM_Odm->IGI_target = (u1Byte) IGI_target;
+
+ //Search pwdB lower bound
+ if(pDM_Odm->TxHangFlg == TRUE)
+ {
+ if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);
+ else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+ ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209);
+ odm_SearchPwdBLowerBound(pDM_Odm, pDM_Odm->IGI_target );
+ }
+
+ if((!pDM_Odm->bLinked)||(*pDM_Odm->pChannel > 149)) // Band4 doesn't need adaptivity
+ {
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ {
+ ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
+ ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
+ }
+ else
+ ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f);
+ return;
+ }
+
+ if(!pDM_Odm->ForceEDCCA)
+ {
+ if(pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI)
+ EDCCA_State = 1;
+ else if(pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5))
+ EDCCA_State = 0;
+ }
+ else
+ EDCCA_State = 1;
+
+ if(pDM_Odm->bLinked && pDM_Odm->Carrier_Sense_enable == FALSE && pDM_Odm->NHM_disable == FALSE &&pDM_Odm->TxHangFlg == FALSE)
+ odm_NHMBB(pDM_Odm);
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d\n",
+ (*pDM_Odm->pBandWidth==ODM_BW80M)?"80M":((*pDM_Odm->pBandWidth==ODM_BW40M)?"40M":"20M"), IGI_target, EDCCA_State));
+
+ if(EDCCA_State == 1)
+ {
+ Diff = IGI_target -(s1Byte)IGI;
+ TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
+ if(TH_L2H_dmc > 10)
+ TH_L2H_dmc = 10;
+
+ TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
+
+ //replace lower bound to prevent EDCCA always equal 1
+ if(TH_H2L_dmc < pDM_Odm->H2L_lb)
+ TH_H2L_dmc = pDM_Odm->H2L_lb;
+ if(TH_L2H_dmc < pDM_Odm->L2H_lb)
+ TH_L2H_dmc = pDM_Odm->L2H_lb;
+ }
+ else
+ {
+ TH_L2H_dmc = 0x7f;
+ TH_H2L_dmc = 0x7f;
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n",
+ IGI, TH_L2H_dmc, TH_H2L_dmc));
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ {
+ ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
+ ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
+ }
+ else
+ ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
+}
+
+int
+getIGIForDiff(int value_IGI)
+{
+ #define ONERCCA_LOW_TH 0x30
+ #define ONERCCA_LOW_DIFF 8
+
+ if (value_IGI < ONERCCA_LOW_TH) {
+ if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
+ return ONERCCA_LOW_TH;
+ else
+ return value_IGI + ONERCCA_LOW_DIFF;
+ } else {
+ return value_IGI;
+ }
+}
+
+VOID
+ODM_Write_DIG(
+ IN PVOID pDM_VOID,
+ IN u1Byte CurrentIGI
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+ if(pDM_DigTable->bStopDIG)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n"));
+ return;
+ }
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x \n",
+ ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));
+
+ if(pDM_DigTable->CurIGValue != CurrentIGI)
+ {
+ //1 Check initial gain by upper bound
+ if(!pDM_DigTable->bPSDInProgress)
+ {
+ if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x) is larger than upper bound !!\n",pDM_DigTable->rx_gain_range_max));
+ CurrentIGI = pDM_DigTable->rx_gain_range_max;
+ }
+
+ }
+
+ //1 Set IGI value
+ if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))
+ {
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+ if(pDM_Odm->RFType > ODM_1T1R)
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+ if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+ {
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+ }
+ }
+ else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
+ {
+ switch(*(pDM_Odm->pOnePathCCA))
+ {
+ case ODM_CCA_2R:
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+ if(pDM_Odm->RFType > ODM_1T1R)
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+
+ if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+ {
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+ }
+ break;
+ case ODM_CCA_1R_A:
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+ if(pDM_Odm->RFType != ODM_1T1R)
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
+ break;
+ case ODM_CCA_1R_B:
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
+ if(pDM_Odm->RFType != ODM_1T1R)
+ ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
+ break;
+ }
+ }
+ pDM_DigTable->CurIGValue = CurrentIGI;
+ }
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x). \n",CurrentIGI));
+
+}
+
+VOID
+odm_PauseDIG(
+ IN PVOID pDM_VOID,
+ IN ODM_Pause_DIG_TYPE PauseType,
+ IN u1Byte IGIValue
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+ static BOOLEAN bPaused = FALSE;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG()=========>\n"));
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ if(*pDM_DigTable->pbP2pLinkInProgress)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): P2P in progress !!\n"));
+ return;
+ }
+#endif
+
+ if((pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) && pDM_Odm->TxHangFlg == TRUE)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Dynamic adjust threshold in progress !!\n"));
+ return;
+ }
+
+ if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n"));
+ return;
+ }
+
+ switch(PauseType)
+ {
+ //1 Pause DIG
+ case ODM_PAUSE_DIG:
+ //2 Disable DIG
+ ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n"));
+
+ //2 Backup IGI value
+ if(!bPaused)
+ {
+ pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;
+ bPaused = TRUE;
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI = 0x%x\n", pDM_DigTable->IGIBackup));
+
+ //2 Write new IGI value
+ ODM_Write_DIG(pDM_Odm, IGIValue);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write new IGI = 0x%x\n", IGIValue));
+ break;
+
+ //1 Resume DIG
+ case ODM_RESUME_DIG:
+ if(bPaused)
+ {
+ //2 Write backup IGI value
+ ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);
+ bPaused = FALSE;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup));
+
+ //2 Enable DIG
+ ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n"));
+ }
+ break;
+
+ default:
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong type !!\n"));
+ break;
+ }
+}
+
+BOOLEAN
+odm_DigAbort(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ prtl8192cd_priv priv = pDM_Odm->priv;
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ PADAPTER pAdapter = pDM_Odm->Adapter;
+ pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
+#endif
+
+ //SupportAbility
+ if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));
+ return TRUE;
+ }
+
+ //SupportAbility
+ if(!(pDM_Odm->SupportAbility & ODM_BB_DIG))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));
+ return TRUE;
+ }
+
+ //ScanInProcess
+ if(*(pDM_Odm->pbScanInProcess))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress \n"));
+ return TRUE;
+ }
+
+ //add by Neil Chen to avoid PSD is processing
+ if(pDM_Odm->bDMInitialGainEnable == FALSE)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing \n"));
+ return TRUE;
+ }
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ #if OS_WIN_FROM_WIN7(OS_VERSION)
+ if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Is AP mode or In HCT Test \n"));
+ return TRUE;
+ }
+ #endif
+
+ if(pDM_Odm->bBtHsOperation)
+ {
+ odm_DigForBtHsMode(pDM_Odm);
+ }
+
+ if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))
+ {
+ if(pRX_HP_Table->RXHP_flag == 1)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In RXHP Operation \n"));
+ return TRUE;
+ }
+ }
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+ #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
+ if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))
+ {
+ printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);
+ ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
+ return TRUE;
+ }
+ #endif
+#else
+ if (!(priv->up_time > 5))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Not In DIG Operation Period \n"));
+ return TRUE;
+ }
+#endif
+
+ return FALSE;
+}
+
+VOID
+odm_DIGInit(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+ PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+
+ pDM_DigTable->bStopDIG = FALSE;
+ pDM_DigTable->bPSDInProgress = FALSE;
+ pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
+ pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW;
+ pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH;
+ pDM_DigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW;
+ pDM_DigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH;
+ pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
+ pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
+ pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
+ pDM_DigTable->PreCCK_CCAThres = 0xFF;
+ pDM_DigTable->CurCCK_CCAThres = 0x83;
+ pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
+ pDM_DigTable->LargeFAHit = 0;
+ pDM_DigTable->Recover_cnt = 0;
+ pDM_DigTable->bMediaConnect_0 = FALSE;
+ pDM_DigTable->bMediaConnect_1 = FALSE;
+
+ //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
+ pDM_Odm->bDMInitialGainEnable = TRUE;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ pDM_DigTable->DIG_Dynamic_MIN_0 = 0x25;
+ pDM_DigTable->DIG_Dynamic_MIN_1 = 0x25;
+
+ // For AP\ ADSL modified DIG
+ pDM_DigTable->bTpTarget = FALSE;
+ pDM_DigTable->bNoiseEst = TRUE;
+ pDM_DigTable->IGIOffset_A = 0;
+ pDM_DigTable->IGIOffset_B = 0;
+ pDM_DigTable->TpTrainTH_min = 0;
+
+ // For RTL8881A
+ FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
+
+ //Dyanmic EDCCA
+ if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+ {
+ ODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);
+ }
+#else
+ pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
+ pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
+
+ //To Initi BT30 IGI
+ pDM_DigTable->BT30_CurIGI=0x32;
+
+ #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ *pDM_DigTable->pbP2pLinkInProgress= FALSE;
+ #endif
+#endif
+
+ if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))
+ {
+ pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
+ pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
+ }
+ else
+ {
+ pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
+ pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
+ }
+
+}
+
+
+VOID
+odm_DIG(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ PADAPTER pAdapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
+#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ prtl8192cd_priv priv = pDM_Odm->priv;
+ PSTA_INFO_T pEntry;
+#endif
+
+ // Common parameters
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+ PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
+ BOOLEAN FirstConnect,FirstDisConnect;
+ u1Byte DIG_MaxOfMin, DIG_Dynamic_MIN, i;
+ u1Byte dm_dig_max, dm_dig_min;
+ u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
+ u1Byte offset;
+ u4Byte dm_FA_thres[3];
+ u1Byte Adap_IGI_Upper = 0;
+ u4Byte TxTp = 0, RxTp = 0;
+ BOOLEAN bDFSBand = FALSE;
+ BOOLEAN bPerformance = TRUE, bFirstTpTarget = FALSE, bFirstCoverage = FALSE;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ u4Byte TpTrainTH_MIN = DM_DIG_TP_Target_TH0;
+ static u1Byte TimeCnt = 0;
+#endif
+
+ if(odm_DigAbort(pDM_Odm) == TRUE)
+ return;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()===========================>\n\n"));
+
+ if(pDM_Odm->adaptivity_flag == TRUE)
+ Adap_IGI_Upper = pDM_Odm->Adaptivity_IGI_upper;
+
+
+ //1 Update status
+ if(pDM_Odm->SupportICType == ODM_RTL8192D)
+ {
+ if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
+ {
+ if(*(pDM_Odm->pbMasterOfDMSP))
+ {
+ DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
+ FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
+ FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
+ }
+ else
+ {
+ DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
+ FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
+ FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
+ }
+ }
+ else
+ {
+ if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
+ {
+ DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
+ FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
+ FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
+ }
+ else
+ {
+ DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
+ FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
+ FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
+ }
+ }
+ }
+ else
+ {
+ DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
+ FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
+ FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
+ }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ //1 Noise Floor Estimate
+ //pDM_DigTable->bNoiseEst = (FirstConnect)?TRUE:pDM_DigTable->bNoiseEst;
+ //odm_InbandNoiseCalculate (pDM_Odm);
+
+ //1 Mode decision
+ if(pDM_Odm->bLinked)
+ {
+ //2 Calculate total TP
+ for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
+ {
+ pEntry = pDM_Odm->pODM_StaInfo[i];
+ if(IS_STA_VALID(pEntry))
+ {
+ RxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);
+ TxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7); //Kbps
+ }
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\n", TxTp, RxTp));
+ }
+
+ switch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)
+ {
+ case 0:
+ {
+ bPerformance = TRUE;
+ break;
+ }
+ case 1:
+ {
+ bPerformance = FALSE;
+ break;
+ }
+ case 2:
+ {
+ if(pDM_Odm->bLinked)
+ {
+ if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)
+ TpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;
+
+ if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)
+ TpTrainTH_MIN = DM_DIG_TP_Target_TH1;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TP training mode lower bound = %dkbps\n", TpTrainTH_MIN));
+
+ //2 Decide DIG mode by total TP
+ if((TxTp + RxTp) > DM_DIG_TP_Target_TH1) // change to performance mode
+ {
+ bFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;
+ pDM_DigTable->bTpTarget = TRUE;
+ bPerformance = TRUE;
+ }
+ else if((TxTp + RxTp) < TpTrainTH_MIN) // change to coverage mode
+ {
+ bFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;
+
+ if(TimeCnt < DM_DIG_TP_Training_Period)
+ {
+ pDM_DigTable->bTpTarget = FALSE;
+ bPerformance = FALSE;
+ TimeCnt++;
+ }
+ else
+ {
+ pDM_DigTable->bTpTarget = TRUE;
+ bPerformance = TRUE;
+ bFirstTpTarget = TRUE;
+ TimeCnt = 0;
+ }
+ }
+ else // remain previous mode
+ {
+ bPerformance = pDM_DigTable->bTpTarget;
+
+ if(!bPerformance)
+ {
+ if(TimeCnt < DM_DIG_TP_Training_Period)
+ TimeCnt++;
+ else
+ {
+ pDM_DigTable->bTpTarget = TRUE;
+ bPerformance = TRUE;
+ bFirstTpTarget = TRUE;
+ TimeCnt = 0;
+ }
+ }
+ }
+
+ if(!bPerformance)
+ pDM_DigTable->TpTrainTH_min = RxTp + TxTp;
+
+ }
+ else
+ {
+ bPerformance = FALSE;
+ pDM_DigTable->TpTrainTH_min = 0;
+ }
+ break;
+ }
+ default:
+ bPerformance = TRUE;
+ }
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== DIG mode = %d ======\n", pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== bPerformance = %d ======\n", bPerformance));
+#endif
+
+ //1 Boundary Decision
+ if((pDM_Odm->SupportICType & ODM_RTL8192C) && (pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
+ {
+ //2 High power case
+ if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
+ {
+ dm_dig_max = DM_DIG_MAX_AP_HP;
+ dm_dig_min = DM_DIG_MIN_AP_HP;
+ }
+ else
+ {
+ dm_dig_max = DM_DIG_MAX_NIC_HP;
+ dm_dig_min = DM_DIG_MIN_NIC_HP;
+ }
+ DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
+ }
+ else
+ {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ //2 For AP\ADSL
+ if(!bPerformance)
+ {
+ dm_dig_max = DM_DIG_MAX_AP_COVERAGR;
+ dm_dig_min = DM_DIG_MIN_AP_COVERAGE;
+ DIG_MaxOfMin = DM_DIG_MAX_OF_MIN_COVERAGE;
+ }
+ else
+ {
+ dm_dig_max = DM_DIG_MAX_AP;
+ dm_dig_min = DM_DIG_MIN_AP;
+ DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;
+ }
+
+ //4 DFS band
+ if (((*pDM_Odm->pChannel>= 52) &&(*pDM_Odm->pChannel <= 64)) ||
+ ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))
+ {
+ bDFSBand = TRUE;
+ dm_dig_min = DM_DIG_MIN_AP_DFS;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): ====== In DFS band ======\n"));
+ }
+
+ //4 TX2path
+ if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))
+ dm_dig_max = 0x2A;
+
+#if RTL8192E_SUPPORT
+#ifdef HIGH_POWER_EXT_LNA
+ if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))
+ dm_dig_max = 0x42;
+#endif
+#endif
+
+#else
+ //2 For WIN\CE
+ if(pDM_Odm->SupportICType >= ODM_RTL8188E)
+ dm_dig_max = 0x5A;
+ else
+ dm_dig_max = DM_DIG_MAX_NIC;
+
+ if(pDM_Odm->SupportICType != ODM_RTL8821)
+ dm_dig_min = DM_DIG_MIN_NIC;
+ else
+ dm_dig_min = 0x1C;
+
+ DIG_MaxOfMin = DM_DIG_MAX_AP;
+#endif
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Absolutly upper bound = 0x%x, lower bound = 0x%x\n",dm_dig_max, dm_dig_min));
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ // for P2P case
+ if(0 < *pDM_Odm->pu1ForcedIgiLb)
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): P2P case: Force IGI lb to: %u !!!!!!\n", *pDM_Odm->pu1ForcedIgiLb));
+ dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
+ dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
+ }
+#endif
+
+ //1 Adjust boundary by RSSI
+ if(pDM_Odm->bLinked && bPerformance)
+ {
+ //2 Modify DIG upper bound
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ offset = 15;
+#else
+ //4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT
+ if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723A)) && (pDM_Odm->bBtLimitedDig==1))
+ {
+ offset = 10;
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));
+ }
+ else
+ offset = 15;
+#endif
+
+ if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )
+ pDM_DigTable->rx_gain_range_max = dm_dig_max;
+ else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )
+ pDM_DigTable->rx_gain_range_max = dm_dig_min;
+ else
+ pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ //2 Modify DIG lower bound
+ //if(pDM_Odm->bOneEntryOnly)
+ {
+ if(pDM_Odm->RSSI_Min < dm_dig_min)
+ DIG_Dynamic_MIN = dm_dig_min;
+ else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
+ DIG_Dynamic_MIN = DIG_MaxOfMin;
+ else
+ DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
+ }
+#else
+ {
+ //4 For AP
+#ifdef __ECOS
+ HAL_REORDER_BARRIER();
+#else
+ rmb();
+#endif
+ if (bDFSBand)
+ {
+ DIG_Dynamic_MIN = dm_dig_min;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force lower bound to 0x%x after link !!!!!!\n", dm_dig_min));
+ }
+ else
+ {
+ if(pDM_Odm->RSSI_Min < dm_dig_min)
+ DIG_Dynamic_MIN = dm_dig_min;
+ else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
+ DIG_Dynamic_MIN = DIG_MaxOfMin;
+ else
+ DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
+ }
+ }
+#endif
+ }
+ else
+ {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ if(bPerformance && bDFSBand)
+ {
+ pDM_DigTable->rx_gain_range_max = 0x28;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force upper bound to 0x%x before link !!!!!!\n", pDM_DigTable->rx_gain_range_max));
+ }
+ else
+#endif
+ {
+ pDM_DigTable->rx_gain_range_max = dm_dig_max;
+ }
+ DIG_Dynamic_MIN = dm_dig_min;
+ }
+
+ //1 Force Lower Bound for AntDiv
+ if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)
+ {
+ if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
+ {
+ if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
+ {
+ if(pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)
+ DIG_Dynamic_MIN = DIG_MaxOfMin;
+ else
+ DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: Force lower bound to 0x%x !!!!!!\n", DIG_Dynamic_MIN));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: RSSI_max = 0x%x !!!!!!\n", pDM_DigTable->AntDiv_RSSI_max));
+ }
+ }
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\n",
+ pDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Link status: bLinked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\n\n",
+ pDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));
+
+ //1 Modify DIG lower bound, deal with abnormal case
+ //2 Abnormal false alarm case
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ if(bDFSBand)
+ {
+ pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
+ }
+ else
+#endif
+ {
+ if(FirstDisConnect)
+ {
+ pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
+ pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;
+ }
+ else
+ pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);
+ }
+
+ //2 Abnormal # beacon case
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(pAdapter))
+ pDM_Odm->bsta_state = TRUE;
+#endif
+
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ if(pDM_Odm->bLinked && !FirstConnect)
+ {
+ if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))
+ {
+ pDM_DigTable->rx_gain_range_min = dm_dig_min;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal #beacon (%d) case in STA mode: Force lower bound to 0x%x !!!!!!\n\n",
+ pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));
+ }
+ }
+#endif
+
+ //2 Abnormal lower bound case
+ if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
+ {
+ pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal lower bound case: Force lower bound to 0x%x !!!!!!\n\n",pDM_DigTable->rx_gain_range_min));
+ }
+
+
+ //1 False alarm threshold decision
+ odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): False alarm threshold = %d, %d, %d \n\n", dm_FA_thres[0], dm_FA_thres[1], dm_FA_thres[2]));
+
+ //1 Adjust initial gain by false alarm
+ if(pDM_Odm->bLinked && bPerformance)
+ {
+ //2 After link
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));
+
+ if(bFirstTpTarget || (FirstConnect && bPerformance))
+ {
+ pDM_DigTable->LargeFAHit = 0;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ if(bDFSBand)
+ {
+ if(pDM_Odm->RSSI_Min > 0x28)
+ CurrentIGI = 0x28;
+ else
+ CurrentIGI = pDM_Odm->RSSI_Min;
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\n"));
+ }
+ else
+#endif
+ {
+ if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)
+ {
+ if(CurrentIGI < pDM_Odm->RSSI_Min)
+ CurrentIGI = pDM_Odm->RSSI_Min;
+ }
+ else
+ {
+ if(CurrentIGI < DIG_MaxOfMin)
+ CurrentIGI = DIG_MaxOfMin;
+ }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ if(pDM_Odm->SupportICType == ODM_RTL8812)
+ ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);
+#endif
+ }
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First connect case: IGI does on-shot to 0x%x\n", CurrentIGI));
+
+ }
+ else
+ {
+ if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
+ CurrentIGI = CurrentIGI + 4;
+ else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
+ CurrentIGI = CurrentIGI + 2;
+ else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
+ CurrentIGI = CurrentIGI - 2;
+
+ //4 Abnormal # beacon case
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(pAdapter)) //STA mode is linked to AP
+ pDM_Odm->bsta_state = _TRUE;
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
+ {
+ CurrentIGI = pDM_DigTable->rx_gain_range_min;
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\n",
+ pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));
+ }
+#endif
+ }
+ }
+ else
+ {
+ //2 Before link
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));
+
+ if(FirstDisConnect || bFirstCoverage)
+ {
+ CurrentIGI = dm_dig_min;
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n"));
+ }
+ else
+ {
+ if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
+ CurrentIGI = CurrentIGI + 4;
+ else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
+ CurrentIGI = CurrentIGI + 2;
+ else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
+ CurrentIGI = CurrentIGI - 2;
+ }
+ }
+
+ //1 Check initial gain by upper/lower bound
+ if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
+ CurrentIGI = pDM_DigTable->rx_gain_range_min;
+
+ if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
+ CurrentIGI = pDM_DigTable->rx_gain_range_max;
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x, TotalFA = %d\n\n", CurrentIGI, pFalseAlmCnt->Cnt_all));
+
+ //1 Force upper bound and lower bound for adaptivity
+ if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)
+ {
+ if(CurrentIGI > Adap_IGI_Upper)
+ CurrentIGI = Adap_IGI_Upper;
+
+ if(pDM_Odm->IGI_LowerBound != 0)
+ {
+ if(CurrentIGI < pDM_Odm->IGI_LowerBound)
+ CurrentIGI = pDM_Odm->IGI_LowerBound;
+ }
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", Adap_IGI_Upper));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force lower bound to 0x%x !!!!!!\n\n", pDM_Odm->IGI_LowerBound));
+ }
+
+
+ //1 High power RSSI threshold
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
+ {
+ // High power IGI lower bound
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
+ if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue));
+ //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
+ CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
+ }
+ }
+ if((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))
+ {
+ if(pHalData->UndecoratedSmoothedPWDB > 0x28)
+ {
+ if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
+ {
+ //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
+ CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
+ }
+ }
+ }
+#endif
+
+ //1 Update status
+#if (RTL8192D_SUPPORT==1)
+ if(pDM_Odm->SupportICType == ODM_RTL8192D)
+ {
+ //sherry delete DualMacSmartConncurrent 20110517
+ if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
+ {
+ ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
+ if(*(pDM_Odm->pbMasterOfDMSP))
+ {
+ pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+ pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
+ }
+ else
+ {
+ pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
+ pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
+ }
+ }
+ else
+ {
+ ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+ if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
+ {
+ pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+ pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
+ }
+ else
+ {
+ pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
+ pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
+ }
+ }
+ }
+ else
+#endif
+ {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ if(pDM_Odm->bBtHsOperation)
+ {
+ if(pDM_Odm->bLinked)
+ {
+ if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
+ ODM_Write_DIG(pDM_Odm, CurrentIGI);
+ else
+ ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
+
+ pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+ pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
+ }
+ else
+ {
+ if(pDM_Odm->bLinkInProcess)
+ ODM_Write_DIG(pDM_Odm, 0x1c);
+ else if(pDM_Odm->bBtConnectProcess)
+ ODM_Write_DIG(pDM_Odm, 0x28);
+ else
+ ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+ }
+ }
+ else // BT is not using
+#endif
+ {
+ ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+ pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
+ pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
+ }
+ }
+}
+
+VOID
+odm_DIGbyRSSI_LPS(
+ IN PVOID pDM_VOID
+ )
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_CE)
+#if 0 //and 2.3.5 coding rule
+ struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv);
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
+ struct dm_priv *pdmpriv = &pHalData->dmpriv;
+#endif
+#endif
+
+ u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C
+ u1Byte CurrentIGI=pDM_Odm->RSSI_Min;
+
+ CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));
+
+ // Using FW PS mode to make IGI
+ //Adjust by FA in LPS MODE
+ if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
+ CurrentIGI = CurrentIGI+4;
+ else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
+ CurrentIGI = CurrentIGI+2;
+ else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
+ CurrentIGI = CurrentIGI-2;
+
+
+ //Lower bound checking
+
+ //RSSI Lower bound check
+ if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
+ RSSI_Lower =(pDM_Odm->RSSI_Min-10);
+ else
+ RSSI_Lower =DM_DIG_MIN_NIC;
+
+ //Upper and Lower Bound checking
+ if(CurrentIGI > DM_DIG_MAX_NIC)
+ CurrentIGI=DM_DIG_MAX_NIC;
+ else if(CurrentIGI < RSSI_Lower)
+ CurrentIGI =RSSI_Lower;
+
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n",pFalseAlmCnt->Cnt_all));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n",pDM_Odm->RSSI_Min));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n",CurrentIGI));
+
+ ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
+#endif
+}
+
+VOID
+odm_DigForBtHsMode(
+ IN PVOID pDM_VOID
+ )
+{
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable=&pDM_Odm->DM_DigTable;
+ u1Byte digForBtHs=0;
+ u1Byte digUpBound=0x5a;
+
+ if(pDM_Odm->bBtConnectProcess)
+ {
+ if(pDM_Odm->SupportICType&(ODM_RTL8723A))
+ digForBtHs = 0x28;
+ else
+ digForBtHs = 0x22;
+ }
+ else
+ {
+ //
+ // Decide DIG value by BT HS RSSI.
+ //
+ digForBtHs = pDM_Odm->btHsRssi+4;
+
+ //DIG Bound
+ if(pDM_Odm->SupportICType&(ODM_RTL8723A))
+ digUpBound = 0x3e;
+
+ if(digForBtHs > digUpBound)
+ digForBtHs = digUpBound;
+ if(digForBtHs < 0x1c)
+ digForBtHs = 0x1c;
+
+ // update Current IGI
+ pDM_DigTable->BT30_CurIGI = digForBtHs;
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs));
+#endif
+}
+
+
+//3============================================================
+//3 FASLE ALARM CHECK
+//3============================================================
+
+VOID
+odm_FalseAlarmCounterStatistics(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+ u4Byte ret_value;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+//Mark there, and check this in odm_DMWatchDog
+#if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)
+ prtl8192cd_priv priv = pDM_Odm->priv;
+ if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
+ return;
+#endif
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ if((pDM_Odm->SupportICType == ODM_RTL8192D) &&
+ (*(pDM_Odm->pMacPhyMode)==ODM_DMSP)&& ////modify by Guo.Mingzhi 2011-12-29
+ (!(*(pDM_Odm->pbMasterOfDMSP))))
+ {
+ odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
+ return;
+ }
+#endif
+
+ if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
+ return;
+
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ {
+
+ //hold ofdm counter
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
+
+ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
+ FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
+ FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
+
+ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
+ FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff);
+ FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
+
+ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
+ FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
+ FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
+
+ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
+ FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
+
+ FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
+ FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
+ FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
+
+#if (RTL8188E_SUPPORT==1)
+ if(pDM_Odm->SupportICType == ODM_RTL8188E)
+ {
+ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
+ FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
+ FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
+ }
+#endif
+
+#if (RTL8192D_SUPPORT==1)
+ if(pDM_Odm->SupportICType == ODM_RTL8192D)
+ {
+ odm_GetCCKFalseAlarm_92D(pDM_Odm);
+ }
+ else
+#endif
+ {
+ //hold cck counter
+ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1);
+
+ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
+ FalseAlmCnt->Cnt_Cck_fail = ret_value;
+
+ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
+ FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
+
+ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
+ FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
+ }
+
+ FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Fast_Fsync +
+ FalseAlmCnt->Cnt_SB_Search_fail +
+ FalseAlmCnt->Cnt_Parity_Fail +
+ FalseAlmCnt->Cnt_Rate_Illegal +
+ FalseAlmCnt->Cnt_Crc8_fail +
+ FalseAlmCnt->Cnt_Mcs_fail +
+ FalseAlmCnt->Cnt_Cck_fail);
+
+ FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
+
+#if (RTL8192C_SUPPORT==1)
+ if(pDM_Odm->SupportICType == ODM_RTL8192C)
+ odm_ResetFACounter_92C(pDM_Odm);
+#endif
+
+#if (RTL8192D_SUPPORT==1)
+ if(pDM_Odm->SupportICType == ODM_RTL8192D)
+ odm_ResetFACounter_92D(pDM_Odm);
+#endif
+
+ if(pDM_Odm->SupportICType >=ODM_RTL8723A)
+ {
+ //reset false alarm counter registers
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
+
+ //update ofdm counter
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
+
+ //reset CCK CCA counter
+ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2);
+ //reset CCK FA counter
+ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2);
+ }
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
+ FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
+ FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
+ FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
+ }
+ else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
+ {
+ u4Byte CCKenable;
+ u4Byte Cnt_Ofdm_fail_temp = 0;
+
+ //read OFDM FA counter
+ FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
+ FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
+
+ //read CCK/OFDM CCA counter
+ ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);
+ FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;
+ FalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;
+
+ // For 8881A
+ if(pDM_Odm->SupportICType == ODM_RTL8881A)
+ {
+ if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)
+ {
+ Cnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;
+ FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
+ FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;
+ }
+ else
+ FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail_pre));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail_pre=%d\n", Cnt_Ofdm_fail_temp));
+
+ // Reset FA counter by enable/disable OFDM
+ if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)
+ {
+ // reset OFDM
+ ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);
+ FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Reset false alarm counter\n"));
+ }
+ }
+
+ // reset OFDM FA coutner
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
+
+ // reset CCK FA counter
+ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
+
+ // reset CCA counter
+ ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);
+ ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);
+
+ CCKenable = ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
+ if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
+ {
+ FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
+ FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;
+ }
+ else
+ {
+ FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
+ FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;
+ }
+
+ }
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_OFDM_CCA=%d\n", FalseAlmCnt->Cnt_OFDM_CCA));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCK_CCA=%d\n", FalseAlmCnt->Cnt_CCK_CCA));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCA_all=%d\n", FalseAlmCnt->Cnt_CCA_all));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n", FalseAlmCnt->Cnt_all));
+}
+
+
+VOID
+odm_FAThresholdCheck(
+ IN PVOID pDM_VOID,
+ IN BOOLEAN bDFSBand,
+ IN BOOLEAN bPerformance,
+ IN u4Byte RxTp,
+ IN u4Byte TxTp,
+ OUT u4Byte* dm_FA_thres
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+ if(pDM_Odm->bLinked && (bPerformance||bDFSBand))
+ {
+ if(pDM_Odm->SupportICType == ODM_RTL8192D)
+ {
+ // 8192D special case
+ dm_FA_thres[0] = DM_DIG_FA_TH0_92D;
+ dm_FA_thres[1] = DM_DIG_FA_TH1_92D;
+ dm_FA_thres[2] = DM_DIG_FA_TH2_92D;
+ }
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
+ {
+ // For AP
+ if((RxTp>>2) > TxTp && RxTp < 10000 && RxTp > 500) // 10Mbps & 0.5Mbps
+ {
+ dm_FA_thres[0] = 0x080;
+ dm_FA_thres[1] = 0x100;
+ dm_FA_thres[2] = 0x200;
+ }
+ else
+ {
+ dm_FA_thres[0] = 0x100;
+ dm_FA_thres[1] = 0x200;
+ dm_FA_thres[2] = 0x300;
+ }
+ }
+#else
+ else if(pDM_Odm->SupportICType == ODM_RTL8723A && pDM_Odm->bBtLimitedDig)
+ {
+ // 8723A BT special case
+ dm_FA_thres[0] = DM_DIG_FA_TH0;
+ dm_FA_thres[1] = 0x250;
+ dm_FA_thres[2] = 0x300;
+ }
+#endif
+ else
+ {
+ // For NIC
+ dm_FA_thres[0] = DM_DIG_FA_TH0;
+ dm_FA_thres[1] = DM_DIG_FA_TH1;
+ dm_FA_thres[2] = DM_DIG_FA_TH2;
+ }
+ }
+ else
+ {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ if(bDFSBand)
+ {
+ // For DFS band and no link
+ dm_FA_thres[0] = 250;
+ dm_FA_thres[1] = 1000;
+ dm_FA_thres[2] = 2000;
+ }
+ else
+#endif
+ {
+ dm_FA_thres[0] = 2000;
+ dm_FA_thres[1] = 4000;
+ dm_FA_thres[2] = 5000;
+ }
+ }
+ return;
+}
+
+u1Byte
+odm_ForbiddenIGICheck(
+ IN PVOID pDM_VOID,
+ IN u1Byte DIG_Dynamic_MIN,
+ IN u1Byte CurrentIGI
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+ PFALSE_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+ u1Byte rx_gain_range_min = pDM_DigTable->rx_gain_range_min;
+
+ if(pFalseAlmCnt->Cnt_all > 10000)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case. \n"));
+
+ if(pDM_DigTable->LargeFAHit != 3)
+ pDM_DigTable->LargeFAHit++;
+
+ if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)
+ {
+ pDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
+ pDM_DigTable->LargeFAHit = 1;
+ }
+
+ if(pDM_DigTable->LargeFAHit >= 3)
+ {
+ if((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max)
+ rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
+ else
+ rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
+ pDM_DigTable->Recover_cnt = 1800;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case: Recover_cnt = %d \n", pDM_DigTable->Recover_cnt));
+ }
+ }
+ else
+ {
+ if(pDM_DigTable->Recover_cnt != 0)
+ {
+ pDM_DigTable->Recover_cnt --;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Recover_cnt = %d \n", pDM_DigTable->Recover_cnt));
+ }
+ else
+ {
+ if(pDM_DigTable->LargeFAHit < 3)
+ {
+ if((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) //DM_DIG_MIN)
+ {
+ pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
+ rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));
+ }
+ else
+ {
+ pDM_DigTable->ForbiddenIGI -= 2;
+ rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
+ }
+ }
+ else
+ {
+ pDM_DigTable->LargeFAHit = 0;
+ }
+ }
+ }
+
+ return rx_gain_range_min;
+
+}
+
+VOID
+odm_InbandNoiseCalculate (
+ IN PVOID pDM_VOID
+ )
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+ u1Byte IGIBackup, TimeCnt = 0, ValidCnt = 0;
+ BOOLEAN bTimeout = TRUE;
+ s1Byte sNoise_A, sNoise_B;
+ s4Byte NoiseRpt_A = 0,NoiseRpt_B = 0;
+ u4Byte tmp = 0;
+ static u1Byte failCnt = 0;
+
+ if(!(pDM_Odm->SupportICType & (ODM_RTL8192E)))
+ return;
+
+ if(pDM_Odm->RFType == ODM_1T1R || *(pDM_Odm->pOnePathCCA) != ODM_CCA_2R)
+ return;
+
+ if(!pDM_DigTable->bNoiseEst)
+ return;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_InbandNoiseEstimate()========>\n"));
+
+ //1 Set initial gain.
+ IGIBackup = pDM_DigTable->CurIGValue;
+ pDM_DigTable->IGIOffset_A = 0;
+ pDM_DigTable->IGIOffset_B = 0;
+ ODM_Write_DIG(pDM_Odm, 0x24);
+
+ //1 Update idle time power report
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x0);
+
+ delay_ms(2);
+
+ //1 Get noise power level
+ while(1)
+ {
+ //2 Read Noise Floor Report
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ tmp = ODM_GetBBReg(pDM_Odm, 0x8f8, bMaskLWord);
+
+ sNoise_A = (s1Byte)(tmp & 0xff);
+ sNoise_B = (s1Byte)((tmp & 0xff00)>>8);
+
+ //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
+
+ if((sNoise_A < 20 && sNoise_A >= -70) && (sNoise_B < 20 && sNoise_B >= -70))
+ {
+ ValidCnt++;
+ NoiseRpt_A += sNoise_A;
+ NoiseRpt_B += sNoise_B;
+ //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
+ }
+
+ TimeCnt++;
+ bTimeout = (TimeCnt >= 150)?TRUE:FALSE;
+
+ if(ValidCnt == 20 || bTimeout)
+ break;
+
+ delay_ms(2);
+
+ }
+
+ //1 Keep idle time power report
+ if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
+ ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x1);
+
+ //1 Recover IGI
+ ODM_Write_DIG(pDM_Odm, IGIBackup);
+
+ //1 Calculate Noise Floor
+ if(ValidCnt != 0)
+ {
+ NoiseRpt_A /= (ValidCnt<<1);
+ NoiseRpt_B /= (ValidCnt<<1);
+ }
+
+ if(bTimeout)
+ {
+ NoiseRpt_A = 0;
+ NoiseRpt_B = 0;
+
+ failCnt ++;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Noise estimate fail time = %d\n", failCnt));
+
+ if(failCnt == 3)
+ {
+ failCnt = 0;
+ pDM_DigTable->bNoiseEst = FALSE;
+ }
+ }
+ else
+ {
+ NoiseRpt_A = -110 + 0x24 + NoiseRpt_A -6;
+ NoiseRpt_B = -110 + 0x24 + NoiseRpt_B -6;
+ pDM_DigTable->bNoiseEst = FALSE;
+ failCnt = 0;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NoiseRpt_A = %d, NoiseRpt_B = %d\n", NoiseRpt_A, NoiseRpt_B));
+ }
+
+ //1 Calculate IGI Offset
+ if(NoiseRpt_A > NoiseRpt_B)
+ {
+ pDM_DigTable->IGIOffset_A = NoiseRpt_A - NoiseRpt_B;
+ pDM_DigTable->IGIOffset_B = 0;
+ }
+ else
+ {
+ pDM_DigTable->IGIOffset_A = 0;
+ pDM_DigTable->IGIOffset_B = NoiseRpt_B - NoiseRpt_A;
+ }
+
+#endif
+ return;
+}
+
+//3============================================================
+//3 CCK Packet Detect Threshold
+//3============================================================
+
+VOID
+odm_PauseCCKPacketDetection(
+ IN PVOID pDM_VOID,
+ IN ODM_Pause_CCKPD_TYPE PauseType,
+ IN u1Byte CCKPDThreshold
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+ static BOOLEAN bPaused = FALSE;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========>\n"));
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ if(*pDM_DigTable->pbP2pLinkInProgress)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("P2P in progress !!\n"));
+ return;
+ }
+#endif
+
+ if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Return: SupportAbility ODM_BB_CCK_PD or ODM_BB_FA_CNT is disabled\n"));
+ return;
+ }
+
+ switch(PauseType)
+ {
+ //1 Pause CCK Packet Detection Threshold
+ case ODM_PAUSE_CCKPD:
+ //2 Disable DIG
+ ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Pause CCK packet detection threshold !!\n"));
+
+ //2 Backup CCK Packet Detection Threshold value
+ if(!bPaused)
+ {
+ pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;
+ bPaused = TRUE;
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Backup CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
+
+ //2 Write new CCK Packet Detection Threshold value
+ ODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write new CCK packet detection tgreshold = %d\n", CCKPDThreshold));
+ break;
+
+ //1 Resume CCK Packet Detection Threshold
+ case ODM_RESUME_CCKPD:
+ if(bPaused)
+ {
+ //2 Write backup CCK Packet Detection Threshold value
+ ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);
+ bPaused = FALSE;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write original CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
+
+ //2 Enable CCK Packet Detection Threshold
+ ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Resume CCK packet detection threshold !!\n"));
+ }
+ break;
+
+ default:
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Wrong type !!\n"));
+ break;
+ }
+ return;
+}
+
+
+VOID
+odm_CCKPacketDetectionThresh(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
+ u1Byte CurCCK_CCAThres;
+
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+//modify by Guo.Mingzhi 2011-12-29
+ if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
+// if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
+ return;
+ if(pDM_Odm->bBtHsOperation)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
+ ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
+ return;
+ }
+#endif
+
+ if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() return==========\n"));
+ return;
+ }
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ if(pDM_Odm->ExtLNA)
+ return;
+#endif
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() ==========>\n"));
+
+ if(pDM_Odm->bLinked)
+ {
+ if(pDM_Odm->RSSI_Min > 25)
+ CurCCK_CCAThres = 0xcd;
+ else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
+ CurCCK_CCAThres = 0x83;
+ else
+ {
+ if(FalseAlmCnt->Cnt_Cck_fail > 1000)
+ CurCCK_CCAThres = 0x83;
+ else
+ CurCCK_CCAThres = 0x40;
+ }
+ }
+ else
+ {
+ if(FalseAlmCnt->Cnt_Cck_fail > 1000)
+ CurCCK_CCAThres = 0x83;
+ else
+ CurCCK_CCAThres = 0x40;
+ }
+
+#if (RTL8192D_SUPPORT==1)
+ if((pDM_Odm->SupportICType == ODM_RTL8192D) && (*pDM_Odm->pBandType == ODM_BAND_2_4G))
+ ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
+ else
+#endif
+ ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() CurCCK_CCAThres = 0x%x\n",CurCCK_CCAThres));
+}
+
+VOID
+ODM_Write_CCK_CCA_Thres(
+ IN PVOID pDM_VOID,
+ IN u1Byte CurCCK_CCAThres
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+ if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres) //modify by Guo.Mingzhi 2012-01-03
+ {
+ ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
+ }
+ pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
+ pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
+}
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+VOID
+odm_EnableEDCCA(
+ IN PVOID pDM_VOID
+)
+{
+
+ // This should be moved out of OUTSRC
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PADAPTER pAdapter = pDM_Odm->Adapter;
+ // Enable EDCCA. The value is suggested by SD3 Wilson.
+
+ //
+ // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
+ //
+ if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
+ {
+ //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x00);
+ ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x00);
+ ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0xFD);
+
+ }
+ else
+ {
+ //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x03);
+ ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x03);
+ ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0x00);
+ }
+
+ //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold+2, 0x00);
+}
+
+VOID
+odm_DisableEDCCA(
+ IN PVOID pDM_VOID
+)
+{
+ // Disable EDCCA..
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);
+ ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 0x7f);
+}
+
+//
+// Description: According to initial gain value to determine to enable or disable EDCCA.
+//
+// Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
+//
+VOID
+odm_DynamicEDCCA(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PADAPTER pAdapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
+ u1Byte RegC50, RegC58;
+ BOOLEAN bEDCCAenable = FALSE;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+ BOOLEAN bFwCurrentInPSMode=FALSE;
+
+ pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));
+
+ // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
+ if(bFwCurrentInPSMode)
+ return;
+#endif
+ //
+ // 2013/11/14 Ken According to BB team Jame's suggestion, we need to disable soft AP mode EDCCA.
+ // 2014/01/08 MH For Miracst AP mode test. We need to disable EDCCA. Otherwise, we may stop
+ // to send beacon in noisy environment or platform.
+ //
+ if(ACTING_AS_AP(pAdapter) || ACTING_AS_AP(GetFirstAPAdapter(pAdapter)))
+ //if(ACTING_AS_AP(pAdapter))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("At least One Port as AP disable EDCCA\n"));
+ odm_DisableEDCCA(pDM_Odm);
+ if(pHalData->bPreEdccaEnable)
+ odm_DisableEDCCA(pDM_Odm);
+ pHalData->bPreEdccaEnable = FALSE;
+ return;
+ }
+
+ RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
+ RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0);
+
+
+ if((RegC50 > 0x28 && RegC58 > 0x28) ||
+ ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26)) ||
+ (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28))
+ {
+ if(!pHalData->bPreEdccaEnable)
+ {
+ odm_EnableEDCCA(pDM_Odm);
+ pHalData->bPreEdccaEnable = TRUE;
+ }
+
+ }
+ else if((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25))
+ {
+ if(pHalData->bPreEdccaEnable)
+ {
+ odm_DisableEDCCA(pDM_Odm);
+ pHalData->bPreEdccaEnable = FALSE;
+ }
+ }
+}
+
+// <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
+VOID
+odm_RFEControl(
+ IN PDM_ODM_T pDM_Odm,
+ IN u8Byte RSSIVal
+ )
+{
+ PADAPTER Adapter = (PADAPTER)pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ static u1Byte TRSW_HighPwr = 0;
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
+ RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
+
+ if (pHalData->RFEType == 3) {
+
+ pDM_Odm->RSSI_TRSW = RSSIVal;
+
+ if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H)
+ {
+ TRSW_HighPwr = 1; // Switch to
+ PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
+ PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); // Set ANTSW=1/ANTSWB=0 for SW control
+
+ }
+ else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L)
+ {
+ TRSW_HighPwr = 0; // Switched back
+ PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
+ PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0); // Set ANTSW=1/ANTSWB=0 for SW control
+
+ }
+ }
+
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\n", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n",
+ RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));
+}
+
+VOID
+odm_MPT_DIGWorkItemCallback(
+ IN PVOID pContext
+ )
+{
+ PADAPTER Adapter = (PADAPTER)pContext;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
+
+ ODM_MPT_DIG(pDM_Odm);
+}
+
+VOID
+odm_MPT_DIGCallback(
+ PRT_TIMER pTimer
+)
+{
+ PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
+
+
+ #if DEV_BUS_TYPE==RT_PCI_INTERFACE
+ #if USE_WORKITEM
+ PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
+ #else
+ ODM_MPT_DIG(pDM_Odm);
+ #endif
+ #else
+ PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
+ #endif
+
+}
+
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+VOID
+odm_MPT_DIGCallback(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if USE_WORKITEM
+ PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
+#else
+ ODM_MPT_DIG(pDM_Odm);
+#endif
+}
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE != ODM_CE)
+VOID
+odm_MPT_Write_DIG(
+ IN PVOID pDM_VOID,
+ IN u1Byte CurIGValue
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+ ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);
+
+ if(pDM_Odm->RFType > ODM_1T1R)
+ ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);
+
+ if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
+ {
+ ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);
+ ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);
+ }
+
+ pDM_DigTable->CurIGValue = CurIGValue;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurIGValue = 0x%x\n", CurIGValue));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("pDM_Odm->RFType = 0x%x\n", pDM_Odm->RFType));
+}
+
+VOID
+ODM_MPT_DIG(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+ PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
+ u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
+ u1Byte DIG_Upper = 0x40, DIG_Lower = 0x20;
+ u4Byte RXOK_cal;
+ u4Byte RxPWDBAve_final;
+ u1Byte IGI_A = 0x20, IGI_B = 0x20;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+ #if ODM_FIX_2G_DIG
+ IGI_A = 0x22;
+ IGI_B = 0x24;
+ #endif
+
+#else
+ if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))
+ return;
+
+ if (*pDM_Odm->pBandType == ODM_BAND_5G)
+ DIG_Lower = 0x22;
+#endif
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
+
+#if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)))
+ if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & ODM_RTL8814A)) // for 5G or 8814
+#else
+ if (1) // for both 2G/5G
+#endif
+ {
+ odm_FalseAlarmCounterStatistics(pDM_Odm);
+
+ RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
+ RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;
+
+ pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
+ pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
+ pDM_Odm->RxPWDBAve = 0;
+ pDM_Odm->MPDIG_2G = FALSE;
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ pDM_Odm->Times_2G = 0;
+#endif
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final));
+
+ if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)
+ {
+ if (CurrentIGI > 0x24)
+ odm_MPT_Write_DIG(pDM_Odm, 0x24);
+ }
+ else
+ {
+ if(pFalseAlmCnt->Cnt_all > 1000){
+ CurrentIGI = CurrentIGI + 8;
+ }
+ else if(pFalseAlmCnt->Cnt_all > 200){
+ CurrentIGI = CurrentIGI + 4;
+ }
+ else if (pFalseAlmCnt->Cnt_all > 50){
+ CurrentIGI = CurrentIGI + 2;
+ }
+ else if (pFalseAlmCnt->Cnt_all < 2){
+ CurrentIGI = CurrentIGI - 2;
+ }
+
+ if (CurrentIGI < DIG_Lower ){
+ CurrentIGI = DIG_Lower;
+ }
+
+ if(CurrentIGI > DIG_Upper){
+ CurrentIGI = DIG_Upper;
+ }
+
+ odm_MPT_Write_DIG(pDM_Odm, CurrentIGI);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG = 0x%x, Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n",
+ CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
+ }
+ }
+ else
+ {
+ if(pDM_Odm->MPDIG_2G == FALSE)
+ {
+ if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & ODM_RTL8814A))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n"));
+ ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);
+ ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);
+ pDM_DigTable->CurIGValue = IGI_B;
+ }
+ else
+ odm_MPT_Write_DIG(pDM_Odm, IGI_A);
+ }
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ pDM_Odm->Times_2G++;
+
+ if (pDM_Odm->Times_2G == 3)
+#endif
+ {
+ pDM_Odm->MPDIG_2G = TRUE;
+ }
+ }
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ if (pDM_Odm->SupportICType == ODM_RTL8812)
+ odm_RFEControl(pDM_Odm, RxPWDBAve_final);
+#endif
+
+ ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);
+}
+#endif
diff --git a/rtl8723BS/hal/OUTSRC/odm_DIG.h b/rtl8723BS/hal/OUTSRC/odm_DIG.h
new file mode 100755
index 0000000..8a9479a
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_DIG.h
@@ -0,0 +1,395 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#ifndef __ODMDIG_H__
+#define __ODMDIG_H__
+
+typedef struct _Dynamic_Initial_Gain_Threshold_
+{
+ BOOLEAN bStopDIG;
+ BOOLEAN bPSDInProgress;
+
+ u1Byte Dig_Enable_Flag;
+ u1Byte Dig_Ext_Port_Stage;
+
+ int RssiLowThresh;
+ int RssiHighThresh;
+
+ u4Byte FALowThresh;
+ u4Byte FAHighThresh;
+
+ u1Byte CurSTAConnectState;
+ u1Byte PreSTAConnectState;
+ u1Byte CurMultiSTAConnectState;
+
+ u1Byte PreIGValue;
+ u1Byte CurIGValue;
+ u1Byte BackupIGValue; //MP DIG
+ u1Byte BT30_CurIGI;
+ u1Byte IGIBackup;
+
+ s1Byte BackoffVal;
+ s1Byte BackoffVal_range_max;
+ s1Byte BackoffVal_range_min;
+ u1Byte rx_gain_range_max;
+ u1Byte rx_gain_range_min;
+ u1Byte Rssi_val_min;
+
+ u1Byte PreCCK_CCAThres;
+ u1Byte CurCCK_CCAThres;
+ u1Byte PreCCKPDState;
+ u1Byte CurCCKPDState;
+ u1Byte CCKPDBackup;
+
+ u1Byte LargeFAHit;
+ u1Byte ForbiddenIGI;
+ u4Byte Recover_cnt;
+
+ u1Byte DIG_Dynamic_MIN_0;
+ u1Byte DIG_Dynamic_MIN_1;
+ BOOLEAN bMediaConnect_0;
+ BOOLEAN bMediaConnect_1;
+
+ u4Byte AntDiv_RSSI_max;
+ u4Byte RSSI_max;
+
+ u1Byte *pbP2pLinkInProgress;
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ BOOLEAN bTpTarget;
+ BOOLEAN bNoiseEst;
+ u4Byte TpTrainTH_min;
+ u1Byte IGIOffset_A;
+ u1Byte IGIOffset_B;
+#endif
+}DIG_T,*pDIG_T;
+
+typedef struct _FALSE_ALARM_STATISTICS{
+ u4Byte Cnt_Parity_Fail;
+ u4Byte Cnt_Rate_Illegal;
+ u4Byte Cnt_Crc8_fail;
+ u4Byte Cnt_Mcs_fail;
+ u4Byte Cnt_Ofdm_fail;
+ u4Byte Cnt_Ofdm_fail_pre; //For RTL8881A
+ u4Byte Cnt_Cck_fail;
+ u4Byte Cnt_all;
+ u4Byte Cnt_Fast_Fsync;
+ u4Byte Cnt_SB_Search_fail;
+ u4Byte Cnt_OFDM_CCA;
+ u4Byte Cnt_CCK_CCA;
+ u4Byte Cnt_CCA_all;
+ u4Byte Cnt_BW_USC; //Gary
+ u4Byte Cnt_BW_LSC; //Gary
+}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;
+
+typedef enum tag_Dynamic_Init_Gain_Operation_Type_Definition
+{
+ DIG_TYPE_THRESH_HIGH = 0,
+ DIG_TYPE_THRESH_LOW = 1,
+ DIG_TYPE_BACKOFF = 2,
+ DIG_TYPE_RX_GAIN_MIN = 3,
+ DIG_TYPE_RX_GAIN_MAX = 4,
+ DIG_TYPE_ENABLE = 5,
+ DIG_TYPE_DISABLE = 6,
+ DIG_OP_TYPE_MAX
+}DM_DIG_OP_E;
+
+typedef enum tag_ODM_PauseDIG_Type {
+ ODM_PAUSE_DIG = BIT0,
+ ODM_RESUME_DIG = BIT1
+} ODM_Pause_DIG_TYPE;
+
+typedef enum tag_ODM_PauseCCKPD_Type {
+ ODM_PAUSE_CCKPD = BIT0,
+ ODM_RESUME_CCKPD = BIT1
+} ODM_Pause_CCKPD_TYPE;
+
+/*
+typedef enum tag_CCK_Packet_Detection_Threshold_Type_Definition
+{
+ CCK_PD_STAGE_LowRssi = 0,
+ CCK_PD_STAGE_HighRssi = 1,
+ CCK_PD_STAGE_MAX = 3,
+}DM_CCK_PDTH_E;
+
+typedef enum tag_DIG_EXT_PORT_ALGO_Definition
+{
+ DIG_EXT_PORT_STAGE_0 = 0,
+ DIG_EXT_PORT_STAGE_1 = 1,
+ DIG_EXT_PORT_STAGE_2 = 2,
+ DIG_EXT_PORT_STAGE_3 = 3,
+ DIG_EXT_PORT_STAGE_MAX = 4,
+}DM_DIG_EXT_PORT_ALG_E;
+
+typedef enum tag_DIG_Connect_Definition
+{
+ DIG_STA_DISCONNECT = 0,
+ DIG_STA_CONNECT = 1,
+ DIG_STA_BEFORE_CONNECT = 2,
+ DIG_MultiSTA_DISCONNECT = 3,
+ DIG_MultiSTA_CONNECT = 4,
+ DIG_CONNECT_MAX
+}DM_DIG_CONNECT_E;
+
+
+#define DM_MultiSTA_InitGainChangeNotify(Event) {DM_DigTable.CurMultiSTAConnectState = Event;}
+
+#define DM_MultiSTA_InitGainChangeNotify_CONNECT(_ADAPTER) \
+ DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_CONNECT)
+
+#define DM_MultiSTA_InitGainChangeNotify_DISCONNECT(_ADAPTER) \
+ DM_MultiSTA_InitGainChangeNotify(DIG_MultiSTA_DISCONNECT)
+*/
+#define DM_DIG_THRESH_HIGH 40
+#define DM_DIG_THRESH_LOW 35
+
+#define DM_FALSEALARM_THRESH_LOW 400
+#define DM_FALSEALARM_THRESH_HIGH 1000
+
+#define DM_DIG_MAX_NIC 0x3e
+#define DM_DIG_MIN_NIC 0x1e //0x22//0x1c
+#define DM_DIG_MAX_OF_MIN_NIC 0x3e
+
+#define DM_DIG_MAX_AP 0x3e
+#define DM_DIG_MIN_AP 0x1c
+#define DM_DIG_MAX_OF_MIN 0x2A //0x32
+#define DM_DIG_MIN_AP_DFS 0x20
+
+#define DM_DIG_MAX_NIC_HP 0x46
+#define DM_DIG_MIN_NIC_HP 0x2e
+
+#define DM_DIG_MAX_AP_HP 0x42
+#define DM_DIG_MIN_AP_HP 0x30
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+#define DM_DIG_MAX_AP_COVERAGR 0x26
+#define DM_DIG_MIN_AP_COVERAGE 0x1c
+#define DM_DIG_MAX_OF_MIN_COVERAGE 0x22
+
+#define DM_DIG_TP_Target_TH0 500
+#define DM_DIG_TP_Target_TH1 1000
+#define DM_DIG_TP_Training_Period 10
+#endif
+
+//vivi 92c&92d has different definition, 20110504
+//this is for 92c
+#if (DM_ODM_SUPPORT_TYPE & ODM_CE)
+ #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
+ #define DM_DIG_FA_TH0 0x80//0x20
+ #else
+ #define DM_DIG_FA_TH0 0x200//0x20
+ #endif
+#else
+ #define DM_DIG_FA_TH0 0x200//0x20
+#endif
+
+#define DM_DIG_FA_TH1 0x300
+#define DM_DIG_FA_TH2 0x400
+//this is for 92d
+#define DM_DIG_FA_TH0_92D 0x100
+#define DM_DIG_FA_TH1_92D 0x400
+#define DM_DIG_FA_TH2_92D 0x600
+
+#define DM_DIG_BACKOFF_MAX 12
+#define DM_DIG_BACKOFF_MIN -4
+#define DM_DIG_BACKOFF_DEFAULT 10
+
+#define DM_DIG_FA_TH0_LPS 4 //-> 4 in lps
+#define DM_DIG_FA_TH1_LPS 15 //-> 15 lps
+#define DM_DIG_FA_TH2_LPS 30 //-> 30 lps
+#define RSSI_OFFSET_DIG 0x05
+
+VOID
+ODM_ChangeDynamicInitGainThresh(
+ IN PVOID pDM_VOID,
+ IN u4Byte DM_Type,
+ IN u4Byte DM_Value
+ );
+
+VOID
+odm_NHMCounterStatisticsInit(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_NHMCounterStatistics(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_NHMBBInit(
+ IN PVOID pDM_VOID
+);
+
+VOID
+odm_NHMBB(
+ IN PVOID pDM_VOID
+);
+
+VOID
+odm_NHMCounterStatisticsReset(
+ IN PVOID pDM_VOID
+);
+
+VOID
+odm_GetNHMCounterStatistics(
+ IN PVOID pDM_VOID
+);
+
+VOID
+odm_SearchPwdBLowerBound(
+ IN PVOID pDM_VOID,
+ IN u1Byte IGI_target
+);
+
+VOID
+odm_AdaptivityInit(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_Adaptivity(
+ IN PVOID pDM_VOID,
+ IN u1Byte IGI
+ );
+
+VOID
+ODM_Write_DIG(
+ IN PVOID pDM_VOID,
+ IN u1Byte CurrentIGI
+ );
+
+VOID
+odm_PauseDIG(
+ IN PVOID pDM_VOID,
+ IN ODM_Pause_DIG_TYPE PauseType,
+ IN u1Byte IGIValue
+ );
+
+VOID
+odm_DIGInit(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_DIG(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_DIGbyRSSI_LPS(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_DigForBtHsMode(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_FalseAlarmCounterStatistics(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_FAThresholdCheck(
+ IN PVOID pDM_VOID,
+ IN BOOLEAN bDFSBand,
+ IN BOOLEAN bPerformance,
+ IN u4Byte RxTp,
+ IN u4Byte TxTp,
+ OUT u4Byte* dm_FA_thres
+ );
+
+u1Byte
+odm_ForbiddenIGICheck(
+ IN PVOID pDM_VOID,
+ IN u1Byte DIG_Dynamic_MIN,
+ IN u1Byte CurrentIGI
+ );
+
+VOID
+odm_InbandNoiseCalculate (
+ IN PVOID pDM_VOID
+ );
+
+BOOLEAN
+odm_DigAbort(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_PauseCCKPacketDetection(
+ IN PVOID pDM_VOID,
+ IN ODM_Pause_CCKPD_TYPE PauseType,
+ IN u1Byte CCKPDThreshold
+ );
+
+VOID
+odm_CCKPacketDetectionThresh(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+ODM_Write_CCK_CCA_Thres(
+ IN PVOID pDM_VOID,
+ IN u1Byte CurCCK_CCAThres
+ );
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+VOID
+odm_DisableEDCCA(
+ IN PVOID pDM_VOID
+);
+
+VOID
+odm_DynamicEDCCA(
+ IN PVOID pDM_VOID
+);
+
+VOID
+odm_MPT_DIGCallback(
+ PRT_TIMER pTimer
+);
+
+VOID
+odm_MPT_DIGWorkItemCallback(
+ IN PVOID pContext
+ );
+
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+VOID
+odm_MPT_DIGCallback(
+ IN PVOID pDM_VOID
+);
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE != ODM_CE)
+VOID
+ODM_MPT_DIG(
+ IN PVOID pDM_VOID
+);
+#endif
+
+
+#endif
diff --git a/rtl8723BS/hal/OUTSRC/odm_DynamicBBPowerSaving.c b/rtl8723BS/hal/OUTSRC/odm_DynamicBBPowerSaving.c
new file mode 100755
index 0000000..9ceb2fd
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_DynamicBBPowerSaving.c
@@ -0,0 +1,218 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+//============================================================
+// include files
+//============================================================
+
+#include "odm_precomp.h"
+
+VOID
+odm_DynamicBBPowerSavingInit(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
+
+ pDM_PSTable->PreCCAState = CCA_MAX;
+ pDM_PSTable->CurCCAState = CCA_MAX;
+ pDM_PSTable->PreRFState = RF_MAX;
+ pDM_PSTable->CurRFState = RF_MAX;
+ pDM_PSTable->Rssi_val_min = 0;
+ pDM_PSTable->initialize = 0;
+}
+
+
+VOID
+odm_DynamicBBPowerSaving(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+
+ if (pDM_Odm->SupportICType != ODM_RTL8723A)
+ return;
+ if(!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE))
+ return;
+ if(!(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))
+ return;
+
+ //1 2.Power Saving for 92C
+ if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
+ {
+ odm_1R_CCA(pDM_Odm);
+ }
+
+ // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.
+ // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns.
+ //1 3.Power Saving for 88C
+ else
+ {
+ ODM_RF_Saving(pDM_Odm, FALSE);
+ }
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+}
+
+VOID
+odm_1R_CCA(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
+
+ if(pDM_Odm->RSSI_Min!= 0xFF)
+ {
+
+ if(pDM_PSTable->PreCCAState == CCA_2R)
+ {
+ if(pDM_Odm->RSSI_Min >= 35)
+ pDM_PSTable->CurCCAState = CCA_1R;
+ else
+ pDM_PSTable->CurCCAState = CCA_2R;
+
+ }
+ else{
+ if(pDM_Odm->RSSI_Min <= 30)
+ pDM_PSTable->CurCCAState = CCA_2R;
+ else
+ pDM_PSTable->CurCCAState = CCA_1R;
+ }
+ }
+ else{
+ pDM_PSTable->CurCCAState=CCA_MAX;
+ }
+
+ if(pDM_PSTable->PreCCAState != pDM_PSTable->CurCCAState)
+ {
+ if(pDM_PSTable->CurCCAState == CCA_1R)
+ {
+ if( pDM_Odm->RFType ==ODM_2T2R )
+ {
+ ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x13);
+ //PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);
+ }
+ else
+ {
+ ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x23);
+ //PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100
+ }
+ }
+ else
+ {
+ ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x33);
+ //PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);
+ }
+ pDM_PSTable->PreCCAState = pDM_PSTable->CurCCAState;
+ }
+}
+
+void
+ODM_RF_Saving(
+ IN PVOID pDM_VOID,
+ IN u1Byte bForceInNormal
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE != ODM_AP)
+ pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
+ u1Byte Rssi_Up_bound = 30 ;
+ u1Byte Rssi_Low_bound = 25;
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
+ if(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
+ {
+ Rssi_Up_bound = 50 ;
+ Rssi_Low_bound = 45;
+ }
+#endif
+ if(pDM_PSTable->initialize == 0){
+
+ pDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;
+ pDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;
+ pDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;
+ pDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;
+ //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
+ pDM_PSTable->initialize = 1;
+ }
+
+ if(!bForceInNormal)
+ {
+ if(pDM_Odm->RSSI_Min != 0xFF)
+ {
+ if(pDM_PSTable->PreRFState == RF_Normal)
+ {
+ if(pDM_Odm->RSSI_Min >= Rssi_Up_bound)
+ pDM_PSTable->CurRFState = RF_Save;
+ else
+ pDM_PSTable->CurRFState = RF_Normal;
+ }
+ else{
+ if(pDM_Odm->RSSI_Min <= Rssi_Low_bound)
+ pDM_PSTable->CurRFState = RF_Normal;
+ else
+ pDM_PSTable->CurRFState = RF_Save;
+ }
+ }
+ else
+ pDM_PSTable->CurRFState=RF_MAX;
+ }
+ else
+ {
+ pDM_PSTable->CurRFState = RF_Normal;
+ }
+
+ if(pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)
+ {
+ if(pDM_PSTable->CurRFState == RF_Save)
+ {
+ // <tynli_note> 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode.
+ // Suggested by SD3 Yu-Nan. 2011.01.20.
+ if(pDM_Odm->SupportICType == ODM_RTL8723A)
+ {
+ ODM_SetBBReg(pDM_Odm, 0x874 , BIT5, 0x1); //Reg874[5]=1b'1
+ }
+ ODM_SetBBReg(pDM_Odm, 0x874 , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
+ ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0
+ ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
+ ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10
+ ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
+ ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
+ ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
+ }
+ else
+ {
+ ODM_SetBBReg(pDM_Odm, 0x874 , 0x1CC000, pDM_PSTable->Reg874);
+ ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70);
+ ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);
+ ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74);
+ ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);
+
+ if(pDM_Odm->SupportICType == ODM_RTL8723A)
+ {
+ ODM_SetBBReg(pDM_Odm,0x874 , BIT5, 0x0); //Reg874[5]=1b'0
+ }
+ }
+ pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
+ }
+#endif
+} \ No newline at end of file
diff --git a/rtl8723BS/hal/OUTSRC/odm_DynamicBBPowerSaving.h b/rtl8723BS/hal/OUTSRC/odm_DynamicBBPowerSaving.h
new file mode 100755
index 0000000..2fdcd6e
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_DynamicBBPowerSaving.h
@@ -0,0 +1,61 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#ifndef __ODMDYNAMICBBPOWERSAVING_H__
+#define __ODMDYNAMICBBPOWERSAVING_H__
+
+typedef struct _Dynamic_Power_Saving_
+{
+ u1Byte PreCCAState;
+ u1Byte CurCCAState;
+
+ u1Byte PreRFState;
+ u1Byte CurRFState;
+
+ int Rssi_val_min;
+
+ u1Byte initialize;
+ u4Byte Reg874,RegC70,Reg85C,RegA74;
+
+}PS_T,*pPS_T;
+
+#define dm_RF_Saving ODM_RF_Saving
+
+void ODM_RF_Saving(
+ IN PVOID pDM_VOID,
+ IN u1Byte bForceInNormal
+ );
+
+VOID
+odm_DynamicBBPowerSavingInit(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_DynamicBBPowerSaving(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_1R_CCA(
+ IN PVOID pDM_VOID
+ );
+
+#endif \ No newline at end of file
diff --git a/rtl8723BS/hal/OUTSRC/odm_DynamicTxPower.c b/rtl8723BS/hal/OUTSRC/odm_DynamicTxPower.c
new file mode 100755
index 0000000..7fbeb9f
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_DynamicTxPower.c
@@ -0,0 +1,884 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+//============================================================
+// include files
+//============================================================
+
+#include "odm_precomp.h"
+
+VOID
+odm_DynamicTxPowerInit(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+
+ #if DEV_BUS_TYPE==RT_USB_INTERFACE
+ if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)
+ {
+ odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
+ pMgntInfo->bDynamicTxPowerEnable = TRUE;
+ }
+ else
+ #else
+ //so 92c pci do not need dynamic tx power? vivi check it later
+ if(IS_HARDWARE_TYPE_8192D(Adapter))
+ pMgntInfo->bDynamicTxPowerEnable = TRUE;
+ else
+ pMgntInfo->bDynamicTxPowerEnable = FALSE;
+ #endif
+
+
+ pHalData->LastDTPLvl = TxHighPwrLevel_Normal;
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ struct dm_priv *pdmpriv = &pHalData->dmpriv;
+ pdmpriv->bDynamicTxPowerEnable = _FALSE;
+
+ #if (RTL8192C_SUPPORT==1)
+ #ifdef CONFIG_USB_HCI
+
+ #ifdef CONFIG_INTEL_PROXIM
+ if((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==_TRUE))
+ #else
+ if(pHalData->BoardType == BOARD_USB_High_PA)
+ #endif
+
+ {
+ //odm_SavePowerIndex(Adapter);
+ odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
+ pdmpriv->bDynamicTxPowerEnable = _TRUE;
+ }
+ else
+ #else
+ pdmpriv->bDynamicTxPowerEnable = _FALSE;
+ #endif
+ #endif
+
+ pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+#endif
+
+}
+
+VOID
+odm_DynamicTxPowerSavePowerIndex(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+ u1Byte index;
+ u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ for(index = 0; index< 6; index++)
+ pHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ struct dm_priv *pdmpriv = &pHalData->dmpriv;
+ for(index = 0; index< 6; index++)
+ pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
+#endif
+#endif
+}
+
+VOID
+odm_DynamicTxPowerRestorePowerIndex(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+ u1Byte index;
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ for(index = 0; index< 6; index++)
+ PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);
+#elif(DM_ODM_SUPPORT_TYPE == ODM_CE)
+ struct dm_priv *pdmpriv = &pHalData->dmpriv;
+ for(index = 0; index< 6; index++)
+ rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
+#endif
+#endif
+}
+
+VOID
+odm_DynamicTxPowerWritePowerIndex(
+ IN PVOID pDM_VOID,
+ IN u1Byte Value)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ u1Byte index;
+ u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
+
+ for(index = 0; index< 6; index++)
+ //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);
+ ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);
+
+}
+
+
+VOID
+odm_DynamicTxPower(
+ IN PVOID pDM_VOID
+ )
+{
+ //
+ // For AP/ADSL use prtl8192cd_priv
+ // For CE/NIC use PADAPTER
+ //
+ //PADAPTER pAdapter = pDM_Odm->Adapter;
+// prtl8192cd_priv priv = pDM_Odm->priv;
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
+ return;
+ //
+ // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
+ // at the same time. In the stage2/3, we need to prive universal interface and merge all
+ // HW dynamic mechanism.
+ //
+ switch (pDM_Odm->SupportPlatform)
+ {
+ case ODM_WIN:
+ case ODM_CE:
+ odm_DynamicTxPowerNIC(pDM_Odm);
+ break;
+ case ODM_AP:
+ odm_DynamicTxPowerAP(pDM_Odm);
+ break;
+
+ case ODM_ADSL:
+ //odm_DIGAP(pDM_Odm);
+ break;
+ }
+
+
+}
+
+
+VOID
+odm_DynamicTxPowerNIC(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+ if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
+ return;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+
+ if(pDM_Odm->SupportICType == ODM_RTL8192C)
+ {
+ odm_DynamicTxPower_92C(pDM_Odm);
+ }
+ else if(pDM_Odm->SupportICType == ODM_RTL8192D)
+ {
+ odm_DynamicTxPower_92D(pDM_Odm);
+ }
+ else if (pDM_Odm->SupportICType == ODM_RTL8821)
+ {
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(Adapter);
+
+ if (pMgntInfo->RegRspPwr == 1)
+ {
+ if(pDM_Odm->RSSI_Min > 60)
+ {
+ ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB
+
+ }
+ else if(pDM_Odm->RSSI_Min < 55)
+ {
+ ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB
+ }
+ }
+#endif
+ }
+#endif
+}
+
+VOID
+odm_DynamicTxPowerAP(
+ IN PVOID pDM_VOID
+
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
+
+//#if ((RTL8192C_SUPPORT==1) || (RTL8192D_SUPPORT==1) || (RTL8188E_SUPPORT==1) || (RTL8812E_SUPPORT==1))
+
+
+ prtl8192cd_priv priv = pDM_Odm->priv;
+ s4Byte i;
+ s2Byte pwr_thd = TX_POWER_NEAR_FIELD_THRESH_AP;
+
+ if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)
+ return;
+
+#if ((RTL8812E_SUPPORT==1) || (RTL8881A_SUPPORT==1))
+ if (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8881A))
+ pwr_thd = TX_POWER_NEAR_FIELD_THRESH_8812;
+#endif
+
+#if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)
+ if(CHIP_VER_92X_SERIES(priv))
+ {
+#ifdef HIGH_POWER_EXT_PA
+ if(pDM_Odm->ExtPA)
+ tx_power_control(priv);
+#endif
+ }
+#endif
+ /*
+ * Check if station is near by to use lower tx power
+ */
+
+ if ((priv->up_time % 3) == 0 ) {
+ int disable_pwr_ctrl = ((pDM_Odm->FalseAlmCnt.Cnt_all > 1000 ) || ((pDM_Odm->FalseAlmCnt.Cnt_all > 300 ) && ((RTL_R8(0xc50) & 0x7f) >= 0x32))) ? 1 : 0;
+
+ for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
+ PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
+ if(IS_STA_VALID(pstat) ) {
+ if(disable_pwr_ctrl)
+ pstat->hp_level = 0;
+ else if ((pstat->hp_level == 0) && (pstat->rssi > pwr_thd))
+ pstat->hp_level = 1;
+ else if ((pstat->hp_level == 1) && (pstat->rssi < (pwr_thd-8)))
+ pstat->hp_level = 0;
+ }
+ }
+
+#if defined(CONFIG_WLAN_HAL_8192EE)
+ if (GET_CHIP_VER(priv) == VERSION_8192E) {
+ if( !disable_pwr_ctrl && (pDM_Odm->RSSI_Min != 0xff) ) {
+ if(pDM_Odm->RSSI_Min > pwr_thd)
+ RRSR_power_control_11n(priv, 1 );
+ else if(pDM_Odm->RSSI_Min < (pwr_thd-8))
+ RRSR_power_control_11n(priv, 0 );
+ } else {
+ RRSR_power_control_11n(priv, 0 );
+ }
+ }
+#endif
+ }
+//#endif
+
+#endif
+}
+
+
+VOID
+odm_DynamicTxPower_92C(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ s4Byte UndecoratedSmoothedPWDB;
+
+ // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
+ if (pDM_Odm->ExtPA == FALSE)
+ return;
+
+ // STA not connected and AP not connected
+ if((!pMgntInfo->bMediaConnect) &&
+ (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+ //the LastDTPlvl should reset when disconnect,
+ //otherwise the tx power level wouldn't change when disconnect and connect again.
+ // Maddest 20091220.
+ pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
+ return;
+ }
+
+#if (INTEL_PROXIMITY_SUPPORT == 1)
+ // Intel set fixed tx power
+ if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)
+ {
+ switch(pMgntInfo->IntelProximityModeInfo.PowerOutput){
+ case 1:
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
+ break;
+ case 2:
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
+ break;
+ case 3:
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
+ break;
+ case 4:
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
+ break;
+ case 5:
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
+ break;
+ default:
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
+ break;
+ }
+ }
+ else
+#endif
+ {
+ if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
+ (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
+ pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ }
+ else
+ {
+ if(pMgntInfo->bMediaConnect) // Default port
+ {
+ if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
+ {
+ UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+ else
+ {
+ UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+ }
+ else // associated entry pwdb
+ {
+ UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+
+ if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+ }
+ else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+ (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+ }
+ else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+ }
+ }
+ }
+ if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d \n" , pHalData->CurrentChannel));
+ PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+ if( (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&
+ (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal
+ odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
+ else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
+ odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
+ else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
+ odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
+ }
+ pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
+
+
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+
+ #if (RTL8192C_SUPPORT==1)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ struct dm_priv *pdmpriv = &pHalData->dmpriv;
+ struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
+ struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
+ int UndecoratedSmoothedPWDB;
+
+ if(!pdmpriv->bDynamicTxPowerEnable)
+ return;
+
+#ifdef CONFIG_INTEL_PROXIM
+ if(Adapter->proximity.proxim_on== _TRUE){
+ struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
+ // Intel set fixed tx power
+ printk("\n %s Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d \n",__FUNCTION__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
+ if(prox_priv!=NULL){
+ if(prox_priv->proxim_modeinfo->power_output> 0)
+ {
+ switch(prox_priv->proxim_modeinfo->power_output)
+ {
+ case 1:
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+ printk("TxHighPwrLevel_100\n");
+ break;
+ case 2:
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
+ printk("TxHighPwrLevel_70\n");
+ break;
+ case 3:
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
+ printk("TxHighPwrLevel_50\n");
+ break;
+ case 4:
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
+ printk("TxHighPwrLevel_35\n");
+ break;
+ case 5:
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
+ printk("TxHighPwrLevel_15\n");
+ break;
+ default:
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
+ printk("TxHighPwrLevel_100\n");
+ break;
+ }
+ }
+ }
+ }
+ else
+#endif
+ {
+ // STA not connected and AP not connected
+ if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
+ (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+ //the LastDTPlvl should reset when disconnect,
+ //otherwise the tx power level wouldn't change when disconnect and connect again.
+ // Maddest 20091220.
+ pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
+ return;
+ }
+
+ if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
+ {
+ #if 0
+ //todo: AP Mode
+ if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
+ (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
+ {
+ UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+ else
+ {
+ UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+ #else
+ UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+ #endif
+ }
+ else // associated entry pwdb
+ {
+ UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+
+ if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+ }
+ else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+ (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+ }
+ else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+ }
+ }
+ if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
+ {
+ PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+ if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal
+ odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
+ else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
+ odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
+ else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
+ odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
+ }
+ pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
+ #endif
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+}
+
+
+VOID
+odm_DynamicTxPower_92D(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ s4Byte UndecoratedSmoothedPWDB;
+
+ PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
+ BOOLEAN bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
+ u1Byte HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
+
+ // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
+ if (pDM_Odm->ExtPA == FALSE)
+ return;
+
+ // If dynamic high power is disabled.
+ if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
+ (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
+ pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ return;
+ }
+
+ // STA not connected and AP not connected
+ if((!pMgntInfo->bMediaConnect) &&
+ (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+
+ //the LastDTPlvl should reset when disconnect,
+ //otherwise the tx power level wouldn't change when disconnect and connect again.
+ // Maddest 20091220.
+ pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
+ return;
+ }
+
+ if(pMgntInfo->bMediaConnect) // Default port
+ {
+ if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
+ {
+ UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+ else
+ {
+ UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+ }
+ else // associated entry pwdb
+ {
+ UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+
+ if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){
+ if(UndecoratedSmoothedPWDB >= 0x33)
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
+ }
+ else if((UndecoratedSmoothedPWDB <0x33) &&
+ (UndecoratedSmoothedPWDB >= 0x2b) )
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+ }
+ else if(UndecoratedSmoothedPWDB < 0x2b)
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
+ }
+
+ }
+ else
+
+ {
+ if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+ }
+ else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+ (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+ }
+ else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+ {
+ pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+ }
+
+ }
+
+//sherry delete flag 20110517
+ if(bGetValueFromBuddyAdapter)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
+ if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
+ HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
+ pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
+ PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+ pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
+ Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;
+ }
+ }
+
+ if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
+ if(Adapter->DualMacSmartConcurrent == TRUE)
+ {
+ if(BuddyAdapter == NULL)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
+ if(!Adapter->bSlaveOfDMSP)
+ {
+ PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+ }
+ }
+ else
+ {
+ if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
+ if(Adapter->bSlaveOfDMSP)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
+ BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;
+ BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
+ }
+ else
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
+ if(!bGetValueFromBuddyAdapter)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
+ PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+ }
+ }
+ }
+ else
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
+ PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+ }
+ }
+ }
+ else
+ {
+ PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
+ }
+
+ }
+ pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+#if (RTL8192D_SUPPORT==1)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
+
+ struct dm_priv *pdmpriv = &pHalData->dmpriv;
+ DM_ODM_T *podmpriv = &pHalData->odmpriv;
+ int UndecoratedSmoothedPWDB;
+ #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+ PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
+ BOOLEAN bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
+ u8 HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
+ #endif
+
+ // If dynamic high power is disabled.
+ if( (pdmpriv->bDynamicTxPowerEnable != _TRUE) ||
+ (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ return;
+ }
+
+ // STA not connected and AP not connected
+ if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
+ (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ //the LastDTPlvl should reset when disconnect,
+ //otherwise the tx power level wouldn't change when disconnect and connect again.
+ // Maddest 20091220.
+ pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
+ return;
+ }
+
+ if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
+ {
+ #if 0
+ //todo: AP Mode
+ if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
+ (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
+ {
+ UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+ else
+ {
+ UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+ #else
+ UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+ #endif
+ }
+ else // associated entry pwdb
+ {
+ UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
+ }
+#if TX_POWER_FOR_5G_BAND == 1
+ if(pHalData->CurrentBandType92D == BAND_ON_5G){
+ if(UndecoratedSmoothedPWDB >= 0x33)
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
+ }
+ else if((UndecoratedSmoothedPWDB <0x33) &&
+ (UndecoratedSmoothedPWDB >= 0x2b) )
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+ }
+ else if(UndecoratedSmoothedPWDB < 0x2b)
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
+ }
+ }
+ else
+#endif
+ {
+ if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
+ }
+ else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
+ (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
+ }
+ else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
+ {
+ pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
+ }
+ }
+#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+ if(bGetValueFromBuddyAdapter)
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
+ if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
+ HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
+ pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
+ PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+ pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
+ Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _FALSE;
+ }
+ }
+#endif
+
+ if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
+#if (RTL8192D_EASY_SMART_CONCURRENT == 1)
+ if(BuddyAdapter == NULL)
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
+ if(!Adapter->bSlaveOfDMSP)
+ {
+ PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+ }
+ }
+ else
+ {
+ if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
+ if(Adapter->bSlaveOfDMSP)
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
+ BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _TRUE;
+ BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
+ }
+ else
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
+ if(!bGetValueFromBuddyAdapter)
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
+ PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+ }
+ }
+ }
+ else
+ {
+ //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
+ PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+ }
+ }
+#else
+ PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
+#endif
+ }
+ pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
+#endif
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+}
+
diff --git a/rtl8723BS/hal/OUTSRC/odm_DynamicTxPower.h b/rtl8723BS/hal/OUTSRC/odm_DynamicTxPower.h
new file mode 100755
index 0000000..67221e5
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_DynamicTxPower.h
@@ -0,0 +1,87 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#ifndef __ODMDYNAMICTXPOWER_H__
+#define __ODMDYNAMICTXPOWER_H__
+
+#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
+#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
+#define TX_POWER_NEAR_FIELD_THRESH_AP 0x3F
+#define TX_POWER_NEAR_FIELD_THRESH_8812 60
+
+#define TxHighPwrLevel_Normal 0
+#define TxHighPwrLevel_Level1 1
+#define TxHighPwrLevel_Level2 2
+#define TxHighPwrLevel_BT1 3
+#define TxHighPwrLevel_BT2 4
+#define TxHighPwrLevel_15 5
+#define TxHighPwrLevel_35 6
+#define TxHighPwrLevel_50 7
+#define TxHighPwrLevel_70 8
+#define TxHighPwrLevel_100 9
+
+VOID
+odm_DynamicTxPowerInit(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_DynamicTxPowerRestorePowerIndex(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_DynamicTxPowerNIC(
+ IN PVOID pDM_VOID
+ );
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+VOID
+odm_DynamicTxPowerSavePowerIndex(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_DynamicTxPowerWritePowerIndex(
+ IN PVOID pDM_VOID,
+ IN u1Byte Value);
+
+VOID
+odm_DynamicTxPower_92C(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_DynamicTxPower_92D(
+ IN PVOID pDM_VOID
+ );
+#endif
+
+VOID
+odm_DynamicTxPower(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_DynamicTxPowerAP(
+ IN PVOID pDM_VOID
+ );
+
+#endif
diff --git a/rtl8723BS/hal/OUTSRC/odm_EdcaTurboCheck.c b/rtl8723BS/hal/OUTSRC/odm_EdcaTurboCheck.c
new file mode 100755
index 0000000..34bfd08
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_EdcaTurboCheck.c
@@ -0,0 +1,1915 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+//============================================================
+// include files
+//============================================================
+//#include "Mp_Precomp.h"
+#include "odm_precomp.h"
+
+VOID
+ODM_EdcaTurboInit(
+ IN PVOID pDM_VOID)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
+ odm_EdcaParaInit(pDM_Odm);
+#elif (DM_ODM_SUPPORT_TYPE==ODM_WIN)
+ PADAPTER Adapter = NULL;
+ HAL_DATA_TYPE *pHalData = NULL;
+
+ if(pDM_Odm->Adapter==NULL) {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));
+ return;
+ }
+
+ Adapter=pDM_Odm->Adapter;
+ pHalData=GET_HAL_DATA(Adapter);
+
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
+ pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
+ pHalData->bIsAnyNonBEPkts = FALSE;
+
+#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
+ pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
+ Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;
+
+#endif
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VO PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VO_PARAM)));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VI PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VI_PARAM)));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BK PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BK_PARAM)));
+
+
+} // ODM_InitEdcaTurbo
+
+VOID
+odm_EdcaTurboCheck(
+ IN PVOID pDM_VOID
+ )
+{
+ //
+ // For AP/ADSL use prtl8192cd_priv
+ // For CE/NIC use PADAPTER
+ //
+
+ //
+ // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
+ // at the same time. In the stage2/3, we need to prive universal interface and merge all
+ // HW dynamic mechanism.
+ //
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));
+
+ if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
+ return;
+
+ switch (pDM_Odm->SupportPlatform)
+ {
+ case ODM_WIN:
+
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
+ odm_EdcaTurboCheckMP(pDM_Odm);
+#endif
+ break;
+
+ case ODM_CE:
+#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
+ odm_EdcaTurboCheckCE(pDM_Odm);
+#endif
+ break;
+
+ case ODM_AP:
+ case ODM_ADSL:
+
+#if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
+ odm_IotEngine(pDM_Odm);
+#endif
+ break;
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
+
+} // odm_CheckEdcaTurbo
+
+#if(DM_ODM_SUPPORT_TYPE==ODM_CE)
+
+
+VOID
+odm_EdcaTurboCheckCE(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ u32 EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
+ u32 EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
+ u32 ICType=pDM_Odm->SupportICType;
+ u32 IOTPeer=0;
+ u8 WirelessMode=0xFF; //invalid value
+ u32 trafficIndex;
+ u32 edca_param;
+ u64 cur_tx_bytes = 0;
+ u64 cur_rx_bytes = 0;
+ u8 bbtchange = _FALSE;
+ u8 bBiasOnRx = _FALSE;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);
+ struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
+ struct recv_priv *precvpriv = &(Adapter->recvpriv);
+ struct registry_priv *pregpriv = &Adapter->registrypriv;
+ struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
+
+ if(pDM_Odm->bLinked != _TRUE)
+ {
+ precvpriv->bIsAnyNonBEPkts = _FALSE;
+ return;
+ }
+
+ if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
+ {
+ precvpriv->bIsAnyNonBEPkts = _FALSE;
+ return;
+ }
+
+ if(pDM_Odm->pWirelessMode!=NULL)
+ WirelessMode=*(pDM_Odm->pWirelessMode);
+
+ IOTPeer = pmlmeinfo->assoc_AP_vendor;
+
+ if (IOTPeer >= HT_IOT_PEER_MAX)
+ {
+ precvpriv->bIsAnyNonBEPkts = _FALSE;
+ return;
+ }
+
+ if( (pDM_Odm->SupportICType == ODM_RTL8192C) ||
+ (pDM_Odm->SupportICType == ODM_RTL8723A) ||
+ (pDM_Odm->SupportICType == ODM_RTL8188E))
+ {
+ if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))
+ bBiasOnRx = _TRUE;
+ }
+
+ // Check if the status needs to be changed.
+ if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
+ {
+ cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;
+ cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;
+
+ //traffic, TX or RX
+ if(bBiasOnRx)
+ {
+ if (cur_tx_bytes > (cur_rx_bytes << 2))
+ { // Uplink TP is present.
+ trafficIndex = UP_LINK;
+ }
+ else
+ { // Balance TP is present.
+ trafficIndex = DOWN_LINK;
+ }
+ }
+ else
+ {
+ if (cur_rx_bytes > (cur_tx_bytes << 2))
+ { // Downlink TP is present.
+ trafficIndex = DOWN_LINK;
+ }
+ else
+ { // Balance TP is present.
+ trafficIndex = UP_LINK;
+ }
+ }
+
+ //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
+ {
+ if(ICType==ODM_RTL8192D)
+ {
+ // Single PHY
+ if(pDM_Odm->RFType==ODM_2T2R)
+ {
+ EDCA_BE_UL = 0x60a42b; //0x5ea42b;
+ EDCA_BE_DL = 0x60a42b; //0x5ea42b;
+ }
+ else
+ {
+ EDCA_BE_UL = 0x6ea42b;
+ EDCA_BE_DL = 0x6ea42b;
+ }
+ }
+ else
+ {
+ if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {
+ if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
+ EDCA_BE_UL = 0x60a42b;
+ EDCA_BE_DL = 0x60a42b;
+ }
+ else
+ {
+ EDCA_BE_UL = 0x6ea42b;
+ EDCA_BE_DL = 0x6ea42b;
+ }
+ }
+ }
+
+ //92D txop can't be set to 0x3e for cisco1250
+ if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
+ {
+ EDCA_BE_DL = edca_setting_DL[IOTPeer];
+ EDCA_BE_UL = edca_setting_UL[IOTPeer];
+ }
+ //merge from 92s_92c_merge temp brunch v2445 20120215
+ else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
+ {
+ EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];
+ }
+ else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
+ {
+ EDCA_BE_DL = 0xa630;
+ }
+ else if(IOTPeer == HT_IOT_PEER_MARVELL)
+ {
+ EDCA_BE_DL = edca_setting_DL[IOTPeer];
+ EDCA_BE_UL = edca_setting_UL[IOTPeer];
+ }
+ else if(IOTPeer == HT_IOT_PEER_ATHEROS)
+ {
+ // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
+ EDCA_BE_DL = edca_setting_DL[IOTPeer];
+ }
+
+ if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
+ {
+ EDCA_BE_UL = 0x5ea42b;
+ EDCA_BE_DL = 0x5ea42b;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x",EDCA_BE_UL,EDCA_BE_DL));
+ }
+
+ if (trafficIndex == DOWN_LINK)
+ edca_param = EDCA_BE_DL;
+ else
+ edca_param = EDCA_BE_UL;
+
+ rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
+
+ pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
+ }
+
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;
+ }
+ else
+ {
+ //
+ // Turn Off EDCA turbo here.
+ // Restore original EDCA according to the declaration of AP.
+ //
+ if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
+ {
+ rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
+ }
+ }
+
+}
+
+
+#elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)
+VOID
+odm_EdcaTurboCheckMP(
+ IN PVOID pDM_VOID
+ )
+{
+
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+
+ PADAPTER pDefaultAdapter = GetDefaultAdapter(Adapter);
+ PADAPTER pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
+ PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
+ //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn
+ u8Byte Ext_curTxOkCnt = 0;
+ u8Byte Ext_curRxOkCnt = 0;
+ //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
+ u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
+
+ // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.
+ u8Byte curTxOkCnt = 0;
+ u8Byte curRxOkCnt = 0;
+ u4Byte EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
+ u4Byte EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
+ u4Byte EDCA_BE = 0x5ea42b;
+ u1Byte IOTPeer=0;
+ BOOLEAN *pbIsCurRDLState=NULL;
+ BOOLEAN bLastIsCurRDLState=FALSE;
+ BOOLEAN bBiasOnRx=FALSE;
+ BOOLEAN bEdcaTurboOn=FALSE;
+ u1Byte TxRate = 0xFF;
+ u8Byte value64;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
+
+////===============================
+////list paramter for different platform
+////===============================
+ bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;
+ pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);
+
+ //2012/09/14 MH Add
+ if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)
+ pHalData->bIsAnyNonBEPkts = TRUE;
+
+ pMgntInfo->NumNonBePkt = 0;
+
+ // Caculate TX/RX TP:
+ //curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
+ //curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
+ curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;
+ curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;
+ pDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
+ pDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
+
+ if(pExtAdapter == NULL)
+ pExtAdapter = pDefaultAdapter;
+
+ Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;
+ Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;
+ GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
+ //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
+ if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
+ {
+ curTxOkCnt = Ext_curTxOkCnt ;
+ curRxOkCnt = Ext_curRxOkCnt ;
+ }
+ //
+ IOTPeer=pMgntInfo->IOTPeer;
+ bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;
+ bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts))?TRUE:FALSE;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx \n",pHalData->bIsAnyNonBEPkts));
+
+
+////===============================
+////check if edca turbo is disabled
+////===============================
+ if(odm_IsEdcaTurboDisable(pDM_Odm))
+ {
+ pHalData->bIsAnyNonBEPkts = FALSE;
+ pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
+ pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
+ pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;
+ pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;
+
+ }
+
+////===============================
+////remove iot case out
+////===============================
+ ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);
+
+
+////===============================
+////Check if the status needs to be changed.
+////===============================
+ if(bEdcaTurboOn)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));
+ if(bBiasOnRx)
+ odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, TRUE, pbIsCurRDLState);
+ else
+ odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, FALSE, pbIsCurRDLState);
+
+//modify by Guo.Mingzhi 2011-12-29
+ EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;
+ if(IS_HARDWARE_TYPE_8821U(Adapter))
+ {
+ if(pMgntInfo->RegTxDutyEnable)
+ {
+ //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)
+ if(!pMgntInfo->ForcedDataRate) //auto rate
+ {
+ if(pDM_Odm->TxRate != 0xFF)
+ TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
+ }
+ else //force rate
+ {
+ TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
+ }
+
+ value64 = (curRxOkCnt<<2);
+ if(curTxOkCnt < value64) //Downlink
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
+ else //Uplink
+ {
+ //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
+ //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
+ if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
+ else
+ {
+ switch (TxRate)
+ {
+ case MGN_VHT1SS_MCS6:
+ case MGN_VHT1SS_MCS5:
+ case MGN_MCS6:
+ case MGN_MCS5:
+ case MGN_48M:
+ case MGN_54M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);
+ break;
+ case MGN_VHT1SS_MCS4:
+ case MGN_MCS4:
+ case MGN_36M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);
+ break;
+ case MGN_VHT1SS_MCS3:
+ case MGN_MCS3:
+ case MGN_24M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);
+ break;
+ case MGN_VHT1SS_MCS2:
+ case MGN_MCS2:
+ case MGN_18M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);
+ break;
+ case MGN_VHT1SS_MCS1:
+ case MGN_MCS1:
+ case MGN_9M:
+ case MGN_12M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);
+ break;
+ case MGN_VHT1SS_MCS0:
+ case MGN_MCS0:
+ case MGN_6M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
+ break;
+ default:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
+ }
+
+ }
+ else if (IS_HARDWARE_TYPE_8812AU(Adapter)){
+ if(pMgntInfo->RegTxDutyEnable)
+ {
+ //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)
+ // it;s the same issue as 8811AU
+ if(!pMgntInfo->ForcedDataRate) //auto rate
+ {
+ if(pDM_Odm->TxRate != 0xFF)
+ TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
+ }
+ else //force rate
+ {
+ TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
+ }
+
+ value64 = (curRxOkCnt<<2);
+ if(curTxOkCnt < value64) //Downlink
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
+ else //Uplink
+ {
+ //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
+ //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
+ if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
+ else
+ {
+ switch (TxRate)
+ {
+ case MGN_VHT2SS_MCS9:
+ case MGN_VHT1SS_MCS9:
+ case MGN_VHT1SS_MCS8:
+ case MGN_MCS15:
+ case MGN_MCS7:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);
+ case MGN_VHT2SS_MCS8:
+ case MGN_VHT1SS_MCS7:
+ case MGN_MCS14:
+ case MGN_MCS6:
+ case MGN_54M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);
+ case MGN_VHT2SS_MCS7:
+ case MGN_VHT2SS_MCS6:
+ case MGN_VHT1SS_MCS6:
+ case MGN_VHT1SS_MCS5:
+ case MGN_MCS13:
+ case MGN_MCS5:
+ case MGN_48M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);
+ break;
+ case MGN_VHT2SS_MCS5:
+ case MGN_VHT2SS_MCS4:
+ case MGN_VHT1SS_MCS4:
+ case MGN_VHT1SS_MCS3:
+ case MGN_MCS12:
+ case MGN_MCS4:
+ case MGN_MCS3:
+ case MGN_36M:
+ case MGN_24M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);
+ break;
+ case MGN_VHT2SS_MCS3:
+ case MGN_VHT2SS_MCS2:
+ case MGN_VHT2SS_MCS1:
+ case MGN_VHT1SS_MCS2:
+ case MGN_VHT1SS_MCS1:
+ case MGN_MCS11:
+ case MGN_MCS10:
+ case MGN_MCS9:
+ case MGN_MCS2:
+ case MGN_MCS1:
+ case MGN_18M:
+ case MGN_12M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);
+ break;
+ case MGN_VHT2SS_MCS0:
+ case MGN_VHT1SS_MCS0:
+ case MGN_MCS0:
+ case MGN_MCS8:
+ case MGN_9M:
+ case MGN_6M:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
+ break;
+ default:
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
+ }
+ }
+ else
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));
+
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA_BE_DL : 0x%lx EDCA_BE_UL : 0x%lx EDCA_BE : 0x%lx \n",EDCA_BE_DL,EDCA_BE_UL,EDCA_BE));
+
+ }
+ else
+ {
+ // Turn Off EDCA turbo here.
+ // Restore original EDCA according to the declaration of AP.
+ if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
+ {
+ Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );
+
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx \n",pDM_Odm->WMMEDCA_BE));
+
+ }
+ }
+
+}
+
+
+//check if edca turbo is disabled
+BOOLEAN
+odm_IsEdcaTurboDisable(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
+ u4Byte IOTPeer=pMgntInfo->IOTPeer;
+
+ if(pDM_Odm->bBtDisableEdcaTurbo)
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));
+ return TRUE;
+ }
+
+ if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||
+ (pDM_Odm->bWIFITest)||
+ (IOTPeer>= HT_IOT_PEER_MAX))
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));
+ return TRUE;
+ }
+
+
+ // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue
+ // 2. User may disable EDCA Turbo mode with OID settings.
+ if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));
+ return TRUE;
+ }
+
+ return FALSE;
+
+
+}
+
+//add iot case here: for MP/CE
+VOID
+ODM_EdcaParaSelByIot(
+ IN PVOID pDM_VOID,
+ OUT u4Byte *EDCA_BE_UL,
+ OUT u4Byte *EDCA_BE_DL
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ u4Byte IOTPeer=0;
+ u4Byte ICType=pDM_Odm->SupportICType;
+ u1Byte WirelessMode=0xFF; //invalid value
+ u4Byte RFType=pDM_Odm->RFType;
+ u4Byte IOTPeerSubType=0;
+
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
+ u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
+
+ if(pDM_Odm->pWirelessMode!=NULL)
+ WirelessMode=*(pDM_Odm->pWirelessMode);
+
+///////////////////////////////////////////////////////////
+////list paramter for different platform
+
+ IOTPeer=pMgntInfo->IOTPeer;
+ IOTPeerSubType=pMgntInfo->IOTPeerSubtype;
+ GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
+
+
+ if(ICType==ODM_RTL8192D)
+ {
+ // Single PHY
+ if(pDM_Odm->RFType==ODM_2T2R)
+ {
+ (*EDCA_BE_UL) = 0x60a42b; //0x5ea42b;
+ (*EDCA_BE_DL) = 0x60a42b; //0x5ea42b;
+
+ }
+ else
+ {
+ (*EDCA_BE_UL) = 0x6ea42b;
+ (*EDCA_BE_DL) = 0x6ea42b;
+ }
+
+ }
+////============================
+/// IOT case for MP
+////============================
+
+ else
+ {
+
+ if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
+ if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
+ (*EDCA_BE_UL) = 0x60a42b;
+ (*EDCA_BE_DL) = 0x60a42b;
+ }
+ else
+ {
+ (*EDCA_BE_UL) = 0x6ea42b;
+ (*EDCA_BE_DL) = 0x6ea42b;
+ }
+ }
+ }
+
+ if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
+ {
+ (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];
+ (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];
+ }
+
+ #if (INTEL_PROXIMITY_SUPPORT == 1)
+ if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)
+ {
+ (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;
+ }
+ else
+ #endif
+ {
+ if((pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))
+ {// To check whether we shall force turn on TXOP configuration.
+ if(!((*EDCA_BE_UL) & 0xffff0000))
+ (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.
+ if(!((*EDCA_BE_DL) & 0xffff0000))
+ (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.
+ }
+
+ //92D txop can't be set to 0x3e for cisco1250
+ if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
+ {
+ (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
+ (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
+ }
+ //merge from 92s_92c_merge temp brunch v2445 20120215
+ else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
+ {
+ (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
+ }
+ else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
+ {
+ (*EDCA_BE_DL) = 0xa630;
+ }
+
+ else if(IOTPeer == HT_IOT_PEER_MARVELL)
+ {
+ (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
+ (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
+ }
+ else if(IOTPeer == HT_IOT_PEER_ATHEROS)
+ {
+ // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
+ if(WirelessMode==ODM_WM_G)
+ (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
+ else
+ (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
+
+ if(ICType == ODM_RTL8821)
+ (*EDCA_BE_DL) = 0x5ea630;
+
+ }
+ }
+
+ if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))
+ {
+ (*EDCA_BE_DL) = 0x432b;
+ (*EDCA_BE_UL) = 0x432b;
+ }
+
+
+
+ if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
+ {
+ (*EDCA_BE_UL) = 0x5ea42b;
+ (*EDCA_BE_DL) = 0x5ea42b;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));
+ }
+
+ // Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.
+ if((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) &&
+ (pMgntInfo->dot11CurrentChannelNumber == 6))
+ {
+ (*EDCA_BE_DL) = 0xa92b;
+ }
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Special: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));
+
+}
+
+
+VOID
+odm_EdcaChooseTrafficIdx(
+ IN PVOID pDM_VOID,
+ IN u8Byte cur_tx_bytes,
+ IN u8Byte cur_rx_bytes,
+ IN BOOLEAN bBiasOnRx,
+ OUT BOOLEAN *pbIsCurRDLState
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+
+ if(bBiasOnRx)
+ {
+
+ if(cur_tx_bytes>(cur_rx_bytes*4))
+ {
+ *pbIsCurRDLState=FALSE;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));
+
+ }
+ else
+ {
+ *pbIsCurRDLState=TRUE;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
+
+ }
+ }
+ else
+ {
+ if(cur_rx_bytes>(cur_tx_bytes*4))
+ {
+ *pbIsCurRDLState=TRUE;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink Traffic\n"));
+
+ }
+ else
+ {
+ *pbIsCurRDLState=FALSE;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
+ }
+ }
+
+ return ;
+}
+
+#endif
+
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
+
+void odm_EdcaParaInit(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ prtl8192cd_priv priv = pDM_Odm->priv;
+ int mode=priv->pmib->dot11BssType.net_work_type;
+
+ static unsigned int slot_time, sifs_time;
+ struct ParaRecord EDCA[4];
+
+ memset(EDCA, 0, 4*sizeof(struct ParaRecord));
+
+ sifs_time = 10;
+ slot_time = 20;
+
+ if (mode & (ODM_WM_N24G|ODM_WM_N5G))
+ sifs_time = 16;
+
+ if (mode & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G|ODM_WM_A))
+ slot_time = 9;
+
+
+#ifdef RTK_AC_SUPPORT //for 11ac logo, edit aifs time for cca test cases
+ if(AC_SIGMA_MODE != AC_SIGMA_NONE)
+ sifs_time = 10;
+#endif
+
+
+#if((defined(RTL_MANUAL_EDCA))&&(DM_ODM_SUPPORT_TYPE==ODM_AP))
+ if( priv->pmib->dot11QosEntry.ManualEDCA ) {
+ if( OPMODE & WIFI_AP_STATE )
+ memcpy(EDCA, priv->pmib->dot11QosEntry.AP_manualEDCA, 4*sizeof(struct ParaRecord));
+ else
+ memcpy(EDCA, priv->pmib->dot11QosEntry.STA_manualEDCA, 4*sizeof(struct ParaRecord));
+
+ #ifdef WIFI_WMM
+ if (QOS_ENABLE)
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
+ else
+ #endif
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
+
+ }else
+ #endif //RTL_MANUAL_EDCA
+ {
+
+ if(OPMODE & WIFI_AP_STATE)
+ {
+ memcpy(EDCA, rtl_ap_EDCA, 2*sizeof(struct ParaRecord));
+
+ if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
+ memcpy(&EDCA[VI], &rtl_ap_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
+ else
+ memcpy(&EDCA[VI], &rtl_ap_EDCA[VI], 2*sizeof(struct ParaRecord));
+ }
+ else
+ {
+ memcpy(EDCA, rtl_sta_EDCA, 2*sizeof(struct ParaRecord));
+
+ if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
+ memcpy(&EDCA[VI], &rtl_sta_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
+ else
+ memcpy(&EDCA[VI], &rtl_sta_EDCA[VI], 2*sizeof(struct ParaRecord));
+ }
+
+ #ifdef WIFI_WMM
+ if (QOS_ENABLE)
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
+ else
+ #endif
+
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
+#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + 2* slot_time));
+#endif
+
+
+ }
+
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_VO_PARAM, (EDCA[VO].TXOPlimit<< 16) | (EDCA[VO].ECWmax<< 12) | (EDCA[VO].ECWmin<< 8) | (sifs_time + EDCA[VO].AIFSN* slot_time));
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[BE].AIFSN* slot_time));
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[BK].AIFSN* slot_time));
+
+#if defined(RTK_AC_SUPPORT) && defined(RTL_MANUAL_EDCA) //for 11ac logo, make BK worse to seperate with BE.
+ if((AC_SIGMA_MODE != AC_SIGMA_NONE) && (priv->pmib->dot11QosEntry.ManualEDCA))
+ {
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | 0xa4 );
+ }
+#endif
+
+// ODM_Write1Byte(pDM_Odm,ACMHWCTRL, 0x00);
+
+ priv->pshare->iot_mode_enable = 0;
+#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
+ if (priv->pshare->rf_ft_var.wifi_beq_iot)
+ priv->pshare->iot_mode_VI_exist = 0;
+
+ #ifdef WMM_VIBE_PRI
+ priv->pshare->iot_mode_BE_exist = 0;
+ #endif
+
+#ifdef WMM_BEBK_PRI
+ priv->pshare->iot_mode_BK_exist = 0;
+#endif
+
+ #ifdef LOW_TP_TXOP
+ priv->pshare->BE_cwmax_enhance = 0;
+ #endif
+
+#elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
+ priv->pshare->iot_mode_BE_exist = 0;
+#endif
+ priv->pshare->iot_mode_VO_exist = 0;
+}
+
+BOOLEAN
+ODM_ChooseIotMainSTA(
+ IN PVOID pDM_VOID,
+ IN PSTA_INFO_T pstat
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ prtl8192cd_priv priv = pDM_Odm->priv;
+ BOOLEAN bhighTP_found_pstat=FALSE;
+
+ if ((GET_ROOT(priv)->up_time % 2) == 0) {
+ unsigned int tx_2s_avg = 0;
+ unsigned int rx_2s_avg = 0;
+ int i=0, aggReady=0;
+ unsigned long total_sum = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes);
+ int assoc_num = GET_ROOT(priv)->assoc_num;
+#ifdef MBSSID
+ if (GET_ROOT(priv)->pmib->miscEntry.vap_enable){
+ for (i=0; i<RTL8192CD_NUM_VWLAN; ++i)
+ assoc_num += GET_ROOT(priv)->pvap_priv[i]-> assoc_num;
+ }
+#endif
+#ifdef UNIVERSAL_REPEATER
+ if (IS_DRV_OPEN(GET_VXD_PRIV(GET_ROOT(priv))))
+ assoc_num += GET_VXD_PRIV(GET_ROOT(priv))-> assoc_num;
+#endif
+#ifdef WDS
+ if(GET_ROOT(priv)->pmib->dot11WdsInfo.wdsEnabled)
+ assoc_num ++;
+#endif
+
+
+ pstat->current_tx_bytes += pstat->tx_byte_cnt;
+ pstat->current_rx_bytes += pstat->rx_byte_cnt;
+
+ if (total_sum != 0) {
+ if (total_sum <= 1000000) {
+ tx_2s_avg = (unsigned int)((pstat->current_tx_bytes*100) / total_sum);
+ rx_2s_avg = (unsigned int)((pstat->current_rx_bytes*100) / total_sum);
+ } else {
+ tx_2s_avg = (unsigned int)(pstat->current_tx_bytes / (total_sum / 100));
+ rx_2s_avg = (unsigned int)(pstat->current_rx_bytes / (total_sum / 100));
+ }
+
+ }
+
+#if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
+ if (pstat->ht_cap_len) {
+ if ((tx_2s_avg + rx_2s_avg) >=25 ) {//50//
+
+ priv->pshare->highTP_found_pstat = pstat;
+ bhighTP_found_pstat=TRUE;
+ }
+ }
+#elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
+ for(i=0; i<8; i++)
+ aggReady += (pstat->ADDBA_ready[i]);
+
+ if ((pstat->ht_cap_len && (
+#ifdef SUPPORT_TX_AMSDU
+ AMSDU_ENABLE ||
+#endif
+ aggReady)) || (pstat->IOTPeer==HT_IOT_PEER_INTEL))
+ {
+ if ((assoc_num==1) || (tx_2s_avg + rx_2s_avg >= 25)) {
+ priv->pshare->highTP_found_pstat = pstat;
+ }
+
+ #ifdef CLIENT_MODE
+ if (OPMODE & WIFI_STATION_STATE) {
+ if ((tx_2s_avg + rx_2s_avg) >= 20)
+ priv->pshare->highTP_found_pstat = pstat;
+ }
+ #endif
+ }
+#endif
+ }
+ else {
+ pstat->current_tx_bytes = pstat->tx_byte_cnt;
+ pstat->current_rx_bytes = pstat->rx_byte_cnt;
+ }
+
+ return bhighTP_found_pstat;
+}
+
+
+#ifdef WIFI_WMM
+VOID
+ODM_IotEdcaSwitch(
+ IN PVOID pDM_VOID,
+ IN unsigned char enable
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ prtl8192cd_priv priv = pDM_Odm->priv;
+ int mode=priv->pmib->dot11BssType.net_work_type;
+ unsigned int slot_time = 20, sifs_time = 10, BE_TXOP = 47, VI_TXOP = 94;
+ unsigned int vi_cw_max = 4, vi_cw_min = 3, vi_aifs;
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ u32 be_edca, vi_edca;
+ u16 disable_cfe;
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
+ if (!(!priv->pmib->dot11OperationEntry.wifi_specific ||
+ ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))
+ #ifdef CLIENT_MODE
+ || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))
+ #endif
+ ))
+ return;
+#endif
+
+#ifdef RTK_AC_SUPPORT //for 11ac logo, do not dynamic switch edca
+ if(AC_SIGMA_MODE != AC_SIGMA_NONE)
+ return;
+#endif
+
+ if ((mode & (ODM_WM_N24G|ODM_WM_N5G)) && (priv->pshare->ht_sta_num
+ #ifdef WDS
+ || ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
+ #endif
+ ))
+ sifs_time = 16;
+
+ if (mode & (ODM_WM_N24G|ODM_WM_N5G|ODM_WM_G|ODM_WM_A)) {
+ slot_time = 9;
+ }
+ else
+ {
+ BE_TXOP = 94;
+ VI_TXOP = 188;
+ }
+
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ vi_edca = -1;
+ disable_cfe = -1;
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
+ if (priv->pshare->iot_mode_VO_exist) {
+ // to separate AC_VI and AC_BE to avoid using the same EDCA settings
+ if (priv->pshare->iot_mode_BE_exist) {
+ vi_cw_max = 5;
+ vi_cw_min = 3;
+ } else {
+ vi_cw_max = 6;
+ vi_cw_min = 4;
+ }
+ }
+ vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
+
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs;
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);
+#endif
+
+#elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
+ if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) {
+ if (priv->pshare->iot_mode_VO_exist) {
+ #ifdef WMM_VIBE_PRI
+ if (priv->pshare->iot_mode_BE_exist)
+ {
+ vi_cw_max = 5;
+ vi_cw_min = 3;
+ vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
+ }
+ else
+ #endif
+ {
+ vi_cw_max = 6;
+ vi_cw_min = 4;
+ vi_aifs = 0x2b;
+ }
+ }
+ else {
+ vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
+ }
+
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)
+ | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs;
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)
+ | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);
+#endif
+
+ #ifdef WMM_BEBK_PRI
+ #ifdef CONFIG_RTL_88E_SUPPORT
+ if ((GET_CHIP_VER(priv) == VERSION_8188E) && priv->pshare->iot_mode_BK_exist) {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (10 << 12) | (6 << 8) | 0x4f;
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (10 << 12) | (6 << 8) | 0x4f);
+#endif
+ }
+ #endif
+ #endif
+#if defined(CONFIG_WLAN_HAL_8881A)
+ if (GET_CHIP_VER(priv) == VERSION_8881A)
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, 0xa64f);
+#endif
+ }
+#endif
+
+
+
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
+ if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist) {
+#if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT)
+ if (GET_CHIP_VER(priv) == VERSION_8188E || GET_CHIP_VER(priv) == VERSION_8812E) {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (10 << 12) | (6 << 8) | 0x4f;
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (6 << 8) | 0x4f);
+#endif
+ }
+ else
+#endif
+ {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (10 << 12) | (4 << 8) | 0x4f;
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f);
+#endif
+ }
+ } else if(!enable)
+#elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
+ if(!enable) //if iot is disable ,maintain original BEQ PARAM
+#endif
+ {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)
+ | (sifs_time + 3 * slot_time);
+ disable_cfe = 1;
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)
+ | (sifs_time + 3 * slot_time));
+#endif
+#ifdef CONFIG_PCI_HCI
+// ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE));
+#endif
+ }
+ else
+ {
+ int txop;
+ unsigned int cw_max;
+#ifdef LOW_TP_TXOP
+ unsigned int txop_close;
+#endif
+
+ #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
+ cw_max = ((priv->pshare->BE_cwmax_enhance) ? 10 : 6);
+ txop_close = ((priv->pshare->rf_ft_var.low_tp_txop && priv->pshare->rf_ft_var.low_tp_txop_close) ? 1 : 0);
+
+ if(priv->pshare->txop_enlarge == 0xe) //if intel case
+ txop = (txop_close ? 0 : (BE_TXOP*2));
+ else //if other case
+ txop = (txop_close ? 0: (BE_TXOP*priv->pshare->txop_enlarge));
+ #else
+ cw_max=6;
+ if((priv->pshare->txop_enlarge==0xe)||(priv->pshare->txop_enlarge==0xd))
+ txop=BE_TXOP*2;
+ else
+ txop=BE_TXOP*priv->pshare->txop_enlarge;
+
+ #endif
+
+ if (priv->pshare->ht_sta_num
+ #ifdef WDS
+ || ((OPMODE & WIFI_AP_STATE) && (mode & (ODM_WM_N24G|ODM_WM_N5G)) &&
+ priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
+ #endif
+ )
+ {
+
+ if (priv->pshare->txop_enlarge == 0xe) {
+ // is intel client, use a different edca value
+ //ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop<< 16) | (cw_max<< 12) | (4 << 8) | 0x1f);
+ if (pDM_Odm->RFType==ODM_1T1R) {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (txop << 16) | (5 << 12) | (3 << 8) | 0x1f;
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (5 << 12) | (3 << 8) | 0x1f);
+#endif
+ }
+ else {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (txop << 16) | (8 << 12) | (5 << 8) | 0x1f;
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (8 << 12) | (5 << 8) | 0x1f);
+#endif
+ }
+
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ disable_cfe = 0;
+#endif
+#ifdef CONFIG_PCI_HCI
+// ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE));
+#endif
+ priv->pshare->txop_enlarge = 2;
+ }
+#if(DM_ODM_SUPPORT_TYPE==ODM_AP)
+ #ifndef LOW_TP_TXOP
+ else if (priv->pshare->txop_enlarge == 0xd) {
+ // is intel ralink, use a different edca value
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (txop << 16) | (6 << 12) | (5 << 8) | 0x2b;
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (6 << 12) | (5 << 8) | 0x2b);
+#endif
+ priv->pshare->txop_enlarge = 2;
+ }
+ #endif
+#endif
+ else
+ {
+// if (txop == 0) {
+//#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+// disable_cfe = 1;
+//#endif
+//#ifdef CONFIG_PCI_HCI
+// ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE));
+//#endif
+// }
+
+ if (pDM_Odm->RFType==ODM_2T2R) {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (txop << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time);
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
+ (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
+#endif
+ }
+ else
+ #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)
+ {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (txop << 16) |
+ (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time);
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
+ (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
+#endif
+ }
+ #else
+ {
+ PSTA_INFO_T pstat = priv->pshare->highTP_found_pstat;
+ if ((GET_CHIP_VER(priv)==VERSION_8881A) && pstat && (pstat->IOTPeer == HT_IOT_PEER_HTC))
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, 0x642b);
+ else {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (txop << 16) | (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time);
+ #else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
+ (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
+#endif
+ }
+ }
+ #endif
+ }
+ }
+ else
+ {
+ #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time);
+#else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
+#endif
+ #else
+ #if defined(CONFIG_RTL_8196D) || defined(CONFIG_RTL_8197DL) || defined(CONFIG_RTL_8196E) || (defined(CONFIG_RTL_8197D) && !defined(CONFIG_PORT0_EXT_GIGA))
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time);
+ #else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time));
+#endif
+ #else
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ be_edca = (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time);
+ #else
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
+ #endif
+ #endif
+/*
+ if (priv->pshare->txop_enlarge == 0xe) {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ disable_cfe = 0;
+#endif
+ #ifdef CONFIG_PCI_HCI
+ ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE));
+ #endif
+ } else {
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ disable_cfe = 1;
+#endif
+ #ifdef CONFIG_PCI_HCI
+ ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE));
+ #endif
+ }
+*/
+ #endif
+ }
+
+ }
+
+#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
+ notify_IOT_EDCA_switch(priv, be_edca, vi_edca, disable_cfe);
+#endif
+}
+#endif
+
+VOID
+odm_IotEngine(
+ IN PVOID pDM_VOID
+ )
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ struct rtl8192cd_priv *priv=pDM_Odm->priv;
+ PSTA_INFO_T pstat = NULL;
+ u4Byte i;
+
+#ifdef WIFI_WMM
+ unsigned int switch_turbo = 0, avg_tp;
+#endif
+////////////////////////////////////////////////////////
+// if EDCA Turbo function is not supported or Manual EDCA Setting
+// then return
+////////////////////////////////////////////////////////
+ if(!(pDM_Odm->SupportAbility&ODM_MAC_EDCA_TURBO)){
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO NOT SUPPORTED\n"));
+ return;
+ }
+
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined(RTL_MANUAL_EDCA) && defined(WIFI_WMM))
+ if(priv->pmib->dot11QosEntry.ManualEDCA){
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: MANUAL SETTING\n"));
+ return ;
+ }
+#endif
+
+#if !(DM_ODM_SUPPORT_TYPE &ODM_AP)
+ //////////////////////////////////////////////////////
+ //find high TP STA every 2s
+//////////////////////////////////////////////////////
+ if ((GET_ROOT(priv)->up_time % 2) == 0)
+ priv->pshare->highTP_found_pstat==NULL;
+
+#if 0
+ phead = &priv->asoc_list;
+ plist = phead->next;
+ while(plist != phead) {
+ pstat = list_entry(plist, struct stat_info, asoc_list);
+
+ if(ODM_ChooseIotMainSTA(pDM_Odm, pstat)); //find the correct station
+ break;
+ if (plist == plist->next) //the last plist
+ break;
+ plist = plist->next;
+ };
+#endif
+
+ //find highTP STA
+ for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
+ pstat = pDM_Odm->pODM_StaInfo[i];
+ if(IS_STA_VALID(pstat) && (ODM_ChooseIotMainSTA(pDM_Odm, pstat))) //find the correct station
+ break;
+ }
+
+ //////////////////////////////////////////////////////
+ //if highTP STA is not found, then return
+ //////////////////////////////////////////////////////
+ if(priv->pshare->highTP_found_pstat==NULL) {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: NO HT STA FOUND\n"));
+ return;
+ }
+#endif
+
+ pstat=priv->pshare->highTP_found_pstat;
+ if(pstat) {
+ if((pstat->tx_avarage + pstat->rx_avarage) < (1<<17)) // 1M bps
+ pstat = NULL;
+ }
+
+#ifdef WIFI_WMM
+ if (QOS_ENABLE) {
+ if (!priv->pmib->dot11OperationEntry.wifi_specific
+ #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
+ ||((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))
+ #elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
+ || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
+ #endif
+ ) {
+ if (priv->pshare->iot_mode_enable &&
+ ((priv->pshare->phw->VO_pkt_count > 50) ||
+ (priv->pshare->phw->VI_pkt_count > 50) ||
+ (priv->pshare->phw->BK_pkt_count > 50))) {
+ priv->pshare->iot_mode_enable = 0;
+ switch_turbo++;
+#ifdef CONFIG_WLAN_HAL_8881A
+ if (GET_CHIP_VER(priv) == VERSION_8881A) {
+ RTL_W32(0x460, 0x03086666);
+ }
+#endif //CONFIG_WLAN_HAL_8881A
+ } else if ((!priv->pshare->iot_mode_enable) &&
+ ((priv->pshare->phw->VO_pkt_count < 50) &&
+ (priv->pshare->phw->VI_pkt_count < 50) &&
+ (priv->pshare->phw->BK_pkt_count < 50))) {
+ priv->pshare->iot_mode_enable++;
+ switch_turbo++;
+//#ifdef CONFIG_WLAN_HAL_8881A
+#if 0
+ if (GET_CHIP_VER(priv) == VERSION_8881A) {
+ if (get_bonding_type_8881A()==BOND_8881AB) {
+ RTL_W32(0x460, 0x03086666);
+ }
+ else {
+ RTL_W32(0x460, 0x0320ffff);
+ }
+ }
+#endif //CONFIG_WLAN_HAL_8881A
+ }
+ }
+
+
+ #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
+ if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific)
+ #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
+ if (priv->pmib->dot11OperationEntry.wifi_specific)
+ #endif
+ {
+ if (!priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count > 50)) {
+ priv->pshare->iot_mode_VO_exist++;
+ switch_turbo++;
+ } else if (priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count < 50)) {
+ priv->pshare->iot_mode_VO_exist = 0;
+ switch_turbo++;
+ }
+#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
+ if (priv->pshare->iot_mode_VO_exist) {
+ //printk("[%s %d] BE_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BE_pkt_count);
+ if (!priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count > 250)) {
+ priv->pshare->iot_mode_BE_exist++;
+ switch_turbo++;
+ } else if (priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count < 250)) {
+ priv->pshare->iot_mode_BE_exist = 0;
+ switch_turbo++;
+ }
+ }
+#endif
+
+#if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_BEBK_PRI)))
+ if (priv->pshare->phw->BE_pkt_count) {
+ //printk("[%s %d] BK_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BK_pkt_count);
+ if (!priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count > 250)) {
+ priv->pshare->iot_mode_BK_exist++;
+ switch_turbo++;
+ } else if (priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count < 250)) {
+ priv->pshare->iot_mode_BK_exist = 0;
+ switch_turbo++;
+ }
+ }
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP)
+ if (priv->pshare->rf_ft_var.wifi_beq_iot)
+ {
+ if (!priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count > 50)) {
+ priv->pshare->iot_mode_VI_exist++;
+ switch_turbo++;
+ } else if (priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count < 50)) {
+ priv->pshare->iot_mode_VI_exist = 0;
+ switch_turbo++;
+ }
+ }
+#endif
+
+ }
+ else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) {
+ if (priv->pshare->txop_enlarge) {
+ priv->pshare->txop_enlarge = 0;
+ if (priv->pshare->iot_mode_enable)
+ switch_turbo++;
+ }
+ }
+
+#if(defined(CLIENT_MODE) && (DM_ODM_SUPPORT_TYPE==ODM_AP))
+ if ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific))
+ {
+ if (priv->pshare->iot_mode_enable &&
+ (((priv->pshare->phw->VO_pkt_count > 50) ||
+ (priv->pshare->phw->VI_pkt_count > 50) ||
+ (priv->pshare->phw->BK_pkt_count > 50)) ||
+ (pstat && (!pstat->ADDBA_ready[0]) & (!pstat->ADDBA_ready[3]))))
+ {
+ priv->pshare->iot_mode_enable = 0;
+ switch_turbo++;
+ }
+ else if ((!priv->pshare->iot_mode_enable) &&
+ (((priv->pshare->phw->VO_pkt_count < 50) &&
+ (priv->pshare->phw->VI_pkt_count < 50) &&
+ (priv->pshare->phw->BK_pkt_count < 50)) &&
+ (pstat && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3]))))
+ {
+ priv->pshare->iot_mode_enable++;
+ switch_turbo++;
+ }
+ }
+#endif
+
+ priv->pshare->phw->VO_pkt_count = 0;
+ priv->pshare->phw->VI_pkt_count = 0;
+ priv->pshare->phw->BK_pkt_count = 0;
+
+ #if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
+ priv->pshare->phw->BE_pkt_count = 0;
+ #endif
+
+ #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
+ if (priv->pshare->rf_ft_var.wifi_beq_iot)
+ priv->pshare->phw->VI_rx_pkt_count = 0;
+ #endif
+
+ }
+#endif
+
+ if ((priv->up_time % 2) == 0) {
+ /*
+ * decide EDCA content for different chip vendor
+ */
+#ifdef WIFI_WMM
+ #if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
+ if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
+
+ #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
+ if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific ||
+ ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
+ #ifdef CLIENT_MODE
+ || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
+ #endif
+ #endif
+ ))
+
+ {
+
+ if (pstat && pstat->rssi >= priv->pshare->rf_ft_var.txop_enlarge_upper) {
+#ifdef LOW_TP_TXOP
+ if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
+ {
+ if (priv->pshare->txop_enlarge != 0xe)
+ {
+ priv->pshare->txop_enlarge = 0xe;
+
+ if (priv->pshare->iot_mode_enable)
+ switch_turbo++;
+ }
+ }
+ else if (priv->pshare->txop_enlarge != 2)
+ {
+ priv->pshare->txop_enlarge = 2;
+ if (priv->pshare->iot_mode_enable)
+ switch_turbo++;
+ }
+#else
+ if (priv->pshare->txop_enlarge != 2)
+ {
+ if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
+ priv->pshare->txop_enlarge = 0xe;
+ else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
+ priv->pshare->txop_enlarge = 0xd;
+ else if (pstat->IOTPeer==HT_IOT_PEER_HTC)
+ priv->pshare->txop_enlarge = 0;
+ else
+ priv->pshare->txop_enlarge = 2;
+
+ if (priv->pshare->iot_mode_enable)
+ switch_turbo++;
+ }
+#endif
+ }
+ else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower)
+ {
+ if (priv->pshare->txop_enlarge) {
+ priv->pshare->txop_enlarge = 0;
+ if (priv->pshare->iot_mode_enable)
+ switch_turbo++;
+ }
+ }
+
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&( defined LOW_TP_TXOP))
+ // for Intel IOT, need to enlarge CW MAX from 6 to 10
+ if (pstat && pstat->IOTPeer==HT_IOT_PEER_INTEL && (((pstat->tx_avarage+pstat->rx_avarage)>>10) <
+ priv->pshare->rf_ft_var.cwmax_enhance_thd))
+ {
+ if (!priv->pshare->BE_cwmax_enhance && priv->pshare->iot_mode_enable)
+ {
+ priv->pshare->BE_cwmax_enhance = 1;
+ switch_turbo++;
+ }
+ } else {
+ if (priv->pshare->BE_cwmax_enhance) {
+ priv->pshare->BE_cwmax_enhance = 0;
+ switch_turbo++;
+ }
+ }
+#endif
+ }
+#endif
+ priv->pshare->current_tx_bytes = 0;
+ priv->pshare->current_rx_bytes = 0;
+ }else {
+ if ((GET_CHIP_VER(priv) == VERSION_8881A)||(GET_CHIP_VER(priv) == VERSION_8192E)|| (GET_CHIP_VER(priv) == VERSION_8188E) ){
+ unsigned int uldl_tp = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes)>>17;
+ if((uldl_tp > 40) && (priv->pshare->agg_to!= 1)) {
+ RTL_W8(0x462, 0x08);
+ priv->pshare->agg_to = 1;
+ } else if((uldl_tp < 35) && (priv->pshare->agg_to !=0)) {
+ RTL_W8(0x462, 0x02);
+ priv->pshare->agg_to = 0;
+ }
+ }
+ }
+
+#if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE))
+ if(AMPDU_ENABLE) {
+#ifdef TX_EARLY_MODE
+ if (GET_TX_EARLY_MODE) {
+ if (!GET_EM_SWQ_ENABLE &&
+ ((priv->assoc_num > 1) ||
+ (pstat && pstat->IOTPeer != HT_IOT_PEER_UNKNOWN))) {
+ if ((priv->pshare->em_tx_byte_cnt >> 17) > EM_TP_UP_BOUND)
+ priv->pshare->reach_tx_limit_cnt++;
+ else
+ priv->pshare->reach_tx_limit_cnt = 0;
+
+ if (priv->pshare->txop_enlarge && priv->pshare->reach_tx_limit_cnt) { //>= WAIT_TP_TIME//
+ GET_EM_SWQ_ENABLE = 1;
+ priv->pshare->reach_tx_limit_cnt = 0;
+
+ if (pstat->IOTPeer == HT_IOT_PEER_INTEL)
+ MAX_EM_QUE_NUM = 12;
+ else if (pstat->IOTPeer == HT_IOT_PEER_RALINK)
+ MAX_EM_QUE_NUM = 10;
+
+ enable_em(priv);
+ }
+ }
+ else if (GET_EM_SWQ_ENABLE) {
+ if ((priv->pshare->em_tx_byte_cnt >> 17) < EM_TP_LOW_BOUND)
+ priv->pshare->reach_tx_limit_cnt++;
+ else
+ priv->pshare->reach_tx_limit_cnt = 0;
+
+ if (!priv->pshare->txop_enlarge || priv->pshare->reach_tx_limit_cnt >= WAIT_TP_TIME) {
+ GET_EM_SWQ_ENABLE = 0;
+ priv->pshare->reach_tx_limit_cnt = 0;
+ disable_em(priv);
+ }
+ }
+ }
+#endif
+
+#if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_RTL_8812_SUPPORT)
+ if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812) {
+ if (priv->assoc_num > 9)
+ {
+ if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){
+ if ((priv->swq_decision == 0)){
+ switch_turbo++;
+ if (priv->pshare->txop_enlarge == 0)
+ priv->pshare->txop_enlarge = 2;
+ priv->swq_decision = 1;
+ }
+ else
+ {
+ if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))
+ {
+ priv->pshare->txop_enlarge = 2;
+ switch_turbo--;
+ }
+ }
+ }
+ else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){
+ priv->swq_decision = 0;
+ }
+ else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) {
+ priv->pshare->txop_enlarge = 2;
+ switch_turbo--;
+ }
+ } else {
+ priv->swq_decision = 0;
+ }
+ } else if(CONFIG_WLAN_NOT_HAL_EXIST)
+#endif
+ {
+ if (priv->assoc_num > 1)
+ {
+ if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){
+ if ((priv->swq_decision == 0)){
+ switch_turbo++;
+ if (priv->pshare->txop_enlarge == 0)
+ priv->pshare->txop_enlarge = 2;
+ priv->swq_decision = 1;
+ }
+ else
+ {
+ if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))
+ {
+ priv->pshare->txop_enlarge = 2;
+ switch_turbo--;
+ }
+ }
+ }
+ else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){
+ priv->swq_decision = 0;
+ }
+ else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) {
+ priv->pshare->txop_enlarge = 2;
+ switch_turbo--;
+ }
+ }
+ //#if (defined CONFIG_RTL_819XD))
+ else if (priv->assoc_num == 1 && (priv->up_time % 2 == 0)
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE)
+ && (!GET_TX_EARLY_MODE || !GET_EM_SWQ_ENABLE)
+#endif
+ ) {
+ if ((pstat) && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3])) {
+ //int en_thd = 14417920>>(priv->up_time % 2);
+ avg_tp = (pstat->current_tx_bytes >> 17);
+
+ //if ((priv->swq_decision == 0) && (pstat->current_tx_bytes > en_thd) && (pstat->current_rx_bytes > en_thd) ) { //50Mbps
+ if ((priv->swq_decision == 0) && (avg_tp > TP_HIGH_WATER_MARK)) { //55Mbps
+ //printk("[%s:%d] swq_decision=1 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp);
+ priv->swq_decision = 1;
+ }
+ //else if ((priv->swq_decision == 1) && ((pstat->tx_avarage < 4587520) || (pstat->rx_avarage < 4587520))) { //35Mbps
+ else if ((priv->swq_decision == 1) && (avg_tp < TP_LOW_WATER_MARK)) { //35Mbps
+ //printk("[%s:%d] swq_decision=0 current_tp: %d Mbps\n", __FUNCTION__, __LINE__, avg_tp);
+ priv->swq_decision = 0;
+ }
+ } else {
+ priv->swq_decision = 0;
+ }
+ }
+ }
+ if( (priv->swq_decision == 1)
+#if (DM_ODM_SUPPORT_TYPE==ODM_AP) && defined(TX_EARLY_MODE)
+ || (GET_EM_SWQ_ENABLE == 1)
+#endif
+ ) {
+ priv->swq_en = 1;
+ priv->swqen_keeptime = priv->up_time;
+ } else {
+ priv->swq_en = 0;
+ priv->swqen_keeptime = 0;
+ }
+ }
+#endif
+
+#ifdef WIFI_WMM
+#ifdef LOW_TP_TXOP
+ if ((!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2))
+ && QOS_ENABLE) {
+ if (switch_turbo || priv->pshare->rf_ft_var.low_tp_txop) {
+ unsigned int thd_tp;
+ unsigned char under_thd;
+ unsigned int curr_tp;
+
+ if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G))
+ {
+ // Determine the upper bound throughput threshold.
+ if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G)) {
+ if (priv->assoc_num && priv->assoc_num != priv->pshare->ht_sta_num)
+ thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
+ else
+ thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_n;
+ }
+ else
+ thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
+
+ // Determine to close txop.
+#if defined(UNIVERSAL_REPEATER) || defined(MBSSID)
+ if(IS_STA_VALID(pstat))
+ {
+ struct rtl8192cd_priv *tmppriv;
+ struct aid_obj *aidarray;
+ aidarray = container_of(pstat, struct aid_obj, station);
+ tmppriv = aidarray->priv;
+
+ curr_tp = (unsigned int)(tmppriv->ext_stats.tx_avarage>>17) + (unsigned int)(tmppriv->ext_stats.rx_avarage>>17);
+ }
+ else
+#endif
+ curr_tp = (unsigned int)(priv->ext_stats.tx_avarage>>17) + (unsigned int)(priv->ext_stats.rx_avarage>>17);
+ if (curr_tp <= thd_tp && curr_tp >= priv->pshare->rf_ft_var.low_tp_txop_thd_low)
+ under_thd = 1;
+ else
+ under_thd = 0;
+ }
+ else
+ {
+ under_thd = 0;
+ }
+
+ if (switch_turbo)
+ {
+ priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
+ priv->pshare->rf_ft_var.low_tp_txop_count = 0;
+ }
+ else if (priv->pshare->iot_mode_enable && (priv->pshare->rf_ft_var.low_tp_txop_close != under_thd)) {
+ priv->pshare->rf_ft_var.low_tp_txop_count++;
+ if (priv->pshare->rf_ft_var.low_tp_txop_close) {
+ priv->pshare->rf_ft_var.low_tp_txop_count = priv->pshare->rf_ft_var.low_tp_txop_delay;
+ }
+ if (priv->pshare->rf_ft_var.low_tp_txop_count ==priv->pshare->rf_ft_var.low_tp_txop_delay)
+
+ {
+ priv->pshare->rf_ft_var.low_tp_txop_count = 0;
+ priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
+ switch_turbo++;
+ }
+ }
+ else
+ {
+ priv->pshare->rf_ft_var.low_tp_txop_count = 0;
+ }
+ }
+ }
+#endif
+
+#ifdef WMM_DSCP_C42
+ if (switch_turbo) {
+ if (!priv->pshare->iot_mode_enable && !priv->pshare->aggrmax_change) {
+ RTL_W16(0x4ca, 0x0404);
+ priv->pshare->aggrmax_change = 1;
+ }
+ else if (priv->pshare->iot_mode_enable && priv->pshare->aggrmax_change) {
+ RTL_W16(0x4ca, priv->pshare->aggrmax_bak);
+ priv->pshare->aggrmax_change = 0;
+ }
+ }
+#endif
+#ifdef TX_EARLY_MODE
+ unsigned int em_tp = ((priv->ext_stats.tx_avarage>>17) + (priv->ext_stats.rx_avarage>>17));
+ if (em_tp > 80)
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (4 << 12) | (3 << 8) | 0x19);
+ else //if (em_tp < 75)
+ ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (0x5e << 16) | (6 << 12) | (5 << 8) | 0x2b);
+#endif
+ if (switch_turbo)
+ ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable );
+#endif
+}
+#endif
+
diff --git a/rtl8723BS/hal/OUTSRC/odm_EdcaTurboCheck.h b/rtl8723BS/hal/OUTSRC/odm_EdcaTurboCheck.h
new file mode 100755
index 0000000..8fba8a2
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_EdcaTurboCheck.h
@@ -0,0 +1,150 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#ifndef __ODMEDCATURBOCHECK_H__
+#define __ODMEDCATURBOCHECK_H__
+
+typedef struct _EDCA_TURBO_
+{
+ BOOLEAN bCurrentTurboEDCA;
+ BOOLEAN bIsCurRDLState;
+
+ #if(DM_ODM_SUPPORT_TYPE == ODM_CE )
+ u4Byte prv_traffic_idx; // edca turbo
+ #endif
+
+}EDCA_T,*pEDCA_T;
+
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+static u4Byte edca_setting_UL[HT_IOT_PEER_MAX] =
+// UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU MARVELL 92U_AP SELF_AP(DownLink/Tx)
+{ 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322};
+
+
+static u4Byte edca_setting_DL[HT_IOT_PEER_MAX] =
+// UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU, MARVELL 92U_AP SELF_AP(UpLink/Rx)
+{ 0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b};
+
+static u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] =
+// UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU, MARVELL 92U_AP SELF_AP
+{ 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322, 0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b};
+
+
+//============================================================
+// EDCA Paramter for AP/ADSL by Mingzhi 2011-11-22
+//============================================================
+#elif (DM_ODM_SUPPORT_TYPE &ODM_ADSL)
+enum qos_prio { BK, BE, VI, VO, VI_AG, VO_AG };
+
+static const struct ParaRecord rtl_ap_EDCA[] =
+{
+//ACM,AIFSN, ECWmin, ECWmax, TXOplimit
+ {0, 7, 4, 10, 0}, //BK
+ {0, 3, 4, 6, 0}, //BE
+ {0, 1, 3, 4, 188}, //VI
+ {0, 1, 2, 3, 102}, //VO
+ {0, 1, 3, 4, 94}, //VI_AG
+ {0, 1, 2, 3, 47}, //VO_AG
+};
+
+static const struct ParaRecord rtl_sta_EDCA[] =
+{
+//ACM,AIFSN, ECWmin, ECWmax, TXOplimit
+ {0, 7, 4, 10, 0},
+ {0, 3, 4, 10, 0},
+ {0, 2, 3, 4, 188},
+ {0, 2, 2, 3, 102},
+ {0, 2, 3, 4, 94},
+ {0, 2, 2, 3, 47},
+};
+#endif
+
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+#ifdef WIFI_WMM
+VOID
+ODM_IotEdcaSwitch(
+ IN PVOID pDM_VOID,
+ IN unsigned char enable
+ );
+#endif
+
+BOOLEAN
+ODM_ChooseIotMainSTA(
+ IN PVOID pDM_VOID,
+ IN PSTA_INFO_T pstat
+ );
+#endif
+
+VOID
+odm_EdcaTurboCheck(
+ IN PVOID pDM_VOID
+ );
+VOID
+ODM_EdcaTurboInit(
+ IN PVOID pDM_VOID
+);
+
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
+VOID
+odm_EdcaTurboCheckMP(
+ IN PVOID pDM_VOID
+ );
+
+//check if edca turbo is disabled
+BOOLEAN
+odm_IsEdcaTurboDisable(
+ IN PVOID pDM_VOID
+);
+//choose edca paramter for special IOT case
+VOID
+ODM_EdcaParaSelByIot(
+ IN PVOID pDM_VOID,
+ OUT u4Byte *EDCA_BE_UL,
+ OUT u4Byte *EDCA_BE_DL
+ );
+//check if it is UL or DL
+VOID
+odm_EdcaChooseTrafficIdx(
+ IN PVOID pDM_VOID,
+ IN u8Byte cur_tx_bytes,
+ IN u8Byte cur_rx_bytes,
+ IN BOOLEAN bBiasOnRx,
+ OUT BOOLEAN *pbIsCurRDLState
+ );
+
+#elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
+VOID
+odm_EdcaTurboCheckCE(
+ IN PVOID pDM_VOID
+ );
+#else
+VOID
+odm_IotEngine(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_EdcaParaInit(
+ IN PVOID pDM_VOID
+ );
+#endif
+
+#endif
diff --git a/rtl8723BS/hal/OUTSRC/odm_HWConfig.c b/rtl8723BS/hal/OUTSRC/odm_HWConfig.c
index a5955ad..b37efd1 100755
--- a/rtl8723BS/hal/OUTSRC/odm_HWConfig.c
+++ b/rtl8723BS/hal/OUTSRC/odm_HWConfig.c
@@ -57,13 +57,7 @@
#define GET_VERSION_MP(ic, txt) (ODM_GetVersion_MP_##ic##txt())
#define GET_VERSION_TC(ic, txt) (ODM_GetVersion_TC_##ic##txt())
-
-#define GET_VERSION(ic, txt) do {\
- if (pDM_Odm->bIsMPChip)\
- GET_VERSION_MP(ic,txt);\
- else\
- GET_VERSION_TC(ic,txt);\
- } while(0)
+#define GET_VERSION(ic, txt) (pDM_Odm->bIsMPChip?GET_VERSION_MP(ic,txt):GET_VERSION_TC(ic,txt))
u1Byte
@@ -987,29 +981,7 @@ odm_RxPhyStatus92CSeries_Parsing(
}
}
- //2 For dynamic ATC switch
- if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC)
- {
- if(pPktinfo->bPacketMatchBSSID && ( *(pDM_Odm->mp_mode) == 0))
- {
- // TODO:
-
- //3 Update CFO report for path-A & path-B
- for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++)
- {
- pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->path_cfotail[i];
- }
-
- //3 Update packet counter
- if(pDM_Odm->packetCount == 0xffffffff)
- pDM_Odm->packetCount = 0;
- else
- pDM_Odm->packetCount++;
-
- //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD,
- //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1]));
- }
- }
+ ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->path_cfotail);
}
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
@@ -1021,8 +993,12 @@ odm_RxPhyStatus92CSeries_Parsing(
// 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/
pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, PWDB_ALL));//PWDB_ALL;
#else
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+ pPhyInfo->SignalStrength = (u1Byte)PWDB_ALL;
+#else
pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));//PWDB_ALL;
#endif
+#endif
}
else
{
@@ -1032,8 +1008,13 @@ odm_RxPhyStatus92CSeries_Parsing(
// 2012/01/12 MH Use customeris signal strength from HalComRxdDesc.c/
pPhyInfo->SignalStrength = (u1Byte)(SignalScaleMapping(pDM_Odm->Adapter, total_rssi/=rf_rx_num));//PWDB_ALL;
#else
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+ total_rssi/=rf_rx_num;
+ pPhyInfo->SignalStrength = (u1Byte)total_rssi;
+#else
pPhyInfo->SignalStrength = (u1Byte)(odm_SignalScaleMapping(pDM_Odm, total_rssi/=rf_rx_num));
#endif
+#endif
}
}
#endif
@@ -1398,27 +1379,9 @@ odm_RxPhyStatusJaguarSeries_Parsing(
}
}
}
- //2 For dynamic ATC switch
- if(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC)
- {
- if(pPktinfo->bPacketMatchBSSID && ( *(pDM_Odm->mp_mode) == 0) )
- {
- //3 Update CFO report for path-A & path-B
- for(i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++)
- {
- pDM_Odm->CFO_tail[i] = (int)pPhyStaRpt->cfotail[i];
- }
- //3 Update packet counter
- if(pDM_Odm->packetCount == 0xffffffff)
- pDM_Odm->packetCount = 0;
- else
- pDM_Odm->packetCount++;
-
- //ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD,
- //("pPhyStaRpt->path_cfotail[i] = 0x%x, pDM_Odm->CFO_tail[i] = 0x%x\n", pPhyStaRpt->path_cfotail[0], pDM_Odm->CFO_tail[1]));
- }
- }
+ ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->cfotail);
+
}
//DbgPrint("isCCKrate= %d, pPhyInfo->SignalStrength=%d % PWDB_AL=%d rf_rx_num=%d\n", isCCKrate, pPhyInfo->SignalStrength, PWDB_ALL, rf_rx_num);
@@ -1812,7 +1775,7 @@ ODM_ConfigRFWithHeaderFile(
{
if(ConfigType == CONFIG_RF_RADIO) {
if(eRFPath == ODM_RF_PATH_A)
- READ_AND_CONFIG_MP(8723A,_RadioA_1T);
+ READ_AND_CONFIG_MP(8723A,_RadioA);
}
}
#endif
@@ -1821,15 +1784,11 @@ ODM_ConfigRFWithHeaderFile(
if (pDM_Odm->SupportICType == ODM_RTL8188E)
{
if(ConfigType == CONFIG_RF_RADIO) {
- if(eRFPath == ODM_RF_PATH_A){
- if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))
- READ_AND_CONFIG(8188E,_RadioA_1T_ICUT);
- else
- READ_AND_CONFIG(8188E,_RadioA_1T);
- }
+ if(eRFPath == ODM_RF_PATH_A)
+ READ_AND_CONFIG_MP(8188E,_RadioA);
}
else if(ConfigType == CONFIG_RF_TXPWR_LMT) {
- READ_AND_CONFIG(8188E,_TXPWR_LMT);
+ READ_AND_CONFIG_MP(8188E,_TXPWR_LMT);
}
}
#endif
@@ -1859,18 +1818,18 @@ ODM_ConfigRFWithHeaderFile(
if(ConfigType == CONFIG_RF_RADIO) {
if(eRFPath == ODM_RF_PATH_A)
{
- READ_AND_CONFIG(8821A,_RadioA);
+ READ_AND_CONFIG_MP(8821A,_RadioA);
}
}
else if(ConfigType == CONFIG_RF_TXPWR_LMT) {
if (pDM_Odm->SupportInterface == ODM_ITRF_USB) {
if (pDM_Odm->ExtPA5G || pDM_Odm->ExtLNA5G)
- READ_AND_CONFIG(8821A,_TXPWR_LMT_8811AU_FEM);
+ READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_FEM);
else
- READ_AND_CONFIG(8821A,_TXPWR_LMT_8811AU_IPA);
+ READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8811AU_IPA);
} else {
- READ_AND_CONFIG(8821A,_TXPWR_LMT_8821A);
+ READ_AND_CONFIG_MP(8821A,_TXPWR_LMT_8821A);
}
}
ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigRFWithHeaderFile\n"));
@@ -1894,18 +1853,18 @@ ODM_ConfigRFWithHeaderFile(
{
if(ConfigType == CONFIG_RF_RADIO) {
if(eRFPath == ODM_RF_PATH_A)
- READ_AND_CONFIG(8192E,_RadioA);
+ READ_AND_CONFIG_MP(8192E,_RadioA);
else if(eRFPath == ODM_RF_PATH_B)
- READ_AND_CONFIG(8192E,_RadioB);
+ READ_AND_CONFIG_MP(8192E,_RadioB);
}
else if(ConfigType == CONFIG_RF_TXPWR_LMT) {
- READ_AND_CONFIG(8192E,_TXPWR_LMT);
+ READ_AND_CONFIG_MP(8192E,_TXPWR_LMT);
}
}
#endif
-#if (RTL8813A_SUPPORT == 1)
- if (pDM_Odm->SupportICType == ODM_RTL8813A)
+#if (RTL8814A_SUPPORT == 1)
+ if (pDM_Odm->SupportICType == ODM_RTL8814A)
{
/*
if(ConfigType == CONFIG_RF_TXPWR_LMT) {
@@ -1936,11 +1895,11 @@ ODM_ConfigRFWithTxPwrTrackHeaderFile(
else if(pDM_Odm->SupportICType == ODM_RTL8821)
{
if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)
- READ_AND_CONFIG(8821A,_TxPowerTrack_PCIE);
+ READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE);
else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)
- READ_AND_CONFIG(8821A,_TxPowerTrack_USB);
+ READ_AND_CONFIG_MP(8821A,_TxPowerTrack_USB);
else
- READ_AND_CONFIG(8821A,_TxPowerTrack_PCIE);
+ READ_AND_CONFIG_MP(8821A,_TxPowerTrack_PCIE);
}
#endif
#if (RTL8812A_SUPPORT == 1)
@@ -1961,9 +1920,9 @@ ODM_ConfigRFWithTxPwrTrackHeaderFile(
else if(pDM_Odm->SupportICType == ODM_RTL8192E)
{
if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)
- READ_AND_CONFIG(8192E,_TxPowerTrack_PCIE);
+ READ_AND_CONFIG_MP(8192E,_TxPowerTrack_PCIE);
else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)
- READ_AND_CONFIG(8192E,_TxPowerTrack_USB);
+ READ_AND_CONFIG_MP(8192E,_TxPowerTrack_USB);
}
#endif
#if RTL8723B_SUPPORT
@@ -1981,9 +1940,11 @@ ODM_ConfigRFWithTxPwrTrackHeaderFile(
else if(pDM_Odm->SupportICType == ODM_RTL8188E)
{
if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)
- READ_AND_CONFIG(8188E,_TxPowerTrack_PCIE);
+ READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE);
else if (pDM_Odm->SupportInterface == ODM_ITRF_USB)
- READ_AND_CONFIG(8188E,_TxPowerTrack_USB);
+ READ_AND_CONFIG_MP(8188E,_TxPowerTrack_USB);
+ else
+ READ_AND_CONFIG_MP(8188E,_TxPowerTrack_PCIE);
}
#endif
@@ -2014,11 +1975,11 @@ ODM_ConfigBBWithHeaderFile(
{
if(ConfigType == CONFIG_BB_PHY_REG)
{
- READ_AND_CONFIG_MP(8723A,_PHY_REG_1T);
+ READ_AND_CONFIG_MP(8723A,_PHY_REG);
}
else if(ConfigType == CONFIG_BB_AGC_TAB)
{
- READ_AND_CONFIG_MP(8723A,_AGC_TAB_1T);
+ READ_AND_CONFIG_MP(8723A,_AGC_TAB);
}
}
#endif
@@ -2028,21 +1989,15 @@ ODM_ConfigBBWithHeaderFile(
{
if(ConfigType == CONFIG_BB_PHY_REG)
{
- if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))
- READ_AND_CONFIG(8188E,_PHY_REG_1T_ICUT);
- else
- READ_AND_CONFIG(8188E,_PHY_REG_1T);
+ READ_AND_CONFIG_MP(8188E,_PHY_REG);
}
else if(ConfigType == CONFIG_BB_AGC_TAB)
{
- if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))
- READ_AND_CONFIG(8188E,_AGC_TAB_1T_ICUT);
- else
- READ_AND_CONFIG(8188E,_AGC_TAB_1T);
+ READ_AND_CONFIG_MP(8188E,_AGC_TAB);
}
else if(ConfigType == CONFIG_BB_PHY_REG_PG)
{
- READ_AND_CONFIG(8188E,_PHY_REG_PG);
+ READ_AND_CONFIG_MP(8188E,_PHY_REG_PG);
}
}
#endif
@@ -2088,15 +2043,15 @@ ODM_ConfigBBWithHeaderFile(
{
if(ConfigType == CONFIG_BB_PHY_REG)
{
- READ_AND_CONFIG(8821A,_PHY_REG);
+ READ_AND_CONFIG_MP(8821A,_PHY_REG);
}
else if(ConfigType == CONFIG_BB_AGC_TAB)
{
- READ_AND_CONFIG(8821A,_AGC_TAB);
+ READ_AND_CONFIG_MP(8821A,_AGC_TAB);
}
else if(ConfigType == CONFIG_BB_PHY_REG_PG)
{
- READ_AND_CONFIG(8821A,_PHY_REG_PG);
+ READ_AND_CONFIG_MP(8821A,_PHY_REG_PG);
}
}
#endif
@@ -2124,20 +2079,20 @@ ODM_ConfigBBWithHeaderFile(
if(ConfigType == CONFIG_BB_PHY_REG)
{
- READ_AND_CONFIG(8192E,_PHY_REG);
+ READ_AND_CONFIG_MP(8192E,_PHY_REG);
}
else if(ConfigType == CONFIG_BB_AGC_TAB)
{
- READ_AND_CONFIG(8192E,_AGC_TAB);
+ READ_AND_CONFIG_MP(8192E,_AGC_TAB);
}
else if(ConfigType == CONFIG_BB_PHY_REG_PG)
{
- READ_AND_CONFIG(8192E,_PHY_REG_PG);
+ READ_AND_CONFIG_MP(8192E,_PHY_REG_PG);
}
}
#endif
-#if (RTL8813A_SUPPORT == 1)
- if(pDM_Odm->SupportICType == ODM_RTL8813A)
+#if (RTL8814A_SUPPORT == 1)
+ if(pDM_Odm->SupportICType == ODM_RTL8814A)
{
if(ConfigType == CONFIG_BB_PHY_REG)
@@ -2182,10 +2137,7 @@ ODM_ConfigMACWithHeaderFile(
#if (RTL8188E_SUPPORT == 1)
if (pDM_Odm->SupportICType == ODM_RTL8188E)
{
- if(IS_VENDOR_8188E_I_CUT_SERIES(Adapter))
- result = READ_AND_CONFIG(8188E,_MAC_REG_ICUT);
- else
- result = READ_AND_CONFIG(8188E,_MAC_REG);
+ READ_AND_CONFIG_MP(8188E,_MAC_REG);
}
#endif
#if (RTL8812A_SUPPORT == 1)
@@ -2197,7 +2149,7 @@ ODM_ConfigMACWithHeaderFile(
#if (RTL8821A_SUPPORT == 1)
if (pDM_Odm->SupportICType == ODM_RTL8821)
{
- READ_AND_CONFIG(8821A,_MAC_REG);
+ READ_AND_CONFIG_MP(8821A,_MAC_REG);
ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("<===8821_ODM_ConfigMACwithHeaderFile\n"));
}
@@ -2211,7 +2163,7 @@ ODM_ConfigMACWithHeaderFile(
#if (RTL8192E_SUPPORT == 1)
if (pDM_Odm->SupportICType == ODM_RTL8192E)
{
- READ_AND_CONFIG(8192E,_MAC_REG);
+ READ_AND_CONFIG_MP(8192E,_MAC_REG);
}
#endif
@@ -2232,19 +2184,19 @@ ODM_ConfigFWWithHeaderFile(
{
if (ConfigType == CONFIG_FW_NIC)
{
- READ_FIRMWARE(8188E,_FW_NIC_T);
+ READ_FIRMWARE_MP(8188E,_FW_NIC_T);
}
else if (ConfigType == CONFIG_FW_WoWLAN)
{
- READ_FIRMWARE(8188E,_FW_WoWLAN_T);
+ READ_FIRMWARE_MP(8188E,_FW_WoWLAN_T);
}
else if(ConfigType == CONFIG_FW_NIC_2)
{
- READ_FIRMWARE(8188E,_FW_NIC_S);
+ READ_FIRMWARE_MP(8188E,_FW_NIC_S);
}
else if (ConfigType == CONFIG_FW_WoWLAN_2)
{
- READ_FIRMWARE(8188E,_FW_WoWLAN_S);
+ READ_FIRMWARE_MP(8188E,_FW_WoWLAN_S);
}
}
#endif
@@ -2302,7 +2254,7 @@ ODM_ConfigFWWithHeaderFile(
}
else if (ConfigType == CONFIG_FW_WoWLAN)
{
- READ_FIRMWARE(8821A,_FW_WoWLAN);
+ READ_FIRMWARE_MP(8821A,_FW_WoWLAN);
}
else if (ConfigType == CONFIG_FW_BT)
{
@@ -2315,16 +2267,16 @@ ODM_ConfigFWWithHeaderFile(
{
if (ConfigType == CONFIG_FW_NIC)
{
- READ_FIRMWARE(8192E,_FW_NIC);
+ READ_FIRMWARE_MP(8192E,_FW_NIC);
}
else if (ConfigType == CONFIG_FW_WoWLAN)
{
- READ_FIRMWARE(8192E,_FW_WoWLAN);
+ READ_FIRMWARE_MP(8192E,_FW_WoWLAN);
}
#ifdef CONFIG_AP_WOWLAN
else if (ConfigType == CONFIG_FW_AP_WoWLAN)
{
- READ_FIRMWARE(8192E,_FW_AP_WoWLAN);
+ READ_FIRMWARE_MP(8192E,_FW_AP_WoWLAN);
}
#endif
@@ -2339,13 +2291,34 @@ ODM_GetHWImgVersion(
IN PDM_ODM_T pDM_Odm
)
{
+ u4Byte Version=0;
+
+#if (RTL8723A_SUPPORT == 1)
+ if (pDM_Odm->SupportICType == ODM_RTL8723A)
+ Version = GET_VERSION_MP(8723A,_MAC_REG);
+#endif
+
+#if (RTL8188E_SUPPORT == 1)
+ if (pDM_Odm->SupportICType == ODM_RTL8188E)
+ Version = GET_VERSION_MP(8188E,_MAC_REG);
+#endif
+
+#if (RTL8821A_SUPPORT == 1)
+ if (pDM_Odm->SupportICType == ODM_RTL8821)
+ Version = GET_VERSION_MP(8821A,_MAC_REG);
+#endif
+
+#if (RTL8192E_SUPPORT == 1)
+ if (pDM_Odm->SupportICType == ODM_RTL8192E)
+ Version = GET_VERSION_MP(8192E,_MAC_REG);
+#endif
#if (RTL8812A_SUPPORT == 1)
if (pDM_Odm->SupportICType == ODM_RTL8812)
- return GET_VERSION_MP(8812A,_MAC_REG);
+ Version = GET_VERSION_MP(8812A,_MAC_REG);
#endif
- return 0;
+ return Version;
}
diff --git a/rtl8723BS/hal/OUTSRC/odm_HWConfig.h b/rtl8723BS/hal/OUTSRC/odm_HWConfig.h
index 16a26f6..da0e5fc 100755
--- a/rtl8723BS/hal/OUTSRC/odm_HWConfig.h
+++ b/rtl8723BS/hal/OUTSRC/odm_HWConfig.h
@@ -24,7 +24,7 @@
/*--------------------------Define -------------------------------------------*/
-#define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
+//#define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
#define AGC_DIFF_CONFIG_MP(ic, band) (ODM_ReadAndConfig_MP_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_MP_##ic##_AGC_TAB_DIFF_##band, \
sizeof(Array_MP_##ic##_AGC_TAB_DIFF_##band)/sizeof(u4Byte)))
#define AGC_DIFF_CONFIG_TC(ic, band) (ODM_ReadAndConfig_TC_##ic##_AGC_TAB_DIFF(pDM_Odm, Array_TC_##ic##_AGC_TAB_DIFF_##band, \
@@ -225,6 +225,12 @@ ODM_GetHWImgVersion(
IN PDM_ODM_T pDM_Odm
);
+s4Byte
+odm_SignalScaleMapping(
+ IN OUT PDM_ODM_T pDM_Odm,
+ IN s4Byte CurrSig
+ );
+
#endif
#endif
diff --git a/rtl8723BS/hal/OUTSRC/odm_NoiseMonitor.c b/rtl8723BS/hal/OUTSRC/odm_NoiseMonitor.c
new file mode 100755
index 0000000..cda06bd
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_NoiseMonitor.c
@@ -0,0 +1,197 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+//============================================================
+// include files
+//============================================================
+//#include "Mp_Precomp.h"
+#include "odm_precomp.h"
+
+//=================================================
+// This function is for inband noise test utility only
+// To obtain the inband noise level(dbm), do the following.
+// 1. disable DIG and Power Saving
+// 2. Set initial gain = 0x1a
+// 3. Stop updating idle time pwer report (for driver read)
+// - 0x80c[25]
+//
+//=================================================
+
+#define Valid_Min -35
+#define Valid_Max 10
+#define ValidCnt 5
+
+s2Byte odm_InbandNoise_Monitor_NSeries(PDM_ODM_T pDM_Odm,u8 bPauseDIG,u8 IGIValue,u32 max_time)
+{
+ u4Byte tmp4b;
+ u1Byte max_rf_path=0,rf_path;
+ u1Byte reg_c50, reg_c58,valid_done=0;
+ struct noise_level noise_data;
+ u32 start = 0, func_start=0, func_end = 0;
+
+ func_start = ODM_GetCurrentTime(pDM_Odm);
+ pDM_Odm->noise_level.noise_all = 0;
+
+ if((pDM_Odm->RFType == ODM_1T2R) ||(pDM_Odm->RFType == ODM_2T2R))
+ max_rf_path = 2;
+ else
+ max_rf_path = 1;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("odm_DebugControlInbandNoise_Nseries() ==> \n"));
+
+ ODM_Memory_Set(pDM_Odm,&noise_data,0,sizeof(struct noise_level));
+
+ //
+ // Step 1. Disable DIG && Set initial gain.
+ //
+
+ if(bPauseDIG)
+ {
+ odm_PauseDIG(pDM_Odm,ODM_PAUSE_DIG,IGIValue);
+ }
+ //
+ // Step 2. Disable all power save for read registers
+ //
+ //dcmd_DebugControlPowerSave(pAdapter, PSDisable);
+
+ //
+ // Step 3. Get noise power level
+ //
+ start = ODM_GetCurrentTime(pDM_Odm);
+ while(1)
+ {
+
+ //Stop updating idle time pwer report (for driver read)
+ ODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 1);
+
+ //Read Noise Floor Report
+ tmp4b = ODM_GetBBReg(pDM_Odm, 0x8f8,bMaskDWord );
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("Noise Floor Report (0x8f8) = 0x%08x\n", tmp4b));
+
+ //ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, TestInitialGain);
+ //if(max_rf_path == 2)
+ // ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, TestInitialGain);
+
+ //update idle time pwer report per 5us
+ ODM_SetBBReg(pDM_Odm, rFPGA0_TxGainStage, BIT25, 0);
+
+ noise_data.value[ODM_RF_PATH_A] = (u1Byte)(tmp4b&0xff);
+ noise_data.value[ODM_RF_PATH_B] = (u1Byte)((tmp4b&0xff00)>>8);
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("value_a = 0x%x(%d), value_b = 0x%x(%d)\n",
+ noise_data.value[ODM_RF_PATH_A], noise_data.value[ODM_RF_PATH_A], noise_data.value[ODM_RF_PATH_B], noise_data.value[ODM_RF_PATH_B]));
+
+ for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++)
+ {
+ noise_data.sval[rf_path] = (s1Byte)noise_data.value[rf_path];
+ noise_data.sval[rf_path] /= 2;
+ }
+
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("sval_a = %d, sval_b = %d\n",
+ noise_data.sval[ODM_RF_PATH_A], noise_data.sval[ODM_RF_PATH_B]));
+ //ODM_delay_ms(10);
+ //ODM_sleep_ms(10);
+
+ for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++)
+ {
+ if( (noise_data.valid_cnt[rf_path] < ValidCnt) && (noise_data.sval[rf_path] < Valid_Max && noise_data.sval[rf_path] >= Valid_Min))
+ {
+ noise_data.valid_cnt[rf_path]++;
+ noise_data.sum[rf_path] += noise_data.sval[rf_path];
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("RF_Path:%d Valid sval = %d\n", rf_path,noise_data.sval[rf_path]));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("Sum of sval = %d, \n", noise_data.sum[rf_path]));
+ if(noise_data.valid_cnt[rf_path] == ValidCnt)
+ {
+ valid_done++;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("After divided, RF_Path:%d ,sum = %d \n", rf_path,noise_data.sum[rf_path]));
+ }
+
+ }
+
+ }
+
+ //printk("####### valid_done:%d #############\n",valid_done);
+ if ((valid_done==max_rf_path) || (ODM_GetProgressingTime(pDM_Odm,start) > max_time))
+ {
+ for(rf_path = ODM_RF_PATH_A; rf_path < max_rf_path; rf_path++)
+ {
+ //printk("%s PATH_%d - sum = %d, valid_cnt = %d \n",__FUNCTION__,rf_path,noise_data.sum[rf_path], noise_data.valid_cnt[rf_path]);
+ if(noise_data.valid_cnt[rf_path])
+ noise_data.sum[rf_path] /= noise_data.valid_cnt[rf_path];
+ else
+ noise_data.sum[rf_path] = 0;
+ }
+ break;
+ }
+ }
+ reg_c50 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XAAGCCore1,bMaskByte0);
+ reg_c50 &= ~BIT7;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("0x%x = 0x%02x(%d)\n", rOFDM0_XAAGCCore1, reg_c50, reg_c50));
+ pDM_Odm->noise_level.noise[ODM_RF_PATH_A] = -110 + reg_c50 + noise_data.sum[ODM_RF_PATH_A];
+ pDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_A];
+
+ if(max_rf_path == 2){
+ reg_c58 = (s4Byte)ODM_GetBBReg(pDM_Odm,rOFDM0_XBAGCCore1,bMaskByte0);
+ reg_c58 &= ~BIT7;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("0x%x = 0x%02x(%d)\n", rOFDM0_XBAGCCore1, reg_c58, reg_c58));
+ pDM_Odm->noise_level.noise[ODM_RF_PATH_B] = -110 + reg_c58 + noise_data.sum[ODM_RF_PATH_B];
+ pDM_Odm->noise_level.noise_all += pDM_Odm->noise_level.noise[ODM_RF_PATH_B];
+ }
+ pDM_Odm->noise_level.noise_all /= max_rf_path;
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("noise_a = %d, noise_b = %d\n",
+ pDM_Odm->noise_level.noise[ODM_RF_PATH_A],
+ pDM_Odm->noise_level.noise[ODM_RF_PATH_B]));
+
+ //
+ // Step 4. Recover the Dig
+ //
+ if(bPauseDIG)
+ {
+ odm_PauseDIG(pDM_Odm,ODM_RESUME_DIG,IGIValue);
+ }
+ func_end = ODM_GetProgressingTime(pDM_Odm,func_start) ;
+ //printk("%s noise_a = %d, noise_b = %d noise_all:%d (%d ms)\n",__FUNCTION__,
+ // pDM_Odm->noise_level.noise[ODM_RF_PATH_A],
+ // pDM_Odm->noise_level.noise[ODM_RF_PATH_B],
+ // pDM_Odm->noise_level.noise_all,func_end);
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,("odm_DebugControlInbandNoise_Nseries() <== \n"));
+ return pDM_Odm->noise_level.noise_all;
+
+}
+s2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time)
+{
+
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES )
+ {
+ //odm_InbandNoise_Monitor_JaguarSeries(pDM_Odm,bPauseDIG,IGIValue,max_time);
+ return 0;
+ }
+ else
+ {
+ return odm_InbandNoise_Monitor_NSeries(pDM_VOID,bPauseDIG,IGIValue,max_time);
+ }
+}
+
+
+
diff --git a/rtl8723BS/hal/OUTSRC/odm_NoiseMonitor.h b/rtl8723BS/hal/OUTSRC/odm_NoiseMonitor.h
new file mode 100755
index 0000000..6625be6
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_NoiseMonitor.h
@@ -0,0 +1,49 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ *****************************************************************************/
+#ifndef __ODMNOISEMONITOR_H__
+#define __ODMNOISEMONITOR_H__
+
+#define ODM_MAX_CHANNEL_NUM 38//14+24
+struct noise_level
+{
+ //u1Byte value_a, value_b;
+ u1Byte value[MAX_RF_PATH];
+ //s1Byte sval_a, sval_b;
+ s1Byte sval[MAX_RF_PATH];
+
+ //s4Byte noise_a=0, noise_b=0,sum_a=0, sum_b=0;
+ //s4Byte noise[ODM_RF_PATH_MAX];
+ s4Byte sum[MAX_RF_PATH];
+ //u1Byte valid_cnt_a=0, valid_cnt_b=0,
+ u1Byte valid[MAX_RF_PATH];
+ u1Byte valid_cnt[MAX_RF_PATH];
+
+};
+
+
+typedef struct _ODM_NOISE_MONITOR_
+{
+ s1Byte noise[MAX_RF_PATH];
+ s2Byte noise_all;
+}ODM_NOISE_MONITOR;
+
+s2Byte ODM_InbandNoise_Monitor(PVOID pDM_VOID,u8 bPauseDIG,u8 IGIValue,u32 max_time);
+
+#endif
diff --git a/rtl8723BS/hal/OUTSRC/odm_PathDiv.c b/rtl8723BS/hal/OUTSRC/odm_PathDiv.c
new file mode 100755
index 0000000..f24e3c4
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_PathDiv.c
@@ -0,0 +1,1580 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+//============================================================
+// include files
+//============================================================
+#include "odm_precomp.h"
+
+
+
+VOID
+odm_PathDiversityInit(
+ IN PVOID pDM_VOID
+)
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
+ return;
+ }
+
+#if RTL8812A_SUPPORT
+
+ if(pDM_Odm->SupportICType & ODM_RTL8812)
+ ODM_PathDiversityInit_8812A(pDM_Odm);
+#endif
+#endif
+}
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+VOID
+odm_PathDiversity(
+ IN PVOID pDM_VOID
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
+ {
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
+ return;
+ }
+
+#if RTL8812A_SUPPORT
+
+ if(pDM_Odm->SupportICType & ODM_RTL8812)
+ ODM_PathDiversity_8812A(pDM_Odm);
+#endif
+}
+#endif //(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+
+
+
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+//
+// 2011/12/02 MH Copy from MP oursrc for temporarily test.
+//
+
+BOOLEAN
+odm_IsConnected_92C(
+ IN PADAPTER Adapter
+)
+{
+ PRT_WLAN_STA pEntry;
+ PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
+ u4Byte i;
+ BOOLEAN bConnected=FALSE;
+
+ if(pMgntInfo->mAssoc)
+ {
+ bConnected = TRUE;
+ }
+ else
+ {
+ for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+ {
+ if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
+ pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+ else
+ pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+ if(pEntry!=NULL)
+ {
+ if(pEntry->bAssociated)
+ {
+ bConnected = TRUE;
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ return bConnected;
+}
+
+BOOLEAN
+ODM_PathDiversityBeforeLink92C(
+ //IN PADAPTER Adapter
+ IN PDM_ODM_T pDM_Odm
+ )
+{
+#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE* pHalData = NULL;
+ PMGNT_INFO pMgntInfo = NULL;
+ //pSWAT_T pDM_SWAT_Table = &Adapter->DM_SWAT_Table;
+ pPD_T pDM_PDTable = NULL;
+
+ s1Byte Score = 0;
+ PRT_WLAN_BSS pTmpBssDesc;
+ PRT_WLAN_BSS pTestBssDesc;
+
+ u1Byte target_chnl = 0;
+ u1Byte index;
+
+ if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413
+ { // The ODM structure is not initialized.
+ return FALSE;
+ }
+ pHalData = GET_HAL_DATA(Adapter);
+ pMgntInfo = &Adapter->MgntInfo;
+ pDM_PDTable = &Adapter->DM_PDTable;
+
+ // Condition that does not need to use path diversity.
+ if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest )
+ {
+ RT_TRACE(COMP_INIT, DBG_LOUD,
+ ("ODM_PathDiversityBeforeLink92C(): No PathDiv Mechanism before link.\n"));
+ return FALSE;
+ }
+
+ // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
+ PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+ if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
+ {
+ PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+
+ RT_TRACE(COMP_INIT, DBG_LOUD,
+ ("ODM_PathDiversityBeforeLink92C(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
+ pMgntInfo->RFChangeInProgress,
+ pHalData->eRFPowerState));
+
+ //pDM_SWAT_Table->SWAS_NoLink_State = 0;
+ pDM_PDTable->PathDiv_NoLink_State = 0;
+
+ return FALSE;
+ }
+ else
+ {
+ PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
+ }
+
+ //1 Run AntDiv mechanism "Before Link" part.
+ //if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
+ if(pDM_PDTable->PathDiv_NoLink_State == 0)
+ {
+ //1 Prepare to do Scan again to check current antenna state.
+
+ // Set check state to next step.
+ //pDM_SWAT_Table->SWAS_NoLink_State = 1;
+ pDM_PDTable->PathDiv_NoLink_State = 1;
+
+ // Copy Current Scan list.
+ Adapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc;
+ PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
+
+ // Switch Antenna to another one.
+ if(pDM_PDTable->DefaultRespPath == 0)
+ {
+ PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x05); // TRX path = PathB
+ odm_SetRespPath_92C(Adapter, 1);
+ pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
+ pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
+ }
+ else
+ {
+ PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x00); // TRX path = PathA
+ odm_SetRespPath_92C(Adapter, 0);
+ pDM_PDTable->OFDMTXPath = 0x0;
+ pDM_PDTable->CCKTXPath = 0x0;
+ }
+#if 0
+
+ pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+ pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
+
+ RT_TRACE(COMP_INIT, DBG_LOUD,
+ ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"));
+ //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
+ pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
+ PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
+#endif
+
+ // Go back to scan function again.
+ RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Scan one more time\n"));
+ pMgntInfo->ScanStep=0;
+ target_chnl = odm_SwAntDivSelectScanChnl(Adapter);
+ odm_SwAntDivConstructScanChnl(Adapter, target_chnl);
+ PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
+
+ return TRUE;
+ }
+ else
+ {
+ //1 ScanComple() is called after antenna swiched.
+ //1 Check scan result and determine which antenna is going
+ //1 to be used.
+
+ for(index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)
+ {
+ pTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]);
+ pTestBssDesc = &(pMgntInfo->bssDesc[index]);
+
+ if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
+ {
+ RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\n"));
+ continue;
+ }
+
+ if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
+ {
+ RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\n"));
+ RT_PRINT_STR(COMP_INIT, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
+ RT_TRACE(COMP_INIT, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+
+ Score++;
+ PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
+ }
+ else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
+ {
+ RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\n"));
+ RT_PRINT_STR(COMP_INIT, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
+ RT_TRACE(COMP_INIT, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
+ Score--;
+ }
+
+ }
+
+ if(pMgntInfo->NumBssDesc!=0 && Score<=0)
+ {
+ RT_TRACE(COMP_INIT, DBG_LOUD,
+ ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
+
+ //pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+ }
+ else
+ {
+ RT_TRACE(COMP_INIT, DBG_LOUD,
+ ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
+
+ if(pDM_PDTable->DefaultRespPath == 0)
+ {
+ pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
+ pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
+ odm_SetRespPath_92C(Adapter, 1);
+ }
+ else
+ {
+ pDM_PDTable->OFDMTXPath = 0x0;
+ pDM_PDTable->CCKTXPath = 0x0;
+ odm_SetRespPath_92C(Adapter, 0);
+ }
+ PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x01); // RX path = PathAB
+
+ //pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
+
+ //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
+ //pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
+ //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
+ }
+
+ // Check state reset to default and wait for next time.
+ //pDM_SWAT_Table->SWAS_NoLink_State = 0;
+ pDM_PDTable->PathDiv_NoLink_State = 0;
+
+ return FALSE;
+ }
+#else
+ return FALSE;
+#endif
+
+}
+
+
+
+VOID
+odm_PathDiversityAfterLink_92C(
+ IN PADAPTER Adapter
+)
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
+ pPD_T pDM_PDTable = &Adapter->DM_PDTable;
+ u1Byte DefaultRespPath=0;
+
+ if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg != 1) || (pHalData->eRFPowerState == eRfOff))
+ {
+ if(pHalData->PathDivCfg == 0)
+ {
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("No ODM_TXPathDiversity()\n"));
+ }
+ else
+ {
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("2T ODM_TXPathDiversity()\n"));
+ }
+ return;
+ }
+ if(!odm_IsConnected_92C(Adapter))
+ {
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity(): No Connections\n"));
+ return;
+ }
+
+
+ if(pDM_PDTable->TrainingState == 0)
+ {
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity() ==>\n"));
+ odm_OFDMTXPathDiversity_92C(Adapter);
+
+ if((pDM_PDTable->CCKPathDivEnable == TRUE) && (pDM_PDTable->OFDM_Pkt_Cnt < 100))
+ {
+ //RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=0\n"));
+
+ if(pDM_PDTable->CCK_Pkt_Cnt > 300)
+ pDM_PDTable->Timer = 20;
+ else if(pDM_PDTable->CCK_Pkt_Cnt > 100)
+ pDM_PDTable->Timer = 60;
+ else
+ pDM_PDTable->Timer = 250;
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: timer=%d\n",pDM_PDTable->Timer));
+
+ PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x00); // RX path = PathA
+ pDM_PDTable->TrainingState = 1;
+ pHalData->RSSI_test = TRUE;
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
+ }
+ else
+ {
+ pDM_PDTable->CCKTXPath = pDM_PDTable->OFDMTXPath;
+ DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: Skip odm_CCKTXPathDiversity_92C, DefaultRespPath is OFDM\n"));
+ odm_SetRespPath_92C(Adapter, DefaultRespPath);
+ odm_ResetPathDiversity_92C(Adapter);
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
+ }
+ }
+ else if(pDM_PDTable->TrainingState == 1)
+ {
+ //RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=1\n"));
+ PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x05); // RX path = PathB
+ pDM_PDTable->TrainingState = 2;
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
+ }
+ else
+ {
+ //RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n"));
+ pDM_PDTable->TrainingState = 0;
+ odm_CCKTXPathDiversity_92C(Adapter);
+ if(pDM_PDTable->OFDM_Pkt_Cnt != 0)
+ {
+ DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is OFDM\n"));
+ }
+ else
+ {
+ DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is CCK\n"));
+ }
+ odm_SetRespPath_92C(Adapter, DefaultRespPath);
+ odm_ResetPathDiversity_92C(Adapter);
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
+ }
+
+}
+
+VOID
+odm_SetRespPath_92C(
+ IN PADAPTER Adapter,
+ IN u1Byte DefaultRespPath
+ )
+{
+ pPD_T pDM_PDTable = &Adapter->DM_PDTable;
+
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_SetRespPath_92C: Select Response Path=%d\n",DefaultRespPath));
+ if(DefaultRespPath != pDM_PDTable->DefaultRespPath)
+ {
+ if(DefaultRespPath == 0)
+ {
+ PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x15);
+ }
+ else
+ {
+ PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x2A);
+ }
+ }
+ pDM_PDTable->DefaultRespPath = DefaultRespPath;
+}
+
+VOID
+odm_OFDMTXPathDiversity_92C(
+ IN PADAPTER Adapter)
+{
+// HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
+ PRT_WLAN_STA pEntry;
+ u1Byte i, DefaultRespPath = 0;
+ s4Byte MinRSSI = 0xFF;
+ pPD_T pDM_PDTable = &Adapter->DM_PDTable;
+ pDM_PDTable->OFDMTXPath = 0;
+
+ //1 Default Port
+ if(pMgntInfo->mAssoc)
+ {
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port RSSI[0]=%d, RSSI[1]=%d\n",
+ Adapter->RxStats.RxRSSIPercentage[0], Adapter->RxStats.RxRSSIPercentage[1]));
+ if(Adapter->RxStats.RxRSSIPercentage[0] > Adapter->RxStats.RxRSSIPercentage[1])
+ {
+ pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & (~BIT0);
+ MinRSSI = Adapter->RxStats.RxRSSIPercentage[1];
+ DefaultRespPath = 0;
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-0\n"));
+ }
+ else
+ {
+ pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT0;
+ MinRSSI = Adapter->RxStats.RxRSSIPercentage[0];
+ DefaultRespPath = 1;
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-1\n"));
+ }
+ //RT_TRACE( COMP_INIT, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath));
+ }
+ //1 Extension Port
+ for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+ {
+ if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
+ pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+ else
+ pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+ if(pEntry!=NULL)
+ {
+ if(pEntry->bAssociated)
+ {
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d, RSSI_0=%d, RSSI_1=%d\n",
+ pEntry->AssociatedMacId, pEntry->rssi_stat.RxRSSIPercentage[0], pEntry->rssi_stat.RxRSSIPercentage[1]));
+
+ if(pEntry->rssi_stat.RxRSSIPercentage[0] > pEntry->rssi_stat.RxRSSIPercentage[1])
+ {
+ pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & ~(BIT(pEntry->AssociatedMacId));
+ //pHalData->TXPath = pHalData->TXPath & ~(1<<(pEntry->AssociatedMacId));
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-0\n", pEntry->AssociatedMacId));
+ if(pEntry->rssi_stat.RxRSSIPercentage[1] < MinRSSI)
+ {
+ MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[1];
+ DefaultRespPath = 0;
+ }
+ }
+ else
+ {
+ pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT(pEntry->AssociatedMacId);
+ //pHalData->TXPath = pHalData->TXPath | (1 << (pEntry->AssociatedMacId));
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-1\n", pEntry->AssociatedMacId));
+ if(pEntry->rssi_stat.RxRSSIPercentage[0] < MinRSSI)
+ {
+ MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[0];
+ DefaultRespPath = 1;
+ }
+ }
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ pDM_PDTable->OFDMDefaultRespPath = DefaultRespPath;
+}
+
+
+VOID
+odm_CCKTXPathDiversity_92C(
+ IN PADAPTER Adapter
+)
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
+ PRT_WLAN_STA pEntry;
+ s4Byte MinRSSI = 0xFF;
+ u1Byte i, DefaultRespPath = 0;
+// BOOLEAN bBModePathDiv = FALSE;
+ pPD_T pDM_PDTable = &Adapter->DM_PDTable;
+
+ //1 Default Port
+ if(pMgntInfo->mAssoc)
+ {
+ if(pHalData->OFDM_Pkt_Cnt == 0)
+ {
+ for(i=0; i<2; i++)
+ {
+ if(pDM_PDTable->RSSI_CCK_Path_cnt[i] > 1) //Because the first packet is discarded
+ pDM_PDTable->RSSI_CCK_Path[i] = pDM_PDTable->RSSI_CCK_Path[i] / (pDM_PDTable->RSSI_CCK_Path_cnt[i]-1);
+ else
+ pDM_PDTable->RSSI_CCK_Path[i] = 0;
+ }
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path[0]=%d, pDM_PDTable->RSSI_CCK_Path[1]=%d\n",
+ pDM_PDTable->RSSI_CCK_Path[0], pDM_PDTable->RSSI_CCK_Path[1]));
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path_cnt[0]=%d, pDM_PDTable->RSSI_CCK_Path_cnt[1]=%d\n",
+ pDM_PDTable->RSSI_CCK_Path_cnt[0], pDM_PDTable->RSSI_CCK_Path_cnt[1]));
+
+ if(pDM_PDTable->RSSI_CCK_Path[0] > pDM_PDTable->RSSI_CCK_Path[1])
+ {
+ pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
+ MinRSSI = pDM_PDTable->RSSI_CCK_Path[1];
+ DefaultRespPath = 0;
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
+ }
+ else if(pDM_PDTable->RSSI_CCK_Path[0] < pDM_PDTable->RSSI_CCK_Path[1])
+ {
+ pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT0;
+ MinRSSI = pDM_PDTable->RSSI_CCK_Path[0];
+ DefaultRespPath = 1;
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-1\n"));
+ }
+ else
+ {
+ if((pDM_PDTable->RSSI_CCK_Path[0] != 0) && (pDM_PDTable->RSSI_CCK_Path[0] < MinRSSI))
+ {
+ pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
+ MinRSSI = pDM_PDTable->RSSI_CCK_Path[1];
+ DefaultRespPath = 0;
+ }
+ else
+ {
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port unchange CCK Path\n"));
+ }
+ }
+ }
+ else //Follow OFDM decision
+ {
+ pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~BIT0)) | (pDM_PDTable->OFDMTXPath &BIT0);
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, Default port Select CCK Path-%d\n",
+ pDM_PDTable->CCKTXPath &BIT0));
+ }
+ }
+ //1 Extension Port
+ for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+ {
+ if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
+ pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+ else
+ pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+ if(pEntry!=NULL)
+ {
+ if(pEntry->bAssociated)
+ {
+ if(pEntry->rssi_stat.OFDM_Pkt_Cnt == 0)
+ {
+ u1Byte j=0;
+ for(j=0; j<2; j++)
+ {
+ if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] > 1)
+ pEntry->rssi_stat.RSSI_CCK_Path[j] = pEntry->rssi_stat.RSSI_CCK_Path[j] / (pEntry->rssi_stat.RSSI_CCK_Path_cnt[j]-1);
+ else
+ pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
+ }
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d, RSSI_CCK0=%d, RSSI_CCK1=%d\n",
+ pEntry->AssociatedMacId, pEntry->rssi_stat.RSSI_CCK_Path[0], pEntry->rssi_stat.RSSI_CCK_Path[1]));
+
+ if(pEntry->rssi_stat.RSSI_CCK_Path[0] >pEntry->rssi_stat.RSSI_CCK_Path[1])
+ {
+ pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
+ if(pEntry->rssi_stat.RSSI_CCK_Path[1] < MinRSSI)
+ {
+ MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
+ DefaultRespPath = 0;
+ }
+ }
+ else if(pEntry->rssi_stat.RSSI_CCK_Path[0] <pEntry->rssi_stat.RSSI_CCK_Path[1])
+ {
+ pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT(pEntry->AssociatedMacId);
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-1\n", pEntry->AssociatedMacId));
+ if(pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI)
+ {
+ MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[0];
+ DefaultRespPath = 1;
+ }
+ }
+ else
+ {
+ if((pEntry->rssi_stat.RSSI_CCK_Path[0] != 0) && (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI))
+ {
+ pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
+ MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
+ DefaultRespPath = 0;
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
+ }
+ else
+ {
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d unchange CCK Path\n", pEntry->AssociatedMacId));
+ }
+ }
+ }
+ else //Follow OFDM decision
+ {
+ pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~(BIT(pEntry->AssociatedMacId)))) | (pDM_PDTable->OFDMTXPath & BIT(pEntry->AssociatedMacId));
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, MACID=%d Select CCK Path-%d\n",
+ pEntry->AssociatedMacId, (pDM_PDTable->CCKTXPath & BIT(pEntry->AssociatedMacId))>>(pEntry->AssociatedMacId)));
+ }
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C:MinRSSI=%d\n",MinRSSI));
+
+ if(MinRSSI == 0xFF)
+ DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
+
+ pDM_PDTable->CCKDefaultRespPath = DefaultRespPath;
+}
+
+
+VOID
+odm_ResetPathDiversity_92C(
+ IN PADAPTER Adapter
+)
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ pPD_T pDM_PDTable = &Adapter->DM_PDTable;
+ PRT_WLAN_STA pEntry;
+ u4Byte i,j;
+
+ pHalData->RSSI_test = FALSE;
+ pDM_PDTable->CCK_Pkt_Cnt = 0;
+ pDM_PDTable->OFDM_Pkt_Cnt = 0;
+ pHalData->CCK_Pkt_Cnt =0;
+ pHalData->OFDM_Pkt_Cnt =0;
+
+ if(pDM_PDTable->CCKPathDivEnable == TRUE)
+ PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x01); //RX path = PathAB
+
+ for(i=0; i<2; i++)
+ {
+ pDM_PDTable->RSSI_CCK_Path_cnt[i]=0;
+ pDM_PDTable->RSSI_CCK_Path[i] = 0;
+ }
+ for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
+ {
+ if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
+ pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
+ else
+ pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
+
+ if(pEntry!=NULL)
+ {
+ pEntry->rssi_stat.CCK_Pkt_Cnt = 0;
+ pEntry->rssi_stat.OFDM_Pkt_Cnt = 0;
+ for(j=0; j<2; j++)
+ {
+ pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] = 0;
+ pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
+ }
+ }
+ else
+ break;
+ }
+}
+
+
+
+
+
+VOID
+odm_CCKTXPathDiversityCallback(
+ PRT_TIMER pTimer
+)
+{
+#if USE_WORKITEM
+ PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
+#else
+ PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
+#endif
+
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+#if USE_WORKITEM
+ PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
+#else
+ odm_PathDiversityAfterLink_92C(Adapter);
+#endif
+#else
+ PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
+#endif
+
+}
+
+
+VOID
+odm_CCKTXPathDiversityWorkItemCallback(
+ IN PVOID pContext
+ )
+{
+ PADAPTER Adapter = (PADAPTER)pContext;
+
+ odm_CCKTXPathDiversity_92C(Adapter);
+}
+
+//
+// 20100514 Luke/Joseph:
+// Callback function for 500ms antenna test trying.
+//
+VOID
+odm_PathDivChkAntSwitchCallback(
+ PRT_TIMER pTimer
+)
+{
+ PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
+
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+
+#if USE_WORKITEM
+ PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
+#else
+ odm_PathDivChkAntSwitch(pDM_Odm);
+#endif
+#else
+ PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
+#endif
+
+//odm_SwAntDivChkAntSwitch(Adapter, SWAW_STEP_DETERMINE);
+
+}
+
+
+VOID
+odm_PathDivChkAntSwitchWorkitemCallback(
+ IN PVOID pContext
+ )
+{
+ PADAPTER pAdapter = (PADAPTER)pContext;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
+
+ odm_PathDivChkAntSwitch(pDM_Odm);
+}
+
+
+ //MAC0_ACCESS_PHY1
+
+// 2011-06-22 Neil Chen & Gary Hsin
+// Refer to Jr.Luke's SW ANT DIV
+// 92D Path Diversity Main function
+// refer to 88C software antenna diversity
+//
+VOID
+odm_PathDivChkAntSwitch(
+ PDM_ODM_T pDM_Odm
+ //PADAPTER Adapter,
+ //u1Byte Step
+)
+{
+ PADAPTER Adapter = pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
+
+
+ pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+ s4Byte curRSSI=100, RSSI_A, RSSI_B;
+ u1Byte nextAntenna=AUX_ANT;
+ static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
+ u8Byte curTxOkCnt, curRxOkCnt;
+ static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
+ u8Byte CurByteCnt=0, PreByteCnt=0;
+ static u1Byte TrafficLoad = TRAFFIC_LOW;
+ u1Byte Score_A=0, Score_B=0;
+ u1Byte i=0x0;
+ // Neil Chen
+ static u1Byte pathdiv_para=0x0;
+ static u1Byte switchfirsttime=0x00;
+ // u1Byte regB33 = (u1Byte) PHY_QueryBBReg(Adapter, 0xB30,BIT27);
+ u1Byte regB33 = (u1Byte)ODM_GetBBReg(pDM_Odm, PATHDIV_REG, BIT27);
+
+
+ //u1Byte reg637 =0x0;
+ static u1Byte fw_value=0x0;
+ //u8Byte curTxOkCnt_tmp, curRxOkCnt_tmp;
+ PADAPTER BuddyAdapter = Adapter->BuddyAdapter; // another adapter MAC
+ // Path Diversity //Neil Chen--2011--06--22
+
+ //u1Byte PathDiv_Trigger = (u1Byte) PHY_QueryBBReg(Adapter, 0xBA0,BIT31);
+ u1Byte PathDiv_Trigger = (u1Byte) ODM_GetBBReg(pDM_Odm, PATHDIV_TRI,BIT31);
+ u1Byte PathDiv_Enable = pHalData->bPathDiv_Enable;
+
+
+ //DbgPrint("Path Div PG Value:%x \n",PathDiv_Enable);
+ if((BuddyAdapter==NULL)||(!PathDiv_Enable)||(PathDiv_Trigger)||(pHalData->CurrentBandType == BAND_ON_2_4G))
+ {
+ return;
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD,("===================>odm_PathDivChkAntSwitch()\n"));
+
+ // The first time to switch path excluding 2nd, 3rd, ....etc....
+ if(switchfirsttime==0)
+ {
+ if(regB33==0)
+ {
+ pDM_SWAT_Table->CurAntenna = MAIN_ANT; // Default MAC0_5G-->Path A (current antenna)
+ }
+ }
+
+ // Condition that does not need to use antenna diversity.
+ if(pDM_Odm->SupportICType != ODM_RTL8192D)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDiversityMechanims(): No PathDiv Mechanism.\n"));
+ return;
+ }
+
+ // Radio off: Status reset to default and return.
+ if(pHalData->eRFPowerState==eRfOff)
+ {
+ //ODM_SwAntDivRestAfterLink(Adapter);
+ return;
+ }
+
+ /*
+ // Handling step mismatch condition.
+ // Peak step is not finished at last time. Recover the variable and check again.
+ if( Step != pDM_SWAT_Table->try_flag )
+ {
+ ODM_SwAntDivRestAfterLink(Adapter);
+ } */
+
+ if(pDM_SWAT_Table->try_flag == 0xff)
+ {
+ // Select RSSI checking target
+ if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
+ {
+ // Target: Infrastructure mode AP.
+ pHalData->RSSI_target = NULL;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDivMechanism(): RSSI_target is DEF AP!\n"));
+ }
+ else
+ {
+ u1Byte index = 0;
+ PRT_WLAN_STA pEntry = NULL;
+ PADAPTER pTargetAdapter = NULL;
+
+ if( pMgntInfo->mIbss || ACTING_AS_AP(Adapter) )
+ {
+ // Target: AP/IBSS peer.
+ pTargetAdapter = Adapter;
+ }
+ else if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
+ {
+ // Target: VWIFI peer.
+ pTargetAdapter = GetFirstExtAdapter(Adapter);
+ }
+
+ if(pTargetAdapter != NULL)
+ {
+ for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
+ {
+ pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
+ if(pEntry != NULL)
+ {
+ if(pEntry->bAssociated)
+ break;
+ }
+ }
+ }
+
+ if(pEntry == NULL)
+ {
+ ODM_PathDivRestAfterLink(pDM_Odm);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
+ return;
+ }
+ else
+ {
+ pHalData->RSSI_target = pEntry;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
+ }
+ }
+
+ pHalData->RSSI_cnt_A = 0;
+ pHalData->RSSI_cnt_B = 0;
+ pDM_SWAT_Table->try_flag = 0;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
+ return;
+ }
+ else
+ {
+ // 1st step
+ curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
+ curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
+ lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
+ lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
+
+ if(pDM_SWAT_Table->try_flag == 1) // Training State
+ {
+ if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+ {
+ TXByteCnt_A += curTxOkCnt;
+ RXByteCnt_A += curRxOkCnt;
+ }
+ else
+ {
+ TXByteCnt_B += curTxOkCnt;
+ RXByteCnt_B += curRxOkCnt;
+ }
+
+ nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
+ pDM_SWAT_Table->RSSI_Trying--;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
+ if(pDM_SWAT_Table->RSSI_Trying == 0)
+ {
+ CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_A+RXByteCnt_A) : (TXByteCnt_B+RXByteCnt_B);
+ PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_B+RXByteCnt_B) : (TXByteCnt_A+RXByteCnt_A);
+
+ if(TrafficLoad == TRAFFIC_HIGH)
+ {
+ //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
+ PreByteCnt =PreByteCnt*9;
+ }
+ else if(TrafficLoad == TRAFFIC_LOW)
+ {
+ //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
+ PreByteCnt =PreByteCnt*2;
+ }
+ if(pHalData->RSSI_cnt_A > 0)
+ RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
+ else
+ RSSI_A = 0;
+ if(pHalData->RSSI_cnt_B > 0)
+ RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
+ else
+ RSSI_B = 0;
+ curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+ pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n",
+ (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
+ RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
+ }
+
+ }
+ else // try_flag=0
+ {
+
+ if(pHalData->RSSI_cnt_A > 0)
+ RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
+ else
+ RSSI_A = 0;
+ if(pHalData->RSSI_cnt_B > 0)
+ RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
+ else
+ RSSI_B = 0;
+ curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+ pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n",
+ (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
+ RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
+ //RT_TRACE(COMP_INIT, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
+ //RT_TRACE(COMP_INIT, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
+ }
+
+ //1 Trying State
+ if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
+ {
+
+ if(pDM_SWAT_Table->TestMode == TP_MODE)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = TP_MODE"));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:CurByteCnt = %"i64fmt"d,", CurByteCnt));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:PreByteCnt = %"i64fmt"d\n",PreByteCnt));
+ if(CurByteCnt < PreByteCnt)
+ {
+ if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+ pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
+ else
+ pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
+ }
+ else
+ {
+ if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+ pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
+ else
+ pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
+ }
+ for (i= 0; i<8; i++)
+ {
+ if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
+ Score_A++;
+ else
+ Score_B++;
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Score_A=%d, Score_B=%d\n", Score_A, Score_B));
+
+ if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+ {
+ nextAntenna = (Score_A >= Score_B)?MAIN_ANT:AUX_ANT;
+ }
+ else
+ {
+ nextAntenna = (Score_B >= Score_A)?AUX_ANT:MAIN_ANT;
+ }
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: nextAntenna=%s\n",(nextAntenna==MAIN_ANT)?"MAIN":"AUX"));
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: preAntenna= %s, curAntenna= %s \n",
+ (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
+
+ if(nextAntenna != pDM_SWAT_Table->CurAntenna)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Switch back to another antenna"));
+ }
+ else
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: current anntena is good\n"));
+ }
+ }
+
+
+ if(pDM_SWAT_Table->TestMode == RSSI_MODE)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = RSSI_MODE"));
+ pDM_SWAT_Table->SelectAntennaMap=0xAA;
+ if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
+ {
+ //RT_TRACE(COMP_INIT, DBG_LOUD, ("SWAS: Switch back to another antenna"));
+ nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)?AUX_ANT : MAIN_ANT;
+ }
+ else // current anntena is good
+ {
+ nextAntenna =pDM_SWAT_Table->CurAntenna;
+ //RT_TRACE(COMP_INIT, DBG_LOUD, ("SWAS: current anntena is good\n"));
+ }
+ }
+
+ pDM_SWAT_Table->try_flag = 0;
+ pHalData->RSSI_test = FALSE;
+ pHalData->RSSI_sum_A = 0;
+ pHalData->RSSI_cnt_A = 0;
+ pHalData->RSSI_sum_B = 0;
+ pHalData->RSSI_cnt_B = 0;
+ TXByteCnt_A = 0;
+ TXByteCnt_B = 0;
+ RXByteCnt_A = 0;
+ RXByteCnt_B = 0;
+
+ }
+
+ //1 Normal State
+ else if(pDM_SWAT_Table->try_flag == 0)
+ {
+ if(TrafficLoad == TRAFFIC_HIGH)
+ {
+ if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
+ TrafficLoad = TRAFFIC_HIGH;
+ else
+ TrafficLoad = TRAFFIC_LOW;
+ }
+ else if(TrafficLoad == TRAFFIC_LOW)
+ {
+ if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
+ TrafficLoad = TRAFFIC_HIGH;
+ else
+ TrafficLoad = TRAFFIC_LOW;
+ }
+ if(TrafficLoad == TRAFFIC_HIGH)
+ pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
+ //RT_TRACE(COMP_INIT, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
+
+ //Prepare To Try Antenna
+ nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
+ pDM_SWAT_Table->try_flag = 1;
+ pHalData->RSSI_test = TRUE;
+ if((curRxOkCnt+curTxOkCnt) > 1000)
+ {
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+ pDM_SWAT_Table->RSSI_Trying = 4;
+#else
+ pDM_SWAT_Table->RSSI_Trying = 2;
+#endif
+ pDM_SWAT_Table->TestMode = TP_MODE;
+ }
+ else
+ {
+ pDM_SWAT_Table->RSSI_Trying = 2;
+ pDM_SWAT_Table->TestMode = RSSI_MODE;
+
+ }
+
+ //RT_TRACE(COMP_INIT, DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
+ pHalData->RSSI_sum_A = 0;
+ pHalData->RSSI_cnt_A = 0;
+ pHalData->RSSI_sum_B = 0;
+ pHalData->RSSI_cnt_B = 0;
+ } // end of try_flag=0
+ }
+
+ //1 4.Change TRX antenna
+ if(nextAntenna != pDM_SWAT_Table->CurAntenna)
+ {
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Change TX Antenna!\n "));
+ //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna); for 88C
+ if(nextAntenna==MAIN_ANT)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH A\n "));
+ pathdiv_para = 0x02; //02 to switchback to RF path A
+ fw_value = 0x03;
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+ odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+#else
+ ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
+#endif
+ }
+ else if(nextAntenna==AUX_ANT)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH B\n "));
+ if(switchfirsttime==0) // First Time To Enter Path Diversity
+ {
+ switchfirsttime=0x01;
+ pathdiv_para = 0x00;
+ fw_value=0x00; // to backup RF Path A Releated Registers
+
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+ odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+#else
+ ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
+ //for(u1Byte n=0; n<80,n++)
+ //{
+ //delay_us(500);
+ ODM_delay_ms(500);
+ odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+
+ fw_value=0x01; // to backup RF Path A Releated Registers
+ ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
+#endif
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: FIRST TIME To DO PATH SWITCH!\n "));
+ }
+ else
+ {
+ pathdiv_para = 0x01;
+ fw_value = 0x02;
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+ odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
+#else
+ ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
+#endif
+ }
+ }
+ // odm_PathDiversity_8192D(Adapter, pathdiv_para);
+ }
+
+ //1 5.Reset Statistics
+ pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
+ pDM_SWAT_Table->CurAntenna = nextAntenna;
+ pDM_SWAT_Table->PreRSSI = curRSSI;
+
+ //1 6.Set next timer
+
+ if(pDM_SWAT_Table->RSSI_Trying == 0)
+ return;
+
+ if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
+ {
+ if(pDM_SWAT_Table->TestMode == TP_MODE)
+ {
+ if(TrafficLoad == TRAFFIC_HIGH)
+ {
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 10 ); //ms
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 10 ms\n"));
+#else
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 20 ); //ms
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 20 ms\n"));
+#endif
+ }
+ else if(TrafficLoad == TRAFFIC_LOW)
+ {
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 50 ); //ms
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 50 ms\n"));
+ }
+ }
+ else // TestMode == RSSI_MODE
+ {
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 500 ms\n"));
+ }
+ }
+ else
+ {
+ if(pDM_SWAT_Table->TestMode == TP_MODE)
+ {
+ if(TrafficLoad == TRAFFIC_HIGH)
+
+#if DEV_BUS_TYPE==RT_PCI_INTERFACE
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 90 ); //ms
+ //ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 90 ms\n"));
+#else
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 180); //ms
+#endif
+ else if(TrafficLoad == TRAFFIC_LOW)
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 100 ); //ms
+ }
+ else
+ ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
+ }
+}
+
+
+
+VOID
+ODM_CCKPathDiversityChkPerPktRssi(
+ PADAPTER Adapter,
+ BOOLEAN bIsDefPort,
+ BOOLEAN bMatchBSSID,
+ PRT_WLAN_STA pEntry,
+ PRT_RFD pRfd,
+ pu1Byte pDesc
+ )
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ BOOLEAN bCount = FALSE;
+ pPD_T pDM_PDTable = &Adapter->DM_PDTable;
+ //BOOLEAN isCCKrate = RX_HAL_IS_CCK_RATE_92C(pDesc);
+#if DEV_BUS_TYPE != RT_SDIO_INTERFACE
+ BOOLEAN isCCKrate = RX_HAL_IS_CCK_RATE(Adapter, pDesc);
+#else //below code would be removed if we have verified SDIO
+ BOOLEAN isCCKrate = IS_HARDWARE_TYPE_8188E(Adapter) ? RX_HAL_IS_CCK_RATE_88E(pDesc) : RX_HAL_IS_CCK_RATE_92C(pDesc);
+#endif
+
+ if((pHalData->PathDivCfg != 1) || (pHalData->RSSI_test == FALSE))
+ return;
+
+ if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
+ bCount = TRUE;
+ else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
+ bCount = TRUE;
+
+ if(bCount && isCCKrate)
+ {
+ if(pDM_PDTable->TrainingState == 1 )
+ {
+ if(pEntry)
+ {
+ if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[0] != 0)
+ pEntry->rssi_stat.RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
+ pEntry->rssi_stat.RSSI_CCK_Path_cnt[0]++;
+ }
+ else
+ {
+ if(pDM_PDTable->RSSI_CCK_Path_cnt[0] != 0)
+ pDM_PDTable->RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
+ pDM_PDTable->RSSI_CCK_Path_cnt[0]++;
+ }
+ }
+ else if(pDM_PDTable->TrainingState == 2 )
+ {
+ if(pEntry)
+ {
+ if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[1] != 0)
+ pEntry->rssi_stat.RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
+ pEntry->rssi_stat.RSSI_CCK_Path_cnt[1]++;
+ }
+ else
+ {
+ if(pDM_PDTable->RSSI_CCK_Path_cnt[1] != 0)
+ pDM_PDTable->RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
+ pDM_PDTable->RSSI_CCK_Path_cnt[1]++;
+ }
+ }
+ }
+}
+
+
+
+
+//Neil Chen---2011--06--22
+//----92D Path Diversity----//
+//#ifdef PathDiv92D
+//==================================
+//3 Path Diversity
+//==================================
+//
+// 20100514 Luke/Joseph:
+// Add new function for antenna diversity after link.
+// This is the main function of antenna diversity after link.
+// This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
+// HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
+// In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
+// After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
+// listened on the air with the RSSI of original antenna.
+// It chooses the antenna with better RSSI.
+// There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting
+// penalty to get next try.
+//
+//
+// 20100503 Joseph:
+// Add new function SwAntDivCheck8192C().
+// This is the main function of Antenna diversity function before link.
+// Mainly, it just retains last scan result and scan again.
+// After that, it compares the scan result to see which one gets better RSSI.
+// It selects antenna with better receiving power and returns better scan result.
+//
+
+
+//
+// 20100514 Luke/Joseph:
+// This function is used to gather the RSSI information for antenna testing.
+// It selects the RSSI of the peer STA that we want to know.
+//
+VOID
+ODM_PathDivChkPerPktRssi(
+ PADAPTER Adapter,
+ BOOLEAN bIsDefPort,
+ BOOLEAN bMatchBSSID,
+ PRT_WLAN_STA pEntry,
+ PRT_RFD pRfd
+ )
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ BOOLEAN bCount = FALSE;
+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
+ pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+
+ if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
+ bCount = TRUE;
+ else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
+ bCount = TRUE;
+
+ if(bCount)
+ {
+ //1 RSSI for SW Antenna Switch
+ if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
+ {
+ pHalData->RSSI_sum_A += pRfd->Status.RxPWDBAll;
+ pHalData->RSSI_cnt_A++;
+ }
+ else
+ {
+ pHalData->RSSI_sum_B += pRfd->Status.RxPWDBAll;
+ pHalData->RSSI_cnt_B++;
+
+ }
+ }
+}
+
+
+//
+// 20100514 Luke/Joseph:
+// Add new function to reset antenna diversity state after link.
+//
+VOID
+ODM_PathDivRestAfterLink(
+ IN PDM_ODM_T pDM_Odm
+ )
+{
+ PADAPTER Adapter=pDM_Odm->Adapter;
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
+
+ pHalData->RSSI_cnt_A = 0;
+ pHalData->RSSI_cnt_B = 0;
+ pHalData->RSSI_test = FALSE;
+ pDM_SWAT_Table->try_flag = 0x0; // NOT 0xff
+ pDM_SWAT_Table->RSSI_Trying = 0;
+ pDM_SWAT_Table->SelectAntennaMap=0xAA;
+ pDM_SWAT_Table->CurAntenna = MAIN_ANT;
+}
+
+
+//==================================================
+//3 PathDiv End
+//==================================================
+
+
+VOID
+ODM_FillTXPathInTXDESC(
+ IN PADAPTER Adapter,
+ IN PRT_TCB pTcb,
+ IN pu1Byte pDesc
+)
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ u4Byte TXPath;
+ pPD_T pDM_PDTable = &Adapter->DM_PDTable;
+
+ //2011.09.05 Add by Luke Lee for path diversity
+ if(pHalData->PathDivCfg == 1)
+ {
+ TXPath = (pDM_PDTable->OFDMTXPath >> pTcb->macId) & BIT0;
+ //RT_TRACE( COMP_INIT, DBG_LOUD, ("Fill TXDESC: macID=%d, TXPath=%d\n", pTcb->macId, TXPath));
+ //SET_TX_DESC_TX_ANT_CCK(pDesc,TXPath);
+ if(TXPath == 0)
+ {
+ SET_TX_DESC_TX_ANTL_92C(pDesc,1);
+ SET_TX_DESC_TX_ANT_HT_92C(pDesc,1);
+ }
+ else
+ {
+ SET_TX_DESC_TX_ANTL_92C(pDesc,2);
+ SET_TX_DESC_TX_ANT_HT_92C(pDesc,2);
+ }
+ TXPath = (pDM_PDTable->CCKTXPath >> pTcb->macId) & BIT0;
+ if(TXPath == 0)
+ {
+ SET_TX_DESC_TX_ANT_CCK_92C(pDesc,1);
+ }
+ else
+ {
+ SET_TX_DESC_TX_ANT_CCK_92C(pDesc,2);
+ }
+ }
+}
+
+//Only for MP //Neil Chen--2012--0502--
+VOID
+odm_PathDivInit_92D(
+IN PDM_ODM_T pDM_Odm)
+{
+ pPATHDIV_PARA pathIQK = &pDM_Odm->pathIQK;
+
+ pathIQK->org_2g_RegC14=0x0;
+ pathIQK->org_2g_RegC4C=0x0;
+ pathIQK->org_2g_RegC80=0x0;
+ pathIQK->org_2g_RegC94=0x0;
+ pathIQK->org_2g_RegCA0=0x0;
+ pathIQK->org_5g_RegC14=0x0;
+ pathIQK->org_5g_RegCA0=0x0;
+ pathIQK->org_5g_RegE30=0x0;
+ pathIQK->swt_2g_RegC14=0x0;
+ pathIQK->swt_2g_RegC4C=0x0;
+ pathIQK->swt_2g_RegC80=0x0;
+ pathIQK->swt_2g_RegC94=0x0;
+ pathIQK->swt_2g_RegCA0=0x0;
+ pathIQK->swt_5g_RegC14=0x0;
+ pathIQK->swt_5g_RegCA0=0x0;
+ pathIQK->swt_5g_RegE30=0x0;
+
+}
+
+
+u1Byte
+odm_SwAntDivSelectScanChnl(
+ IN PADAPTER Adapter
+ )
+{
+#if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
+ PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
+ PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
+ PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
+ u1Byte i, j, ScanChannel = 0, ChannelNum = 0;
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+ u1Byte EachChannelSTAs[MAX_SCAN_CHANNEL_NUM] = {0};
+
+ if(pMgntInfo->tmpNumBssDesc == 0)
+ return 0;
+
+ for(i = 0; i < pMgntInfo->tmpNumBssDesc; i++)
+ {
+ ChannelNum = pMgntInfo->tmpbssDesc[i].ChannelNumber;
+ for(j = 0; j < pChannelList->ChannelLen; j++)
+ {
+ if(pChannelList->ChnlListEntry[j].ChannelNum == ChannelNum)
+ {
+ EachChannelSTAs[j]++;
+ break;
+ }
+ }
+ }
+
+ for(i = 0; i < MAX_SCAN_CHANNEL_NUM; i++)
+ {
+ if(EachChannelSTAs[i] > EachChannelSTAs[ScanChannel])
+ ScanChannel = i;
+ }
+
+ if(EachChannelSTAs[ScanChannel] == 0)
+ {
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("odm_SwAntDivSelectScanChnl(): Scan List is empty.\n"));
+ return 0;
+ }
+
+ ScanChannel = pChannelList->ChnlListEntry[ScanChannel].ChannelNum;
+
+
+
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD,
+ ("odm_SwAntDivSelectScanChnl(): Channel (( %d )) is select as scan channel.\n", ScanChannel));
+
+ return ScanChannel;
+#else
+ return 0;
+#endif
+}
+
+
+VOID
+odm_SwAntDivConstructScanChnl(
+ IN PADAPTER Adapter,
+ IN u1Byte ScanChnl
+ )
+{
+
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
+
+ if(ScanChnl == 0)
+ {
+ u1Byte i;
+ PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
+
+ // 20100519 Joseph: Original antenna scanned nothing.
+ // Test antenna shall scan all channel with half period in this condition.
+
+ RT_TRACE_F(COMP_SCAN, DBG_TRACE, (" RT_CHNL_LIST_ACTION_CONSTRUCT chnl %d \n", ScanChnl));
+
+ RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, NULL, NULL);
+ for(i = 0; i < pChannelList->ChannelLen; i++)
+ pChannelList->ChnlListEntry[i].ScanPeriod /= 2;
+ }
+ else
+ {
+ // The using of this CustomizedScanRequest is a trick to rescan the two channels
+ // under the NORMAL scanning process. It will not affect MGNT_INFO.CustomizedScanRequest.
+ CUSTOMIZED_SCAN_REQUEST CustomScanReq;
+
+ CustomScanReq.bEnabled = TRUE;
+ CustomScanReq.Channels[0] = ScanChnl;
+ CustomScanReq.Channels[1] = pMgntInfo->dot11CurrentChannelNumber;
+ CustomScanReq.nChannels = 2;
+ CustomScanReq.ScanType = SCAN_ACTIVE;
+ CustomScanReq.Duration = DEFAULT_PASSIVE_SCAN_PERIOD;
+
+ RT_TRACE_F(COMP_SCAN, DBG_TRACE, (" RT_CHNL_LIST_ACTION_CONSTRUCT chnl %d \n", ScanChnl));
+
+ RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, &CustomScanReq, NULL);
+ }
+
+}
+
+
+#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
diff --git a/rtl8723BS/hal/OUTSRC/odm_PathDiv.h b/rtl8723BS/hal/OUTSRC/odm_PathDiv.h
new file mode 100755
index 0000000..85791d0
--- a/dev/null
+++ b/rtl8723BS/hal/OUTSRC/odm_PathDiv.h
@@ -0,0 +1,196 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+#ifndef __ODMPATHDIV_H__
+#define __ODMPATHDIV_H__
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+
+VOID
+odm_PathDiversityInit(
+ IN PVOID pDM_VOID
+ );
+
+VOID
+odm_PathDiversity(
+ IN PVOID pDM_VOID
+ );
+
+#endif //(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+
+
+#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+
+//#define PATHDIV_ENABLE 1
+#define dm_PathDiv_RSSI_Check ODM_PathDivChkPerPktRssi
+#define PathDivCheckBeforeLink8192C ODM_PathDiversityBeforeLink92C
+
+typedef struct _PathDiv_Parameter_define_
+{
+ u4Byte org_5g_RegE30;
+ u4Byte org_5g_RegC14;
+ u4Byte org_5g_RegCA0;
+ u4Byte swt_5g_RegE30;
+ u4Byte swt_5g_RegC14;
+ u4Byte swt_5g_RegCA0;
+ //for 2G IQK information
+ u4Byte org_2g_RegC80;
+ u4Byte org_2g_RegC4C;
+ u4Byte org_2g_RegC94;
+ u4Byte org_2g_RegC14;
+ u4Byte org_2g_RegCA0;
+
+ u4Byte swt_2g_RegC80;
+ u4Byte swt_2g_RegC4C;
+ u4Byte swt_2g_RegC94;
+ u4Byte swt_2g_RegC14;
+ u4Byte swt_2g_RegCA0;
+}PATHDIV_PARA,*pPATHDIV_PARA;
+
+VOID
+odm_PathDiversityInit_92C(
+ IN PADAPTER Adapter
+ );
+
+VOID
+odm_2TPathDiversityInit_92C(
+ IN PADAPTER Adapter
+ );
+
+VOID
+odm_1TPathDiversityInit_92C(
+ IN PADAPTER Adapter
+ );
+
+BOOLEAN
+odm_IsConnected_92C(
+ IN PADAPTER Adapter
+ );
+
+BOOLEAN
+ODM_PathDiversityBeforeLink92C(
+ //IN PADAPTER Adapter
+ IN PDM_ODM_T pDM_Odm
+ );
+
+VOID
+odm_PathDiversityAfterLink_92C(
+ IN PADAPTER Adapter
+ );
+
+VOID
+odm_SetRespPath_92C(
+ IN PADAPTER Adapter,
+ IN u1Byte DefaultRespPath
+ );
+
+VOID
+odm_OFDMTXPathDiversity_92C(
+ IN PADAPTER Adapter
+ );
+
+VOID
+odm_CCKTXPathDiversity_92C(
+ IN PADAPTER Adapter
+ );
+
+VOID
+odm_ResetPathDiversity_92C(
+ IN PADAPTER Adapter
+ );
+
+VOID
+odm_CCKTXPathDiversityCallback(
+ PRT_TIMER pTimer
+ );
+
+VOID
+odm_CCKTXPathDiversityWorkItemCallback(
+ IN PVOID pContext
+ );
+
+VOID
+odm_PathDivChkAntSwitchCallback(
+ PRT_TIMER pTimer
+ );
+
+VOID
+odm_PathDivChkAntSwitchWorkitemCallback(
+ IN PVOID pContext
+ );
+
+
+VOID
+odm_PathDivChkAntSwitch(
+ PDM_ODM_T pDM_Odm
+ );
+
+VOID
+ODM_CCKPathDiversityChkPerPktRssi(
+ PADAPTER Adapter,
+ BOOLEAN bIsDefPort,
+ BOOLEAN bMatchBSSID,
+ PRT_WLAN_STA pEntry,
+ PRT_RFD pRfd,
+ pu1Byte pDesc
+ );
+
+VOID
+ODM_PathDivChkPerPktRssi(
+ PADAPTER Adapter,
+ BOOLEAN bIsDefPort,
+ BOOLEAN bMatchBSSID,
+ PRT_WLAN_STA pEntry,
+ PRT_RFD pRfd
+ );
+
+VOID
+ODM_PathDivRestAfterLink(
+ IN PDM_ODM_T pDM_Odm
+ );
+
+VOID
+ODM_FillTXPathInTXDESC(
+ IN PADAPTER Adapter,
+ IN PRT_TCB pTcb,
+ IN pu1Byte pDesc
+ );
+
+VOID
+odm_PathDivInit_92D(
+ IN PDM_ODM_T pDM_Odm
+ );
+
+u1Byte
+odm_SwAntDivSelectScanChnl(
+ IN PADAPTER Adapter
+ );
+
+VOID
+odm_SwAntDivConstructScanChnl(
+ IN PADAPTER Adapter,
+ IN u1Byte ScanChnl
+ );
+
+ #endif //#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))
+
+
+ #endif //#ifndef __ODMPATHDIV_H__
+
diff --git a/rtl8723BS/hal/OUTSRC/odm_RegDefine11AC.h b/rtl8723BS/hal/OUTSRC/odm_RegDefine11AC.h
index 1193653..855aa16 100755
--- a/rtl8723BS/hal/OUTSRC/odm_RegDefine11AC.h
+++ b/rtl8723BS/hal/OUTSRC/odm_RegDefine11AC.h
@@ -29,19 +29,36 @@
//PAGE 8
#define ODM_REG_CCK_RPT_FORMAT_11AC 0x804
#define ODM_REG_BB_RX_PATH_11AC 0x808
+#define ODM_REG_BB_ATC_11AC 0x860
+#define ODM_REG_DBG_RPT_11AC 0x8fc
//PAGE 9
#define ODM_REG_OFDM_FA_RST_11AC 0x9A4
+#define ODM_REG_NHM_TIMER_11AC 0x990
+#define ODM_REG_NHM_TH9_TH10_11AC 0x994
+#define ODM_REG_NHM_TH3_TO_TH0_11AC 0x998
+#define ODM_REG_NHM_TH7_TO_TH4_11AC 0x99c
+#define ODM_REG_NHM_TH8_11AC 0x9a0
+#define ODM_REG_NHM_9E8_11AC 0x9e8
//PAGE A
#define ODM_REG_CCK_CCA_11AC 0xA0A
#define ODM_REG_CCK_FA_RST_11AC 0xA2C
#define ODM_REG_CCK_FA_11AC 0xA5C
+//PAGE B
+#define ODM_REG_RST_RPT_11AC 0xB58
//PAGE C
+#define ODM_REG_TRMUX_11AC 0xC08
#define ODM_REG_IGI_A_11AC 0xC50
//PAGE E
#define ODM_REG_IGI_B_11AC 0xE50
//PAGE F
+#define ODM_REG_CCK_CCA_CNT_11AC 0xF08
#define ODM_REG_OFDM_FA_11AC 0xF48
-
+#define ODM_REG_RPT_11AC 0xfa0
+#define ODM_REG_NHM_CNT_11AC 0xfa8
+//PAGE 18
+#define ODM_REG_IGI_C_11AC 0x1850
+//PAGE 1A
+#define ODM_REG_IGI_D_11AC 0x1A50
//2 MAC REG LIST
#define ODM_REG_RESP_TX_11AC 0x6D8
@@ -52,6 +69,7 @@
#define ODM_BIT_IGI_11AC 0xFFFFFFFF
#define ODM_BIT_CCK_RPT_FORMAT_11AC BIT16
#define ODM_BIT_BB_RX_PATH_11AC 0xF
+#define ODM_BIT_BB_ATC_11AC BIT14
#endif
diff --git a/rtl8723BS/hal/OUTSRC/odm_RegDefine11N.h b/rtl8723BS/hal/OUTSRC/odm_RegDefine11N.h
index b623609..c6e4b18 100755
--- a/rtl8723BS/hal/OUTSRC/odm_RegDefine11N.h
+++ b/rtl8723BS/hal/OUTSRC/odm_RegDefine11N.h
@@ -44,20 +44,27 @@
#define ODM_REG_RF_PIN_11N 0x804
#define ODM_REG_PSD_CTRL_11N 0x808
#define ODM_REG_TX_ANT_CTRL_11N 0x80C
-#define ODM_REG_BB_PWR_SAV5_11N 0x818
+#define ODM_REG_BB_PWR_SAV5_11N 0x818
#define ODM_REG_CCK_RPT_FORMAT_11N 0x824
#define ODM_REG_RX_DEFUALT_A_11N 0x858
#define ODM_REG_RX_DEFUALT_B_11N 0x85A
-#define ODM_REG_BB_PWR_SAV3_11N 0x85C
+#define ODM_REG_BB_PWR_SAV3_11N 0x85C
#define ODM_REG_ANTSEL_CTRL_11N 0x860
#define ODM_REG_RX_ANT_CTRL_11N 0x864
#define ODM_REG_PIN_CTRL_11N 0x870
-#define ODM_REG_BB_PWR_SAV1_11N 0x874
+#define ODM_REG_BB_PWR_SAV1_11N 0x874
#define ODM_REG_ANTSEL_PATH_11N 0x878
#define ODM_REG_BB_3WIRE_11N 0x88C
#define ODM_REG_SC_CNT_11N 0x8C4
-#define ODM_REG_PSD_DATA_11N 0x8B4
+#define ODM_REG_PSD_DATA_11N 0x8B4
+#define ODM_REG_PSD_DATA_11N 0x8B4
+#define ODM_REG_NHM_TIMER_11N 0x894
+#define ODM_REG_NHM_TH9_TH10_11N 0x890
+#define ODM_REG_NHM_TH3_TO_TH0_11N 0x898
+#define ODM_REG_NHM_TH7_TO_TH4_11N 0x89c
+#define ODM_REG_NHM_CNT_11N 0x8d8
//PAGE 9
+#define ODM_REG_DBG_RPT_11N 0x908
#define ODM_REG_ANT_MAPPING1_11N 0x914
#define ODM_REG_ANT_MAPPING2_11N 0x918
//PAGE A
@@ -78,7 +85,7 @@
#define ODM_REG_CCK_FA_MSB_11N 0xA58
#define ODM_REG_CCK_FA_LSB_11N 0xA5C
#define ODM_REG_CCK_CCA_CNT_11N 0xA60
-#define ODM_REG_BB_PWR_SAV4_11N 0xA74
+#define ODM_REG_BB_PWR_SAV4_11N 0xA74
//PAGE B
#define ODM_REG_LNA_SWITCH_11N 0xB2C
#define ODM_REG_PATH_SWITCH_11N 0xB30
@@ -90,9 +97,9 @@
#define ODM_REG_BB_RX_PATH_11N 0xC04
#define ODM_REG_TRMUX_11N 0xC08
#define ODM_REG_OFDM_FA_RSTC_11N 0xC0C
-#define ODM_REG_RXIQI_MATRIX_11N 0xC14
+#define ODM_REG_RXIQI_MATRIX_11N 0xC14
#define ODM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C
-#define ODM_REG_IGI_A_11N 0xC50
+#define ODM_REG_IGI_A_11N 0xC50
#define ODM_REG_ANTDIV_PARA2_11N 0xC54
#define ODM_REG_IGI_B_11N 0xC58
#define ODM_REG_ANTDIV_PARA3_11N 0xC5C
@@ -108,9 +115,11 @@
#define ODM_REG_OFDM_FA_TYPE1_11N 0xCF0
//PAGE D
#define ODM_REG_OFDM_FA_RSTD_11N 0xD00
+#define ODM_REG_BB_ATC_11N 0xD2C
#define ODM_REG_OFDM_FA_TYPE2_11N 0xDA0
#define ODM_REG_OFDM_FA_TYPE3_11N 0xDA4
#define ODM_REG_OFDM_FA_TYPE4_11N 0xDA8
+#define ODM_REG_RPT_11N 0xDF4
//PAGE E
#define ODM_REG_TXAGC_A_6_18_11N 0xE00
#define ODM_REG_TXAGC_A_24_54_11N 0xE04
@@ -143,12 +152,8 @@
#define ODM_REG_STANDBY_11N 0xEDC
#define ODM_REG_SLEEP_11N 0xEE0
#define ODM_REG_PMPD_ANAEN_11N 0xEEC
-
-
-
-
-
-
+#define ODM_REG_IGI_C_11N 0xF84
+#define ODM_REG_IGI_D_11N 0xF88
//2 MAC REG LIST
#define ODM_REG_BB_RST_11N 0x02
@@ -161,14 +166,15 @@
#define ODM_REG_EDCA_BK_11N 0x50C
#define ODM_REG_TXPAUSE_11N 0x522
#define ODM_REG_RESP_TX_11N 0x6D8
-#define ODM_REG_ANT_TRAIN_PARA1_11N 0x7b0
-#define ODM_REG_ANT_TRAIN_PARA2_11N 0x7b4
+#define ODM_REG_ANT_TRAIN_PARA1_11N 0x7b0
+#define ODM_REG_ANT_TRAIN_PARA2_11N 0x7b4
//DIG Related
#define ODM_BIT_IGI_11N 0x0000007F
#define ODM_BIT_CCK_RPT_FORMAT_11N BIT9
#define ODM_BIT_BB_RX_PATH_11N 0xF
+#define ODM_BIT_BB_ATC_11N BIT11
#endif
diff --git a/rtl8723BS/hal/OUTSRC/odm_debug.c b/rtl8723BS/hal/OUTSRC/odm_debug.c
index 1547ff1..6dc171a 100755
--- a/rtl8723BS/hal/OUTSRC/odm_debug.c
+++ b/rtl8723BS/hal/OUTSRC/odm_debug.c
@@ -50,7 +50,7 @@ pDM_Odm->DebugComponents =
// ODM_COMP_DYNAMIC_PRICCA |
// ODM_COMP_RXHP |
// ODM_COMP_MP |
-// ODM_COMP_DYNAMIC_ATC |
+// ODM_COMP_CFO_TRACKING |
//MAC Functions
// ODM_COMP_EDCA_TURBO |
diff --git a/rtl8723BS/hal/OUTSRC/odm_debug.h b/rtl8723BS/hal/OUTSRC/odm_debug.h
index 0a32f85..802d0df 100755
--- a/rtl8723BS/hal/OUTSRC/odm_debug.h
+++ b/rtl8723BS/hal/OUTSRC/odm_debug.h
@@ -70,32 +70,32 @@
//
//-----------------------------------------------------------------------------
//BB Functions
-#define ODM_COMP_DIG BIT0
-#define ODM_COMP_RA_MASK BIT1
+#define ODM_COMP_DIG BIT0
+#define ODM_COMP_RA_MASK BIT1
#define ODM_COMP_DYNAMIC_TXPWR BIT2
#define ODM_COMP_FA_CNT BIT3
#define ODM_COMP_RSSI_MONITOR BIT4
#define ODM_COMP_CCK_PD BIT5
-#define ODM_COMP_ANT_DIV BIT6
+#define ODM_COMP_ANT_DIV BIT6
#define ODM_COMP_PWR_SAVE BIT7
#define ODM_COMP_PWR_TRAIN BIT8
#define ODM_COMP_RATE_ADAPTIVE BIT9
-#define ODM_COMP_PATH_DIV BIT10
-#define ODM_COMP_PSD BIT11
+#define ODM_COMP_PATH_DIV BIT10
+#define ODM_COMP_PSD BIT11
#define ODM_COMP_DYNAMIC_PRICCA BIT12
-#define ODM_COMP_RXHP BIT13
+#define ODM_COMP_RXHP BIT13
#define ODM_COMP_MP BIT14
-#define ODM_COMP_DYNAMIC_ATC BIT15
+#define ODM_COMP_CFO_TRACKING BIT15
//MAC Functions
#define ODM_COMP_EDCA_TURBO BIT16
#define ODM_COMP_EARLY_MODE BIT17
//RF Functions
#define ODM_COMP_TX_PWR_TRACK BIT24
#define ODM_COMP_RX_GAIN_TRACK BIT25
-#define ODM_COMP_CALIBRATION BIT26
+#define ODM_COMP_CALIBRATION BIT26
//Common Functions
#define ODM_COMP_COMMON BIT30
-#define ODM_COMP_INIT BIT31
+#define ODM_COMP_INIT BIT31
/*------------------------Export Marco Definition---------------------------*/
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
diff --git a/rtl8723BS/hal/OUTSRC/odm_interface.c b/rtl8723BS/hal/OUTSRC/odm_interface.c
index 9cf4ff4..36908dc 100755
--- a/rtl8723BS/hal/OUTSRC/odm_interface.c
+++ b/rtl8723BS/hal/OUTSRC/odm_interface.c
@@ -312,6 +312,20 @@ ODM_MoveMemory(
#endif
}
+void ODM_Memory_Set
+ (IN PDM_ODM_T pDM_Odm,
+ IN PVOID pbuf,
+ IN s1Byte value,
+ IN u4Byte length)
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
+ _rtw_memset(pbuf,value, length);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ PlatformFillMemory(pbuf,length,value);
+#endif
+}
s4Byte ODM_CompareMemory(
IN PDM_ODM_T pDM_Odm,
IN PVOID pBuf1,
@@ -718,6 +732,33 @@ ODM_FillH2CCmd(
#endif
+u4Byte
+ODM_GetCurrentTime(
+ IN PDM_ODM_T pDM_Odm
+ )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ return 0;
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+ return rtw_get_current_time();
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ return 0;
+#endif
+}
+s4Byte
+ODM_GetProgressingTime(
+ IN PDM_ODM_T pDM_Odm,
+ IN u4Byte Start_Time
+ )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+ return 0;
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+ return rtw_get_passing_time_ms(Start_Time);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+ return 0;
+#endif
+}
diff --git a/rtl8723BS/hal/OUTSRC/odm_interface.h b/rtl8723BS/hal/OUTSRC/odm_interface.h
index 7d75575..689318a 100755
--- a/rtl8723BS/hal/OUTSRC/odm_interface.h
+++ b/rtl8723BS/hal/OUTSRC/odm_interface.h
@@ -251,6 +251,12 @@ s4Byte ODM_CompareMemory(
IN PVOID pBuf2,
IN u4Byte length
);
+
+void ODM_Memory_Set
+ (IN PDM_ODM_T pDM_Odm,
+ IN PVOID pbuf,
+ IN s1Byte value,
+ IN u4Byte length);
//
// ODM MISC-spin lock relative API.
@@ -379,5 +385,16 @@ ODM_FillH2CCmd(
IN pu1Byte CmdStartSeq
);
#endif
+
+u4Byte
+ODM_GetCurrentTime(
+ IN PDM_ODM_T pDM_Odm
+ );
+s4Byte
+ODM_GetProgressingTime(
+ IN PDM_ODM_T pDM_Odm,
+ IN u4Byte Start_Time
+ );
+
#endif // __ODM_INTERFACE_H__
diff --git a/rtl8723BS/hal/OUTSRC/odm_precomp.h b/rtl8723BS/hal/OUTSRC/odm_precomp.h
index e3c71d2..74877a8 100755
--- a/rtl8723BS/hal/OUTSRC/odm_precomp.h
+++ b/rtl8723BS/hal/OUTSRC/odm_precomp.h
@@ -145,6 +145,13 @@
#include "odm_RegDefine11AC.h"
#include "odm_RegDefine11N.h"
#include "odm_AntDiv.h"
+#include "odm_EdcaTurboCheck.h"
+#include "odm_DIG.h"
+#include "odm_PathDiv.h"
+#include "odm_DynamicBBPowerSaving.h"
+#include "odm_DynamicTxPower.h"
+#include "odm_CfoTracking.h"
+#include "odm_NoiseMonitor.h"
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
#if (RTL8192C_SUPPORT==1)
diff --git a/rtl8723BS/hal/OUTSRC/odm_types.h b/rtl8723BS/hal/OUTSRC/odm_types.h
index 27cecce..4ebbe72 100755
--- a/rtl8723BS/hal/OUTSRC/odm_types.h
+++ b/rtl8723BS/hal/OUTSRC/odm_types.h
@@ -34,6 +34,12 @@
#define ODM_ENDIAN_BIG 0
#define ODM_ENDIAN_LITTLE 1
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+#define GET_ODM(__pAdapter) ((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->DM_OutSrc)))
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
+#define GET_ODM(__pAdapter) ((PDM_ODM_T)(&((GET_HAL_DATA(__pAdapter))->odmpriv)))
+#endif
+
#if (DM_ODM_SUPPORT_TYPE != ODM_WIN)
#define RT_PCI_INTERFACE 1
#define RT_USB_INTERFACE 2
@@ -260,6 +266,9 @@ typedef enum _RT_SPINLOCK_TYPE{
#define RTL8881A_SUPPORT 0
#endif
+#define READ_NEXT_PAIR(v1, v2, i) do { if (i+2 >= ArrayLen) break; i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
+#define COND_ELSE 2
+#define COND_ENDIF 3
#endif // __ODM_TYPES_H__
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c
index 6945019..89e1ae2 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.c
@@ -18,41 +18,95 @@
*
******************************************************************************/
-//#include "Mp_Precomp.h"
+
#include "../odm_precomp.h"
#if (RTL8723B_SUPPORT == 1)
static BOOLEAN
-CheckCondition(
- const u4Byte Condition,
- const u4Byte Hex
+CheckPositive(
+ IN PDM_ODM_T pDM_Odm,
+ IN const u4Byte Condition1,
+ IN const u4Byte Condition2
)
{
- u4Byte _board = (Hex & 0x000000FF);
- u4Byte _interface = (Hex & 0x0000FF00) >> 8;
- u4Byte _platform = (Hex & 0x00FF0000) >> 16;
- u4Byte cond = Condition;
-
- if ( Condition == 0xCDCDCDCD )
- return TRUE;
-
- cond = Condition & 0x000000FF;
- if ( (_board != cond) && (cond != 0xFF) )
- return FALSE;
-
- cond = Condition & 0x0000FF00;
- cond = cond >> 8;
- if ( ((_interface & cond) == 0) && (cond != 0x07) )
- return FALSE;
-
- cond = Condition & 0x00FF0000;
- cond = cond >> 16;
- if ( ((_platform & cond) == 0) && (cond != 0x0F) )
+ u1Byte _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA
+ ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA
+ ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA
+ ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA
+ ((pDM_Odm->BoardType & BIT2) >> 2) << 4; // _BT
+
+ u4Byte cond1 = Condition1, cond2 = Condition2;
+ u4Byte driver1 = pDM_Odm->CutVersion << 24 |
+ pDM_Odm->SupportPlatform << 16 |
+ pDM_Odm->PackageType << 12 |
+ pDM_Odm->SupportInterface << 8 |
+ _BoardType;
+
+ u4Byte driver2 = pDM_Odm->TypeGLNA << 0 |
+ pDM_Odm->TypeGPA << 8 |
+ pDM_Odm->TypeALNA << 16 |
+ pDM_Odm->TypeAPA << 24;
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ (" (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ (" (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));
+
+
+ //============== Value Defined Check ===============//
+ //QFN Type [15:12] and Cut Version [27:24] need to do value check
+
+ if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
+ return FALSE;
+ if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
+ return FALSE;
+
+ //=============== Bit Defined Check ================//
+ // We don't care [31:28] and [23:20]
+ //
+ cond1 &= 0x000F0FFF;
+ driver1 &= 0x000F0FFF;
+
+ if ((cond1 & driver1) == cond1)
+ {
+ u4Byte bitMask = 0;
+ if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE
+ return TRUE;
+
+ if ((cond1 & BIT0) != 0) //GLNA
+ bitMask |= 0x000000FF;
+ if ((cond1 & BIT1) != 0) //GPA
+ bitMask |= 0x0000FF00;
+ if ((cond1 & BIT2) != 0) //ALNA
+ bitMask |= 0x00FF0000;
+ if ((cond1 & BIT3) != 0) //APA
+ bitMask |= 0xFF000000;
+
+ if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched
+ return TRUE;
+ else
+ return FALSE;
+ }
+ else
+ {
return FALSE;
+ }
+}
+static BOOLEAN
+CheckNegative(
+ IN PDM_ODM_T pDM_Odm,
+ IN const u4Byte Condition1,
+ IN const u4Byte Condition2
+ )
+{
return TRUE;
}
-
/******************************************************************************
* AGC_TAB.TXT
******************************************************************************/
@@ -197,69 +251,73 @@ ODM_ReadAndConfig_MP_8723B_AGC_TAB(
IN PDM_ODM_T pDM_Odm
)
{
- #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
-
- u4Byte hex = 0;
- u4Byte i = 0;
- u2Byte count = 0;
- pu4Byte ptr_array = NULL;
- u1Byte platform = pDM_Odm->SupportPlatform;
- u1Byte _interface = pDM_Odm->SupportInterface;
- u1Byte board = pDM_Odm->BoardType;
- u4Byte ArrayLen = sizeof(Array_MP_8723B_AGC_TAB)/sizeof(u4Byte);
- pu4Byte Array = Array_MP_8723B_AGC_TAB;
-
-
- hex += board;
- hex += _interface << 8;
- hex += platform << 16;
- hex += 0xFF000000;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_AGC_TAB, hex = 0x%X\n", hex));
-
- for (i = 0; i < ArrayLen; i += 2 )
- {
- u4Byte v1 = Array[i];
- u4Byte v2 = Array[i+1];
+ u4Byte i = 0;
+ u4Byte ArrayLen = sizeof(Array_MP_8723B_AGC_TAB)/sizeof(u4Byte);
+ pu4Byte Array = Array_MP_8723B_AGC_TAB;
- // This (offset, data) pair meets the condition.
- if ( v1 < 0xCDCDCDCD )
- {
- odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
- continue;
- }
- else
- { // This line is the start line of branch.
- if ( !CheckCondition(Array[i], hex) )
- { // Discard the following (offset, data) pairs.
- READ_NEXT_PAIR(v1, v2, i);
- while (v2 != 0xDEAD &&
- v2 != 0xCDEF &&
- v2 != 0xCDCD && i < ArrayLen -2)
- {
- READ_NEXT_PAIR(v1, v2, i);
- }
- i -= 2; // prevent from for-loop += 2
- }
- else // Configure matched pairs and skip to end of if-else.
- {
- READ_NEXT_PAIR(v1, v2, i);
- while (v2 != 0xDEAD &&
- v2 != 0xCDEF &&
- v2 != 0xCDCD && i < ArrayLen -2)
- {
- odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
- READ_NEXT_PAIR(v1, v2, i);
- }
-
- while (v2 != 0xDEAD && i < ArrayLen -2)
- {
- READ_NEXT_PAIR(v1, v2, i);
- }
-
- }
- }
- }
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_AGC_TAB\n"));
+
+ for (i = 0; i < ArrayLen; i += 2 )
+ {
+ u4Byte v1 = Array[i];
+ u4Byte v2 = Array[i+1];
+
+ // This (offset, data) pair doesn't care the condition.
+ if ( v1 < 0x40000000 )
+ {
+ odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
+ continue;
+ }
+ else
+ { // This line is the beginning of branch.
+ BOOLEAN bMatched = TRUE;
+ u1Byte cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+
+ if (cCond == COND_ELSE) { // ELSE, ENDIF
+ bMatched = TRUE;
+ READ_NEXT_PAIR(v1, v2, i);
+ } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) {
+ bMatched = FALSE;
+ READ_NEXT_PAIR(v1, v2, i);
+ READ_NEXT_PAIR(v1, v2, i);
+ } else {
+ READ_NEXT_PAIR(v1, v2, i);
+ if ( ! CheckNegative(pDM_Odm, v1, v2) )
+ bMatched = FALSE;
+ else
+ bMatched = TRUE;
+ READ_NEXT_PAIR(v1, v2, i);
+ }
+
+ if ( bMatched == FALSE )
+ { // Condition isn't matched. Discard the following (offset, data) pairs.
+ while (v1 < 0x40000000 && i < ArrayLen -2)
+ READ_NEXT_PAIR(v1, v2, i);
+
+ i -= 2; // prevent from for-loop += 2
+ }
+ else // Configure matched pairs and skip to end of if-else.
+ {
+ while (v1 < 0x40000000 && i < ArrayLen-2) {
+ odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
+ READ_NEXT_PAIR(v1, v2, i);
+ }
+
+ // Keeps reading until ENDIF.
+ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+ while (cCond != COND_ENDIF && i < ArrayLen-2) {
+ READ_NEXT_PAIR(v1, v2, i);
+ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+ }
+ }
+ }
+ }
+}
+u4Byte
+ODM_GetVersion_MP_8723B_AGC_TAB(void)
+{
+ return 11;
}
/******************************************************************************
@@ -313,9 +371,8 @@ u4Byte Array_MP_8723B_PHY_REG[] = {
0x90C, 0x81121111,
0x910, 0x00000002,
0x914, 0x00000201,
- 0x948, 0x00000280,
0xA00, 0x00D047C8,
- 0xA04, 0x80FF000C,
+ 0xA04, 0x80FF800C,
0xA08, 0x8C838300,
0xA0C, 0x2E7F120F,
0xA10, 0x9500BB78,
@@ -469,69 +526,73 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG(
IN PDM_ODM_T pDM_Odm
)
{
- #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
-
- u4Byte hex = 0;
- u4Byte i = 0;
- u2Byte count = 0;
- pu4Byte ptr_array = NULL;
- u1Byte platform = pDM_Odm->SupportPlatform;
- u1Byte _interface = pDM_Odm->SupportInterface;
- u1Byte board = pDM_Odm->BoardType;
- u4Byte ArrayLen = sizeof(Array_MP_8723B_PHY_REG)/sizeof(u4Byte);
- pu4Byte Array = Array_MP_8723B_PHY_REG;
-
-
- hex += board;
- hex += _interface << 8;
- hex += platform << 16;
- hex += 0xFF000000;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG, hex = 0x%X\n", hex));
-
- for (i = 0; i < ArrayLen; i += 2 )
- {
- u4Byte v1 = Array[i];
- u4Byte v2 = Array[i+1];
+ u4Byte i = 0;
+ u4Byte ArrayLen = sizeof(Array_MP_8723B_PHY_REG)/sizeof(u4Byte);
+ pu4Byte Array = Array_MP_8723B_PHY_REG;
- // This (offset, data) pair meets the condition.
- if ( v1 < 0xCDCDCDCD )
- {
- odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
- continue;
- }
- else
- { // This line is the start line of branch.
- if ( !CheckCondition(Array[i], hex) )
- { // Discard the following (offset, data) pairs.
- READ_NEXT_PAIR(v1, v2, i);
- while (v2 != 0xDEAD &&
- v2 != 0xCDEF &&
- v2 != 0xCDCD && i < ArrayLen -2)
- {
- READ_NEXT_PAIR(v1, v2, i);
- }
- i -= 2; // prevent from for-loop += 2
- }
- else // Configure matched pairs and skip to end of if-else.
- {
- READ_NEXT_PAIR(v1, v2, i);
- while (v2 != 0xDEAD &&
- v2 != 0xCDEF &&
- v2 != 0xCDCD && i < ArrayLen -2)
- {
- odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
- READ_NEXT_PAIR(v1, v2, i);
- }
-
- while (v2 != 0xDEAD && i < ArrayLen -2)
- {
- READ_NEXT_PAIR(v1, v2, i);
- }
-
- }
- }
- }
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG\n"));
+
+ for (i = 0; i < ArrayLen; i += 2 )
+ {
+ u4Byte v1 = Array[i];
+ u4Byte v2 = Array[i+1];
+
+ // This (offset, data) pair doesn't care the condition.
+ if ( v1 < 0x40000000 )
+ {
+ odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
+ continue;
+ }
+ else
+ { // This line is the beginning of branch.
+ BOOLEAN bMatched = TRUE;
+ u1Byte cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+
+ if (cCond == COND_ELSE) { // ELSE, ENDIF
+ bMatched = TRUE;
+ READ_NEXT_PAIR(v1, v2, i);
+ } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) {
+ bMatched = FALSE;
+ READ_NEXT_PAIR(v1, v2, i);
+ READ_NEXT_PAIR(v1, v2, i);
+ } else {
+ READ_NEXT_PAIR(v1, v2, i);
+ if ( ! CheckNegative(pDM_Odm, v1, v2) )
+ bMatched = FALSE;
+ else
+ bMatched = TRUE;
+ READ_NEXT_PAIR(v1, v2, i);
+ }
+
+ if ( bMatched == FALSE )
+ { // Condition isn't matched. Discard the following (offset, data) pairs.
+ while (v1 < 0x40000000 && i < ArrayLen -2)
+ READ_NEXT_PAIR(v1, v2, i);
+
+ i -= 2; // prevent from for-loop += 2
+ }
+ else // Configure matched pairs and skip to end of if-else.
+ {
+ while (v1 < 0x40000000 && i < ArrayLen-2) {
+ odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
+ READ_NEXT_PAIR(v1, v2, i);
+ }
+
+ // Keeps reading until ENDIF.
+ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+ while (cCond != COND_ENDIF && i < ArrayLen-2) {
+ READ_NEXT_PAIR(v1, v2, i);
+ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+ }
+ }
+ }
+ }
+}
+u4Byte
+ODM_GetVersion_MP_8723B_PHY_REG(void)
+{
+ return 11;
}
/******************************************************************************
@@ -552,22 +613,15 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG_PG(
IN PDM_ODM_T pDM_Odm
)
{
- u4Byte hex = 0;
- u4Byte i = 0;
- u2Byte count = 0;
- pu4Byte ptr_array = NULL;
- u1Byte platform = pDM_Odm->SupportPlatform;
- u1Byte _interface = pDM_Odm->SupportInterface;
- u1Byte board = pDM_Odm->BoardType;
- u4Byte ArrayLen = sizeof(Array_MP_8723B_PHY_REG_PG)/sizeof(u4Byte);
- pu4Byte Array = Array_MP_8723B_PHY_REG_PG;
+ u4Byte i = 0;
+ u4Byte ArrayLen = sizeof(Array_MP_8723B_PHY_REG_PG)/sizeof(u4Byte);
+ pu4Byte Array = Array_MP_8723B_PHY_REG_PG;
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG_PG\n"));
pDM_Odm->PhyRegPgVersion = 1;
pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;
- hex += board;
- hex += _interface << 8;
- hex += platform << 16;
- hex += 0xFF000000;
+
for (i = 0; i < ArrayLen; i += 6 )
{
u4Byte v1 = Array[i];
@@ -577,29 +631,7 @@ ODM_ReadAndConfig_MP_8723B_PHY_REG_PG(
u4Byte v5 = Array[i+4];
u4Byte v6 = Array[i+5];
- // this line is a line of pure_body
- if ( v1 < 0xCDCDCDCD )
- {
- odm_ConfigBB_PHY_REG_PG_8723B(pDM_Odm, v1, v2, v3, v4, v5, v6);
- continue;
- }
- else
- { // this line is the start of branch
- if ( !CheckCondition(Array[i], hex) )
- { // don't need the hw_body
- i += 2; // skip the pair of expression
- v1 = Array[i];
- v2 = Array[i+1];
- v3 = Array[i+2];
- while (v2 != 0xDEAD)
- {
- i += 3;
- v1 = Array[i];
- v2 = Array[i+1];
- v3 = Array[i+1];
- }
- }
- }
+ odm_ConfigBB_PHY_REG_PG_8723B(pDM_Odm, v1, v2, v3, v4, v5, v6);
}
}
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h
index 0d5b292..f5b9036 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_BB.h
@@ -22,7 +22,6 @@
#ifndef __INC_MP_BB_HW_IMG_8723B_H
#define __INC_MP_BB_HW_IMG_8723B_H
-//static BOOLEAN CheckCondition(const u4Byte Condition, const u4Byte Hex);
/******************************************************************************
* AGC_TAB.TXT
@@ -32,6 +31,7 @@ void
ODM_ReadAndConfig_MP_8723B_AGC_TAB( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_AGC_TAB(void);
/******************************************************************************
* PHY_REG.TXT
@@ -41,6 +41,7 @@ void
ODM_ReadAndConfig_MP_8723B_PHY_REG( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_PHY_REG(void);
/******************************************************************************
* PHY_REG_PG.TXT
@@ -50,6 +51,7 @@ void
ODM_ReadAndConfig_MP_8723B_PHY_REG_PG( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_PHY_REG_PG(void);
#endif
#endif // end of HWIMG_SUPPORT
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c
index 7075636..f3b435e 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_FW.c
@@ -1604,16 +1604,3719 @@ ODM_ReadFirmware_MP_8723B_FW_BT(
}
-// v23.02 20140214 by Isaachsu <isaachsu@realtek.com>
+// v27.01 20140429 by Isaachsu <isaachsu@realtek.com>
u1Byte Array_MP_8723B_FW_NIC[] = {
-0x01, 0x53, 0x10, 0x00, 0x17, 0x00, 0x02, 0x00, 0x02, 0x14, 0x16, 0x39, 0xB4, 0x78, 0x00, 0x00,
-0x16, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x02, 0x45, 0xED, 0x02, 0x6F, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x70, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x7F, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x01, 0x53, 0x10, 0x00, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x29, 0x13, 0x45, 0x38, 0x78, 0x00, 0x00,
+0xD1, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x02, 0x45, 0xED, 0x02, 0x67, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x68, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x70, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x5F, 0x0D, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x78, 0xE6, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F,
+0x00, 0x00, 0x00, 0x02, 0x68, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6F, 0xEE, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x77, 0xBD, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F,
+0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00,
+0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00,
+0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00,
+0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07,
+0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B,
+0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00,
+0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18,
+0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24,
+0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00,
+0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20,
+0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31,
+0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00,
+0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07,
+0x07, 0x08, 0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, 0x13, 0x14, 0x15, 0x04, 0x04, 0x04, 0x05, 0x07,
+0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21,
+0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
+0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00,
+0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00,
+0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00,
+0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00,
+0x00, 0x01, 0xE0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00,
+0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00,
+0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x02, 0x04, 0x06, 0x08, 0x0A,
+0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, 0x04,
+0x04, 0x05, 0x05, 0x02, 0x04, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x19,
+0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x94, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0,
+0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C,
+0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00,
+0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1,
+0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF,
+0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30,
+0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8,
+0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8,
+0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5,
+0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD,
+0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86,
+0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF,
+0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F,
+0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6,
+0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80,
+0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x90, 0x74, 0x01, 0x93,
+0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2,
+0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81,
+0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE,
+0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18,
+0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09,
+0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81,
+0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02,
+0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09,
+0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F,
+0x04, 0x90, 0x46, 0x90, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3,
+0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4,
+0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F,
+0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0xDD, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02,
+0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C,
+0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5,
+0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01,
+0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC,
+0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5,
+0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22,
+0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4,
+0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0xDC, 0x8F, 0xF0,
+0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08,
+0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6,
+0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30,
+0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC,
+0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0xDD, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF,
+0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED,
+0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC,
+0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22,
+0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0,
+0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE4, 0x93, 0xFC,
+0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, 0x22, 0xE0, 0xF8, 0xA3,
+0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF9,
+0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0,
+0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0,
+0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12,
+0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83,
+0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x46, 0x2B,
+0x02, 0x43, 0x6D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2,
+0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33,
+0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF,
+0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x70, 0xE4, 0x7E,
+0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93,
+0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3,
+0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA,
+0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE,
+0x00, 0x41, 0xA1, 0xE9, 0x00, 0x41, 0xA1, 0xEA, 0x00, 0x41, 0xA1, 0xEB, 0x00, 0x41, 0xA1, 0xEF,
+0x00, 0x01, 0x70, 0x00, 0x41, 0xA1, 0xF0, 0x00, 0x41, 0xA1, 0xF1, 0x00, 0x41, 0xA2, 0x13, 0x00,
+0x59, 0x55, 0x51, 0xD7, 0x61, 0x3F, 0x7F, 0x02, 0xD1, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02,
+0xD1, 0xAC, 0x7F, 0x02, 0xD1, 0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E,
+0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xA3, 0xD1, 0xD6, 0xEF, 0x54, 0xF8, 0x44, 0x05, 0xFD,
+0x7F, 0xA3, 0xD1, 0xAC, 0x7F, 0xA0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75,
+0x83, 0x00, 0xE0, 0x90, 0xA2, 0x09, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2,
+0x09, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x5C, 0xD3, 0x10, 0xAF,
+0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4C, 0x08, 0xD1, 0xA2, 0xD1, 0x96, 0xD1, 0x96, 0x90, 0x01, 0x00,
+0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0x90,
+0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x7F, 0x01, 0x12, 0x5A, 0xD8,
+0x90, 0x9F, 0xBB, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x33, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x08,
+0x90, 0xA2, 0x01, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x01, 0xF0, 0xEF, 0xC4, 0x13,
+0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0x02, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0x02, 0x74,
+0x02, 0xF0, 0x90, 0xA2, 0x01, 0x12, 0x87, 0xB8, 0x7F, 0x01, 0x12, 0x5A, 0xD8, 0x90, 0x9F, 0xBA,
+0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0xD1, 0xD6, 0xE5, 0x0D,
+0x5F, 0xF5, 0x11, 0x7F, 0x55, 0xD1, 0xD6, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0xD1, 0xD6,
+0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0xD1, 0xD6, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD, 0x11,
+0x7F, 0x54, 0xD1, 0xAC, 0xAD, 0x12, 0x7F, 0x55, 0xD1, 0xAC, 0xAD, 0x13, 0x7F, 0x56, 0xD1, 0xAC,
+0xAD, 0x14, 0x7F, 0x57, 0xD1, 0xAC, 0x53, 0x91, 0xEF, 0x22, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5,
+0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0xD1, 0xAC, 0xAD, 0x0E, 0x7F, 0x51, 0xD1, 0xAC,
+0xAD, 0x0F, 0x7F, 0x52, 0xD1, 0xAC, 0xAD, 0x10, 0x7F, 0x53, 0xC1, 0xAC, 0x7F, 0x01, 0x7E, 0x00,
+0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0xD1, 0xD6, 0xEF, 0x20, 0xE6, 0x0C, 0x7F, 0x05, 0xD1, 0xD6, 0xEF,
+0x44, 0x80, 0xFD, 0x7F, 0x05, 0xD1, 0xAC, 0x22, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54, 0x07,
+0xFF, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x36, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75, 0xF0, 0x0E, 0xEF,
+0x90, 0xA0, 0x35, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA1, 0xAF, 0xF0, 0x90, 0xA1, 0xAE, 0xEE, 0xF0,
+0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1,
+0xAA, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C,
+0x12, 0x36, 0x3E, 0x90, 0xA1, 0xAA, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xA3, 0xA3,
+0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x29, 0xE0, 0x30, 0xE0, 0x79,
+0x90, 0xA0, 0x2B, 0xE0, 0x70, 0x3B, 0x7D, 0x16, 0x7F, 0x6F, 0x31, 0x5C, 0x91, 0x08, 0x90, 0xA0,
+0x29, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0x11, 0xDA, 0x90, 0xA0, 0x29, 0xE0, 0xC3,
+0x13, 0x54, 0x07, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x34, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x01, 0xF0,
+0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0xA3, 0x74, 0x03, 0x11, 0x1F, 0x90, 0xA0, 0x2B, 0x74, 0x01, 0xF0,
+0x22, 0x90, 0xA0, 0x2B, 0xE0, 0x64, 0x01, 0x70, 0x2E, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54,
+0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x34, 0x12, 0x45, 0xA9, 0xE0, 0x30, 0xE0, 0x18, 0x75,
+0xF0, 0x0E, 0xEF, 0x11, 0xDA, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xFB,
+0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x01, 0x27, 0xD1, 0x51, 0x22, 0x90, 0xA0, 0x38, 0x12, 0x45, 0xA9,
+0xE0, 0xFF, 0x7E, 0x00, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xB0,
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x2D, 0x90, 0x05,
+0x22, 0xE0, 0x90, 0xA1, 0xB5, 0xF0, 0x7D, 0x14, 0x91, 0x04, 0xBF, 0x01, 0x13, 0x51, 0xA6, 0x90,
+0xA1, 0xB3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, 0x51, 0x26,
+0x90, 0xA1, 0xB5, 0xE0, 0xFF, 0x7D, 0x15, 0x31, 0x5C, 0x80, 0x13, 0x51, 0xA6, 0x90, 0xA1, 0xB3,
+0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xB2, 0xE0, 0xFF, 0x51, 0x26, 0x90, 0x04,
+0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x38, 0x12, 0x45,
+0xA9, 0xE0, 0xFF, 0x7E, 0x00, 0xE4, 0xFD, 0x11, 0xE6, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF,
+0xF0, 0x90, 0x9D, 0x97, 0xED, 0xF0, 0x22, 0x90, 0x9F, 0xD1, 0xE0, 0x44, 0x02, 0xF0, 0x7D, 0x08,
+0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xBB, 0xEF, 0xF0, 0xA3, 0xED,
+0xF0, 0x90, 0x9D, 0x95, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x42, 0x90, 0x05, 0x22,
+0xE0, 0x90, 0xA1, 0xBF, 0xF0, 0x7D, 0x26, 0x91, 0x04, 0xEF, 0x64, 0x01, 0x70, 0x0B, 0x51, 0x09,
+0x90, 0xA0, 0x29, 0xE0, 0x20, 0xE0, 0x1A, 0x80, 0x15, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x13,
+0x54, 0x03, 0x30, 0xE0, 0x0C, 0x51, 0x09, 0x90, 0xA0, 0x29, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xB6,
+0xDD, 0x90, 0xA1, 0xBF, 0xE0, 0xFF, 0x7D, 0x27, 0x31, 0x5C, 0x12, 0xB7, 0x69, 0x80, 0x0F, 0x12,
+0xB7, 0x69, 0x51, 0x09, 0x90, 0xA0, 0x29, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xB6, 0xDD, 0x90, 0x9F,
+0xCA, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0,
+0x0B, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x28, 0x31, 0x5C, 0x90, 0x04, 0x1F, 0x74,
+0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9D, 0x9B, 0xE0, 0xFF, 0x90, 0xA1,
+0xBC, 0xE0, 0xFB, 0x7D, 0x01, 0x51, 0xB0, 0x90, 0xA1, 0xBD, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0,
+0xFD, 0x90, 0xA1, 0xBB, 0xE0, 0xFF, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
+0x44, 0x80, 0xF0, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, 0x90, 0x9F,
+0xE1, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x2B,
+0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA1, 0xB0, 0xA3, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF6, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90,
+0xA1, 0xF5, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xB8, 0x21, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA1,
+0xF5, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA1, 0xF6, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xF7, 0xE0, 0x25, 0xE0, 0x25, 0xE0,
+0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74,
+0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF,
+0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE5,
+0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x30, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0xE8, 0xF0,
+0x7D, 0x29, 0x91, 0x04, 0xBF, 0x01, 0x16, 0x90, 0x9D, 0x9C, 0x51, 0xAA, 0x90, 0xA1, 0xE6, 0xEE,
+0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xE5, 0xE0, 0xFF, 0x51, 0x26, 0x90, 0xA1, 0xE8,
+0xE0, 0xFF, 0x7D, 0x2A, 0x31, 0x5C, 0x80, 0x16, 0x90, 0x9D, 0x9C, 0x51, 0xAA, 0x90, 0xA1, 0xE6,
+0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0xE5, 0xE0, 0xFF, 0x51, 0x26, 0x90, 0x04,
+0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
+0x90, 0xA1, 0xC0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1D, 0x90, 0x05,
+0x22, 0xE0, 0x90, 0xA1, 0xC4, 0xF0, 0x7D, 0x36, 0x91, 0x04, 0xBF, 0x01, 0x03, 0x12, 0xB7, 0xD4,
+0x90, 0xA1, 0xC4, 0xE0, 0xFF, 0x7D, 0x37, 0x31, 0x5C, 0x80, 0x03, 0x12, 0xB7, 0xD4, 0x90, 0x05,
+0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x38, 0x31, 0x5C, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x31, 0x5C, 0xE4, 0x90, 0xA2, 0x03, 0xF0, 0xA3, 0xF0, 0x90,
+0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70,
+0x03, 0x7F, 0x01, 0x22, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x15,
+0xD3, 0x90, 0xA2, 0x04, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0x03, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x80,
+0x13, 0x7F, 0x01, 0x80, 0x1B, 0xD3, 0x90, 0xA2, 0x04, 0xE0, 0x94, 0xE8, 0x90, 0xA2, 0x03, 0xE0,
+0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32,
+0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA2, 0x03, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80,
+0x9E, 0x90, 0xA1, 0x16, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0,
+0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA1, 0x1B, 0xF0, 0x7D, 0x01, 0x91, 0x04, 0xEF, 0x64,
+0x01, 0x70, 0x02, 0xD1, 0xEF, 0x90, 0xA1, 0x1B, 0xE0, 0xFF, 0x7D, 0x02, 0x31, 0x5C, 0x80, 0x02,
+0xD1, 0xEF, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0xA1, 0x15, 0xEF, 0xF0, 0xA3, 0xED,
+0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA0, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0D,
+0x90, 0xA1, 0x16, 0xE0, 0xB4, 0x01, 0x06, 0x7D, 0x36, 0x7F, 0x6F, 0x31, 0x5C, 0x90, 0xA1, 0x15,
+0xE0, 0x70, 0x0B, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x7D, 0x05, 0x31, 0x72, 0x80, 0x26, 0x90, 0xA1,
+0x15, 0xE0, 0xB4, 0x01, 0x09, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x71, 0x56, 0x80, 0x16, 0x90, 0xA1,
+0x15, 0xE0, 0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA0, 0x24, 0xE0, 0xFE, 0xA3,
+0xE0, 0xFF, 0x71, 0xB9, 0x90, 0xA0, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0A,
+0x90, 0xA1, 0x16, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x31, 0x5C, 0x22, 0x8F, 0x54, 0x7D, 0x17, 0x91,
+0x04, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x90, 0xA0, 0x2C, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0x75, 0xF0,
+0x0E, 0xE5, 0x54, 0x90, 0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13,
+0x13, 0x54, 0x07, 0xFB, 0x90, 0xA0, 0x29, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xE0, 0xF0,
+0xAF, 0x04, 0x12, 0xB0, 0x18, 0x75, 0xF0, 0x0E, 0xE5, 0x54, 0x12, 0xAE, 0x02, 0x75, 0xF0, 0x0E,
+0xE5, 0x54, 0x31, 0x4B, 0xAD, 0x54, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
+0xA1, 0xE1, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xE3, 0xE0, 0xFF, 0xC3,
+0x94, 0x02, 0x40, 0x02, 0xC1, 0x4C, 0x90, 0xA1, 0xE2, 0xE0, 0xFE, 0x75, 0xF0, 0x0E, 0x90, 0xA0,
+0x2E, 0x12, 0x45, 0xA9, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5,
+0x82, 0x8C, 0x83, 0xE0, 0x90, 0xA1, 0xE4, 0xF0, 0x90, 0xA1, 0xE1, 0xE0, 0x60, 0x31, 0x90, 0xA1,
+0xE4, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x90, 0xA0, 0x30, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0,
+0x82, 0x90, 0xA1, 0xE3, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE0,
+0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x33, 0x90,
+0xA1, 0xE4, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x30, 0x12, 0x45,
+0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0xE3, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03,
+0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC,
+0xF4, 0x5F, 0x90, 0xA1, 0xE4, 0xF0, 0x90, 0xA1, 0xE4, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x75,
+0xF0, 0x0E, 0x90, 0xA0, 0x2E, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA1, 0xE3, 0xE0,
+0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82,
+0x8C, 0x83, 0xEF, 0xF0, 0x90, 0xA1, 0xE3, 0xE0, 0x04, 0xF0, 0xA1, 0x7A, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0x90, 0xA0, 0x29, 0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54,
+0x07, 0x25, 0xE0, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x90, 0xA0, 0x29, 0xE0, 0xFE, 0xC3, 0x13, 0x54,
+0x07, 0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x12, 0x47, 0xF8, 0xE4, 0x90, 0xA0, 0x2B, 0xF0,
+0x91, 0x08, 0x90, 0xA0, 0x29, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x75, 0xF0, 0x0E, 0x90,
+0xA0, 0x2C, 0x12, 0x45, 0xA9, 0xE0, 0xFA, 0x75, 0xF0, 0x0E, 0xED, 0x90, 0xA0, 0x2D, 0x12, 0x45,
+0xA9, 0xE0, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, 0xC4, 0x54, 0x0F,
+0x90, 0xA1, 0xE0, 0xF0, 0xAF, 0x02, 0x12, 0xB0, 0x18, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54,
+0x07, 0x75, 0xF0, 0x0E, 0x12, 0xAE, 0x02, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF,
+0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x37, 0x12, 0x45, 0xA9, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0E, 0xEF,
+0x31, 0x4B, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0xE4, 0xFF, 0xA1, 0x68, 0x90,
+0x9D, 0x9D, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x51, 0xB0, 0x90, 0xA1, 0x19, 0xEE, 0xF0, 0xFC,
+0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA1,
+0x20, 0xF0, 0x90, 0xA1, 0x1D, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA1, 0x1D,
+0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x51, 0x26, 0x90, 0xA1, 0x1D, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA1, 0x1F, 0xE0, 0xFF, 0x90, 0xA1, 0x1D, 0xA3, 0xE0, 0xFE,
+0x24, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA1, 0x20, 0xE0, 0xFF,
+0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2C, 0x2E, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x12, 0xB5, 0x5E, 0x90, 0x9F,
+0x1A, 0xE0, 0x64, 0x0C, 0x60, 0x12, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x52, 0x40, 0xE4, 0xFD, 0xFF,
+0x31, 0x5C, 0x7D, 0x08, 0xE4, 0xFF, 0x31, 0x72, 0x22, 0x12, 0x5D, 0x10, 0xE4, 0xFD, 0xFF, 0x31,
+0x5C, 0x90, 0x9F, 0x11, 0x74, 0x01, 0xF0, 0x22, 0x7D, 0x12, 0x7F, 0xFF, 0x31, 0x5C, 0x7F, 0x01,
+0x12, 0x5A, 0xD8, 0x90, 0xA0, 0x09, 0xE0, 0xFF, 0xE4, 0xFD, 0x02, 0x87, 0xBD, 0xF1, 0xB9, 0x90,
+0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x9F, 0x11, 0xF0, 0x22, 0x12, 0xB4, 0x1F, 0x80,
+0xEE, 0xF1, 0xF5, 0x80, 0xEA, 0xE4, 0xFD, 0xFF, 0x31, 0x5C, 0x90, 0x9F, 0x11, 0x74, 0x01, 0xF0,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x20, 0xE6,
+0x02, 0x21, 0x3E, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x6E, 0x7F, 0x8D, 0x12, 0x46, 0xD6, 0x90, 0x00,
+0x8E, 0xE0, 0xF5, 0x6F, 0xEF, 0x24, 0xFC, 0x60, 0x0C, 0x24, 0x03, 0x60, 0x02, 0x21, 0x2E, 0xAF,
+0x6E, 0x31, 0x71, 0x21, 0x2E, 0x74, 0x92, 0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83,
+0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x15, 0x12,
+0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0x49, 0x75, 0xF0, 0x04,
+0xE5, 0x6E, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB,
+0x0D, 0xE4, 0xFF, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9,
+0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90,
+0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5,
+0x6E, 0x90, 0x96, 0x13, 0x31, 0x43, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x14, 0x12, 0x45,
+0xA9, 0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x31, 0x49, 0x75, 0xF0, 0x04, 0xE5,
+0x6E, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0x31, 0x49, 0x75, 0xF0,
+0x08, 0xE5, 0x6E, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x49,
+0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x01, 0x31, 0x43, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90,
+0x89, 0x02, 0x31, 0x43, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x03, 0x31, 0x43, 0x75, 0xF0,
+0x08, 0xE5, 0x6E, 0x90, 0x89, 0x04, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x31, 0x49,
+0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x05, 0x31, 0x43, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90,
+0x89, 0x06, 0x31, 0x43, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x07, 0x31, 0x43, 0x7F, 0x8F,
+0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x46, 0xAC, 0xD0, 0xD0,
+0x92, 0xAF, 0x22, 0x12, 0x45, 0xA9, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16,
+0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06,
+0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x05, 0xEF, 0xF0, 0x7F, 0x8F, 0x12,
+0x46, 0xD6, 0xEF, 0x30, 0xE6, 0x4C, 0x7F, 0x8D, 0x12, 0x46, 0xD6, 0xEF, 0x64, 0x01, 0x70, 0x42,
+0x90, 0xA2, 0x06, 0xF0, 0x90, 0xA2, 0x06, 0xE0, 0xFD, 0x90, 0xA2, 0x05, 0xE0, 0x75, 0xF0, 0x10,
+0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83,
+0xE0, 0xFB, 0xE4, 0xFF, 0x31, 0x49, 0x90, 0xA2, 0x06, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10,
+0x40, 0xD2, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12,
+0x46, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA0, 0xDD, 0xF0, 0x90, 0xA0, 0xDD, 0xE0,
+0x64, 0x01, 0xF0, 0x24, 0xD7, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x51, 0xA3, 0xF0, 0x12, 0x3E, 0x44,
+0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x0E, 0x90, 0x9F, 0x1A, 0xE0,
+0xFF, 0x90, 0x9F, 0x19, 0xE0, 0x6F, 0x60, 0x02, 0x51, 0x28, 0xC2, 0xAF, 0x12, 0x99, 0xC9, 0xBF,
+0x01, 0x03, 0x12, 0x8D, 0x41, 0xD2, 0xAF, 0x90, 0xA0, 0x56, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0xB2,
+0x00, 0x11, 0x01, 0x12, 0x42, 0xDD, 0x80, 0xB4, 0x90, 0x9F, 0x0E, 0xE0, 0x90, 0x9F, 0x19, 0x30,
+0xE0, 0x04, 0xE0, 0xFF, 0xC1, 0x1D, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x04, 0x7D, 0x01, 0x7F, 0x04,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x10, 0xED, 0xF0, 0x90, 0x9F, 0x13, 0xE0,
+0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x61, 0x89, 0xEE, 0xC4, 0x13, 0x13, 0x13,
+0x54, 0x01, 0x30, 0xE0, 0x02, 0x61, 0x89, 0x90, 0x9F, 0x1A, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x61,
+0x89, 0xEF, 0x70, 0x02, 0x61, 0x00, 0x24, 0xFE, 0x70, 0x02, 0x61, 0x39, 0x24, 0xFE, 0x60, 0x48,
+0x24, 0xFC, 0x70, 0x02, 0x61, 0x74, 0x24, 0xFC, 0x60, 0x02, 0x61, 0x89, 0xEE, 0xB4, 0x0E, 0x02,
+0x71, 0xED, 0x90, 0x9F, 0x1A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x1E, 0x90, 0x9F, 0x1A, 0xE0,
+0xB4, 0x06, 0x02, 0x71, 0xC2, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x04, 0x0E, 0x90, 0xA2, 0x10, 0xE0,
+0xFF, 0x60, 0x05, 0x12, 0xB6, 0x0E, 0x80, 0x02, 0xF1, 0xD5, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x08,
+0x60, 0x02, 0x61, 0x89, 0xD1, 0x0B, 0x61, 0x89, 0x90, 0x9F, 0x1A, 0xE0, 0x70, 0x04, 0x7F, 0x01,
+0x91, 0x1E, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xC2, 0x90, 0x9F, 0x1A, 0xE0, 0xB4,
+0x0E, 0x07, 0x71, 0x8E, 0xBF, 0x01, 0x02, 0x71, 0xED, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x0C, 0x60,
+0x02, 0x61, 0x89, 0x71, 0x8E, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, 0x89, 0x91, 0xB6, 0x61, 0x89,
+0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0E, 0x07, 0x71, 0x8E, 0xBF, 0x01, 0x02, 0x71, 0xED, 0x90, 0x9F,
+0x1A, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xC2, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0x8E,
+0xBF, 0x01, 0x02, 0x91, 0xB6, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0xB5, 0x9E,
+0xEF, 0x64, 0x01, 0x70, 0x54, 0xD1, 0x3D, 0x80, 0x50, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0E, 0x07,
+0x71, 0x8E, 0xBF, 0x01, 0x02, 0x71, 0xED, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x06, 0x02, 0x71, 0xC2,
+0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0C, 0x07, 0x71, 0x8E, 0xBF, 0x01, 0x02, 0x91, 0xB6, 0x90, 0x9F,
+0x1A, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x1E, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x04, 0x1A, 0x12,
+0xB6, 0x4D, 0x80, 0x15, 0x90, 0x9F, 0x1A, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0x9F, 0x14, 0xE0, 0xFF,
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xF1, 0x6D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F,
+0xCA, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0x9F, 0xD0, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07,
+0x80, 0x1D, 0xF1, 0xF0, 0xBF, 0x01, 0x18, 0x90, 0x9F, 0x13, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F,
+0x20, 0xE0, 0x0C, 0x90, 0x9F, 0x19, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F,
+0x00, 0x22, 0x90, 0x9F, 0x14, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44, 0x40, 0xF0,
+0x7D, 0x04, 0x7F, 0x01, 0x91, 0x47, 0x80, 0x0F, 0x91, 0x3F, 0x90, 0x05, 0x27, 0xE0, 0x54, 0x7F,
+0xF0, 0x90, 0x9F, 0x12, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5C, 0x90, 0x9F, 0x14,
+0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x91, 0x43, 0x80, 0x1E, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40,
+0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x91, 0x47, 0x90, 0x05, 0x27, 0xE0, 0x44,
+0x80, 0xF0, 0x90, 0x9F, 0x12, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5C, 0x90, 0xA2,
+0x0F, 0xEF, 0xF0, 0x12, 0x5D, 0x10, 0x90, 0xA2, 0x0F, 0xE0, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12,
+0x49, 0x5C, 0x7D, 0x04, 0x7F, 0x01, 0x91, 0x47, 0x90, 0x9F, 0x12, 0x74, 0x04, 0xF0, 0x22, 0xE0,
+0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2,
+0x0E, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01,
+0xFF, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x9F, 0x1A, 0xED, 0xF0,
+0x80, 0x05, 0x90, 0x9F, 0x19, 0xED, 0xF0, 0x7F, 0x8F, 0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE4, 0x31,
+0x90, 0xA2, 0x0E, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90, 0x9F,
+0x13, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x9F, 0x1A, 0xE0, 0x54,
+0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x9F, 0x19, 0xE0, 0xFD, 0x7F, 0x89, 0x12, 0x46,
+0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x27, 0x90, 0x9F,
+0x14, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x12, 0x49, 0x67, 0xBF,
+0x01, 0x13, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x91, 0x47, 0x90,
+0x9F, 0x12, 0x74, 0x0E, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0xA3, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F,
+0x79, 0x13, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79,
+0xBD, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0x16, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0x1D, 0x14, 0xF0, 0xA3,
+0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9F, 0x22, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x9F,
+0x4E, 0xE0, 0x24, 0x04, 0x90, 0x9F, 0x2C, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0xFD, 0xFF, 0x91,
+0x47, 0x7D, 0x0C, 0x7F, 0x02, 0x91, 0x47, 0x91, 0x43, 0x90, 0x9D, 0x98, 0xE0, 0xB4, 0x01, 0x08,
+0x90, 0x9F, 0x21, 0x74, 0xDD, 0xF0, 0x80, 0x12, 0x90, 0x9D, 0x98, 0xE0, 0x90, 0x9F, 0x21, 0xB4,
+0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12, 0x46, 0xD6, 0xEF,
+0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x46, 0xD6, 0xEF, 0x30, 0xE2, 0x06, 0x90,
+0x9F, 0x4E, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0xB6, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3,
+0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x9F, 0x4E, 0xE0, 0x24, 0x04,
+0x90, 0x9F, 0x2C, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9F, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0x90,
+0x01, 0x38, 0xE0, 0x90, 0x9F, 0xC2, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90, 0x9F, 0xC3, 0xF0, 0x90,
+0x01, 0x3A, 0xE0, 0x90, 0x9F, 0xC4, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90, 0x9F, 0xC5, 0xF0, 0x90,
+0x01, 0x30, 0xE0, 0x90, 0x9F, 0xC6, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90, 0x9F, 0xC7, 0xF0, 0x90,
+0x01, 0x32, 0xE0, 0x90, 0x9F, 0xC8, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90, 0x9F, 0xC9, 0xF0, 0x12,
+0x77, 0x41, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xBA, 0x12, 0x08,
+0xAA, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4,
+0xFD, 0xFF, 0x12, 0x49, 0x5C, 0xE4, 0x90, 0x9F, 0xBC, 0xF0, 0x22, 0x12, 0x5D, 0x10, 0xE4, 0xFD,
+0xFF, 0x12, 0x49, 0x5C, 0x91, 0x43, 0x90, 0x9F, 0x12, 0x74, 0x0C, 0xF0, 0x22, 0xAE, 0x07, 0x12,
+0x6B, 0xE2, 0xBF, 0x01, 0x15, 0x90, 0x9F, 0x0E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0,
+0x09, 0xAF, 0x06, 0x7D, 0x01, 0x51, 0x40, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x7D, 0x2D, 0x12,
+0x4C, 0x04, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0xD1, 0xCE, 0x12, 0x46, 0xFD,
+0xE4, 0xFD, 0x7F, 0x01, 0x91, 0x47, 0xE4, 0x90, 0x9F, 0x12, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70,
+0x2A, 0xD1, 0x3D, 0x90, 0x01, 0x38, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01,
+0x30, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x30, 0x74, 0x10, 0xF0, 0x90, 0x01,
+0x39, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0x12, 0x8D, 0xC9, 0x90, 0x9F,
+0xC7, 0xE0, 0x90, 0x01, 0x31, 0xF0, 0x90, 0x9F, 0xC8, 0xE0, 0x90, 0x01, 0x32, 0xF0, 0x90, 0x9F,
+0xC9, 0xE0, 0x90, 0x01, 0x33, 0xF0, 0x90, 0x9F, 0xC2, 0xE0, 0x90, 0x01, 0x38, 0xF0, 0x90, 0x9F,
+0xC5, 0xE0, 0x90, 0x01, 0x3B, 0xF0, 0xD1, 0xCA, 0x7D, 0x02, 0x7F, 0x02, 0xD1, 0xCE, 0x7F, 0x01,
+0x91, 0x1E, 0x81, 0xE6, 0x7D, 0x02, 0x7F, 0x02, 0xD1, 0xCE, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15,
+0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83,
+0xEE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE,
+0x90, 0x9F, 0xBD, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0x90, 0x01, 0x53,
+0xF0, 0x90, 0x9F, 0xBF, 0xE0, 0x60, 0x10, 0x7D, 0x10, 0x7F, 0x03, 0xF1, 0x8E, 0x90, 0x9F, 0xBF,
+0xE0, 0x90, 0x05, 0x73, 0xF0, 0x80, 0x22, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF,
+0x12, 0x77, 0x0C, 0x12, 0x6E, 0xCF, 0xF1, 0x6D, 0x80, 0x0F, 0x90, 0x01, 0x53, 0x74, 0x03, 0xF0,
+0x7D, 0x10, 0xFF, 0xF1, 0x8E, 0xD1, 0xC4, 0xD1, 0x0B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F,
+0xBD, 0xE0, 0x30, 0xE0, 0x27, 0x90, 0x9F, 0xBF, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x9F, 0xC0,
+0xE0, 0x60, 0x04, 0x14, 0xF0, 0x80, 0x16, 0x90, 0x9F, 0xBE, 0xE0, 0x14, 0x90, 0x9F, 0xC0, 0xF0,
+0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0xD1, 0xE3, 0xD1, 0xC4, 0x22, 0x7D, 0x2F, 0x12,
+0x46, 0xF8, 0x7D, 0x08, 0x7F, 0x01, 0x91, 0x47, 0x90, 0x9F, 0x12, 0x74, 0x08, 0xF0, 0x22, 0xEF,
+0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D,
+0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83,
+0xEE, 0xF0, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0x20, 0xE0, 0x2A, 0x90, 0x9F, 0x17, 0xE0, 0x64, 0x01,
+0x70, 0x22, 0x12, 0x7F, 0xC5, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, 0x60, 0x0F, 0xE4, 0xFD, 0x7F,
+0x0C, 0x51, 0x40, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x02, 0xB5, 0x5E, 0x90, 0x9F, 0x1A, 0xE0,
+0x70, 0x02, 0x51, 0x3C, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0xFF, 0x12,
+0x49, 0x5C, 0x7D, 0x0C, 0x7F, 0x01, 0x81, 0x47, 0xF1, 0xF0, 0xEF, 0x70, 0x02, 0xF1, 0xA3, 0x22,
+0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07,
+0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x7F, 0xF4, 0x12, 0x46, 0xD6, 0xEF, 0x20,
+0xE5, 0x0E, 0x7F, 0xF4, 0x12, 0x46, 0xD6, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22,
+0x7F, 0x03, 0x22, 0x11, 0x09, 0x90, 0x9D, 0x98, 0xEF, 0xF0, 0x11, 0x6A, 0x90, 0x01, 0x64, 0x74,
+0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x12, 0x46, 0xD6, 0xEF, 0x54,
+0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x46, 0xAC, 0x7F, 0x16, 0x12, 0x46, 0xD6, 0xEF, 0x54,
+0x0F, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0xAC, 0x7F, 0x38, 0x12, 0x46, 0xD6, 0xEF, 0x44,
+0x40, 0xFD, 0x7F, 0x38, 0x12, 0x46, 0xAC, 0x02, 0x37, 0x99, 0x11, 0xB9, 0x11, 0xE9, 0x11, 0x75,
+0x11, 0x94, 0x02, 0x47, 0xBA, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18,
+0x32, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3,
+0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62,
+0x43, 0x20, 0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0,
+0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0,
+0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F,
+0x50, 0x12, 0x46, 0xAC, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x46, 0xAC, 0xE4, 0xFD, 0x7F, 0x52, 0x12,
+0x46, 0xAC, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x46, 0xAC, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3,
+0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD,
+0x7F, 0x54, 0x12, 0x46, 0xAC, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x46, 0xAC, 0x7D, 0xFF, 0x7F, 0x56,
+0x12, 0x46, 0xAC, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x46, 0xAC, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA1,
+0x05, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30,
+0xE5, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4,
+0xF5, 0xA8, 0xF5, 0xE8, 0x11, 0xB9, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12,
+0x46, 0xAC, 0x80, 0xFE, 0x22, 0x7F, 0x81, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81,
+0x12, 0x46, 0xAC, 0x7F, 0x80, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x46,
+0xAC, 0xF1, 0xE0, 0x12, 0x3E, 0x11, 0x12, 0x99, 0x2E, 0x12, 0x99, 0xF2, 0x7F, 0x01, 0x12, 0x43,
+0xA5, 0x90, 0xA0, 0x28, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0xA5, 0x90, 0xA0, 0x28, 0xE0, 0x04,
+0xF0, 0x11, 0x23, 0x31, 0xFB, 0x7F, 0x80, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80,
+0x12, 0x46, 0xAC, 0x75, 0x28, 0xFF, 0xF1, 0xAE, 0x12, 0x99, 0x6F, 0x7B, 0x01, 0x7A, 0xA0, 0x79,
+0xDA, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xEF, 0x64, 0x01, 0x70, 0x26, 0x90, 0xA0, 0xDA,
+0xE0, 0x54, 0x07, 0xF0, 0xE0, 0xFF, 0x64, 0x07, 0x60, 0x04, 0xEF, 0xB4, 0x04, 0x15, 0xF1, 0xBE,
+0xBF, 0x01, 0x10, 0x7F, 0x16, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0x0F, 0x44, 0x60, 0xFD, 0x7F, 0x16,
+0x12, 0x46, 0xAC, 0x7F, 0x81, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46,
+0xAC, 0xF1, 0xC9, 0x12, 0xB1, 0xD9, 0xE4, 0xFF, 0x02, 0x44, 0x2E, 0xF1, 0xA8, 0x12, 0x96, 0xC8,
+0x12, 0x9B, 0x63, 0x12, 0xB2, 0x90, 0x12, 0x54, 0xE6, 0x12, 0xB6, 0xCE, 0x12, 0x8F, 0xC7, 0x7E,
+0x00, 0x7F, 0x19, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xFA, 0x12, 0x08, 0xAA, 0x7F, 0x80,
+0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0x01, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0x01, 0x12, 0x45,
+0x71, 0x90, 0x9F, 0xFD, 0x12, 0x08, 0x6D, 0x90, 0x9D, 0x98, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x2A,
+0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0xA0, 0x09, 0xEE, 0xF0,
+0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0xA0, 0x0A, 0xEE, 0xF0,
+0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x4A, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0x90,
+0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA0, 0x09, 0xEF, 0xF0, 0x90,
+0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x9D, 0x98, 0xE0,
+0x64, 0x03, 0x70, 0x20, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90,
+0xA0, 0x09, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90,
+0xA0, 0x0A, 0xEF, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x7F, 0x01, 0x51, 0xD8, 0x12,
+0x82, 0x77, 0x12, 0x82, 0xED, 0x90, 0x9F, 0xE3, 0x74, 0x01, 0xF0, 0x90, 0xA0, 0x16, 0xE0, 0x54,
+0xFE, 0xF0, 0x90, 0x04, 0x8F, 0xE4, 0xF0, 0x22, 0x90, 0x9F, 0xEF, 0xE0, 0x13, 0x13, 0x13, 0x54,
+0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x09, 0xF0, 0x22, 0xEF, 0xF0, 0x22, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xC5, 0xEF, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xFF,
+0x12, 0x71, 0xC5, 0x90, 0x9F, 0xCE, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xB1,
+0x10, 0x90, 0x9F, 0xCE, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0x80, 0x3A, 0x90, 0x9F, 0xCA, 0xE0,
+0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x2A, 0x90, 0x9F, 0xCD, 0xE0,
+0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x10, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F,
+0x09, 0x80, 0x13, 0x7F, 0x03, 0x80, 0x0F, 0x90, 0x9F, 0xCD, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x04,
+0x7F, 0x03, 0x80, 0x02, 0x7F, 0x09, 0x51, 0xD8, 0x90, 0xA1, 0xC5, 0xE0, 0x64, 0x03, 0x60, 0x02,
+0x61, 0xEA, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x6F, 0x90, 0x9F,
+0xD4, 0xE0, 0xFF, 0x90, 0x9F, 0xDF, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x42, 0xEE, 0x75, 0xF0, 0x03,
+0xA4, 0xFF, 0x90, 0x9F, 0xD6, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33,
+0xFC, 0x90, 0x9F, 0xCC, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x40,
+0x08, 0xEE, 0x9F, 0x90, 0xA1, 0xC8, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xC8, 0x74, 0x03, 0xF0, 0x90,
+0xA1, 0xC8, 0xE0, 0xFF, 0x91, 0xFE, 0x90, 0x9F, 0xDD, 0xE0, 0x04, 0xF0, 0x80, 0x18, 0x90, 0x9F,
+0xD7, 0xE0, 0xFF, 0x91, 0xFE, 0x90, 0x9F, 0xD2, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0xDD, 0xF0,
+0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0xDF, 0xF0, 0x80, 0x0D, 0x90, 0x9F, 0xCC,
+0xE0, 0xFF, 0x91, 0xFE, 0x90, 0x9F, 0xDD, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x13,
+0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0xC7, 0xF0, 0x80, 0x06, 0x90, 0xA1,
+0xC7, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90,
+0xA0, 0x09, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xC6, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xC6, 0x74,
+0x01, 0xF0, 0x90, 0xA1, 0xC6, 0x12, 0x87, 0xB8, 0x90, 0x9F, 0xDC, 0x74, 0x01, 0xF0, 0x90, 0x9F,
+0xCA, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0D, 0x90, 0xA1, 0xC5, 0xE0, 0x70, 0x42, 0xFD,
+0xFF, 0x12, 0x49, 0x5C, 0x80, 0x3B, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1D,
+0x90, 0x9F, 0xD0, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80,
+0x1B, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x7D, 0x01, 0x7F, 0x0C, 0x80, 0x11, 0x90, 0xA1, 0xC5,
+0xE0, 0xB4, 0x03, 0x0D, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x07, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x52,
+0x40, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x18, 0x90, 0xA1, 0xC5, 0xE0, 0x70, 0x04, 0x7D, 0x04, 0x80,
+0x0A, 0x90, 0xA1, 0xC5, 0xE0, 0x64, 0x03, 0x70, 0x34, 0x7D, 0x0B, 0x7F, 0x6F, 0x80, 0x2B, 0x90,
+0xA1, 0xC5, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, 0x21, 0x90, 0xA1, 0xC5, 0xE0, 0xB4, 0x03, 0x1D,
+0x90, 0x9F, 0xCA, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54,
+0x3F, 0x30, 0xE0, 0x03, 0x12, 0x77, 0x62, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0xCD,
+0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0x7F, 0x01, 0xF1, 0x81, 0x90, 0x9F,
+0xCE, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06,
+0xCF, 0xE0, 0x44, 0x10, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x90,
+0xA1, 0xAE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x02, 0x48, 0x27,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01,
+0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0,
+0x90, 0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x51, 0xD8,
+0x90, 0x9F, 0xE5, 0xE0, 0x20, 0xE0, 0x36, 0x90, 0x9F, 0xBB, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0,
+0x2C, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xFF, 0xF0, 0x80, 0x06, 0x90, 0xA1,
+0xFF, 0x74, 0x01, 0xF0, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x90, 0xA2, 0x00, 0x30, 0xE0, 0x05, 0x74,
+0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xFF, 0x12, 0x87, 0xB8, 0x7F, 0x02, 0x12,
+0x46, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x46, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0x90, 0x9F, 0xE5, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0x9F, 0xEA, 0xE0, 0xFF, 0x51,
+0xD8, 0x90, 0x9F, 0xEB, 0x12, 0x87, 0xB8, 0xB1, 0x10, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5C, 0x90,
+0xA1, 0x15, 0xEF, 0xF0, 0x90, 0xA1, 0x17, 0x74, 0x02, 0xF0, 0x7F, 0x01, 0x12, 0x71, 0xC5, 0x90,
+0x9F, 0xCE, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x22, 0x90, 0xA1, 0x15, 0xE0, 0xB4,
+0x02, 0x04, 0x7D, 0x07, 0x80, 0x09, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x0D, 0x7F,
+0xFF, 0x12, 0x49, 0x5C, 0x12, 0x4C, 0x08, 0xBF, 0x01, 0x03, 0x12, 0x46, 0xFD, 0x90, 0x9F, 0xCE,
+0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F, 0x01,
+0x51, 0xD8, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x0C, 0x90, 0x9F, 0xCB, 0xE0, 0x24, 0x03, 0xFF,
+0x90, 0x9F, 0xDA, 0x91, 0xFA, 0x90, 0x9F, 0xCA, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90,
+0xA1, 0x16, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0x16, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4,
+0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0x17, 0x74,
+0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0x17, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x90, 0xA1,
+0x16, 0xE0, 0xFD, 0x12, 0x87, 0xBD, 0xE4, 0x90, 0x9F, 0xDC, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xFF,
+0xB4, 0x02, 0x08, 0x90, 0x9F, 0xDD, 0xE0, 0x04, 0xF0, 0x80, 0x09, 0xEF, 0xB4, 0x05, 0x05, 0xE4,
+0x90, 0x9F, 0xDD, 0xF0, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x17, 0x90,
+0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x08, 0x80, 0x66, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x05,
+0x70, 0x63, 0x7D, 0x0E, 0x80, 0x5A, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x2C,
+0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0A, 0x90, 0x9F, 0x19, 0xE0, 0xFF,
+0xE4, 0xFD, 0x12, 0x52, 0x40, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x30,
+0x90, 0xA1, 0x15, 0xE0, 0x64, 0x05, 0x70, 0x2D, 0x7D, 0x0F, 0x80, 0x24, 0x90, 0x9F, 0x17, 0xE0,
+0x60, 0x23, 0x90, 0x9F, 0x19, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x52, 0x40, 0x90, 0xA1, 0x15, 0xE0,
+0xB4, 0x02, 0x04, 0x7D, 0x0A, 0x80, 0x09, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x10,
+0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0xCD, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12,
+0x49, 0x5C, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0xE4,
+0xFF, 0xF1, 0x81, 0x90, 0x9F, 0xCE, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0,
+0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0x30,
+0xE0, 0x35, 0x12, 0x7F, 0xFB, 0x90, 0x9F, 0xDD, 0xE0, 0xFF, 0xB4, 0x01, 0x02, 0x80, 0x1C, 0x90,
+0x9F, 0xDD, 0xE0, 0xFF, 0xB4, 0x02, 0x02, 0x80, 0x1C, 0x90, 0x9F, 0xDD, 0xE0, 0xFF, 0xB4, 0x03,
+0x02, 0x41, 0xEE, 0x90, 0x9F, 0xDD, 0xE0, 0xFF, 0xB4, 0x04, 0x02, 0xE1, 0xED, 0x90, 0x9F, 0xDD,
+0xE0, 0xFF, 0xB4, 0x05, 0x02, 0xB1, 0xAF, 0x22, 0x90, 0x9F, 0xE5, 0xE0, 0x30, 0xE0, 0x05, 0x12,
+0x4F, 0xC8, 0x80, 0x02, 0xF1, 0x2B, 0x90, 0xA0, 0x16, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x71, 0x4E,
+0x22, 0x90, 0x9F, 0xFA, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x1C, 0xEF, 0xB4, 0x01, 0x05, 0x90,
+0xA0, 0x01, 0x80, 0x03, 0x90, 0x9F, 0xFD, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D,
+0x7F, 0x80, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x22, 0xE4, 0x90, 0x9E, 0x8D, 0xF0, 0x22, 0x75, 0xE8,
+0x07, 0x75, 0xA8, 0x85, 0x22, 0xB1, 0x10, 0x90, 0x9F, 0x11, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x00,
+0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1B, 0xF0, 0xA3,
+0x74, 0x01, 0xF0, 0x22, 0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x04, 0xE4, 0xFF, 0x51, 0xEE, 0x22,
+0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0xA1, 0x15,
+0xEF, 0xF0, 0x7F, 0x03, 0x91, 0xFE, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x9F, 0xDD,
+0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xCE, 0xE0, 0xFF,
+0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x09, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3C,
+0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0A, 0x90, 0x9F, 0xCB, 0xE0, 0xFF, 0x90,
+0x9F, 0xDB, 0x80, 0x21, 0x90, 0xA1, 0x15, 0xE0, 0xFC, 0xB4, 0x01, 0x0D, 0x90, 0x9F, 0xCB, 0xE0,
+0xFE, 0x90, 0x9F, 0xDA, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, 0xB4, 0x04, 0x0F, 0x90, 0x9F, 0xCC,
+0xE0, 0xFF, 0x90, 0x9F, 0xDA, 0xE0, 0xC3, 0x9F, 0x90, 0x9F, 0xE1, 0xF0, 0x90, 0x9F, 0xCA, 0xE0,
+0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2C, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20,
+0xE0, 0x02, 0x21, 0x0A, 0x90, 0x9F, 0xE1, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, 0x25,
+0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x12, 0x4C,
+0x71, 0x80, 0x77, 0x90, 0x9F, 0xCA, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x54, 0x90, 0x9F, 0xD0,
+0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x52, 0x40, 0x90, 0x9F, 0xCE, 0xE0, 0xC4,
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0x90, 0x9F, 0xD1, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB,
+0xF0, 0xE4, 0x90, 0x9F, 0xE0, 0xF0, 0x90, 0x9F, 0xDD, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xFF, 0xB4,
+0x01, 0x08, 0x90, 0x9F, 0xD2, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x04, 0x06, 0x90, 0x9F,
+0xD2, 0x74, 0x07, 0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x07, 0x90, 0x9F, 0xD1, 0xE0, 0x44, 0x04,
+0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, 0x09, 0x90, 0xA1, 0x15, 0xE0,
+0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0xCE, 0xE0, 0x13, 0x13,
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x1B, 0x90, 0x9F, 0xE1, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A,
+0xEF, 0x7F, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0x12, 0x4B,
+0xB9, 0x90, 0x9F, 0xCD, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x22, 0xE4,
+0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0xDE, 0x90, 0xA0, 0xE6, 0xEF, 0xF0, 0x60, 0xF0, 0x90,
+0x9D, 0x93, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x0B, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12,
+0x6A, 0x2F, 0x12, 0xA1, 0x20, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9D, 0x93, 0xE0, 0xFF, 0x30, 0xE1,
+0x06, 0x54, 0xFD, 0xF0, 0x12, 0x7B, 0x26, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9D, 0x93, 0xE0, 0xFF,
+0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0xF1, 0x65, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9D, 0x93, 0xE0,
+0xFF, 0x30, 0xE6, 0x05, 0x54, 0xBF, 0xF0, 0x31, 0x9D, 0xD2, 0xAF, 0x80, 0xB2, 0xE4, 0x7B, 0x01,
+0x7A, 0xA0, 0x79, 0x13, 0x31, 0xC3, 0xEF, 0xB4, 0x02, 0x18, 0x90, 0xA1, 0xE9, 0xE0, 0x64, 0x04,
+0x60, 0x0B, 0x7F, 0x40, 0xB1, 0x9C, 0x90, 0xA1, 0xE9, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA1,
+0xE9, 0xF0, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1,
+0xB6, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x45, 0xBE, 0x12, 0x46, 0xC6, 0xEF, 0x54, 0x0F,
+0x64, 0x04, 0x70, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0xB6, 0xE0, 0xFF,
+0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x45, 0xB5, 0x12, 0x92, 0xBE, 0x7F, 0x01, 0x80, 0x0E, 0x7F, 0x01,
+0x51, 0x11, 0x7F, 0x02, 0x80, 0x06, 0x7F, 0x02, 0x51, 0x11, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0x71, 0xE9, 0x7F, 0x04, 0x8F, 0x71, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9D, 0x93, 0xE0,
+0x45, 0x71, 0xF0, 0x22, 0x90, 0xFD, 0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA1, 0x24,
+0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x61, 0xE8, 0x90, 0xA1, 0xEB, 0xE0, 0x70, 0x1A, 0x7F, 0x2E, 0x12,
+0x46, 0xD6, 0x90, 0xA0, 0x05, 0xEF, 0xF0, 0x7F, 0x2D, 0x12, 0x46, 0xD6, 0x90, 0xA0, 0x06, 0xEF,
+0xF0, 0x90, 0xA1, 0xEB, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x24, 0xE0, 0x64, 0x15, 0x70, 0x6E, 0x90,
+0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x1C, 0xF4, 0x54, 0x3F, 0x04, 0xFE, 0x90, 0xA0, 0x05, 0xE0,
+0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9E, 0x90, 0xA1, 0x23, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x1D, 0xE4,
+0xF0, 0x80, 0x19, 0x90, 0xA0, 0x05, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x3F, 0x2E,
+0x90, 0xA1, 0x23, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA1, 0x23, 0xE0,
+0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFE, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA1, 0x21,
+0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, 0x46, 0xAC, 0x90, 0xA1, 0x23, 0xE0, 0xC4, 0x54, 0xF0, 0xFF,
+0x90, 0xA0, 0x06, 0xE0, 0x54, 0x0F, 0x4F, 0xFD, 0x7F, 0x2D, 0x12, 0x46, 0xAC, 0x90, 0xA1, 0x24,
+0xE0, 0xB4, 0x21, 0x0B, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xD1, 0xAF, 0x7F, 0x04, 0x51, 0x15, 0x90,
+0xA1, 0x24, 0xE0, 0xB4, 0x23, 0x08, 0x7F, 0x01, 0x91, 0x0E, 0x7F, 0x04, 0x51, 0x15, 0x90, 0xA1,
+0x24, 0xE0, 0xB4, 0x27, 0x08, 0x7F, 0x02, 0x91, 0x0E, 0x7F, 0x04, 0x51, 0x15, 0x90, 0xA1, 0x24,
+0xE0, 0xB4, 0x30, 0x0B, 0xE4, 0xFB, 0xFD, 0x7F, 0x01, 0xD1, 0x4A, 0x7F, 0x04, 0x51, 0x15, 0x90,
+0xA1, 0x24, 0xE0, 0x64, 0x34, 0x70, 0x71, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x4F, 0x90, 0x9F,
+0xEF, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x60, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54,
+0x01, 0xFF, 0x90, 0xA0, 0x0A, 0xE0, 0xFB, 0x90, 0xA0, 0x09, 0xE0, 0x90, 0xA1, 0xCC, 0xF0, 0x7D,
+0x01, 0x12, 0x8A, 0xE7, 0x90, 0xA1, 0x21, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0xA1, 0x79, 0x21, 0xFD,
+0x7F, 0x34, 0x31, 0xC7, 0x90, 0xA0, 0x10, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0,
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x1B, 0x12, 0x8A, 0xCE,
+0x90, 0xA0, 0x10, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0xFE,
+0xF0, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x24, 0xE0, 0xFD, 0xB4, 0x35, 0x07,
+0x90, 0x9F, 0xD1, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x36, 0x22, 0x90, 0xFD, 0x61, 0xE0, 0x90,
+0xA1, 0x21, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x22, 0xF0, 0x90, 0xA1, 0x24, 0xE0, 0xFF,
+0x90, 0xA1, 0x21, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x22, 0x31, 0xC7, 0x90, 0xA1, 0x24,
+0xE0, 0xB4, 0x37, 0x02, 0xD1, 0xC8, 0x90, 0xA1, 0x24, 0xE0, 0xB4, 0x40, 0x14, 0x90, 0xFD, 0x62,
+0xE0, 0x30, 0xE0, 0x08, 0x90, 0x9F, 0xED, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x9F, 0xED,
+0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
+0x90, 0xA1, 0x8B, 0x74, 0x15, 0xF0, 0x90, 0xA1, 0x99, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x8D, 0xEF,
+0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x8B, 0x91, 0x94, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1,
+0x6D, 0x74, 0x09, 0xF0, 0x90, 0xA1, 0x7B, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x6F, 0xEF, 0xF0, 0x70,
+0x31, 0x90, 0x9F, 0xE3, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, 0x60, 0x02, 0x80, 0x0C, 0x90, 0x07, 0x70,
+0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, 0x90, 0xA1, 0x70, 0x74, 0x01, 0xF0, 0x80,
+0x05, 0xE4, 0x90, 0xA1, 0x70, 0xF0, 0xE4, 0x90, 0xA1, 0x71, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
+0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA1, 0x70, 0xF0, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA1,
+0x71, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA1, 0x72, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA1,
+0x73, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA1, 0x74, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA1,
+0x75, 0xF0, 0x90, 0xA1, 0x70, 0xE0, 0x54, 0x01, 0x90, 0x9F, 0xE3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01,
+0x7A, 0xA1, 0x79, 0x6D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9E, 0x88, 0xE0, 0xFF,
+0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9E, 0x89, 0xE0, 0xB5,
+0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44,
+0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0x9E, 0x89, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF2,
+0xF9, 0x74, 0x9D, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F,
+0x12, 0x06, 0x63, 0x90, 0x9E, 0x89, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F,
+0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9E, 0x89, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F,
+0xF0, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x31, 0xC7, 0x8F, 0x51, 0xE5, 0x51, 0xB4,
+0x03, 0x08, 0xE4, 0xFF, 0x91, 0x0E, 0x7F, 0x04, 0xB1, 0x9C, 0x22, 0x90, 0xA1, 0x05, 0xEF, 0xF0,
+0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x64, 0xA3, 0xE0, 0xF5, 0x65, 0x65, 0x64, 0x60, 0x6D, 0x90, 0xA1,
+0x06, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5,
+0x66, 0xE4, 0xF5, 0x63, 0xE5, 0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
+0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF,
+0x74, 0x08, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x63, 0xE5,
+0x63, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x06, 0x91, 0x94, 0xE5, 0x65, 0x04, 0x54,
+0x0F, 0xF5, 0x65, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x65, 0x90, 0x04, 0x7F, 0xE5, 0x65, 0xF0, 0x90,
+0xA1, 0x05, 0xE0, 0x7F, 0x04, 0x70, 0x02, 0x41, 0x15, 0xB1, 0x9C, 0x22, 0x90, 0xA2, 0x0A, 0xEF,
+0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9D, 0x93, 0xE0, 0xFF, 0x90, 0xA2, 0x0A, 0xE0, 0xFE,
+0xEF, 0x4E, 0x90, 0x9D, 0x93, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06,
+0x89, 0x90, 0xA0, 0xEB, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xEC, 0xF0, 0x90,
+0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xED, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90,
+0xA0, 0xEE, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0,
+0xA3, 0xF0, 0x90, 0x9F, 0xF0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA0, 0xEC, 0xE0, 0xB4, 0x0C, 0x06,
+0xE5, 0x70, 0x70, 0x10, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7D, 0x07, 0x7F, 0x30,
+0x31, 0xC7, 0x8F, 0x51, 0x90, 0xA0, 0xEC, 0xE0, 0xB4, 0x0D, 0x0E, 0xE5, 0x51, 0x64, 0x01, 0x60,
+0x05, 0x75, 0x70, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x70, 0xE5, 0x51, 0xB4, 0x01, 0x05, 0x75, 0x52,
+0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, 0xA0, 0xEB, 0xE0, 0xFB, 0xAD, 0x52, 0xE4, 0xFF, 0xD1,
+0x4A, 0x7F, 0x04, 0xB1, 0x9C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x7C, 0x74, 0x0B, 0xF0,
+0x90, 0xA1, 0x8A, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x7E, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63,
+0xE0, 0x90, 0xA1, 0x7F, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA1, 0x80, 0xF0, 0x90, 0xFD, 0x64,
+0xE0, 0x90, 0xA1, 0x81, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA1, 0x82, 0xF0, 0x90, 0xFD, 0x66,
+0xE0, 0x90, 0xA1, 0x83, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA1, 0x84, 0xF0, 0x80, 0x11, 0x90,
+0xA1, 0x7F, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
+0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x7C, 0x81, 0x94, 0x12, 0x95, 0x78, 0x7F, 0x02, 0x41, 0x15, 0x90,
+0xA1, 0x25, 0x74, 0x08, 0xF0, 0x90, 0xA1, 0x33, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x27, 0xEF, 0xF0,
+0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x25, 0x81, 0x94, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54,
+0x03, 0x20, 0xE0, 0x1E, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x17, 0xE0, 0x90, 0xA1, 0x25, 0x30,
+0xE1, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x25, 0xE0, 0xFF, 0x12,
+0x89, 0x67, 0x22, 0x90, 0xA0, 0xF6, 0x74, 0x12, 0xF0, 0x90, 0xA1, 0x04, 0x74, 0x05, 0xF0, 0x90,
+0xA0, 0xF8, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA0, 0xF4, 0xE0, 0x90, 0xA0,
+0xFB, 0xF0, 0x90, 0xA0, 0xF5, 0xE0, 0x90, 0xA0, 0xFC, 0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xF6,
+0x91, 0x94, 0x7F, 0x04, 0xA1, 0x9C, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA0, 0xEB, 0x12,
+0x45, 0xB5, 0x12, 0x06, 0x89, 0x90, 0xA0, 0x13, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90,
+0xA0, 0x14, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0x15, 0xF0, 0x90, 0x9F, 0xF0,
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x31, 0xC3, 0xEF, 0xB4, 0x02, 0x04,
+0x7F, 0x40, 0xB1, 0x9C, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x9E,
+0x89, 0xE0, 0xFE, 0x90, 0x9E, 0x88, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E,
+0x00, 0xEE, 0x64, 0x01, 0x60, 0x2D, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF2, 0xF9, 0x74, 0x9D,
+0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x12, 0x97, 0x2C, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x9E, 0x88,
+0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90,
+0x9E, 0x88, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xA1, 0x1B, 0x7D, 0x01, 0x7F, 0x17,
+0x21, 0xC7, 0x90, 0x9F, 0xF0, 0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x31, 0xC7, 0x90,
+0xA0, 0xEB, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xF1, 0xE0,
+0x44, 0x01, 0xF0, 0x7D, 0x01, 0x7F, 0x28, 0x31, 0xC7, 0x90, 0xA0, 0xEB, 0xEF, 0xF0, 0xD0, 0xD0,
+0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05,
+0xC0, 0x07, 0x7D, 0xF3, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0xED, 0x04,
+0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0,
+0x83, 0xD0, 0xE0, 0x32, 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, 0x90, 0x01, 0xC4, 0x74, 0x24, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0x47, 0x7A, 0xE5, 0x14,
+0x30, 0xE7, 0x03, 0x12, 0x47, 0xDC, 0x74, 0x24, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3,
+0xF0, 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, 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, 0x90, 0x01, 0xC4, 0x74, 0x7C, 0xF0, 0x74,
+0x68, 0xA3, 0xF0, 0x12, 0x9A, 0x00, 0xE5, 0x19, 0x30, 0xE1, 0x03, 0x12, 0x67, 0xB8, 0xE5, 0x19,
+0x30, 0xE4, 0x03, 0x12, 0x66, 0xA8, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x59, 0x1A, 0xE5, 0x19,
+0x30, 0xE6, 0x03, 0x12, 0x9A, 0x2D, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x71, 0x88, 0xE5, 0x1B, 0x30,
+0xE1, 0x03, 0x12, 0x86, 0xD2, 0xE5, 0x1B, 0x30, 0xE2, 0x02, 0xD1, 0xF1, 0xE5, 0x1B, 0x30, 0xE3,
+0x03, 0x12, 0x9A, 0x3A, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x9A, 0x63, 0xE5, 0x1B, 0x30, 0xE5,
+0x02, 0x71, 0xA4, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x9A, 0x92, 0xE5, 0x1C, 0x30, 0xE1, 0x02,
+0x71, 0xC2, 0xE5, 0x1C, 0x30, 0xE4, 0x02, 0x51, 0x2D, 0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31, 0x36,
+0x74, 0x7C, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 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, 0xE4, 0xF5, 0x63, 0x74, 0x8D, 0x25, 0x63, 0xF5, 0x82, 0xE4,
+0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x41, 0x21, 0xE5, 0x63, 0x13, 0x13, 0x13, 0x54, 0x1F,
+0xFF, 0xE5, 0x63, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83,
+0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE,
+0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0x21, 0x75, 0xF0, 0x10, 0xE5, 0x63,
+0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5,
+0x63, 0x90, 0x81, 0x02, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0,
+0x44, 0x20, 0xF0, 0x80, 0x7C, 0xEF, 0x30, 0xE6, 0x21, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81,
+0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x05, 0x12, 0x45,
+0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0xE4, 0xFB, 0x80, 0x52, 0x74, 0x92, 0x25, 0x63, 0xF5, 0x82,
+0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x92, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34,
+0x9C, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x14, 0xAF, 0x63, 0x12, 0x9F, 0x24, 0x74, 0x92,
+0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x24, 0x75, 0xF0, 0x10,
+0xE5, 0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90,
+0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0x7B, 0x01, 0xAF, 0x63, 0x12, 0x7D,
+0x73, 0x05, 0x63, 0xE5, 0x63, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0x39, 0x22, 0xE4, 0xFF, 0x90,
+0xA0, 0x58, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA0, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x50,
+0x48, 0x74, 0x5A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10,
+0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA0, 0x59, 0x30, 0xE7, 0x0E, 0xE0, 0x24,
+0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x15, 0xE0, 0xFF, 0x12, 0xAD,
+0x81, 0x90, 0xA0, 0x59, 0xE0, 0x24, 0x5A, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0x74, 0x01,
+0xF0, 0x90, 0xA0, 0x59, 0xE0, 0x04, 0xF0, 0x80, 0xAE, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50,
+0xE4, 0x90, 0xA0, 0x59, 0xF0, 0x90, 0xA0, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x61,
+0x87, 0x74, 0x5A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x61, 0x7F,
+0x90, 0xA0, 0x59, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x06, 0x12, 0x45, 0xA9, 0xE0, 0xFD,
+0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x07, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA0,
+0x59, 0xE0, 0xFC, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0,
+0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75,
+0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA0, 0x59,
+0xE0, 0x75, 0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F,
+0x01, 0x90, 0xA0, 0x59, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE5,
+0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x90,
+0x8D, 0x01, 0x12, 0x45, 0xA9, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xED,
+0xF0, 0x0F, 0xEF, 0xB4, 0x05, 0xCB, 0x90, 0xA0, 0x59, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81,
+0x09, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83,
+0xEE, 0xF0, 0x90, 0xA0, 0x59, 0xE0, 0xFF, 0x90, 0xA0, 0x58, 0xE0, 0xFD, 0x12, 0xA8, 0xDA, 0x90,
+0xA0, 0x59, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90,
+0xA0, 0x59, 0xE0, 0x04, 0xF0, 0x41, 0x95, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x10, 0xA3,
+0x74, 0x01, 0xF0, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x71, 0xEE, 0x91,
+0x13, 0x02, 0x5F, 0xD4, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x16, 0x90, 0x9F, 0x17, 0xE0, 0x60,
+0x10, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x03, 0x02, 0x77, 0x62, 0x12, 0x4F,
+0x9B, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x07, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x12, 0x90,
+0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x08, 0x71, 0xE2, 0xBF, 0x01, 0x06, 0x02, 0x77, 0x24, 0x12, 0x57,
+0xA3, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0x0D, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0B,
+0x71, 0xE2, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0xB2, 0xCB, 0xD0, 0xD0,
+0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x02, 0x81, 0xDA, 0x90, 0x9E,
+0x8D, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0xDA, 0x90, 0x9F, 0x13, 0xE0, 0x30, 0xE0, 0x1D, 0x90,
+0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE,
+0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x9F, 0x4C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x9F, 0x15, 0xE0,
+0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x9F, 0x1E,
+0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x9F, 0x20, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08,
+0x90, 0x9F, 0x1D, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0x9F, 0x0E, 0xE0, 0x30,
+0xE0, 0x11, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x71, 0xE2, 0xEF, 0x70,
+0x02, 0xF5, 0x63, 0xE5, 0x63, 0x60, 0x43, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x9F,
+0x20, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x0B, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0x9F, 0x20, 0xE0,
+0x80, 0x0F, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0x9F, 0x20, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24,
+0xFE, 0xFF, 0x90, 0x9F, 0x1F, 0xE0, 0x2F, 0x90, 0xA1, 0xAF, 0x12, 0x48, 0x1F, 0x90, 0x9F, 0x1A,
+0xE0, 0x20, 0xE2, 0x03, 0x12, 0x52, 0x3C, 0x12, 0x7F, 0xC5, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
+0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x05, 0x27, 0xE0, 0xF5, 0x54, 0x12, 0x06,
+0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0x0E, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54,
+0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF,
+0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0x0E, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E,
+0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x9F,
+0x0E, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE,
+0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0x9F, 0x0E, 0xF0, 0xEE, 0xC3, 0x13, 0x20, 0xE0,
+0x02, 0xA1, 0xFF, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0xE6, 0x75, 0x54, 0x21, 0x13, 0x13, 0x54, 0x3F,
+0x30, 0xE0, 0x11, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x56, 0xCE, 0x43,
+0x54, 0x08, 0x80, 0x0C, 0xE4, 0x90, 0x9F, 0x0F, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0xD1, 0xD9,
+0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x12,
+0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x14, 0x90, 0x9F, 0x0E, 0xE0, 0xC4, 0x13,
+0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x80, 0x90, 0x9F, 0x0E, 0xE0, 0xC4, 0x13, 0x13, 0x54,
+0x03, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0x9F, 0x11,
+0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0xB2, 0xCB, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0xC4, 0x13, 0x13,
+0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x21, 0x71, 0xE2, 0xEF, 0x60, 0x04, 0x7F, 0x01,
+0x80, 0x18, 0x7F, 0x02, 0x80, 0x14, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90,
+0x9F, 0x11, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xC1, 0xCA, 0xFF, 0x12, 0xB2, 0xCB, 0xC1, 0xCA, 0x90,
+0x9F, 0x0E, 0xE0, 0xFF, 0x20, 0xE0, 0x02, 0xC1, 0x96, 0x43, 0x54, 0x31, 0x13, 0x13, 0x54, 0x3F,
+0x30, 0xE0, 0x11, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x56, 0xCE, 0x43,
+0x54, 0x08, 0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0xD1, 0xD9, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x13,
+0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0,
+0x03, 0x43, 0x54, 0x04, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0xC4,
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x90, 0x9F, 0x12, 0xE0, 0x64, 0x02, 0x60, 0x6B, 0xE4,
+0xFD, 0x7F, 0x02, 0x80, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x9F, 0x12, 0xE0,
+0xB4, 0x02, 0x19, 0x12, 0xB6, 0x69, 0x71, 0xE2, 0xBF, 0x01, 0x09, 0x90, 0x9F, 0x19, 0xE0, 0xFF,
+0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0x40, 0x80, 0x3E, 0x90, 0x9F, 0x1A, 0xE0,
+0x90, 0x9F, 0x12, 0xF0, 0x80, 0x34, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90,
+0x9F, 0x12, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x9F, 0x12, 0xE0,
+0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x52, 0x40, 0x12, 0x57, 0xE8, 0x90, 0x9F, 0x19,
+0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x52, 0x40, 0x12, 0xB2, 0x90, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D,
+0x02, 0x7F, 0x02, 0xD1, 0xD9, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED,
+0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0,
+0x22, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0x9F, 0x12, 0xE0, 0x64, 0x02, 0x60,
+0x36, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0x9F, 0x1A, 0xE0, 0x64,
+0x02, 0x60, 0x24, 0x12, 0x75, 0xD7, 0x90, 0x9F, 0x14, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30,
+0xE0, 0x15, 0x90, 0x9F, 0x1D, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0B, 0x12, 0x57, 0x7F, 0xD1,
+0xCF, 0x90, 0x9F, 0x1E, 0xE0, 0x14, 0xF0, 0x22, 0xEF, 0x70, 0x4F, 0x7D, 0x78, 0x7F, 0x02, 0xD1,
+0xD9, 0x7D, 0x02, 0x7F, 0x03, 0xD1, 0xD9, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x77, 0x0C, 0x90, 0x01,
+0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x9E, 0x8D, 0xE0, 0x70, 0x15, 0x12,
+0x5D, 0x10, 0x12, 0x57, 0xD5, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54,
+0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x52, 0x40, 0x90, 0x9F, 0x13, 0xE0, 0x54,
+0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0,
+0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x12, 0x56, 0xCE, 0x7D, 0x02, 0x7F, 0x03, 0x12, 0x56,
+0xCE, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x9F, 0x22, 0xA3, 0xE0, 0x90, 0x05, 0x58,
+0xF0, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xFB, 0xF0, 0x90,
+0x9F, 0x1A, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02, 0x52, 0x40, 0x90, 0x9F, 0x14,
+0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xBD, 0xE0, 0x30, 0xE0, 0x11, 0x90, 0x01, 0x3B, 0xE0,
+0x30, 0xE4, 0x0A, 0xD1, 0xCF, 0x90, 0x9F, 0xBF, 0xE0, 0x90, 0x05, 0x73, 0xF0, 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, 0x90, 0x01, 0xC4, 0x74, 0xEE,
+0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0xF1, 0x8D, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x11, 0xB6, 0xE5, 0x21,
+0x30, 0xE2, 0x02, 0x11, 0xDA, 0xE5, 0x21, 0x30, 0xE5, 0x02, 0x11, 0xA4, 0xE5, 0x22, 0x30, 0xE0,
+0x02, 0x51, 0xC1, 0xE5, 0x23, 0x30, 0xE1, 0x02, 0x71, 0xBD, 0xE5, 0x23, 0x30, 0xE0, 0x02, 0x71,
+0x4F, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0x07, 0xE5, 0x23, 0x30, 0xE2, 0x09, 0x11, 0xF5, 0x90,
+0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04, 0x12, 0x62, 0x15,
+0xE5, 0x24, 0x30, 0xE4, 0x02, 0x11, 0xC2, 0xE5, 0x24, 0x30, 0xE5, 0x03, 0x12, 0x9A, 0xAE, 0xE5,
+0x24, 0x30, 0xE6, 0x02, 0x91, 0x6A, 0xE5, 0x24, 0x30, 0xE7, 0x03, 0x12, 0x5F, 0x68, 0x74, 0xEE,
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 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, 0x90, 0xA0, 0x29, 0xE0, 0x30, 0xE0, 0x0A, 0xF1, 0x08, 0xE4, 0x90, 0xA0,
+0x2B, 0xF0, 0x12, 0x47, 0xF8, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x03, 0x12, 0xB6, 0x84, 0x02,
+0x48, 0x59, 0x91, 0x06, 0x90, 0x9F, 0x1D, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F,
+0x02, 0x12, 0x56, 0xCE, 0x12, 0x5F, 0xD4, 0x02, 0x57, 0x3E, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x14,
+0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0xB5, 0x5E, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xF7,
+0xF0, 0x12, 0x52, 0x28, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x16, 0xE0,
+0x30, 0xE0, 0x1F, 0x90, 0xA0, 0x1B, 0xE0, 0xB4, 0x01, 0x0C, 0xA3, 0xE0, 0xB4, 0x01, 0x13, 0x74,
+0x02, 0xF0, 0x31, 0x27, 0x80, 0x0C, 0x90, 0xA0, 0x1B, 0xE0, 0xB4, 0x02, 0x05, 0x74, 0x03, 0xF0,
+0x31, 0x4E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD,
+0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, 0xFB, 0xFD,
+0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x1D, 0xE0, 0xB4, 0x01, 0x02, 0x80, 0x48, 0x90, 0xA0,
+0x1D, 0xE0, 0xB4, 0x02, 0x10, 0x31, 0x27, 0x7F, 0x01, 0x31, 0xC5, 0x51, 0x1C, 0x90, 0xA0, 0x1D,
+0x74, 0x03, 0xF0, 0x80, 0x4B, 0x90, 0xA0, 0x1D, 0xE0, 0x64, 0x03, 0x70, 0x22, 0x90, 0xA0, 0x20,
+0x31, 0x2A, 0xE4, 0xFF, 0x31, 0xC5, 0x51, 0x1C, 0x90, 0xA0, 0x16, 0xE0, 0xC3, 0x13, 0x54, 0x03,
+0xFF, 0xE4, 0xFB, 0xFD, 0x12, 0x4C, 0xA9, 0x90, 0xA0, 0x1D, 0x74, 0x04, 0xF0, 0x80, 0x21, 0x90,
+0xA0, 0x1D, 0xE0, 0xB4, 0x04, 0x1A, 0x90, 0xA0, 0x16, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0x7B,
+0x01, 0x7D, 0x01, 0x12, 0x4C, 0xA9, 0x90, 0xA0, 0x1D, 0x74, 0x02, 0xF0, 0x90, 0xA0, 0x1B, 0xF0,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x13,
+0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4,
+0xF0, 0x80, 0x34, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06,
+0xCC, 0x70, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x03, 0xF0, 0x90, 0xA0, 0x16, 0xE0, 0x30, 0xE0, 0x17,
+0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0B, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80,
+0x03, 0x90, 0x06, 0xCC, 0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAD, 0x07, 0xED, 0x70,
+0x23, 0x90, 0xA0, 0x17, 0xE0, 0x54, 0x03, 0xFC, 0x70, 0x02, 0x80, 0x22, 0xBC, 0x01, 0x02, 0x80,
+0x24, 0x90, 0xA0, 0x17, 0xE0, 0x54, 0x03, 0xFC, 0xBC, 0x02, 0x02, 0x80, 0x27, 0xEC, 0x64, 0x03,
+0x70, 0x2E, 0x80, 0x27, 0x90, 0xA0, 0x17, 0xE0, 0xC4, 0x54, 0x03, 0xFC, 0x70, 0x04, 0x7F, 0x01,
+0x80, 0x1B, 0xBC, 0x01, 0x04, 0x7F, 0x03, 0x80, 0x14, 0x90, 0xA0, 0x17, 0xE0, 0xC4, 0x54, 0x03,
+0xFC, 0xBC, 0x02, 0x04, 0x7F, 0x09, 0x80, 0x05, 0xBC, 0x03, 0x05, 0x7F, 0x0D, 0x12, 0x5A, 0xD8,
+0x90, 0xA0, 0x16, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x45, 0xED, 0x70, 0x1F, 0xA3, 0xE0,
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x80, 0x06, 0x90, 0xA1,
+0x15, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x20, 0x90, 0xA0, 0x17,
+0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x80, 0x06,
+0x90, 0xA1, 0x15, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xFD, 0x7F, 0x01, 0x12, 0x87, 0xBD,
+0x22, 0x12, 0x9B, 0x18, 0x90, 0xA1, 0x15, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80,
+0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x54, 0x47, 0x90, 0xA1, 0x15, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01,
+0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90,
+0x9F, 0x28, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x9F, 0x2D, 0xE0, 0xFB, 0xAC, 0x07, 0x90, 0x9F,
+0x13, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0x9F, 0x29, 0xE0, 0xD3, 0x94, 0x03, 0x50, 0x07, 0x90, 0x9F,
+0x1F, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, 0x90, 0x9F, 0x1F, 0xF0, 0x7D, 0x03, 0x90,
+0x9F, 0x4E, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C, 0xFF, 0x90, 0x9F, 0x2C, 0xF0, 0x90, 0x9F, 0x22,
+0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0x9F, 0x22, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0,
+0x90, 0x9F, 0x1F, 0xEB, 0xF0, 0x90, 0x9F, 0x22, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x90,
+0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x3E, 0x90, 0x9F, 0x12, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02,
+0x7E, 0x01, 0x90, 0x9F, 0x11, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70,
+0x24, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x6B, 0xEE, 0x71, 0x96, 0x90, 0x9F, 0x12, 0xE0,
+0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0x9F, 0x12, 0xE0, 0x70, 0x06, 0xFD,
+0x7F, 0x04, 0x12, 0x52, 0x40, 0x22, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03,
+0x30, 0xE0, 0x0F, 0x90, 0x9F, 0x12, 0xE0, 0x64, 0x02, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12,
+0x52, 0x40, 0x90, 0x9F, 0x12, 0xE0, 0x64, 0x02, 0x60, 0x02, 0xF1, 0x24, 0x22, 0x90, 0x9F, 0x0E,
+0xE0, 0xFF, 0x30, 0xE0, 0x40, 0x90, 0x9F, 0x12, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01,
+0x90, 0x9F, 0x11, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x26, 0xEF,
+0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x6B, 0xEE, 0x12, 0xB4, 0x75, 0x90, 0x9F, 0x12, 0xE0, 0xB4,
+0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x04, 0x06, 0xE4,
+0xFD, 0xFF, 0x12, 0x52, 0x40, 0x22, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x90, 0x9F, 0x17, 0xE0, 0x60,
+0x58, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x50, 0x90, 0xA1, 0x15, 0x04, 0xF0, 0xE4, 0x90,
+0x9F, 0x1E, 0xF0, 0x90, 0x9F, 0x0E, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x9F, 0x12, 0xE0, 0xB4, 0x02,
+0x05, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x12, 0x6B, 0xE2, 0xEF, 0x70, 0x04, 0x90, 0xA1, 0x15, 0xF0,
+0x90, 0xA1, 0x15, 0xE0, 0x60, 0x23, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0x90, 0xA1,
+0xAE, 0xF0, 0x90, 0x9F, 0x1F, 0xE0, 0x90, 0xA1, 0xAF, 0x12, 0x48, 0x1F, 0x90, 0x9F, 0x1A, 0xE0,
+0x20, 0xE2, 0x03, 0x12, 0x52, 0x3C, 0x12, 0x7F, 0xC5, 0x22, 0x90, 0x9F, 0x13, 0xE0, 0xFF, 0xC4,
+0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x21, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0,
+0x90, 0x9F, 0x14, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0,
+0x90, 0x9F, 0x17, 0xE0, 0x60, 0x03, 0x12, 0x52, 0x28, 0x90, 0x9F, 0xCE, 0xE0, 0xFF, 0xC4, 0x13,
+0x13, 0x54, 0x03, 0x30, 0xE0, 0x22, 0x90, 0x9F, 0xD1, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18,
+0xEF, 0x54, 0xFD, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x9F, 0xD1, 0x30, 0xE1, 0x06, 0xE0, 0x44,
+0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x03, 0x12,
+0xB1, 0x9C, 0x22, 0xE4, 0x90, 0xA1, 0x05, 0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE,
+0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF,
+0x90, 0x9F, 0x4A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x9F,
+0x4A, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x28, 0xEB, 0x9F, 0xFF, 0x90,
+0x9F, 0x2C, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFD, 0xC3, 0x94, 0x19, 0x50, 0x13, 0x74,
+0x2F, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0x2A, 0xE0,
+0x04, 0xF0, 0xB1, 0xA5, 0x90, 0x9F, 0x2A, 0xE0, 0xC3, 0x94, 0x64, 0x40, 0x67, 0xE4, 0x90, 0xA1,
+0x06, 0xF0, 0x90, 0xA1, 0x05, 0xF0, 0x90, 0xA1, 0x05, 0xE0, 0xFF, 0xC3, 0x94, 0x19, 0x50, 0x47,
+0x74, 0x2F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA1, 0x06, 0xE0,
+0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x27, 0x90, 0xA1, 0x05, 0xE0, 0xFF, 0x94, 0x0A, 0x40,
+0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x9F, 0x29, 0xF0, 0xE4, 0x80, 0x0E, 0xE4, 0x90, 0x9F, 0x29, 0xF0,
+0x90, 0xA1, 0x05, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90, 0x9F, 0x28, 0xF0, 0x80, 0x08, 0x90,
+0xA1, 0x05, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x9F, 0x29, 0xE0, 0xFD, 0x7B, 0x08, 0xE4, 0xFF,
+0x51, 0xFC, 0xF1, 0x41, 0x22, 0x90, 0x9F, 0xB6, 0xE0, 0xFF, 0x90, 0x9F, 0x20, 0xE0, 0xD3, 0x9F,
+0x40, 0x24, 0x90, 0x9F, 0x2E, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, 0x9F,
+0x28, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x9F, 0x2D, 0xF0, 0xFB, 0x90, 0x9F, 0x28, 0xE0,
+0xFF, 0xA3, 0xE0, 0xFD, 0x51, 0xFC, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1,
+0x86, 0x90, 0x9F, 0x17, 0xE0, 0x70, 0x02, 0xC1, 0x86, 0x90, 0x9F, 0x15, 0xE0, 0xFF, 0xC4, 0x54,
+0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x9F, 0x1E, 0xF0, 0x90, 0x06, 0xAA,
+0xE0, 0x04, 0x90, 0x9F, 0x1D, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x9F, 0x1D, 0xE0, 0xFE,
+0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0x9F, 0x1E, 0xEF, 0xF0, 0x90, 0x9F, 0x13, 0xE0, 0x30,
+0xE0, 0x02, 0x91, 0xD3, 0x90, 0x9F, 0x14, 0xE0, 0x44, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0x20, 0xF0,
+0x90, 0x9F, 0x22, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01,
+0x3C, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x90, 0x9F,
+0x15, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0E, 0x90, 0x9F, 0x0E, 0xE0,
+0x30, 0xE0, 0x05, 0x12, 0xB4, 0xC4, 0x80, 0x02, 0xD1, 0x97, 0x90, 0x9F, 0x14, 0xE0, 0x13, 0x13,
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x10, 0x90, 0x9F, 0x1D, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x06,
+0x12, 0x57, 0x7F, 0x12, 0x6E, 0xD5, 0x90, 0x9F, 0x0E, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x07, 0x90,
+0x9F, 0x14, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x63,
+0x54, 0xC0, 0x70, 0x0D, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x52,
+0x28, 0xE5, 0x63, 0x30, 0xE6, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x64, 0x01, 0x70, 0x21, 0x90, 0x9F,
+0x1B, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xF1,
+0x62, 0x80, 0x0C, 0x12, 0x4F, 0x9B, 0x80, 0x07, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFE, 0xF0, 0xE5,
+0x63, 0x90, 0x9F, 0x1B, 0x30, 0xE7, 0x1B, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xAE, 0xF0,
+0x90, 0x9F, 0xB7, 0xE0, 0x90, 0xA1, 0xAF, 0x12, 0x48, 0x1F, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x04,
+0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x22, 0x7D, 0x20, 0xE4, 0xFF, 0x74, 0x1D, 0x2F, 0xF8,
+0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5,
+0x83, 0xEE, 0xF0, 0x22, 0x90, 0x9F, 0x17, 0xE0, 0x64, 0x02, 0x60, 0x14, 0x90, 0x9F, 0x15, 0xE0,
+0x54, 0x0F, 0x60, 0x0C, 0x12, 0x57, 0xF0, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, 0x52, 0x40,
+0x22, 0xE4, 0xFF, 0x74, 0x2F, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE4, 0xF0, 0x0F,
+0xEF, 0xB4, 0x19, 0xEF, 0xE4, 0x90, 0x9F, 0x2A, 0xF0, 0x90, 0x9F, 0x2E, 0xF0, 0x90, 0x9F, 0x28,
+0xF0, 0x22, 0x90, 0x9F, 0xBB, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x20, 0x90, 0x04, 0x1D, 0xE0,
+0x70, 0x1A, 0x90, 0x9D, 0x9A, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x4A, 0xB0, 0x90, 0xA2,
+0x07, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x3C,
+0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5,
+0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22,
+0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 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, 0x90, 0x01, 0xC4, 0x74, 0xBD, 0xF0,
+0x74, 0x77, 0xA3, 0xF0, 0x12, 0x62, 0x24, 0x53, 0x91, 0xBF, 0x74, 0xBD, 0x04, 0x90, 0x01, 0xC4,
+0xF0, 0x74, 0x77, 0xA3, 0xF0, 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,
+0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D,
+0x10, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x78, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4,
+0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0,
+0x32, 0x90, 0xA0, 0xEB, 0x74, 0x0A, 0xF0, 0x90, 0xA0, 0xF9, 0x74, 0x06, 0xF0, 0x12, 0x06, 0x89,
+0x90, 0xA0, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xEE, 0xF0, 0x90, 0x00,
+0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xEF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA0,
+0xF0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0xF1, 0xF0, 0x90, 0x00, 0x05, 0x12,
+0x06, 0xA2, 0x90, 0xA0, 0xF2, 0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x02, 0x64, 0x94, 0x12,
+0x06, 0x89, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xF5, 0x54, 0x90, 0x00, 0x02, 0x12,
+0x06, 0xA2, 0xF5, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x90, 0x00, 0x04, 0x12,
+0x06, 0xA2, 0xF5, 0x57, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xF5, 0x58, 0x90, 0x00, 0x06, 0x12,
+0x06, 0xA2, 0xF5, 0x59, 0xE5, 0x51, 0x12, 0x45, 0xC7, 0x78, 0xE2, 0x00, 0x78, 0xEA, 0x01, 0x78,
+0xF2, 0x02, 0x78, 0xFA, 0x03, 0x79, 0x02, 0x04, 0x79, 0x0A, 0x05, 0x79, 0x12, 0x06, 0x00, 0x00,
+0x79, 0x29, 0x75, 0x52, 0x02, 0x75, 0x53, 0x29, 0x80, 0x45, 0x75, 0x52, 0x06, 0x75, 0x53, 0x2A,
+0x80, 0x3D, 0x75, 0x52, 0x01, 0x75, 0x53, 0x31, 0x80, 0x35, 0x75, 0x52, 0x01, 0x75, 0x53, 0x32,
+0x80, 0x2D, 0x75, 0x52, 0x06, 0x75, 0x53, 0x33, 0x80, 0x25, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54,
+0x01, 0x41, 0x90, 0xA0, 0x0B, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xA3, 0xE5, 0x56, 0xF0,
+0xA3, 0xE5, 0x57, 0xF0, 0xA3, 0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, 0x7B,
+0x00, 0x7A, 0x00, 0x79, 0x54, 0xAD, 0x52, 0xAF, 0x53, 0x02, 0x61, 0xC7, 0x90, 0xA0, 0xE8, 0x12,
+0x45, 0xBE, 0x90, 0xA0, 0xE7, 0xEF, 0xF0, 0x12, 0x45, 0xC7, 0x79, 0xAB, 0x00, 0x79, 0xB4, 0x01,
+0x79, 0xBC, 0x02, 0x79, 0xC4, 0x10, 0x79, 0xCC, 0x11, 0x79, 0xD5, 0x12, 0x79, 0xDD, 0x14, 0x79,
+0xE5, 0x20, 0x79, 0xEE, 0x21, 0x79, 0xF7, 0x23, 0x79, 0xFF, 0x24, 0x7A, 0x08, 0x25, 0x7A, 0x11,
+0x27, 0x7A, 0x1A, 0x28, 0x7A, 0x23, 0x40, 0x7A, 0x2C, 0x42, 0x7A, 0x34, 0x60, 0x7A, 0x3D, 0x61,
+0x7A, 0x46, 0x62, 0x7A, 0x4F, 0x63, 0x7A, 0x58, 0x64, 0x7A, 0x61, 0x65, 0x7A, 0x69, 0x66, 0x7A,
+0x72, 0x67, 0x7A, 0x7B, 0x68, 0x7A, 0x84, 0x69, 0x7A, 0x8C, 0x6B, 0x7A, 0x95, 0x6C, 0x7A, 0x9E,
+0x6D, 0x7A, 0xA7, 0x6E, 0x7A, 0xB0, 0x6F, 0x00, 0x00, 0x7A, 0xB8, 0x90, 0xA0, 0xE8, 0x12, 0x45,
+0xB5, 0x02, 0x8E, 0x45, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x61, 0x8A, 0x90, 0xA0, 0xE8, 0x12,
+0x45, 0xB5, 0x41, 0xDC, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x9D, 0x90, 0xA0, 0xE8, 0x12,
+0x45, 0xB5, 0x02, 0x8E, 0x9D, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x41, 0xC8, 0x90, 0xA0, 0xE8,
+0x12, 0x45, 0xB5, 0xE1, 0x34, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x8F, 0xD6, 0x90, 0xA0,
+0xE8, 0x12, 0x45, 0xB5, 0x02, 0x91, 0xD0, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x2C, 0x90,
+0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x6C, 0xDB, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x92,
+0x16, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x92, 0x55, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5,
+0x02, 0x92, 0x94, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0xAC, 0x17, 0x90, 0xA0, 0xE8, 0x12,
+0x45, 0xB5, 0x81, 0x0C, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x83, 0x03, 0x90, 0xA0, 0xE8,
+0x12, 0x45, 0xB5, 0x02, 0x64, 0xFE, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x67, 0xBC, 0x90,
+0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x67, 0xC2, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x93,
+0x35, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x65, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02,
+0x67, 0x26, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x65, 0xB7, 0x90, 0xA0, 0xE8, 0x12, 0x45,
+0xB5, 0x02, 0x67, 0xD5, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x01, 0x8F, 0x90, 0xA0, 0xE8, 0x12,
+0x45, 0xB5, 0x02, 0x93, 0x97, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x94, 0xBB, 0x90, 0xA0,
+0xE8, 0x12, 0x45, 0xB5, 0x02, 0x94, 0xE5, 0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x95, 0x47,
+0x90, 0xA0, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x77, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90,
+0xA0, 0xE7, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x9E, 0x8C, 0xF0,
+0xBF, 0x01, 0x08, 0x12, 0x98, 0x73, 0xE4, 0x90, 0x9E, 0x8C, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x9F, 0x0D,
+0xF0, 0xBF, 0x01, 0x0C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x23, 0x80, 0x1E,
+0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x11,
+0x90, 0x9F, 0x0E, 0xE0, 0x20, 0xE0, 0x07, 0xE4, 0xFF, 0x12, 0xB2, 0xCB, 0x80, 0x03, 0x12, 0x6B,
+0xEE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9D, 0xF1,
+0xE0, 0xFF, 0x90, 0x9D, 0xF0, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF,
+0x70, 0x43, 0x90, 0x9D, 0xF0, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9D, 0xA0, 0x12, 0x45, 0xA9,
+0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA1, 0xF9, 0x74, 0x9D, 0x35, 0xF0, 0xFA, 0x7B,
+0x01, 0xAF, 0x05, 0x31, 0x3C, 0x90, 0x9D, 0xF0, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A,
+0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9D, 0xF0, 0xF0, 0x12, 0x95, 0x78, 0x90, 0x9D,
+0x93, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53,
+0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30,
+0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55,
+0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06,
+0x89, 0x54, 0x01, 0xFF, 0x74, 0x8D, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xEF,
+0xF0, 0x74, 0x8D, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xAF, 0x54, 0x70,
+0x04, 0xF1, 0x54, 0x80, 0x02, 0xF1, 0x43, 0x05, 0x54, 0x80, 0xC6, 0x12, 0x77, 0x41, 0xE5, 0x55,
+0x70, 0x19, 0x90, 0x9E, 0x8D, 0xE0, 0x70, 0x13, 0x12, 0x5D, 0x10, 0x12, 0x57, 0xD5, 0x90, 0x9F,
+0x13, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x90, 0xA0, 0xEB, 0x12,
+0x45, 0xBE, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x12, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83,
+0xE0, 0x54, 0x9C, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0,
+0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06,
+0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5,
+0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA0, 0xEB, 0x12,
+0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0,
+0x83, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0,
+0x82, 0xE0, 0xFF, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54,
+0x40, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4,
+0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5,
+0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x20, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0,
+0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x16, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x92,
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0F, 0xE5, 0x51, 0xB4,
+0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x91, 0xF0, 0x74, 0x12, 0x25, 0x51,
+0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE5, 0x22, 0x75, 0xF0, 0x04, 0xE5, 0x51,
+0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x74, 0x92, 0x25, 0x51,
+0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x51, 0xB1, 0x1E, 0x22, 0x8F, 0x52,
+0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE0, 0xFF,
+0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x2F, 0xFF, 0xE4,
+0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA0, 0xEE, 0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40,
+0x02, 0x80, 0x19, 0xE5, 0x53, 0xD3, 0x94, 0x19, 0x40, 0x05, 0x90, 0xA0, 0xEE, 0x80, 0x0B, 0x75,
+0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4,
+0xFB, 0xAF, 0x52, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69,
+0xE4, 0x90, 0xA1, 0xA7, 0xF0, 0xE5, 0x67, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0xA1, 0xA2, 0xF0,
+0xE5, 0x67, 0x54, 0x07, 0x90, 0xA1, 0xA4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x01, 0x12,
+0x45, 0xA9, 0xE0, 0x90, 0xA1, 0xA5, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x12, 0x12, 0x45,
+0xA9, 0xE0, 0x54, 0x7F, 0x90, 0xA1, 0xA8, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x67, 0x90, 0x96, 0x13,
+0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA1, 0xA9, 0xF0, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA1, 0xA3, 0xF0,
+0xE5, 0x69, 0x70, 0x42, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5,
+0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC, 0xFD, 0xEB, 0x25, 0xE0, 0x25, 0xE0,
+0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x99, 0x12, 0x45, 0x39, 0x78,
+0x01, 0x12, 0x08, 0x47, 0xE5, 0x67, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5,
+0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xA8, 0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0, 0xFE,
+0xD3, 0x9F, 0x40, 0x0B, 0xE5, 0x68, 0x54, 0x80, 0xFD, 0xEF, 0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90,
+0xA1, 0xA9, 0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F, 0x68, 0xE5, 0x68, 0x54, 0x7F, 0x90,
+0xA1, 0xA3, 0xF0, 0xE5, 0x68, 0x54, 0x80, 0x90, 0xA1, 0xA6, 0xF0, 0xE5, 0x69, 0x70, 0x33, 0x90,
+0xA1, 0xA2, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82,
+0xE0, 0xFF, 0x90, 0xA1, 0xA4, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33,
+0xD8, 0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0xA1, 0xA5, 0xE0, 0x54, 0x7F, 0xF0,
+0x80, 0x52, 0x90, 0xA1, 0xA2, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0,
+0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA1, 0xA4, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80,
+0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67,
+0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0xA1, 0xA5, 0xF0, 0x90, 0xA1,
+0xA3, 0xE0, 0x90, 0x41, 0xF7, 0x93, 0xFE, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x4F, 0x90, 0xA1, 0xA5,
+0xF0, 0x44, 0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE5,
+0x68, 0xF0, 0xE5, 0x67, 0x70, 0x06, 0x90, 0x01, 0xC8, 0xE5, 0x68, 0xF0, 0x90, 0xA1, 0xA5, 0xE0,
+0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x75, 0xF0,
+0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x54,
+0x03, 0x4F, 0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xEF, 0xF0,
+0x7D, 0x01, 0xAF, 0x67, 0x12, 0xA8, 0xDA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0x90,
+0x9F, 0x21, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0x57, 0xE0, 0x54, 0xFE,
+0x4F, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0,
+0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9,
+0xE0, 0x44, 0x04, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA0, 0x09, 0xF0, 0x90, 0x00, 0x01, 0x12,
+0x06, 0xA2, 0x90, 0xA0, 0x0A, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0x33, 0x33, 0x33, 0x54,
+0xF8, 0xFF, 0x90, 0x9F, 0xEF, 0xE0, 0x54, 0xF7, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F,
+0x90, 0x07, 0x65, 0x30, 0xE0, 0x04, 0x74, 0x18, 0xF0, 0x22, 0xE4, 0xF0, 0x22, 0x90, 0x04, 0x24,
+0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0xA0, 0x38, 0xF0, 0x90, 0x00, 0x01, 0x12,
+0x06, 0xA2, 0x25, 0x51, 0x90, 0xA0, 0x46, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51,
+0x90, 0xA0, 0x54, 0xF0, 0x22, 0x90, 0x9F, 0xBB, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2B, 0xEF,
+0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x22, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30,
+0xE0, 0x04, 0x7F, 0x03, 0x80, 0x11, 0x90, 0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0,
+0x04, 0x7F, 0x0D, 0x80, 0x02, 0x7F, 0x09, 0x12, 0x5A, 0xD8, 0x22, 0x90, 0x9F, 0xCE, 0xE0, 0xC4,
+0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0x41, 0x76, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x01, 0x70,
+0x38, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x20, 0x90, 0x06,
+0x92, 0x74, 0x04, 0xF0, 0x90, 0x9F, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xD6, 0xE0, 0x75, 0xF0,
+0x03, 0x84, 0xFF, 0x90, 0x9F, 0xDF, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x41, 0x5B, 0xE4, 0x90,
+0x9F, 0xD2, 0xF0, 0x90, 0x9F, 0xDD, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x04, 0x70,
+0x35, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06,
+0x92, 0x74, 0x04, 0xF0, 0x90, 0x9F, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0xD5, 0xE0, 0xFF, 0x90,
+0x9F, 0xDF, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x41, 0x5B, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x90,
+0x9F, 0xDD, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x06, 0x60, 0x02, 0x21, 0xB9,
+0x90, 0x9F, 0xE0, 0xE0, 0xFF, 0x90, 0x9F, 0xDF, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00,
+0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0x9F, 0xD6, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF,
+0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x90, 0x9F, 0xE0, 0xE0, 0x94, 0x03, 0x40,
+0x1F, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0x9F, 0xDD, 0x30, 0xE0, 0x05, 0x74, 0x05,
+0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x90, 0x9F, 0xE0, 0xF0, 0x22,
+0x90, 0x9F, 0xD1, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x74, 0xEF, 0x54, 0xFB, 0xF0,
+0xE4, 0xA3, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0B, 0x90, 0x9F, 0xEF,
+0xE0, 0x20, 0xE0, 0x02, 0x41, 0x01, 0x21, 0xEA, 0x90, 0x9F, 0xE0, 0xE0, 0xFF, 0x90, 0x9F, 0xDF,
+0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0x9F, 0xD6,
+0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40,
+0x0B, 0x90, 0x9F, 0xEF, 0xE0, 0x30, 0xE0, 0x02, 0x21, 0xEA, 0x41, 0x01, 0x90, 0x9F, 0xEF, 0xE0,
+0x30, 0xE0, 0x16, 0x90, 0x9F, 0xD2, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4,
+0x90, 0x9F, 0xDF, 0xF0, 0x90, 0xA1, 0xEA, 0x41, 0x10, 0x90, 0x9F, 0xDD, 0x74, 0x02, 0xF0, 0x22,
+0x12, 0x49, 0x67, 0x90, 0x9F, 0xE0, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0x12, 0x5C, 0xFE, 0x90, 0x9F,
+0xE0, 0xE0, 0xFF, 0x90, 0x9F, 0xDF, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03,
+0x12, 0x07, 0x03, 0x90, 0x9F, 0xD6, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41,
+0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x0A, 0x90, 0x9F, 0xE0, 0xE0, 0x94, 0x03, 0x50, 0x02, 0x41,
+0x76, 0x7F, 0x03, 0x12, 0x5A, 0xD8, 0x90, 0x05, 0x22, 0xE0, 0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12,
+0x49, 0x5C, 0x90, 0x04, 0x9C, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x07, 0x70,
+0x52, 0x90, 0x9F, 0xE0, 0xE0, 0xB4, 0x04, 0x08, 0x90, 0x9F, 0xDD, 0x74, 0x05, 0xF0, 0x41, 0x55,
+0x90, 0x9F, 0xD1, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0xFB, 0xF0,
+0xE4, 0xA3, 0xF0, 0x90, 0x9F, 0xEF, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0x9F, 0xD2, 0x74, 0x09, 0xF0,
+0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x9F, 0xDF, 0xF0, 0x90, 0xA1, 0xEA, 0x04, 0x80,
+0x0F, 0x90, 0x9F, 0xDD, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x49, 0x67, 0x90, 0x9F, 0xE0, 0xE0, 0x04,
+0xF0, 0x80, 0x48, 0x90, 0x9F, 0xD2, 0xE0, 0x64, 0x09, 0x70, 0x5B, 0x90, 0x9F, 0xD1, 0xE0, 0x30,
+0xE0, 0x0E, 0x90, 0x9F, 0xDD, 0x74, 0x05, 0xF0, 0x90, 0x9F, 0xD1, 0xE0, 0x54, 0xFE, 0xF0, 0x22,
+0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x29, 0x74, 0x04, 0xF0, 0x90, 0x9F, 0xDF, 0xE0, 0x04, 0xF0,
+0xE0, 0xB4, 0x02, 0x17, 0x90, 0xA1, 0xEA, 0xE0, 0x90, 0x9F, 0xDD, 0x60, 0x05, 0x74, 0x05, 0xF0,
+0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x22, 0x7F, 0x03, 0x02, 0x5C, 0xFE,
+0x90, 0xA1, 0xEA, 0xE0, 0x90, 0x9F, 0xDD, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02,
+0xF0, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x30, 0x7D, 0x00, 0x7B, 0x01, 0x7A,
+0x9F, 0x79, 0xCA, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0xCB, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0,
+0x90, 0x9D, 0x98, 0xE0, 0xFC, 0x64, 0x02, 0x70, 0x1D, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30,
+0xE2, 0x02, 0x7E, 0x01, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x90, 0x9F, 0xCD,
+0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0x22, 0xEC, 0x64, 0x01, 0x70, 0x0D, 0x90, 0xFD, 0x70, 0xE0, 0x7F,
+0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x13, 0x90, 0x9D, 0x98, 0xE0, 0x64, 0x03, 0x70, 0x1C,
+0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0xEF, 0x54, 0x01, 0xC4, 0x33,
+0x33, 0x54, 0xC0, 0xFF, 0x90, 0x9F, 0xCD, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x22, 0x7E, 0x00, 0x7F,
+0x0A, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xF0, 0x12, 0x08, 0xAA, 0x90, 0x9F, 0xDE, 0x74,
+0x02, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xBE,
+0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xCA, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0,
+0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04,
+0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0xCA, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54,
+0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF,
+0x90, 0x9F, 0xCA, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x06,
+0x89, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0x9F, 0xCA, 0xF0, 0x90, 0x00, 0x03, 0x12,
+0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xCD, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF,
+0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE,
+0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0xCD, 0xF0, 0xEE, 0x54, 0x10, 0xFE,
+0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x20, 0xFD,
+0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0x9F, 0xCD, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF,
+0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E,
+0x90, 0x9F, 0xCD, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0x9F,
+0xCE, 0xE0, 0x54, 0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F, 0xFF,
+0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xFF,
+0x90, 0x9F, 0xCE, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E, 0xFF, 0xF0, 0x90, 0x00,
+0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0xCE,
+0xF0, 0xEE, 0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06,
+0xA2, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x9F, 0xCE, 0xF0, 0xEE, 0x54,
+0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x09,
+0x12, 0x5D, 0x10, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x12,
+0x06, 0x89, 0x20, 0xE0, 0x02, 0xA1, 0xE0, 0x90, 0x05, 0x54, 0xE0, 0x90, 0x9F, 0xDB, 0xF0, 0xE0,
+0xC3, 0x13, 0x90, 0x9F, 0xDA, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16,
+0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0xCB, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2,
+0x90, 0x9F, 0xCC, 0xF0, 0x80, 0x48, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A,
+0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x9F, 0xCB, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A,
+0xEF, 0xF0, 0x80, 0x06, 0x90, 0x9F, 0xCB, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2,
+0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0x9F, 0xCC, 0x50, 0x05, 0x74,
+0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0x9F, 0xCC, 0x74, 0x2A, 0xF0, 0x90, 0x9F,
+0xCE, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3D, 0x90, 0x9F, 0xCB, 0xE0, 0x75, 0xF0,
+0x03, 0x84, 0x90, 0x9F, 0xD3, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0x9F, 0xCC, 0xE0, 0x75,
+0xF0, 0x03, 0x84, 0x90, 0x9F, 0xD5, 0xF0, 0x90, 0x9F, 0xCB, 0xE0, 0xC3, 0x13, 0x90, 0x9F, 0xD6,
+0xF0, 0x90, 0x9F, 0xCC, 0xE0, 0xC3, 0x13, 0x90, 0x9F, 0xD7, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08,
+0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x57, 0x8E, 0xE4, 0x90, 0xA0, 0x07, 0xF0, 0x90, 0xA0, 0xEB, 0x12,
+0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x3B,
+0x90, 0x9F, 0xCA, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x0A, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54,
+0x01, 0x30, 0xE0, 0x27, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90,
+0xA0, 0x09, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x05, 0x75, 0x51, 0x01,
+0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0xF1, 0xBD, 0x90, 0x9F, 0xCA, 0xE0, 0xC4,
+0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0x9F, 0xCE, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07,
+0x7D, 0x04, 0x7F, 0x02, 0x12, 0x54, 0x47, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11,
+0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0xD2, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90,
+0x9F, 0xDD, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, 0x08, 0x90, 0x9F, 0xDD, 0x74, 0x04,
+0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0x9F, 0xDD, 0x74, 0x02, 0xF0, 0x80, 0x0A, 0xEF,
+0xB4, 0x07, 0x06, 0x90, 0x9F, 0xDD, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0x9F, 0xD2, 0xF0, 0x80, 0x6A,
+0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xC4, 0x13, 0x13,
+0x54, 0x03, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x14, 0x12, 0x06, 0x89, 0xFF, 0x13, 0x13,
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x51, 0xED,
+0x7D, 0x2C, 0x7F, 0x40, 0x12, 0x46, 0xAC, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03,
+0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x04, 0x7F, 0x03, 0x80, 0x02, 0x7F,
+0x01, 0x12, 0x5A, 0xD8, 0xAD, 0x52, 0x7F, 0x02, 0xF1, 0xBD, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C,
+0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0x9F, 0xD0, 0xE0, 0x54, 0xDF,
+0xF0, 0xE4, 0x90, 0x9F, 0xDC, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01,
+0x30, 0xE0, 0x09, 0x90, 0x9F, 0xFA, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x5F,
+0x81, 0x90, 0x9F, 0xFA, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x71, 0xC5, 0x90, 0x9F, 0xCA,
+0xE0, 0x20, 0xE0, 0x07, 0x90, 0x9F, 0xCE, 0xE0, 0x54, 0xBF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0xE4, 0xFF, 0x90, 0x9F, 0xCA, 0xE0, 0x30, 0xE0, 0x38, 0xA3, 0x12, 0x5C, 0xFA, 0x90, 0x9F, 0xDD,
+0x74, 0x01, 0xF0, 0x90, 0x9F, 0xDC, 0xF0, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x07, 0x7D, 0x05, 0x7F,
+0x6F, 0x02, 0x49, 0x5C, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0xCA, 0xE0, 0xFF, 0xC4,
+0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x77,
+0x62, 0x22, 0x90, 0x9F, 0xE5, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x8A, 0x9E, 0x80, 0x02, 0xD1, 0x90,
+0x90, 0xA0, 0x10, 0xE0, 0x30, 0xE0, 0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA0, 0x11, 0xE0, 0x64,
+0x08, 0x70, 0x1B, 0x90, 0xA0, 0x10, 0xE0, 0x30, 0xE0, 0x0F, 0x12, 0x8A, 0xCE, 0x90, 0xA0, 0x10,
+0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA0, 0x11, 0xF0, 0x90, 0x9F,
+0xCE, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x13, 0x90, 0xA0, 0x12, 0xE0, 0x04,
+0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90, 0x04, 0x9C, 0xE4, 0xF0, 0x90, 0xA0, 0x12, 0xF0, 0x90, 0x9F,
+0x0E, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x9F, 0x10, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0x17, 0xE0, 0x60,
+0x6F, 0x90, 0x9F, 0x13, 0xE0, 0x30, 0xE0, 0x23, 0x90, 0x9F, 0x2B, 0xE0, 0x04, 0xF0, 0x90, 0x05,
+0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13,
+0xD8, 0xF9, 0xFF, 0x90, 0x9F, 0x48, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x9F, 0x14, 0xE0, 0x13,
+0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0C, 0x12, 0x6E,
+0xCF, 0x90, 0x9F, 0x1D, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA1, 0xFD, 0xE4, 0x75, 0xF0,
+0x01, 0x12, 0x08, 0xD6, 0xC3, 0x90, 0xA1, 0xFE, 0xE0, 0x94, 0x80, 0x90, 0xA1, 0xFD, 0xE0, 0x64,
+0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0,
+0x7F, 0x01, 0x12, 0x62, 0x15, 0x02, 0x6F, 0xD5, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF,
+0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, 0x9F, 0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54,
+0x03, 0x30, 0xE0, 0x03, 0x02, 0x89, 0x62, 0x90, 0xA0, 0x0A, 0xE0, 0x60, 0x03, 0x02, 0x88, 0x82,
+0xE5, 0x26, 0x64, 0x02, 0x60, 0x4A, 0xE5, 0x27, 0x70, 0x46, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37,
+0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0xE5, 0x26,
+0x90, 0xA1, 0x9A, 0xB4, 0x01, 0x05, 0x12, 0x45, 0x71, 0x80, 0x0C, 0x12, 0x45, 0x71, 0xEF, 0x44,
+0x80, 0xFF, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x9A,
+0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45,
+0xE5, 0x27, 0x64, 0x02, 0x70, 0x02, 0x21, 0x62, 0xE5, 0x27, 0x70, 0x02, 0x21, 0x62, 0x7F, 0x48,
+0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA1, 0x9A, 0x12,
+0x08, 0x6D, 0x90, 0xA0, 0x09, 0xE0, 0x90, 0xA1, 0x9A, 0x60, 0x09, 0x12, 0x45, 0x71, 0xEF, 0x44,
+0x80, 0xFF, 0x80, 0x07, 0x12, 0x45, 0x71, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA1, 0x9A, 0x12,
+0x08, 0x6D, 0x90, 0xA1, 0x9A, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48,
+0x21, 0x5D, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x43, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF,
+0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0xE5, 0x26, 0x90, 0xA1, 0x9A, 0xB4,
+0x01, 0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x01, 0x80, 0x06, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02,
+0xFF, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x9A, 0x12, 0x45, 0x71, 0x90, 0xAA,
+0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xE5, 0x27, 0x64, 0x02, 0x70,
+0x02, 0x21, 0x62, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEC, 0x90, 0xA1, 0x9A,
+0x12, 0x08, 0x6D, 0xE5, 0x27, 0x70, 0x13, 0x90, 0xA1, 0x9A, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x77,
+0xFF, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0x80, 0x55, 0x90, 0xA1, 0x9A, 0x12, 0x45, 0x71,
+0xEF, 0x44, 0x66, 0xFF, 0xEC, 0x90, 0xA1, 0x9A, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12,
+0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA1, 0x9E, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0x09,
+0xE0, 0x90, 0xA1, 0x9E, 0x60, 0x08, 0x12, 0x45, 0x71, 0xEF, 0x44, 0x02, 0x80, 0x06, 0x12, 0x45,
+0x71, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xA1, 0x9E, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x9E, 0x12,
+0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x90,
+0xA1, 0x9A, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, 0x09, 0x12,
+0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x26, 0xEF, 0xF0, 0x90, 0xA0, 0x0A, 0xE0,
+0x70, 0x7D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEE, 0x54, 0x0F, 0xFE, 0xE4, 0xFD, 0xFC,
+0x90, 0xA1, 0x27, 0x12, 0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA1, 0x27,
+0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x05, 0x90, 0x9F, 0xEB, 0x80, 0x31, 0xE4, 0xFF,
+0xFE, 0xFD, 0xFC, 0x90, 0xA1, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x0A, 0x90,
+0x9F, 0xEB, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0x41, 0x4B, 0xE4, 0xFF, 0x7E, 0x02, 0xFD, 0xFC, 0x90,
+0xA1, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x09, 0x90, 0x9F, 0xEB, 0x04, 0xF0,
+0xA3, 0xF0, 0x80, 0x77, 0xE4, 0x7F, 0x80, 0xFE, 0xFD, 0xFC, 0x90, 0xA1, 0x27, 0x12, 0x45, 0x8D,
+0xC3, 0x12, 0x45, 0x60, 0x70, 0x65, 0x90, 0x9F, 0xEB, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x5C, 0x7F,
+0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0x02, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA1,
+0x27, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x08,
+0x90, 0x9F, 0xEB, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x9F, 0xEB, 0xF0, 0x7F, 0x30, 0x7E,
+0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA1, 0x27, 0x12,
+0x08, 0x6D, 0x90, 0xA1, 0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x07, 0xE4, 0x90,
+0x9F, 0xEC, 0xF0, 0x80, 0x06, 0x90, 0x9F, 0xEC, 0x74, 0x01, 0xF0, 0x90, 0x9F, 0xE5, 0xE0, 0x44,
+0x01, 0xF0, 0x7D, 0x11, 0x12, 0x46, 0xF8, 0x90, 0x07, 0x78, 0xE0, 0x90, 0x9F, 0xEA, 0xF0, 0x90,
+0xA0, 0x09, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x87, 0xBD, 0x90, 0xA1, 0x26, 0xE0, 0xFD, 0x70, 0x02,
+0x80, 0x24, 0xED, 0xB4, 0x01, 0x0A, 0x90, 0x9F, 0xE5, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22,
+0x90, 0xA1, 0x26, 0xE0, 0xFD, 0xB4, 0x02, 0x0A, 0x90, 0x9F, 0xE5, 0xE0, 0x54, 0x1F, 0x44, 0x60,
+0xF0, 0x22, 0xED, 0xB4, 0x03, 0x07, 0x90, 0x9F, 0xE5, 0xE0, 0x54, 0x1F, 0xF0, 0x22, 0x12, 0x4F,
+0xC8, 0x90, 0x9F, 0xE5, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, 0xEF, 0xC3, 0x13, 0x54, 0x0F,
+0xC3, 0x9E, 0x40, 0x03, 0x02, 0x5D, 0x90, 0x90, 0x9F, 0xE5, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F,
+0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0x90, 0x9F,
+0xCD, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0x0A, 0xE0, 0xFB, 0x90, 0xA0, 0x09,
+0xE0, 0x90, 0xA1, 0xCC, 0xF0, 0xE4, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1,
+0xC9, 0xEF, 0xF0, 0x90, 0xA1, 0xCB, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0x61, 0xFE, 0x90, 0x07, 0x6E,
+0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90, 0xA1, 0xCB, 0xE0, 0x70,
+0x6D, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90,
+0xA1, 0xC9, 0xE0, 0x70, 0x4F, 0x90, 0xA1, 0xCC, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x20, 0x12,
+0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48,
+0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0x80, 0x1F, 0x12,
+0x37, 0x4E, 0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F,
+0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F,
+0x64, 0x12, 0x46, 0xAC, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x80, 0x81, 0x70, 0x7F, 0x67,
+0x12, 0x46, 0xD6, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90, 0xA1, 0xC9, 0xE0,
+0x70, 0x18, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9,
+0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF,
+0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12, 0x46, 0xAC, 0x7F, 0x4F, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x01,
+0xFD, 0x7F, 0x4F, 0x12, 0x46, 0xAC, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x66,
+0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F,
+0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90,
+0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x81, 0x84, 0x90, 0x07,
+0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x90, 0xA1, 0xC9, 0xE0,
+0x70, 0x56, 0x90, 0xA1, 0xCB, 0xE0, 0x60, 0x19, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x20,
+0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x80,
+0x28, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xDF, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90,
+0xA1, 0xCC, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x80, 0xFF,
+0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08,
+0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0x7F,
+0xFD, 0x7F, 0x4E, 0x12, 0x46, 0xAC, 0x7F, 0x4F, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F,
+0x4F, 0x12, 0x46, 0xAC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xB1, 0xE2, 0x7F, 0x08, 0x12, 0x46, 0xD6,
+0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0xAC, 0xE4, 0xFF, 0xB1, 0x61, 0x51, 0xCE, 0x90,
+0x9F, 0x13, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xB1, 0xC9, 0x90, 0x9F, 0x14, 0xE0,
+0x54, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x91, 0xC4, 0x91, 0x89, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0x14, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x9F, 0xCD, 0xE0, 0xC4,
+0x13, 0x13, 0x54, 0x01, 0xFF, 0x90, 0xA0, 0x0A, 0xE0, 0xFB, 0x90, 0xA0, 0x09, 0xE0, 0x90, 0xA1,
+0xCC, 0xF0, 0x7D, 0x01, 0x51, 0xE7, 0x90, 0x9F, 0x21, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0xAC,
+0x90, 0x9F, 0x18, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0,
+0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x10,
+0xFD, 0x7F, 0x08, 0x12, 0x46, 0xAC, 0x7F, 0x01, 0xB1, 0x61, 0x7F, 0x90, 0x12, 0x46, 0xD6, 0xEF,
+0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0xAC, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90,
+0x9F, 0x1A, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0xD1, 0x01, 0xBF, 0x01, 0x02, 0x91, 0xB4,
+0x22, 0x90, 0x9F, 0x13, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x9F, 0x0E, 0xE0, 0xFF, 0x30, 0xE0, 0x0E,
+0xC3, 0x13, 0x30, 0xE0, 0x07, 0xB1, 0xBC, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xB1, 0x2F,
+0x22, 0x90, 0xA1, 0xF8, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F,
+0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0xA1, 0xF8, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0xA1,
+0xFA, 0xE0, 0x94, 0x88, 0x90, 0xA1, 0xF9, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0,
+0x44, 0x10, 0xF0, 0x22, 0x90, 0xA1, 0xF9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14,
+0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA1, 0xFA, 0xE0, 0x94, 0x32, 0x90, 0xA1, 0xF9, 0xE0,
+0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0x90, 0x9F, 0x11, 0xE0,
+0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0x9F, 0xC6, 0xE0, 0x90, 0x01, 0x30,
+0xF0, 0x90, 0x9F, 0xC3, 0xE0, 0x90, 0x01, 0x39, 0xF0, 0x90, 0x9F, 0xC4, 0xE0, 0x90, 0x01, 0x3A,
+0xF0, 0x22, 0x90, 0x01, 0xC4, 0x74, 0xE2, 0xF0, 0x74, 0x8D, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x46,
+0xD6, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0xE2, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8D, 0xA3, 0xF0,
+0x22, 0x90, 0x9F, 0xBD, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x13, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x17,
+0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, 0xA0, 0x10,
+0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0xA2, 0x0B, 0xEF, 0xF0, 0x7F,
+0x02, 0x12, 0x44, 0xB7, 0x90, 0x9D, 0x94, 0xE0, 0xFF, 0x90, 0xA2, 0x0B, 0xE0, 0xFE, 0xEF, 0x4E,
+0x90, 0x9D, 0x94, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51,
+0x90, 0x9D, 0x99, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9A, 0xF0,
+0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9B, 0xF0, 0x90, 0x00, 0x03, 0x12,
+0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x25, 0x51,
+0x90, 0x9D, 0x9D, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9E, 0xF0,
+0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9D, 0x9F, 0xF0, 0x22, 0x8B, 0x51, 0x8A,
+0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x1B, 0x90, 0xA0, 0x29,
+0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x77, 0x08, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89,
+0x54, 0x0F, 0xFF, 0x12, 0x4D, 0x1B, 0xE1, 0xC7, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00,
+0x01, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0E, 0x90,
+0xA0, 0x2C, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x03, 0xFF,
+0x75, 0xF0, 0x0E, 0xED, 0x90, 0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0x90,
+0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0x75, 0xF0, 0x0E, 0x90,
+0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE3, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2,
+0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0E, 0xEE, 0x90, 0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x1F,
+0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0xE4,
+0xFB, 0x12, 0xB1, 0x09, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2,
+0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x7B, 0x01, 0x12, 0xB1, 0x09, 0xAB, 0x51, 0xAA, 0x52,
+0xA9, 0x53, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x12, 0x06,
+0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x35, 0x12, 0x45, 0xA9, 0xEF, 0xF0,
+0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0xED, 0x90,
+0xA0, 0x36, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70, 0x26,
+0x90, 0xA0, 0x2A, 0xEF, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xC4, 0x54, 0xF0,
+0xFF, 0x90, 0xA0, 0x29, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, 0x01, 0xF0, 0x7D,
+0x20, 0xE4, 0xFF, 0x12, 0x57, 0x8E, 0x22, 0x7E, 0x00, 0x7F, 0x2D, 0x7D, 0x00, 0x7B, 0x01, 0x7A,
+0xA0, 0x79, 0x29, 0x02, 0x08, 0xAA, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xBE, 0x12, 0x06, 0x89, 0xFF,
+0x54, 0x7F, 0x90, 0x9F, 0x17, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90,
+0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x9F, 0x15, 0xE0,
+0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90,
+0x9F, 0x13, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x9F,
+0x15, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0x16, 0xF0,
+0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x30, 0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94,
+0x04, 0x90, 0x9F, 0x29, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0xA0, 0xEB,
+0x12, 0x45, 0xB5, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03,
+0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F,
+0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00,
+0x06, 0x12, 0x06, 0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x9F, 0x1F, 0x50, 0x05,
+0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x04,
+0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12, 0x54, 0x47, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x90,
+0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xBB, 0xE0, 0x54, 0xFE, 0x4E,
+0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12,
+0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x9F, 0xBB, 0xF0, 0xEE,
+0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE,
+0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x9F, 0xBB, 0xF0, 0xEE, 0x54, 0x20, 0xFE,
+0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF,
+0x54, 0xBF, 0x4E, 0x90, 0x9F, 0xBB, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0,
+0x29, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, 0x01, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x0B,
+0x80, 0x0E, 0xE4, 0xF5, 0x52, 0x90, 0xA0, 0x09, 0xE0, 0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03,
+0x75, 0x51, 0x01, 0xAD, 0x52, 0xAF, 0x51, 0x12, 0x87, 0xBD, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5,
+0x90, 0xA0, 0xEE, 0x12, 0x45, 0xBE, 0x31, 0x7F, 0x90, 0x9F, 0x17, 0xE0, 0xFF, 0x12, 0x6F, 0x38,
+0x90, 0x9F, 0x17, 0xE0, 0x60, 0x18, 0x90, 0xA0, 0xEE, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x01, 0x12,
+0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x31, 0xA0, 0x22, 0x90,
+0x9F, 0x13, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x9F, 0x20, 0xF0, 0x90, 0x9F, 0x1B, 0xF0, 0x90,
+0x9F, 0x14, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x56, 0xCA, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x56, 0xCE,
+0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0x9F, 0x1D, 0x74, 0x02, 0xF0, 0x80, 0x16,
+0xED, 0x70, 0x0A, 0x90, 0x9F, 0xB9, 0xE0, 0x90, 0x9F, 0x1D, 0xF0, 0x80, 0x05, 0x90, 0x9F, 0x1D,
+0xED, 0xF0, 0x90, 0x9F, 0x1D, 0xE0, 0xA3, 0xF0, 0x90, 0x9F, 0x14, 0xE0, 0x44, 0x08, 0xF0, 0x22,
+0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0x9F, 0xB6,
+0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0xB7, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3,
+0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0xB9, 0xF0, 0x22,
+0x90, 0x9F, 0xB6, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28,
+0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x9F, 0xBC, 0xF0, 0x60, 0x35, 0x90,
+0x9F, 0xCA, 0xE0, 0x20, 0xE0, 0x2E, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x52, 0x40, 0x90, 0x9F, 0xBB,
+0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x1D, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x14,
+0x90, 0x9F, 0xBB, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x04, 0x7F, 0x0D, 0x80, 0x02, 0x7F,
+0x09, 0x12, 0x5A, 0xD8, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xBD, 0xE0,
+0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00,
+0x01, 0x12, 0x06, 0xA2, 0x90, 0x9F, 0xBE, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x9F,
+0xBF, 0xF0, 0x90, 0x9F, 0xBE, 0xE0, 0x90, 0x9F, 0xC0, 0xF0, 0x90, 0x9F, 0xBD, 0xE0, 0x54, 0x01,
+0xFF, 0x02, 0x56, 0xE3, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x9F, 0xC1, 0xE0, 0x54,
+0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x90, 0x9F, 0x13, 0xE0,
+0x54, 0xEF, 0x4F, 0xF0, 0x90, 0x9F, 0xC1, 0xE0, 0x54, 0x01, 0xFF, 0x02, 0x56, 0x5C, 0x90, 0xA1,
+0xEC, 0x12, 0x45, 0xBE, 0xE4, 0xFE, 0x90, 0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x3B, 0xA3,
+0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0xA1, 0xEC, 0x12, 0x45, 0xB5, 0x8E, 0x82, 0x75,
+0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83,
+0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x06, 0x50, 0x33, 0x74, 0x52, 0x2E, 0xF5, 0x82,
+0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E,
+0x90, 0xA1, 0xEC, 0x12, 0x45, 0xB5, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74,
+0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD,
+0x58, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA1, 0xEF, 0xE0, 0x70,
+0x13, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0x01, 0x12, 0x08, 0x6D, 0x90, 0xA1,
+0xEF, 0x74, 0x01, 0xF0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0xFF, 0xE4, 0x8F,
+0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, 0x90, 0xA0, 0x01, 0x12, 0x45, 0x71, 0xEC, 0x54, 0xC1,
+0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, 0xAD, 0x52, 0xAC,
+0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45,
+0x53, 0x90, 0x9F, 0xFD, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA0,
+0x16, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F, 0xFF,
+0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA0, 0x16,
+0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x20,
+0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x90, 0xA0, 0x16, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF,
+0x54, 0x03, 0xFE, 0x90, 0xA0, 0x17, 0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF,
+0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x30, 0xFD,
+0xEF, 0x54, 0xCF, 0x4D, 0xFF, 0x90, 0xA0, 0x17, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF,
+0x4E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0x18, 0xF0, 0x90, 0x00, 0x03, 0x12,
+0x06, 0xA2, 0x90, 0xA0, 0x19, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0x1A, 0xF0,
+0x90, 0xA0, 0x18, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, 0x78,
+0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0x20, 0xEE, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0xA0, 0x19, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF,
+0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0x22, 0xEE, 0xF0, 0xA3,
+0xEF, 0xF0, 0x90, 0xA0, 0x1A, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03,
+0x90, 0xA0, 0x24, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA0, 0x16, 0xE0, 0x30, 0xE0, 0x17, 0x90,
+0xA0, 0x1B, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07,
+0x83, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x1B, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
+0xF0, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0x90, 0xA0, 0xEB, 0x12, 0x45,
+0xBE, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0x90, 0xA0, 0x26, 0xF0, 0x90, 0x00,
+0x01, 0x12, 0x06, 0xA2, 0x90, 0xA0, 0x27, 0xF0, 0x90, 0xA0, 0xEB, 0x12, 0x45, 0xB5, 0x7D, 0x02,
+0x7F, 0x38, 0x02, 0x61, 0xC7, 0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0xFF, 0x90, 0x9F, 0xEF,
+0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0xE0, 0xC3, 0x13, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xE6, 0xF0, 0xA3,
+0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE0, 0x37, 0x12, 0x46, 0xC6, 0xEF, 0x54, 0x0F, 0x64, 0x04,
+0x70, 0x25, 0x90, 0xA0, 0x10, 0xE0, 0x30, 0xE0, 0x02, 0x80, 0x24, 0x90, 0xFD, 0x62, 0xE0, 0xB4,
+0xAD, 0x13, 0xA3, 0xE0, 0xB4, 0x35, 0x0E, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01,
+0xE5, 0x74, 0xDF, 0xF0, 0x22, 0x80, 0x00, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90,
+0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0x25, 0xE0,
+0xFF, 0x90, 0x9F, 0xEF, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0,
+0x08, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x22, 0x90, 0xA0, 0x10, 0xE0, 0x20, 0xE0, 0x07,
+0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA1,
+0xFB, 0xF0, 0x90, 0xA1, 0xFB, 0xE0, 0xFD, 0x70, 0x02, 0xC1, 0xC7, 0x90, 0x9D, 0xF0, 0xE0, 0xFF,
+0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9D, 0xF1, 0xE0, 0xB5,
+0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44,
+0x01, 0xF0, 0x22, 0x90, 0xA1, 0xF0, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80,
+0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xC1, 0xA4, 0xE4,
+0x90, 0xA1, 0xFC, 0xF0, 0x90, 0xA1, 0xFC, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0xA1,
+0xF0, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0,
+0xFE, 0x74, 0xD0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9D, 0xF1,
+0xE0, 0x75, 0xF0, 0x08, 0x90, 0x9D, 0xA0, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4,
+0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA1, 0xF0, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF,
+0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF,
+0x90, 0x9D, 0xF1, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x9D, 0xA4, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29,
+0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA1, 0xFC, 0xE0, 0x04, 0xF0, 0x80,
+0x83, 0x90, 0xA1, 0xFB, 0xE0, 0xFF, 0x90, 0xA1, 0xF0, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08,
+0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA1, 0xFB, 0xF0, 0x90, 0xA1, 0xF0, 0xE0,
+0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0,
+0x90, 0xA1, 0xF0, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9D, 0xF1, 0xE0, 0x04, 0xF0,
+0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0xA1, 0x82, 0xE4, 0x90, 0x9D,
+0xF1, 0xF0, 0xA1, 0x82, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA1, 0xF0, 0xE0, 0x44,
+0x80, 0x90, 0x00, 0x8A, 0xF0, 0x90, 0xA1, 0xF0, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12,
+0x45, 0xA9, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xE4, 0x90, 0x9E, 0x88, 0xF0, 0xA3, 0xF0, 0x90,
+0x9D, 0xF0, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xCD,
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0xFE, 0xA3,
+0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA1, 0xD0, 0xE0, 0x94, 0xE8, 0x90,
+0xA1, 0xCF, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00,
+0x80, 0x15, 0x90, 0xA1, 0xCF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00,
+0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xD5, 0x12, 0x45, 0xBE, 0x7F, 0x96, 0x7E, 0x02, 0xD1, 0xD6, 0xEF,
+0x60, 0x58, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF,
+0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA1, 0xD8, 0xEF, 0xF0, 0xEE,
+0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA1, 0xD8, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0xA1, 0xD5, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF,
+0xE4, 0x33, 0xFE, 0xF1, 0x9F, 0x90, 0xA1, 0xD8, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA1, 0xD5, 0x12,
+0x45, 0xB5, 0xF1, 0xFA, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4,
+0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC,
+0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE,
+0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74,
+0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D,
+0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82,
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA1, 0xD1, 0xEF, 0xF0, 0xA3,
+0x12, 0x45, 0xBE, 0x90, 0xA1, 0xF1, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06,
+0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0,
+0x01, 0x90, 0xA1, 0xD2, 0x12, 0x45, 0xB5, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02,
+0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0xA1, 0xD1, 0xE0, 0x24, 0x02, 0xF9,
+0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0xB5,
+0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA1, 0xD2, 0x12,
+0x45, 0xB5, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03,
+0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1,
+0xBF, 0x01, 0x06, 0x90, 0xA0, 0xEB, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F,
+0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA0, 0xEB, 0xE0, 0x90, 0xA0, 0xED,
+0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01,
+0x08, 0x90, 0xA0, 0xEB, 0xE0, 0x90, 0xA0, 0xEE, 0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F,
+0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA0, 0xEB, 0xE0, 0x90, 0xA0, 0xEF,
+0xF0, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xEB, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01,
+0x08, 0x90, 0xA0, 0xEB, 0xE0, 0x90, 0xA0, 0xF0, 0xF0, 0x90, 0xA0, 0xEC, 0xE0, 0xFF, 0xA3, 0xE0,
+0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA0, 0xF4, 0xF0, 0x90, 0xA0, 0xF0, 0xE0, 0x90, 0xA0,
+0xF5, 0xF0, 0x02, 0x66, 0xF3, 0x90, 0xA1, 0xF2, 0x12, 0x45, 0xBE, 0xE4, 0xFF, 0x90, 0xA1, 0xF2,
+0x12, 0x45, 0xB5, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5,
+0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x01,
+0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00,
+0x12, 0x3E, 0x50, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0,
+0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E,
+0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4,
+0x90, 0xA0, 0xDB, 0xF0, 0xA3, 0xF0, 0x31, 0x51, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0xA0,
+0xDC, 0xE0, 0x94, 0x88, 0x90, 0xA0, 0xDB, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0,
+0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x27, 0x90, 0xA0, 0xDB, 0xE4, 0x75,
+0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA0, 0xDC,
+0xE0, 0x94, 0x32, 0x90, 0xA0, 0xDB, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30,
+0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xC9,
+0xF0, 0x74, 0x99, 0xA3, 0xF0, 0x90, 0xA0, 0x28, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED,
+0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F,
+0x01, 0x22, 0xE4, 0x90, 0x9D, 0x93, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22,
+0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0,
+0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0,
+0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x9F, 0x0E,
+0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01,
+0x70, 0x20, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x1A, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C,
+0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0x9F, 0xB7, 0xE0, 0x90, 0xA1, 0xAF, 0x12,
+0x48, 0x1F, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x9F, 0x17, 0xE0, 0x60,
+0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x9F, 0x13, 0xE0,
+0x54, 0xFB, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52,
+0x28, 0x22, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x9F, 0x17, 0xE0, 0x60, 0x0E, 0x90,
+0x9F, 0x1B, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x52, 0x28, 0x22, 0x90, 0x9F,
+0x13, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2E, 0xEF, 0x54, 0xBF, 0xF0, 0x90,
+0x04, 0xE0, 0xE0, 0x90, 0x9F, 0x14, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0,
+0x54, 0xFE, 0xF0, 0x90, 0x9F, 0xD0, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D,
+0x01, 0x7F, 0x0C, 0x02, 0x52, 0x40, 0x12, 0x52, 0x28, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90,
+0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80,
+0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA1, 0x16, 0xF0, 0xA3, 0xF0, 0xA3,
+0xF0, 0x7F, 0x83, 0x12, 0x46, 0xD6, 0x90, 0xA1, 0x16, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x46, 0xD6,
+0xAE, 0x07, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0xA1, 0x18, 0xE0,
+0x94, 0x64, 0x90, 0xA1, 0x17, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40,
+0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x22, 0x90, 0xA1, 0x17, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08,
+0xD6, 0x80, 0xBE, 0xE4, 0xFF, 0xE4, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5,
+0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0xBE, 0x03, 0x12, 0x12,
+0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x80, 0xF0, 0x80,
+0x0F, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0,
+0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4,
+0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xAD, 0x0F, 0xBF, 0x80, 0xA7, 0xE4, 0x90,
+0xAD, 0xE2, 0xF0, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9,
+0x75, 0xF0, 0x02, 0xEE, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x0E, 0xBE, 0x05, 0xE7, 0x74,
+0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x92, 0x2F, 0xF5,
+0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93,
+0xF5, 0x83, 0x74, 0xC0, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5,
+0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4,
+0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0x74, 0x13, 0xF0, 0x75, 0xF0,
+0x04, 0xEF, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96,
+0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96,
+0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12,
+0x45, 0xA9, 0xE0, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9,
+0xE0, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54,
+0xCF, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x40, 0xF0,
+0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x7F, 0xF0, 0x75, 0xF0,
+0x04, 0xEF, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81,
+0x00, 0x12, 0x45, 0xA9, 0xEE, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83,
+0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0x61, 0xC4, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0xA1, 0x36, 0xEB, 0xF0, 0x70, 0x6C, 0x90,
+0xA1, 0x36, 0xE0, 0xFE, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFC, 0x90,
+0xA1, 0x37, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x53, 0x90, 0xA1, 0x3B, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0,
+0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, 0x90, 0x9D, 0x92, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0,
+0x4F, 0x90, 0xA1, 0x3D, 0xF0, 0x90, 0xA1, 0x38, 0xE0, 0x90, 0xA1, 0x3F, 0xF0, 0x90, 0xA1, 0x39,
+0x74, 0x0C, 0xF0, 0x90, 0xA1, 0x47, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x39, 0x12,
+0x64, 0x94, 0x7F, 0x04, 0x12, 0x65, 0x9C, 0x90, 0xA1, 0x37, 0xE0, 0xFF, 0x90, 0xA1, 0x36, 0xE0,
+0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE4, 0xF5, 0x5E, 0x74,
+0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3,
+0x94, 0x11, 0x40, 0x29, 0x80, 0x1F, 0xEE, 0xB4, 0x01, 0x08, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x1D,
+0x80, 0x13, 0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0x70, 0x0B, 0xED,
+0xC3, 0x94, 0x03, 0x40, 0x08, 0x75, 0x5E, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x5E, 0xAF, 0x5E, 0x22,
+0xAB, 0x07, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x5E, 0xE4,
+0xF5, 0x62, 0xE5, 0x5E, 0x54, 0x7F, 0xF9, 0xE5, 0x5E, 0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB,
+0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x15,
+0x12, 0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xF5, 0x61, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24,
+0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, 0x24, 0x91,
+0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x5E, 0x4A, 0xFF,
+0x74, 0x12, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEB,
+0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0x74, 0x12, 0x2B, 0xF5, 0x82,
+0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE9, 0x64, 0x2C, 0x70, 0x33, 0x75, 0xF0, 0x04,
+0xEB, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5F, 0xC3, 0x9E,
+0x50, 0x1E, 0x05, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04,
+0xEB, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0xE1, 0x18,
+0xE9, 0xC3, 0x95, 0x60, 0x50, 0x6B, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x60, 0x40, 0x02, 0xE1,
+0x18, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEB, 0x90, 0x89, 0x00, 0x12,
+0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75,
+0x83, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3,
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60,
+0x1D, 0xB9, 0x13, 0x14, 0x79, 0x18, 0x89, 0x5E, 0x74, 0x12, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99,
+0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x60, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x5A, 0x0D, 0x80,
+0x98, 0xE9, 0x65, 0x60, 0x70, 0x43, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9,
+0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44,
+0x80, 0xF5, 0x5E, 0x80, 0x33, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34,
+0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94,
+0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x74, 0x12, 0x2B, 0xF5, 0x82, 0xE4, 0x34,
+0x9D, 0xF5, 0x83, 0xE5, 0x60, 0xF0, 0xF5, 0x5E, 0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD,
+0x5E, 0x02, 0x7D, 0x73, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54,
+0x03, 0xFE, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0x74, 0x12,
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x2F,
+0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xF9, 0x54, 0x03, 0xFB, 0xEE,
+0xD3, 0x9B, 0x50, 0x1B, 0xEE, 0x60, 0x18, 0x1E, 0xEE, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFB,
+0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE9, 0x54, 0xF3, 0x4B, 0xF0, 0xED,
+0xD3, 0x9C, 0x40, 0x02, 0xAD, 0x04, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83,
+0xE0, 0x54, 0x80, 0x42, 0x05, 0x8E, 0x6A, 0xE4, 0xFB, 0x02, 0x7D, 0x73, 0xAA, 0x07, 0xAB, 0x05,
+0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF5,
+0x60, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA0, 0xFD, 0xF0,
+0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEA,
+0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0xE5, 0x60, 0x25, 0xE0, 0x24,
+0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA,
+0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0,
+0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xC4, 0x54, 0x03, 0x90,
+0xA0, 0xFB, 0xF0, 0x74, 0x12, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x60, 0xF0,
+0x74, 0x12, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE5, 0x60, 0xD3,
+0x9F, 0x40, 0x04, 0x8F, 0x60, 0x8F, 0x5E, 0xEB, 0x70, 0x02, 0x21, 0x14, 0xAF, 0x03, 0x8F, 0x61,
+0xE5, 0x5E, 0x30, 0xE7, 0x05, 0x85, 0x60, 0x5E, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x02, 0x21, 0x14,
+0xE5, 0x60, 0x64, 0x2C, 0x70, 0x2A, 0xE5, 0x5F, 0xD3, 0x94, 0x00, 0x40, 0x23, 0xE5, 0x5F, 0xD3,
+0x94, 0x02, 0x50, 0x1C, 0x15, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75,
+0xF0, 0x04, 0xEA, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61,
+0xE5, 0x61, 0x70, 0x02, 0x21, 0x14, 0x90, 0xA0, 0xFD, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x40,
+0x7D, 0xE4, 0x90, 0xA0, 0xFC, 0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90,
+0xA0, 0xFD, 0xE0, 0xFF, 0xEC, 0xC3, 0x9F, 0x40, 0x5F, 0xEC, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF,
+0x75, 0xF0, 0x08, 0xEA, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4,
+0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xEC, 0x54, 0x07, 0xFF, 0x74, 0x01,
+0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE,
+0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02,
+0x7D, 0x0C, 0x90, 0xA0, 0xFC, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF,
+0xED, 0xD3, 0x9F, 0x40, 0x03, 0x1C, 0x80, 0x97, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA0,
+0xFD, 0xE0, 0xF5, 0x5E, 0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x02, 0x7D, 0x73,
+0xE4, 0xF5, 0x51, 0x74, 0x8D, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x70,
+0x03, 0x02, 0xA8, 0xCD, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0,
+0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0xA8, 0xCD, 0xE5, 0x51, 0x25,
+0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94,
+0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0xA8, 0xCD, 0xE5, 0x51, 0x75, 0xF0, 0x0A, 0xA4, 0x24,
+0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xBE, 0xE5,
+0x51, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xF5, 0x56, 0xA3,
+0xE0, 0xF5, 0x57, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF,
+0x90, 0xA0, 0xED, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE,
+0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB,
+0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35,
+0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0xA0, 0xEF,
+0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFF, 0xC3, 0x90, 0xA0, 0xF0, 0xE0, 0x9F, 0xFE, 0x90,
+0xA0, 0xEF, 0xE0, 0x95, 0xF0, 0x90, 0xA0, 0xF1, 0xF0, 0xA3, 0xCE, 0xF0, 0x90, 0x00, 0x06, 0x12,
+0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0x25, 0xE0, 0xFF, 0xEC, 0x33, 0xFE, 0xEF, 0x2D, 0xFD, 0xEE, 0x3C,
+0xFC, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x25, 0xE0, 0xFF, 0xE5, 0xF0, 0x33, 0xFE, 0x90, 0x00,
+0x02, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xCF, 0x2D, 0xFD, 0xEF, 0x3C, 0xFC, 0x90,
+0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0x78, 0x02, 0xC3,
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x2D, 0xFF, 0xEC, 0x3E, 0x90, 0xA0, 0xF3, 0xF0, 0xA3, 0xEF,
+0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x52, 0x54,
+0x7F, 0xF5, 0x53, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xE0, 0x90,
+0xA0, 0xF5, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xFF,
+0x13, 0x13, 0x54, 0x03, 0x90, 0xA0, 0xF6, 0xF0, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34,
+0x9B, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0xA1, 0xBB, 0x90, 0xA0, 0xF5, 0xE0, 0xFF,
+0xE5, 0x53, 0x9F, 0x40, 0x08, 0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52, 0xE5, 0x53, 0x90,
+0x41, 0x5F, 0x93, 0xFF, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0,
+0xC3, 0x9F, 0xE5, 0x53, 0x40, 0x05, 0x90, 0x41, 0x37, 0x80, 0x03, 0x90, 0x41, 0x4B, 0x93, 0xF5,
+0x58, 0x90, 0xA0, 0x0B, 0xE0, 0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05, 0xE5, 0x53, 0xB4,
+0x0B, 0x05, 0x90, 0xA0, 0x0D, 0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05, 0xE5, 0x53, 0xB4,
+0x0A, 0x05, 0x90, 0xA0, 0x0E, 0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05, 0xE5, 0x53, 0xB4,
+0x09, 0x05, 0x90, 0xA0, 0x0F, 0x80, 0x03, 0x90, 0xA0, 0x0C, 0xE0, 0xF5, 0x5C, 0xE5, 0x5C, 0xC3,
+0x94, 0x80, 0x50, 0x28, 0xE5, 0x5C, 0x94, 0x1B, 0x40, 0x02, 0x80, 0x13, 0xE5, 0x58, 0x25, 0x5C,
+0xFF, 0xE4, 0x33, 0xFE, 0xD3, 0xEF, 0x94, 0x1B, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x05, 0x75,
+0x58, 0x1B, 0x80, 0x20, 0xE5, 0x5C, 0x25, 0x58, 0xF5, 0x58, 0x80, 0x18, 0xC3, 0xE4, 0x95, 0x5C,
+0xF5, 0x5C, 0xE5, 0x58, 0xD3, 0x95, 0x5C, 0x40, 0x08, 0xE5, 0x58, 0x95, 0x5C, 0xF5, 0x58, 0x80,
+0x03, 0xE4, 0xF5, 0x58, 0xE5, 0x58, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x95, 0xF9, 0x74, 0x40, 0x35,
+0xF0, 0xFA, 0x7B, 0xFF, 0x90, 0xA0, 0xE7, 0x12, 0x45, 0xBE, 0xC3, 0xE5, 0x57, 0x94, 0x0F, 0xE5,
+0x56, 0x94, 0x00, 0x40, 0x02, 0x81, 0x25, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x06,
+0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, 0xF0,
+0x3E, 0xFC, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E,
+0x40, 0x02, 0xA1, 0x8B, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8,
+0xF9, 0xFD, 0xAC, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2D, 0xFF, 0xEE, 0x3C,
+0xFE, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x50,
+0x02, 0xA1, 0x92, 0xE5, 0x53, 0xD3, 0x94, 0x38, 0x50, 0x13, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82,
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x0F, 0x50, 0x02, 0xA1, 0x92, 0xE5, 0x53, 0xD3,
+0x94, 0x3A, 0x50, 0x13, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0,
+0xC3, 0x94, 0x14, 0x50, 0x02, 0xA1, 0x92, 0xE5, 0x53, 0xD3, 0x94, 0x3C, 0x40, 0x02, 0xA1, 0x6B,
+0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x19, 0x50,
+0x02, 0xA1, 0x92, 0xA1, 0x6B, 0xE5, 0x51, 0x70, 0x50, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x90,
+0x00, 0x08, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13,
+0xFF, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0x9D, 0x92, 0x74, 0x01, 0xF0, 0x80, 0x29,
+0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06,
+0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, 0x9F,
+0xEC, 0x9E, 0x40, 0x05, 0xE4, 0x90, 0x9D, 0x92, 0xF0, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56,
+0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, 0x56,
+0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0x25, 0xE0,
+0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, 0x55,
+0xE4, 0xF5, 0x5D, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x75, 0xF0, 0x02, 0xE5, 0x5D, 0xA4, 0xF5,
+0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3,
+0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA0, 0xE7, 0x12, 0x45, 0xB5, 0x85, 0x5D, 0x82, 0x75,
+0x83, 0x00, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55,
+0xEE, 0x35, 0x54, 0xF5, 0x54, 0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xB7, 0x90, 0xA0, 0xE7, 0x12,
+0x45, 0xB5, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0xE5, 0x57, 0xAE, 0x56, 0xA8,
+0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3,
+0xE5, 0x55, 0x9F, 0xE5, 0x54, 0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54, 0x9E,
+0xF5, 0x54, 0x80, 0x05, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x91, 0xF5,
+0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xAE, 0x54, 0xFF,
+0xE4, 0xFC, 0xFD, 0xE5, 0x53, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41,
+0xF5, 0x83, 0x12, 0x45, 0x99, 0xC3, 0x12, 0x45, 0x60, 0x50, 0x07, 0xAF, 0x51, 0x12, 0x9D, 0x90,
+0x80, 0x20, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xD3,
+0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x40, 0x07, 0x7D, 0x01, 0xAF, 0x51, 0x12,
+0x9F, 0x9C, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x91, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xA3,
+0xE0, 0x90, 0xA1, 0x38, 0xF0, 0x90, 0xA1, 0x37, 0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD, 0xFF,
+0x12, 0x9C, 0xD8, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0x02, 0xA8, 0x9B, 0x74, 0x92, 0x25, 0x51, 0xF5,
+0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xE1, 0x30, 0xAD, 0x53,
+0xAF, 0x51, 0x12, 0x9D, 0x4C, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83,
+0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07,
+0xF5, 0x5B, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xC3,
+0x94, 0x30, 0x50, 0x11, 0xE4, 0xF5, 0x5B, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B,
+0xF5, 0x83, 0xE4, 0xC1, 0xB3, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83,
+0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1, 0xDC, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A,
+0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x4D, 0xEF, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x01,
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80,
+0xF8, 0x74, 0x80, 0x98, 0x50, 0x2E, 0xED, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x92, 0x25,
+0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74,
+0x80, 0x98, 0x50, 0x10, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0,
+0x65, 0x53, 0x60, 0x3B, 0xE5, 0x5B, 0x70, 0x05, 0x75, 0x5B, 0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4,
+0x01, 0x05, 0x75, 0x5B, 0x03, 0x80, 0x03, 0x75, 0x5B, 0x05, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82,
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94,
+0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0x80, 0x29, 0x74,
+0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x92, 0x25, 0x51,
+0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74,
+0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x12, 0x25, 0x51,
+0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE5, 0x53, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90,
+0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x03, 0x02, 0xA8,
+0x78, 0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0xF5, 0x5B,
+0x74, 0x92, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0x02, 0xA8, 0x78,
+0xEC, 0x64, 0x06, 0x60, 0x03, 0x02, 0xA8, 0x9B, 0xF5, 0x54, 0xF5, 0x55, 0x75, 0xF0, 0x10, 0xE5,
+0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xD3, 0xE5, 0x57, 0x94,
+0xE8, 0xE5, 0x56, 0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94,
+0xFA, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5,
+0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF,
+0x90, 0x42, 0x24, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA0, 0xF8, 0xEE, 0xF0,
+0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x5A, 0x90, 0xA0, 0xEA, 0x12, 0x45, 0xB5, 0x75, 0xF0, 0x02, 0xE5,
+0x5A, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80,
+0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42, 0x1F, 0x93, 0xFD,
+0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0xC3,
+0x90, 0xA0, 0xF9, 0xE0, 0x95, 0x55, 0x90, 0xA0, 0xF8, 0xE0, 0x95, 0x54, 0x40, 0x07, 0x05, 0x5A,
+0xE5, 0x5A, 0xB4, 0x05, 0xB1, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, 0x24, 0x01, 0xFF,
+0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06, 0xEF, 0x95, 0x5A,
+0xFF, 0x80, 0x02, 0xE4, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83,
+0xE0, 0xC3, 0x13, 0xFE, 0xEF, 0xC4, 0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0x74, 0x01, 0x25, 0x51,
+0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4,
+0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82,
+0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34,
+0x93, 0xF5, 0x83, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x25, 0xE0, 0xFF, 0x70, 0x04, 0xF5, 0x5B,
+0x80, 0x04, 0xEF, 0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA0, 0xEE, 0xE0, 0x94, 0x03, 0x90, 0xA0, 0xED,
+0xE0, 0x94, 0x00, 0x40, 0x03, 0xE4, 0xF5, 0x5B, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01,
+0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF8, 0x90, 0xA0, 0xFA, 0xF0, 0x45, 0x5B, 0xFF, 0xF0, 0x75, 0xF0,
+0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x74, 0x92, 0x25, 0x51, 0xF5,
+0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x92, 0x50, 0x0E, 0x25, 0x51,
+0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, 0x51, 0xF5, 0x82,
+0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xE4, 0xFD, 0xAF, 0x51, 0x11, 0xDA, 0x05, 0x51, 0xE5,
+0x51, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0xA1, 0x23, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0xE4, 0xF0,
+0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0,
+0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0,
+0x0A, 0xEF, 0x90, 0x8D, 0x07, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF,
+0x90, 0x8D, 0x09, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5,
+0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9,
+0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9,
+0xEE, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1,
+0xD9, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x1F, 0xFB,
+0x24, 0xF1, 0x50, 0x02, 0x41, 0x09, 0xE4, 0xF5, 0x6B, 0x90, 0xA1, 0xD9, 0xE0, 0xFD, 0x75, 0xF0,
+0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83,
+0xF5, 0x83, 0xE0, 0xFE, 0xEB, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40,
+0xF5, 0x83, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFC,
+0xEE, 0x5C, 0x90, 0xA1, 0xDC, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9,
+0xE0, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x6B, 0x70, 0x07, 0x90, 0xA1, 0xDC, 0xE0, 0x54,
+0xF0, 0xF0, 0x90, 0xA1, 0xDC, 0xE0, 0xFF, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89,
+0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF,
+0xF0, 0x05, 0x6B, 0xE5, 0x6B, 0x64, 0x07, 0x70, 0x80, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x04,
+0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA1, 0xDA,
+0xF0, 0x75, 0x6C, 0x06, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0,
+0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5,
+0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00,
+0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90,
+0xA1, 0xDB, 0xF0, 0x90, 0xA1, 0xDB, 0xE0, 0x60, 0x41, 0x75, 0x6B, 0x07, 0x74, 0x01, 0x7E, 0x00,
+0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xDB,
+0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x1B, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0x90, 0xA1,
+0xDA, 0xF0, 0xED, 0x60, 0x24, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x1E, 0xE0, 0x24, 0x20, 0xF0, 0x80,
+0x18, 0x15, 0x6B, 0xE5, 0x6B, 0xC3, 0x94, 0x00, 0x50, 0xC2, 0xE5, 0x6C, 0x60, 0x0B, 0x15, 0x6C,
+0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x40, 0x02, 0x41, 0x24, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4,
+0x06, 0x1D, 0xFF, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9,
+0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90,
+0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6C,
+0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA1, 0xDB, 0xF0, 0x90, 0xA1, 0xDB, 0xE0,
+0x60, 0x3C, 0xE4, 0xF5, 0x6B, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33,
+0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xDB, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x18, 0xE5,
+0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0xFC, 0xED, 0x60, 0x1D, 0xEC, 0xD3, 0x94, 0x0B, 0x40,
+0x17, 0x74, 0x20, 0x2C, 0xFC, 0x80, 0x11, 0x05, 0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xC7, 0x05, 0x6C,
+0xE5, 0x6C, 0x64, 0x07, 0x60, 0x02, 0x41, 0xBD, 0x90, 0xA1, 0xDA, 0xE0, 0xFF, 0x90, 0xA1, 0xD9,
+0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x12, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x75, 0xF0, 0x04,
+0xEE, 0x90, 0x96, 0x13, 0x12, 0x45, 0xA9, 0xEC, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00,
+0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3,
+0x9F, 0x40, 0x09, 0x90, 0xA1, 0xDA, 0xE0, 0x4E, 0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C,
+0x50, 0x06, 0xAF, 0x06, 0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA1, 0xD9, 0xE0, 0xFF, 0x24, 0x12, 0xF5,
+0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE5, 0x6D, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x15,
+0x12, 0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x6A, 0x90, 0xA1, 0xD9, 0xE0, 0xFF, 0xE4,
+0xFB, 0xAD, 0x6D, 0x12, 0x7D, 0x73, 0x90, 0xA1, 0xD9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81,
+0x03, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x0F,
+0x74, 0x92, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x23, 0xEE,
+0xC3, 0x94, 0x04, 0x90, 0xA1, 0xD9, 0xE0, 0x40, 0x0E, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x95,
+0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0B, 0x24, 0x92, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83,
+0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x90, 0x00,
+0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x1F, 0xF5, 0x53, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13,
+0x54, 0x01, 0xF5, 0x52, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF,
+0x54, 0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x40,
+0xC4, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x55, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01,
+0xF5, 0x56, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F,
+0xF5, 0x59, 0xEF, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x54, 0x01, 0xC4,
+0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45,
+0xA9, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF,
+0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xBF, 0x4F, 0xF0,
+0xE5, 0x59, 0x60, 0x02, 0xA1, 0x80, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51,
+0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0xFF,
+0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0x4F, 0xF0,
+0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12, 0x45,
+0xA9, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75,
+0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x14, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0xE5,
+0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x15, 0x12,
+0x45, 0xA9, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99,
+0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x12, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5,
+0x83, 0xE0, 0xFF, 0xE5, 0x5A, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58,
+0x85, 0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08,
+0xE5, 0x51, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x58, 0xF5, 0x82, 0xE4, 0x35,
+0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, 0x04, 0xD4, 0xAF, 0x51, 0x31, 0x67,
+0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x40, 0xF0, 0x22,
+0x7F, 0x84, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x5B, 0xEE, 0xF0,
+0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA1, 0x65, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x5D, 0x12,
+0x45, 0x71, 0x12, 0x08, 0x3A, 0x90, 0xA1, 0x65, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04,
+0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA1, 0x5D, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x61, 0x12,
+0x45, 0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53,
+0x90, 0xA1, 0x69, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x69, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12,
+0x08, 0x6D, 0x90, 0xA1, 0x5B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92,
+0xAF, 0x22, 0x90, 0xA0, 0x2D, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13,
+0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x0C, 0xED, 0xF0, 0xEF,
+0x14, 0x60, 0x02, 0xE1, 0x1E, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA2, 0x0C, 0xE0,
+0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA1,
+0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00,
+0x00, 0x01, 0x7F, 0x00, 0x7E, 0x08, 0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00,
+0x00, 0x01, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09,
+0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA2, 0x0C, 0xE0,
+0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78,
+0x04, 0x12, 0x08, 0x5A, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0A, 0xB1, 0x94,
+0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA2, 0x0C, 0xE0, 0xFF, 0xE4,
+0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0x12, 0x08, 0x5A, 0x90, 0xA1, 0x61,
+0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0D, 0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x0C,
+0x00, 0x00, 0x00, 0x90, 0xA2, 0x0C, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF,
+0xE4, 0x78, 0x1A, 0x12, 0x08, 0x5A, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08,
+0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x61, 0x12,
+0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xB1, 0x90, 0x90, 0xA1, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00,
+0x0C, 0x00, 0x90, 0xA1, 0x4F, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x65, 0x90, 0x06,
+0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90,
+0xA1, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0xB1, 0x94, 0x90,
+0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x79, 0x00,
+0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0xB1, 0x94, 0x90, 0xA1, 0x5D, 0x12, 0x08, 0x79, 0x00,
+0x00, 0x0C, 0x00, 0x90, 0xA1, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0xB1, 0x90, 0x90,
+0xA1, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA1, 0x4F, 0x12, 0x08, 0x79, 0x00,
+0x00, 0x0C, 0x00, 0xF1, 0x94, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA1,
+0x4F, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x90, 0xA1, 0x49, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA1, 0x48, 0xEF, 0xF0, 0xA3, 0xA3,
+0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA1, 0x53, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x4B, 0x12, 0x45,
+0x71, 0x12, 0x08, 0x3A, 0x90, 0xA1, 0x53, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04, 0xC0,
+0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA1, 0x4B, 0x12, 0x45, 0x71, 0x90, 0xA1, 0x4F, 0x12, 0x45,
+0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90,
+0xA1, 0x57, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x49, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA1, 0x57,
+0x12, 0x45, 0x71, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0x48, 0xE0, 0xFF, 0xD0, 0x05,
+0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
+0xA1, 0xDD, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x30, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02,
+0xF5, 0x72, 0x80, 0x08, 0x90, 0xA1, 0xDD, 0xE0, 0x24, 0xFE, 0xF5, 0x72, 0x90, 0xA1, 0x4B, 0x12,
+0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x12, 0xAF, 0x8A, 0x90, 0xA1, 0x4B, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x80, 0x21, 0x90, 0xA1, 0x4B, 0x12, 0x08, 0x79, 0x00,
+0x00, 0x00, 0xFF, 0x90, 0xA1, 0xDD, 0xE0, 0xFF, 0x12, 0xAF, 0x8A, 0x90, 0xA1, 0x4B, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA1, 0xDD, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA1,
+0x4F, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0x12, 0xAF, 0x9A, 0xD0, 0xD0, 0x92,
+0xAF, 0x22, 0xC3, 0xEF, 0x9D, 0xF5, 0x56, 0xC3, 0x94, 0x08, 0x50, 0x24, 0xE4, 0xF5, 0x57, 0x75,
+0xF0, 0x0E, 0xEB, 0x90, 0xA0, 0x30, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA0, 0xEF,
+0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xE5, 0x56, 0xF0, 0x80, 0x46,
+0xE5, 0x56, 0xC3, 0x94, 0x10, 0x50, 0x09, 0x75, 0x57, 0x01, 0xE5, 0x56, 0x24, 0xF8, 0x80, 0x17,
+0xE5, 0x56, 0xC3, 0x94, 0x18, 0x50, 0x09, 0x75, 0x57, 0x02, 0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07,
+0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8, 0xFF, 0x75, 0xF0, 0x0E, 0xEB, 0x90, 0xA0, 0x30, 0x12,
+0x45, 0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA0, 0xEF, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0,
+0x03, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xAF, 0x57, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, 0x03, 0x74,
+0x1F, 0xC3, 0x95, 0x54, 0x40, 0x14, 0x90, 0xA0, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0xE4, 0xFD, 0x11,
+0x92, 0x90, 0xA0, 0xEB, 0xEF, 0xF0, 0x24, 0xD4, 0x80, 0x55, 0x74, 0x3F, 0xC3, 0x95, 0x54, 0x40,
+0x16, 0x90, 0xA0, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x20, 0xAF, 0x54, 0x11, 0x92, 0x90, 0xA0,
+0xEB, 0xEF, 0xF0, 0x24, 0x88, 0x80, 0x38, 0x74, 0x5F, 0xC3, 0x95, 0x54, 0x40, 0x16, 0x90, 0xA0,
+0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x40, 0xAF, 0x54, 0x11, 0x92, 0x90, 0xA0, 0xEB, 0xEF, 0xF0,
+0x24, 0xD0, 0x80, 0x1B, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x30, 0x90, 0xA0, 0xEF, 0xEE, 0xF0,
+0xAB, 0x55, 0x7D, 0x60, 0xAF, 0x54, 0x11, 0x92, 0x90, 0xA0, 0xEB, 0xEF, 0xF0, 0x24, 0x84, 0xFD,
+0xE4, 0x34, 0x04, 0xFC, 0x75, 0xF0, 0x0E, 0xE5, 0x55, 0x90, 0xA0, 0x2E, 0x12, 0x45, 0xA9, 0x75,
+0xF0, 0x03, 0xEE, 0x12, 0x45, 0xA9, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0x90, 0xA0, 0x29, 0xE0,
+0x30, 0xE0, 0x35, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0x90, 0xA0, 0x34, 0x12, 0x45,
+0xA9, 0xE0, 0xFE, 0x30, 0xE0, 0x22, 0x75, 0xF0, 0x0E, 0xEF, 0x90, 0xA0, 0x34, 0x12, 0x45, 0xA9,
+0xEE, 0x54, 0xFE, 0xF0, 0x90, 0xA0, 0x2B, 0x74, 0x05, 0xF0, 0x90, 0xA0, 0x29, 0xE0, 0xC3, 0x13,
+0x54, 0x07, 0xFD, 0x7F, 0x01, 0x12, 0x4D, 0x68, 0x22, 0x7B, 0x01, 0x7A, 0xA0, 0x79, 0xDB, 0x7F,
+0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0xA0, 0xDB, 0xE0, 0x54, 0x30, 0xFF,
+0xBF, 0x20, 0x07, 0x90, 0xA0, 0x56, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x56, 0xF0, 0x22,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA0,
+0xDE, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0xA0, 0xE2, 0x12, 0x08,
+0x6D, 0x90, 0xA0, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF,
+0x60, 0x24, 0x90, 0xA0, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA0, 0xDE,
+0x12, 0x08, 0x6D, 0x90, 0xA0, 0xDE, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F,
+0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0xA0, 0xE2, 0x12, 0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF,
+0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA0, 0xE2, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE,
+0xFF, 0xEC, 0x90, 0xA0, 0xE2, 0x12, 0x08, 0x6D, 0x90, 0xA0, 0xE2, 0x12, 0x45, 0x71, 0x90, 0xAA,
+0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0x0E, 0x12, 0x08, 0xAA, 0x90,
+0x9F, 0x0E, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0C,
+0xF0, 0x22, 0x7D, 0x1F, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0,
+0x90, 0x9F, 0x11, 0x74, 0x04, 0xF0, 0x22, 0x71, 0xEB, 0x80, 0xE7, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
+0xC0, 0xD0, 0x90, 0x9F, 0x11, 0xE0, 0x90, 0xA2, 0x0D, 0xF0, 0x6F, 0x70, 0x02, 0x61, 0xD8, 0xEF,
+0x14, 0x60, 0x46, 0x14, 0x60, 0x72, 0x14, 0x70, 0x02, 0x61, 0x83, 0x14, 0x70, 0x02, 0x61, 0xAF,
+0x24, 0x04, 0x60, 0x02, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0x4F, 0xEC,
+0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x4F, 0xDD, 0x61, 0xD8, 0x90, 0xA2,
+0x0D, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0x4F, 0xF1, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0x64, 0x01,
+0x60, 0x02, 0x61, 0xD8, 0x12, 0x4F, 0xDF, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x04, 0x04,
+0x91, 0x1F, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x4F, 0xB9, 0x61, 0xD8,
+0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0x4F, 0xF5, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0,
+0x60, 0x02, 0x61, 0xD8, 0x71, 0xEB, 0x61, 0xD8, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x04, 0x04, 0x91,
+0x0C, 0x80, 0x75, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x01, 0x04, 0x71, 0xDF, 0x80, 0x6A, 0x90, 0xA2,
+0x0D, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0x02, 0x80, 0x5F, 0x90, 0xA2, 0x0D, 0xE0, 0x70, 0x59, 0x71,
+0xDD, 0x80, 0x55, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x04, 0x04, 0x91, 0x33, 0x80, 0x4A, 0x90, 0xA2,
+0x0D, 0xE0, 0xB4, 0x01, 0x04, 0x71, 0xF4, 0x80, 0x3F, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x02, 0x05,
+0x12, 0x5F, 0xB5, 0x80, 0x33, 0x90, 0xA2, 0x0D, 0xE0, 0x70, 0x2D, 0x71, 0xF2, 0x80, 0x29, 0x90,
+0xA2, 0x0D, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0x48, 0x80, 0x1E, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x01,
+0x04, 0x51, 0xB2, 0x80, 0x13, 0x90, 0xA2, 0x0D, 0xE0, 0xB4, 0x02, 0x04, 0x91, 0x5D, 0x80, 0x08,
+0x90, 0xA2, 0x0D, 0xE0, 0x70, 0x02, 0x51, 0xC7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x71, 0xEB, 0x7D,
+0x20, 0x12, 0x46, 0xF8, 0x90, 0x9F, 0x11, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x9F, 0x11, 0x74, 0x01,
+0xF0, 0x22, 0x71, 0xEB, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x9F, 0x11, 0x74, 0x03,
+0xF0, 0x22, 0x12, 0x46, 0xFD, 0x90, 0x9F, 0x11, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0,
+0x44, 0x40, 0xF0, 0x7D, 0x23, 0x12, 0x46, 0xF8, 0x90, 0x9F, 0x11, 0x74, 0x02, 0xF0, 0x22, 0xE4,
+0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x9F, 0x11, 0x74,
+0x01, 0xF0, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x5C, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40,
+0xF0, 0x90, 0x9F, 0x11, 0x74, 0x03, 0xF0, 0x22, 0x7D, 0x25, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90,
+0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x9F, 0x11, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x5D, 0x10,
+0x7D, 0x24, 0x7F, 0x6F, 0x12, 0x49, 0x5C, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x9F,
+0x11, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01, 0x3C,
+0x74, 0x02, 0xF0, 0x90, 0x9F, 0x13, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xEF,
+0x54, 0xFB, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x9F, 0x20, 0xE0, 0x04,
+0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x9F, 0xB6, 0xE0, 0xFF, 0x90, 0x9F, 0x20,
+0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0x90, 0x9E, 0x8D, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0x9F, 0x14, 0xE0,
+0x54, 0xFB, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA1, 0x05, 0xF0, 0xE0, 0xFD, 0x54, 0xC0,
+0x70, 0x09, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x7F, 0xED, 0x30, 0xE6, 0x4E, 0x90,
+0x9F, 0x17, 0xE0, 0x64, 0x02, 0x70, 0x2B, 0x90, 0x9F, 0x13, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0,
+0x09, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x29, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F,
+0x64, 0x01, 0x70, 0x30, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x4B, 0x56,
+0x80, 0x22, 0x90, 0x9F, 0x1B, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x9F, 0x15, 0xE0, 0x54, 0x0F, 0x64,
+0x02, 0x60, 0x05, 0x12, 0x77, 0x62, 0x80, 0x0C, 0x12, 0x4F, 0x9B, 0x80, 0x07, 0x90, 0x9F, 0x1B,
+0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0x05, 0xE0, 0x90, 0x9F, 0x1B, 0x30, 0xE7, 0x1B, 0xE0, 0x44,
+0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0x9F, 0xB7, 0xE0, 0x90, 0xA1, 0xAF, 0x12, 0x48,
+0x1F, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x9F,
+0x13, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90,
+0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xAE, 0xF0,
+0x90, 0x9F, 0xB8, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0xA1, 0xAF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F,
+0x58, 0x7E, 0x01, 0x12, 0x48, 0x27, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x9F,
+0xCA, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0x9F, 0xDC, 0xE0, 0x70, 0x60, 0x90, 0x9F, 0x19, 0xE0, 0xD3,
+0x94, 0x00, 0x50, 0x57, 0x90, 0x9F, 0xBC, 0xE0, 0x60, 0x4E, 0x80, 0x4F, 0x12, 0x57, 0xF0, 0xEF,
+0x64, 0x01, 0x70, 0x47, 0x90, 0x9F, 0x1B, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x9F, 0x19,
+0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x9F, 0x1B, 0xE0, 0x20,
+0xE4, 0x29, 0x90, 0x9F, 0x14, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x9F, 0xBC,
+0xE0, 0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0,
+0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x60,
+0x3B, 0x90, 0x9E, 0x8D, 0xE0, 0x64, 0x01, 0x70, 0x33, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xFE, 0xF0,
+0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x49, 0x5C, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x7D, 0x08,
+0xE4, 0xFF, 0x12, 0x49, 0x72, 0xBF, 0x01, 0x14, 0x90, 0x9F, 0x13, 0xE0, 0x44, 0x40, 0xF0, 0x7D,
+0x06, 0x7F, 0x01, 0x12, 0x54, 0x47, 0x90, 0x9F, 0x12, 0x74, 0x06, 0xF0, 0x22, 0x7D, 0x2E, 0x7F,
+0x6F, 0x12, 0x49, 0x5C, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x54, 0x47, 0x90, 0x05, 0x27, 0xE0, 0x54,
+0xBF, 0xF0, 0x90, 0x9F, 0x12, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0x7D,
+0x04, 0x7F, 0x01, 0x12, 0x54, 0x47, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x9F, 0x12,
+0x74, 0x04, 0xF0, 0x22, 0x90, 0x9F, 0x13, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11,
+0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80,
+0x29, 0x90, 0x9F, 0x20, 0xE0, 0x04, 0xF0, 0x90, 0x9F, 0x1B, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x9F,
+0xB6, 0xE0, 0xFF, 0x90, 0x9F, 0x20, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x9E, 0x8D, 0xE0, 0xB4,
+0x01, 0x0B, 0x90, 0x9F, 0x14, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x52, 0x28, 0x22, 0x7E, 0x00,
+0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x9F, 0x79, 0xBD, 0x02, 0x08, 0xAA, 0x90, 0xA1, 0xBD,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D,
+0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6,
+0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x90, 0xA1, 0xBB, 0xE0, 0xFF, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x11, 0xEF, 0xF0, 0x90, 0x9D, 0x9B, 0xE0, 0xFF, 0x90,
+0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x49, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0xA2,
+0x11, 0xE0, 0x70, 0x3B, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x12, 0x54,
+0x3F, 0x80, 0x26, 0x90, 0x9F, 0x1A, 0xE0, 0x64, 0x06, 0x70, 0x24, 0x90, 0xA2, 0x11, 0xE0, 0x60,
+0x1E, 0x90, 0x9F, 0x13, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0,
+0x44, 0x80, 0xF0, 0x90, 0x9F, 0x1A, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5C, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9D, 0x9E, 0xE0, 0xFF, 0xE4, 0xFB, 0x7D, 0x01, 0x12, 0x4A, 0xB0,
+0x90, 0xA1, 0xC2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xC0, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xAB, 0x07, 0x90, 0xA2, 0x12, 0xED, 0xF0, 0xEC, 0xF9,
+0xE0, 0xFF, 0xAE, 0x03, 0x74, 0x2A, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0,
+0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE9, 0xF0, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10,
+0xED, 0xF0, 0xAF, 0x06, 0x22, 0x00, 0x31, 0x18
+};
+u4Byte ArrayLength_MP_8723B_FW_NIC = 30808;
+
+
+
+void
+ODM_ReadFirmware_MP_8723B_FW_NIC(
+ IN PDM_ODM_T pDM_Odm,
+ OUT u1Byte *pFirmware,
+ OUT u4Byte *pFirmwareSize
+)
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
+ *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8723B_FW_NIC;
+#else
+ ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8723B_FW_NIC, ArrayLength_MP_8723B_FW_NIC);
+#endif
+ *pFirmwareSize = ArrayLength_MP_8723B_FW_NIC;
+}
+
+// v27.01 20140429 by Isaachsu <isaachsu@realtek.com>
+u1Byte Array_MP_8723B_FW_WoWLAN[] = {
+0x01, 0x53, 0x30, 0x00, 0x1B, 0x00, 0x01, 0x00, 0x04, 0x29, 0x13, 0x46, 0x2C, 0x6C, 0x00, 0x00,
+0xD1, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x02, 0x48, 0x94, 0x02, 0x67, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x68, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x6E, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x68, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x6A, 0x02, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x6E, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED, 0x39, 0xFD, 0xEC, 0x38, 0xFC, 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, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE,
+0xED, 0x59, 0xFD, 0xEC, 0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD,
+0xEC, 0x48, 0xFC, 0x22, 0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0,
+0xE8, 0x9C, 0x45, 0xF0, 0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
+0x22, 0xE0, 0xF8, 0xA3, 0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82,
+0xF5, 0x82, 0xE5, 0xF0, 0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0,
+0xF9, 0x22, 0xEB, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8,
+0xE4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93,
+0xF5, 0x82, 0x88, 0x83, 0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80,
+0xDF, 0xE3, 0xF5, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, 0xE3, 0xF5,
+0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, 0xE6, 0x08,
+0xB5, 0xF0, 0x52, 0xDF, 0xF6, 0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x46, 0xDF,
+0xF6, 0x80, 0x42, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x36, 0xDF,
+0xF6, 0x80, 0x32, 0x88, 0x82, 0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, 0x25,
+0xDF, 0xF5, 0x80, 0x21, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0,
+0x14, 0xDF, 0xF5, 0x80, 0x10, 0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, 0x93, 0xA3,
+0xB5, 0xF0, 0x02, 0xDF, 0xF4, 0x02, 0x45, 0x70, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, 0x80, 0xD4,
+0x80, 0x3E, 0x80, 0x15, 0x80, 0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, 0x80, 0xA3,
+0x80, 0x51, 0x80, 0x74, 0x80, 0x3C, 0x02, 0x45, 0x7C, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4,
+0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8,
+0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, 0x80, 0x70,
+0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, 0xDF, 0xF4,
+0x80, 0x5E, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x51, 0xDF,
+0xF5, 0x80, 0x4D, 0x89, 0x82, 0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x40,
+0xDF, 0xF5, 0x80, 0x3C, 0x89, 0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5,
+0xF0, 0x2E, 0xDF, 0xF4, 0x80, 0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA,
+0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8,
+0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0x00,
+0x7F, 0xFF, 0xB5, 0xF0, 0x02, 0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, 0x8A, 0x83,
+0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3,
+0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, 0xE3, 0x80,
+0xCF, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC,
+0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0,
+0xAF, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xAB,
+0xED, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00,
+0x50, 0x8E, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x44, 0xB8, 0x73, 0xC2, 0xAF, 0x80, 0xFE, 0x32,
+0x12, 0x45, 0xEF, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0, 0xC2, 0x8C, 0xE5, 0x8A, 0x24,
+0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C, 0xEC, 0x24, 0x87, 0xF8, 0xE6,
+0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00, 0x40, 0xCE, 0x79, 0x03, 0x78,
+0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1, 0x03, 0x44, 0x18, 0xF6, 0xD2,
+0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF, 0x23, 0x24, 0x81, 0xF8, 0x0F,
+0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30, 0xE4, 0xF2, 0x00, 0xE5, 0x0C,
+0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8, 0xE6, 0xFD, 0xA6, 0x81, 0x08,
+0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8, 0x6D, 0x60, 0xE0, 0x08, 0xE6,
+0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5, 0x0C, 0x24, 0x87, 0xF8, 0xE6,
+0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD, 0xF8, 0xE5, 0x81, 0x6D, 0x60,
+0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86, 0xC8, 0xF6, 0x15, 0x0C, 0x80,
+0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF, 0xE6, 0x30, 0xE0, 0x03, 0x10,
+0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F, 0x08, 0x54, 0xF4, 0x54, 0x7C,
+0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6, 0x81, 0x74, 0x02, 0x60, 0x06,
+0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80, 0xF6, 0x08, 0xF6, 0x08, 0xDF,
+0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x49, 0x33, 0x74, 0x01, 0x93, 0xC0, 0xE0, 0xE4, 0x93, 0xC0,
+0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2, 0x8C, 0xD2, 0xAF, 0x22, 0x02,
+0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81, 0x2F, 0x2F, 0xF8, 0xE6, 0x20,
+0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE, 0x0C, 0xEE, 0xC3, 0x9F, 0x50,
+0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18, 0xBE, 0x02, 0x02, 0x74, 0xFF,
+0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09, 0x09, 0x80, 0xF3, 0x16, 0x16,
+0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81, 0xEE, 0xD3, 0x9F, 0x40, 0x22,
+0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02, 0xA9, 0x81, 0x18, 0x06, 0x06,
+0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09, 0xF7, 0x19, 0x80, 0xF3, 0x1E,
+0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F, 0x04, 0x90, 0x49, 0x33, 0x93,
+0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F,
+0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x54, 0x8C,
+0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F, 0xF8, 0xE6, 0xF5, 0x81, 0x02,
+0x46, 0x38, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18,
+0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C, 0x60, 0x08, 0xA8, 0x05, 0xE7,
+0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5, 0x0C, 0xB5, 0x07, 0xE3, 0x7F,
+0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01, 0x0F, 0x74, 0x86, 0x2F, 0xF8,
+0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC, 0x81, 0xED, 0x6C, 0x60, 0x08,
+0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5, 0x07, 0xDE, 0x89, 0x81, 0x7F,
+0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8,
+0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4, 0xD2, 0xE2, 0xC6, 0xD2, 0xAF,
+0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x46, 0x37, 0x8F, 0xF0, 0xE4, 0xFF, 0xFE, 0xE5, 0x0C,
+0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08, 0xE6, 0x60, 0x0B, 0x2D, 0xF6,
+0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6, 0x60, 0x25, 0x7E, 0x02, 0x08,
+0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30, 0xE2, 0x0C, 0xD2, 0xAF, 0x7F,
+0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC, 0x4E, 0xF6, 0xD2, 0xAF, 0x02,
+0x46, 0x38, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF, 0x56, 0xC6, 0xD2, 0xAF, 0x54,
+0x80, 0x4F, 0xFF, 0x22, 0x02, 0x48, 0xD2, 0x02, 0x46, 0xC8, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93,
+0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8,
+0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04,
+0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
+0x40, 0x80, 0x90, 0x49, 0x17, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30,
+0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0,
+0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8,
+0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83,
+0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0x95, 0x7B, 0x00, 0x41, 0x95, 0x7C, 0x00,
+0x41, 0x95, 0x8E, 0x00, 0x41, 0x94, 0xD0, 0x00, 0x41, 0x94, 0xB2, 0x00, 0x44, 0x95, 0x6E, 0x00,
+0x50, 0xF2, 0x01, 0x4C, 0x9B, 0x58, 0x40, 0x5F, 0xF4, 0x7F, 0x02, 0x51, 0xE7, 0xEF, 0x44, 0x01,
+0xFD, 0x7F, 0x02, 0x31, 0x4F, 0x7F, 0x02, 0x51, 0xE7, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E,
+0x00, 0x12, 0x3E, 0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
+0x90, 0x95, 0x56, 0xEF, 0xF0, 0x90, 0x95, 0x58, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0x41, 0x54, 0x90,
+0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90, 0x95, 0x58,
+0xE0, 0x70, 0x47, 0x7F, 0x67, 0x51, 0xE7, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x31, 0x4F, 0x90,
+0x95, 0x56, 0xE0, 0x70, 0x2C, 0x90, 0x95, 0x59, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x0F, 0x12,
+0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, 0x51, 0xD7, 0xEF, 0x54, 0xFE, 0x80, 0x0E, 0x12, 0x37,
+0x4E, 0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0x51, 0xD7, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x31,
+0x4F, 0x7F, 0x4E, 0x51, 0xE7, 0xEF, 0x44, 0x80, 0x41, 0xC1, 0x7F, 0x67, 0x51, 0xE7, 0xEF, 0x44,
+0x20, 0xFD, 0x7F, 0x67, 0x31, 0x4F, 0x90, 0x95, 0x56, 0xE0, 0x70, 0x18, 0x7F, 0x48, 0x7E, 0x09,
+0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E,
+0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x51, 0xE7, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x31, 0x4F,
+0x7F, 0x4F, 0x51, 0xE7, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0x31, 0x4F, 0x7F, 0x30, 0x7E, 0x09,
+0x12, 0x37, 0x4E, 0xE4, 0x74, 0x66, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30,
+0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF,
+0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12,
+0x38, 0x45, 0x80, 0x7E, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x44,
+0x18, 0xF0, 0x90, 0x95, 0x56, 0xE0, 0x70, 0x52, 0x90, 0x95, 0x58, 0xE0, 0x60, 0x17, 0x7F, 0x67,
+0x51, 0xE7, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x31, 0x4F, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37,
+0x4E, 0xE4, 0xFF, 0x80, 0x26, 0x7F, 0x67, 0x51, 0xE7, 0xEF, 0x54, 0xDF, 0xFD, 0x7F, 0x67, 0x31,
+0x4F, 0x90, 0x95, 0x59, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x0B, 0x12, 0x37, 0x4E, 0xE4, 0x74,
+0x80, 0xFF, 0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9,
+0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x51, 0xE7, 0xEF, 0x54,
+0x7F, 0xFD, 0x7F, 0x4E, 0x31, 0x4F, 0x7F, 0x4F, 0x51, 0xE7, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x4F,
+0x31, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48,
+0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82,
+0x75, 0x83, 0x00, 0xE0, 0x90, 0x95, 0x89, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90,
+0x95, 0x89, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0xFF,
+0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x01, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x90, 0x95, 0x84, 0xED, 0xF0, 0x90, 0x95, 0x83, 0xEF, 0xF0, 0xD3, 0x94, 0x07, 0x50, 0x6D,
+0x7F, 0x47, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02,
+0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0x31, 0x4F, 0x7F, 0x46, 0x51, 0xE7, 0x90,
+0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F,
+0xFD, 0x7F, 0x46, 0x31, 0x4F, 0x90, 0x95, 0x84, 0xE0, 0x60, 0x17, 0x7F, 0x45, 0x51, 0xE7, 0x90,
+0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F,
+0x80, 0x16, 0x7F, 0x45, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08,
+0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x75, 0x90, 0x95, 0x83,
+0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8,
+0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x31, 0x4F, 0x7F,
+0x62, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3,
+0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0x31, 0x4F, 0x90, 0x95, 0x84, 0xE0, 0x60, 0x1A, 0x7F,
+0x61, 0x51, 0xE7, 0x90, 0x95, 0x83, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3,
+0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x19, 0x7F, 0x61, 0x51, 0xE7, 0x90, 0x95, 0x83,
+0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD,
+0x7F, 0x61, 0x31, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x12, 0x52, 0xA5, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0x4B, 0xE0, 0xFF, 0x90, 0x8F, 0x4A, 0xE0, 0xFB, 0x90,
+0x8F, 0x4C, 0xE0, 0x90, 0x95, 0x59, 0xF0, 0x7D, 0x01, 0x31, 0x69, 0x12, 0x57, 0xF8, 0x31, 0x45,
+0x31, 0x39, 0x31, 0x39, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90,
+0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0x51, 0xE7, 0xE5,
+0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x51, 0xE7, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x51,
+0xE7, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x51, 0xE7, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD,
+0x11, 0x7F, 0x54, 0x31, 0x4F, 0xAD, 0x12, 0x7F, 0x55, 0x31, 0x4F, 0xAD, 0x13, 0x7F, 0x56, 0x31,
+0x4F, 0xAD, 0x14, 0x7F, 0x57, 0x31, 0x4F, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, 0x51, 0xE7, 0xEF,
+0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x31, 0x4F, 0x7F, 0x80, 0x51, 0xE7, 0xEF, 0x44, 0x80, 0xFD, 0x7F,
+0x80, 0x31, 0x4F, 0x12, 0x7A, 0x52, 0x12, 0x3E, 0x11, 0xF1, 0xF2, 0x12, 0x7A, 0xAD, 0x7F, 0x01,
+0x12, 0x47, 0x00, 0x90, 0x93, 0x88, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x47, 0x00, 0x90, 0x93, 0x88,
+0xE0, 0x04, 0xF0, 0xB1, 0x06, 0x12, 0x72, 0xE4, 0x7F, 0x80, 0x51, 0xE7, 0xEF, 0x44, 0x40, 0xFD,
+0x7F, 0x80, 0x31, 0x4F, 0x75, 0x28, 0xFF, 0xF1, 0xF5, 0x12, 0x7A, 0x7D, 0x12, 0x80, 0x0B, 0x7F,
+0x81, 0x51, 0xE7, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x31, 0x4F, 0x12, 0x7A, 0xBB, 0x12, 0x88,
+0xAB, 0xE4, 0xFF, 0x02, 0x47, 0x89, 0xF1, 0x1C, 0x90, 0x8D, 0x06, 0xEF, 0xF0, 0xD1, 0xB1, 0x90,
+0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x17, 0x51, 0xE7,
+0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x31, 0x4F, 0x7F, 0x16, 0x51, 0xE7, 0xEF, 0x54,
+0x0F, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x31, 0x4F, 0x7F, 0x38, 0x51, 0xE7, 0xEF, 0x44, 0x40, 0xFD,
+0x7F, 0x38, 0x31, 0x4F, 0x02, 0x37, 0x99, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E,
+0x8E, 0xE0, 0xFD, 0x7F, 0x93, 0x31, 0x4F, 0x90, 0x8E, 0x85, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F,
+0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F,
+0x08, 0x51, 0xE7, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x31, 0x4F, 0x7F, 0x01, 0xF1, 0xFC, 0x7F,
+0x90, 0x51, 0xE7, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x31, 0x4F, 0x7F, 0x14, 0x7E, 0x00, 0x02,
+0x3E, 0x50, 0xAD, 0x07, 0x90, 0x8F, 0x33, 0xE0, 0x75, 0xF0, 0x40, 0xA4, 0xFF, 0x90, 0x95, 0x6A,
+0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x8F, 0x34, 0xE0, 0xC3, 0x13, 0x54,
+0x7F, 0x90, 0x95, 0x6D, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x62, 0x90, 0x95, 0x6A, 0xE0,
+0x70, 0x02, 0xA3, 0xE0, 0x60, 0x0B, 0x90, 0x95, 0x6A, 0x74, 0xFF, 0x75, 0xF0, 0xD0, 0x12, 0x08,
+0xD6, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54,
+0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x71, 0x1A, 0x71, 0x09, 0x90, 0x8F, 0x34, 0xE0,
+0x30, 0xE0, 0x6F, 0x90, 0x95, 0x6A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E, 0x50, 0x90, 0x8F,
+0x32, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00,
+0x20, 0xE0, 0x02, 0x7D, 0x01, 0x71, 0x1A, 0xE4, 0x90, 0x95, 0x6C, 0xF0, 0x90, 0x95, 0x6D, 0xE0,
+0xFF, 0x90, 0x95, 0x6C, 0xE0, 0xC3, 0x9F, 0x50, 0x39, 0x90, 0x95, 0x6A, 0xE0, 0xFE, 0xA3, 0xE0,
+0xFF, 0x12, 0x3E, 0x50, 0x71, 0x09, 0x90, 0x95, 0x6A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E,
+0x50, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54,
+0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x71, 0x1A, 0x90, 0x95, 0x6C, 0xE0, 0x04, 0xF0,
+0x80, 0xBA, 0x22, 0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F,
+0x50, 0x31, 0x4F, 0xAD, 0x0E, 0x7F, 0x51, 0x31, 0x4F, 0xAD, 0x0F, 0x7F, 0x52, 0x31, 0x4F, 0xAD,
+0x10, 0x7F, 0x53, 0x21, 0x4F, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
+0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x31, 0x4F, 0xE4,
+0xFD, 0x7F, 0x51, 0x31, 0x4F, 0xE4, 0xFD, 0x7F, 0x52, 0x31, 0x4F, 0xE4, 0xFD, 0x7F, 0x53, 0x21,
+0x4F, 0xD1, 0x85, 0xD1, 0xBD, 0x12, 0x7A, 0x14, 0x12, 0x7A, 0x33, 0x80, 0xA6, 0x90, 0x01, 0x34,
+0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3,
+0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54, 0x31, 0x4F, 0x7D, 0xFF, 0x7F, 0x55, 0x31, 0x4F, 0x7D, 0xFF,
+0x7F, 0x56, 0x31, 0x4F, 0x7D, 0xFF, 0x7F, 0x57, 0x21, 0x4F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x7F, 0x8F, 0x51, 0xE7, 0xEF, 0x30, 0xE6, 0x1E, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x26, 0x7F,
+0x8D, 0x51, 0xE7, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x27, 0x7F, 0x8F, 0x51, 0xE7, 0xEF, 0x30, 0xE0,
+0x06, 0xE4, 0xFD, 0x7F, 0x8D, 0x31, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xF4, 0x51, 0xE7,
+0xEF, 0x20, 0xE5, 0x0D, 0x7F, 0xF4, 0x51, 0xE7, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02,
+0x22, 0x7F, 0x03, 0x22, 0xF1, 0xD4, 0x7F, 0x08, 0x51, 0xE7, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08,
+0x31, 0x4F, 0xE4, 0xFF, 0xF1, 0xFC, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x7F, 0x01,
+0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x51, 0xE7, 0xEF, 0x20, 0xE6, 0x0C, 0x7F, 0x05, 0x51,
+0xE7, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x05, 0x31, 0x4F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06,
+0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x90, 0x8F, 0x4B, 0xE0, 0xFF, 0x90,
+0x8F, 0x4A, 0xE0, 0xFB, 0x90, 0x8F, 0x4C, 0xE0, 0x90, 0x95, 0x59, 0xF0, 0xE4, 0xFD, 0x31, 0x69,
+0x7F, 0x02, 0x51, 0xE7, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x31, 0x4F, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xB1, 0x47, 0xF1, 0x34, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0x90, 0x8E, 0x87, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x08, 0x12, 0x9E, 0x3A, 0xBF, 0x01,
+0x02, 0xF1, 0xB1, 0x22, 0x90, 0x01, 0xC4, 0x74, 0xD4, 0xF0, 0x74, 0x4F, 0xA3, 0xF0, 0x7F, 0x90,
+0x51, 0xE7, 0xEF, 0x20, 0xE0, 0xF8, 0x74, 0xD4, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x4F, 0xA3,
+0xF0, 0x22, 0x22, 0xC1, 0xEA, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x85, 0x22, 0x90, 0x95, 0x78, 0xEF,
+0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F,
+0x01, 0x90, 0x95, 0x78, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0x95, 0x7A, 0xE0, 0x94, 0x88, 0x90,
+0x95, 0x79, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90,
+0x95, 0x79, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50,
+0xD3, 0x90, 0x95, 0x7A, 0xE0, 0x94, 0x32, 0x90, 0x95, 0x79, 0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90,
+0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0xF0, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8F, 0x24,
+0xE0, 0x90, 0x95, 0x44, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x3F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x43, 0xE0, 0xF5,
+0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0x95, 0x3F, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5,
+0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8E,
+0x84, 0xE0, 0x60, 0x29, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x21, 0x90, 0x8E, 0x8B, 0xF0,
+0x04, 0x60, 0x1A, 0x90, 0x8E, 0x88, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90,
+0x8E, 0x8C, 0x11, 0x60, 0x90, 0x8E, 0x87, 0xE0, 0x20, 0xE2, 0x02, 0x11, 0xCE, 0x22, 0x7D, 0x01,
+0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x91, 0xED, 0xF0, 0x90, 0x8E,
+0x80, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x41, 0x19, 0xEE, 0xC4, 0x13,
+0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x41, 0x19, 0x90, 0x8E, 0x87, 0xE0, 0xFE, 0x6F, 0x70,
+0x02, 0x41, 0x19, 0xEF, 0x70, 0x02, 0x21, 0x91, 0x24, 0xFE, 0x70, 0x02, 0x21, 0xCA, 0x24, 0xFE,
+0x60, 0x47, 0x24, 0xFC, 0x70, 0x02, 0x41, 0x04, 0x24, 0xFC, 0x60, 0x02, 0x41, 0x19, 0xEE, 0xB4,
+0x0E, 0x02, 0x51, 0x60, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x83, 0x90, 0x8E,
+0x87, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x3F, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x04, 0x0D, 0x90, 0x95,
+0x91, 0xE0, 0xFF, 0x60, 0x04, 0x91, 0x69, 0x80, 0x02, 0xD1, 0x17, 0x90, 0x8E, 0x87, 0xE0, 0x64,
+0x08, 0x60, 0x02, 0x41, 0x19, 0xD1, 0x09, 0x41, 0x19, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x04, 0x7F,
+0x01, 0x51, 0x83, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x3F, 0x90, 0x8E, 0x87, 0xE0,
+0xB4, 0x0E, 0x07, 0x51, 0x1E, 0xBF, 0x01, 0x02, 0x51, 0x60, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x0C,
+0x60, 0x02, 0x41, 0x19, 0x51, 0x1E, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, 0x19, 0x51, 0xB0, 0x41,
+0x19, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0E, 0x07, 0x51, 0x1E, 0xBF, 0x01, 0x02, 0x51, 0x60, 0x90,
+0x8E, 0x87, 0xE0, 0xB4, 0x06, 0x02, 0x51, 0x3F, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0C, 0x07, 0x51,
+0x1E, 0xBF, 0x01, 0x02, 0x51, 0xB0, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x04, 0x70, 0x5B, 0x12, 0x9D,
+0xB9, 0xEF, 0x64, 0x01, 0x70, 0x53, 0x91, 0x34, 0x80, 0x4F, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0E,
+0x07, 0x51, 0x1E, 0xBF, 0x01, 0x02, 0x51, 0x60, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x06, 0x02, 0x51,
+0x3F, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0C, 0x07, 0x51, 0x1E, 0xBF, 0x01, 0x02, 0x51, 0xB0, 0x90,
+0x8E, 0x87, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x83, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x04, 0x19,
+0xB1, 0xFD, 0x80, 0x15, 0x90, 0x8E, 0x87, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0x8E, 0x81, 0xE0, 0xFF,
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xB1, 0xF2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x9D,
+0xA0, 0xBF, 0x01, 0x18, 0x90, 0x8E, 0x80, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0C,
+0x90, 0x8E, 0x86, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90,
+0x8E, 0x81, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x04, 0x80,
+0x06, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x51, 0xE8, 0xE4, 0xFD, 0xFF, 0x80, 0x45,
+0x90, 0x8E, 0x81, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0x7D, 0x0C, 0x80, 0x0D, 0x90, 0x06, 0x04,
+0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0x51, 0xE8, 0xE4, 0xFD,
+0xFF, 0x80, 0x22, 0x90, 0x95, 0x90, 0xEF, 0xF0, 0x12, 0x4F, 0x6A, 0x90, 0x95, 0x90, 0xE0, 0x60,
+0x05, 0xE4, 0xFD, 0xFF, 0x51, 0xA5, 0x7D, 0x04, 0x7F, 0x01, 0x80, 0x4C, 0xE4, 0xFD, 0x7F, 0x0C,
+0x11, 0xD2, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x8D, 0x05, 0xED, 0xF0, 0x22,
+0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x23, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xFD, 0xF0, 0x7D,
+0x2C, 0x7F, 0x6F, 0x51, 0xA5, 0x7D, 0x08, 0x7F, 0x01, 0x91, 0x9F, 0xBF, 0x01, 0x0D, 0x90, 0x8E,
+0x80, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x51, 0xE8, 0x22, 0x90, 0x8E, 0x86, 0xE0,
+0x90, 0x94, 0xCC, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
+0x95, 0x8F, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54,
+0x01, 0xFF, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x8E, 0x87, 0xED,
+0xF0, 0x80, 0x05, 0x90, 0x8E, 0x86, 0xED, 0xF0, 0x7F, 0x8F, 0x12, 0x4A, 0xE7, 0xEF, 0x30, 0xE4,
+0x31, 0x90, 0x95, 0x8F, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23, 0x90,
+0x8E, 0x80, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0x87, 0xE0,
+0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0x8E, 0x86, 0xE0, 0xFD, 0x7F, 0x89, 0x12,
+0x49, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, 0x7F, 0xA3, 0x7D, 0x00, 0x7B, 0x01, 0x7A,
+0x8E, 0x79, 0x80, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F,
+0x79, 0x2A, 0x12, 0x08, 0xAA, 0x90, 0x8E, 0x83, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x8A, 0x14, 0xF0,
+0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x8E, 0x8F, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90,
+0x8E, 0xBB, 0xE0, 0x24, 0x04, 0x90, 0x8E, 0x99, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4, 0xFD, 0xFF,
+0x51, 0xE8, 0x7D, 0x0C, 0x7F, 0x02, 0x51, 0xE8, 0x7D, 0x0C, 0x7F, 0x01, 0x51, 0xE8, 0x90, 0x8D,
+0x06, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x8E, 0x8E, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90,
+0x8E, 0x8E, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x79, 0x12,
+0x4A, 0xE7, 0xEF, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0F, 0x7F, 0x28, 0x12, 0x4A, 0xE7, 0xEF, 0x30,
+0xE2, 0x06, 0x90, 0x8E, 0xBB, 0x74, 0x02, 0xF0, 0x90, 0x8F, 0x23, 0x74, 0x05, 0xF0, 0xA3, 0xF0,
+0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0xBB, 0xE0, 0x24,
+0x04, 0x90, 0x8E, 0x99, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x12, 0x6C, 0x7B, 0x7E, 0x00, 0x7F, 0x02,
+0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x27, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x04, 0xE0, 0x54,
+0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x51, 0xA5, 0xE4, 0x90,
+0x8F, 0x29, 0xF0, 0x22, 0x7D, 0x2D, 0xF1, 0xF4, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F,
+0x03, 0xF1, 0xD6, 0x12, 0x4C, 0x1E, 0xE4, 0xFD, 0x7F, 0x01, 0x41, 0xE8, 0x90, 0x8E, 0x84, 0xE0,
+0x64, 0x01, 0x70, 0x14, 0x90, 0x8E, 0x82, 0xE0, 0x54, 0x0F, 0x60, 0x04, 0x51, 0x9C, 0xC1, 0x29,
+0x90, 0x8E, 0x87, 0xE0, 0x70, 0x02, 0x11, 0xCE, 0x22, 0xEF, 0x60, 0x2E, 0x90, 0x8D, 0xFF, 0xE0,
+0x64, 0x01, 0x70, 0x26, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x51,
+0xA5, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x91, 0x9B, 0xBF, 0x01, 0x0D, 0x90, 0x8E, 0x80,
+0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x51, 0xE8, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x51, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8D,
+0x03, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x21, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x95,
+0x55, 0xF0, 0x7D, 0x26, 0xF1, 0xF4, 0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x9E, 0x8A, 0x90, 0x95,
+0x55, 0xE0, 0xFF, 0x7D, 0x27, 0x51, 0xA5, 0x91, 0xED, 0x80, 0x05, 0x91, 0xED, 0x12, 0x9E, 0x8A,
+0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x51,
+0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x93, 0xEF, 0xF0, 0x90, 0x8D,
+0x09, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x4F, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x0E,
+0x70, 0x1C, 0x90, 0x95, 0x93, 0xE0, 0x70, 0x41, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0x7F, 0xF0, 0x90,
+0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x51, 0xE8, 0x80, 0x26, 0x90, 0x8E,
+0x87, 0xE0, 0x64, 0x06, 0x70, 0x23, 0x90, 0x95, 0x93, 0xE0, 0x60, 0x1D, 0x90, 0x8E, 0x80, 0xE0,
+0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E,
+0x87, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x51, 0xA5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x29,
+0x90, 0x8E, 0x87, 0xE0, 0x64, 0x0C, 0x60, 0x04, 0x51, 0x9C, 0x91, 0x9B, 0x22, 0xE4, 0x90, 0x93,
+0xA8, 0xF0, 0x90, 0x94, 0xD0, 0x04, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93,
+0x73, 0x12, 0x43, 0xE5, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C,
+0xFC, 0x90, 0x93, 0x73, 0x12, 0x08, 0x6D, 0x12, 0x85, 0xBF, 0xE4, 0x90, 0x94, 0xB4, 0xF0, 0xFF,
+0x12, 0x86, 0xDB, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x33, 0x7D, 0x01, 0x7F, 0x02, 0x11,
+0xD2, 0x7F, 0x05, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x51, 0xDC, 0x90, 0x8E, 0x87, 0xE0, 0x64, 0x02,
+0x60, 0x1C, 0x90, 0x93, 0xA8, 0xE0, 0x04, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7D,
+0x01, 0x7F, 0x02, 0x11, 0xD2, 0x90, 0x93, 0xA8, 0xE0, 0xD3, 0x94, 0x0A, 0x40, 0xDC, 0x90, 0x95,
+0x46, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0A, 0xE4, 0x90, 0x95, 0x4A, 0xF0, 0x7F, 0x04, 0x02,
+0x80, 0x35, 0x7D, 0x2F, 0x12, 0x4C, 0x19, 0x7D, 0x08, 0x7F, 0x01, 0x41, 0xE8, 0x7D, 0x2E, 0x7F,
+0x6F, 0x51, 0xA5, 0x7D, 0x02, 0x7F, 0x01, 0x41, 0xE8, 0x12, 0x4F, 0x6A, 0xE4, 0xFD, 0xFF, 0x51,
+0xA5, 0x7D, 0x0C, 0x7F, 0x01, 0x41, 0xE8, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD,
+0xFF, 0x51, 0xA5, 0x7D, 0x0C, 0x7F, 0x01, 0x41, 0xE8, 0x90, 0x8E, 0x80, 0xE0, 0x13, 0x13, 0x13,
+0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0,
+0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8F, 0x25, 0xE0, 0xC3,
+0x13, 0x54, 0x7F, 0x90, 0x95, 0x44, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x11, 0x6C,
+0x90, 0x8E, 0x80, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
+0x93, 0xB8, 0xEF, 0xF0, 0x7D, 0x38, 0x7F, 0xFF, 0x51, 0xA5, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x1A,
+0x90, 0x06, 0x32, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x93, 0xB8, 0xD1, 0xA8, 0x90, 0x93, 0xB9, 0xEE,
+0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7D, 0x38, 0xE4, 0xFF, 0x51, 0xA5,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x7C, 0xE0, 0xFF, 0x7B, 0x18, 0x7D, 0x01, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x76, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x95, 0x75,
+0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x74, 0xC7, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x95, 0x75, 0xE0,
+0x90, 0x04, 0x25, 0xF0, 0x90, 0x95, 0x76, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03, 0x74, 0x10, 0x40,
+0x0D, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x04, 0xF0, 0x80, 0x0A, 0x2D, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x95, 0x77, 0xE0, 0x25, 0xE0, 0x25, 0xE0,
+0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74,
+0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF,
+0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
+0x44, 0x80, 0xF0, 0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54,
+0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0,
+0x22, 0xE4, 0xFD, 0xFF, 0x51, 0xA5, 0x7D, 0x04, 0x7F, 0x01, 0x41, 0xE8, 0x7D, 0x02, 0x7F, 0x02,
+0xF1, 0xD6, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30,
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x8E, 0x84, 0xE0, 0x60,
+0x02, 0x91, 0x4C, 0x22, 0x7F, 0xFF, 0x51, 0xA5, 0xE4, 0x90, 0x95, 0x81, 0xF0, 0xA3, 0xF0, 0x90,
+0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70,
+0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x95, 0x82, 0xE0, 0x94, 0xE8, 0x90, 0x95, 0x81, 0xE0, 0x94,
+0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E,
+0x00, 0x12, 0x3E, 0x50, 0x90, 0x95, 0x81, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBF,
+0xE4, 0x90, 0x93, 0x9D, 0xF0, 0x90, 0x93, 0x9D, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x40, 0x90, 0x01,
+0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0x90,
+0x8E, 0x84, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x87, 0xE0, 0xFF, 0x90, 0x8E, 0x86, 0xE0, 0x6F, 0x60,
+0x02, 0x11, 0x92, 0xC2, 0xAF, 0x12, 0x7A, 0x84, 0xBF, 0x01, 0x03, 0x12, 0x9E, 0x70, 0xD2, 0xAF,
+0x90, 0x93, 0x95, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0x88, 0xD2, 0x12, 0x4F, 0xF3, 0x12, 0x46, 0x38,
+0x80, 0xB3, 0x90, 0x8E, 0x86, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x50, 0xD2, 0x90, 0x8E, 0x80, 0xE0,
+0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x1A, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0,
+0xE0, 0x90, 0x8E, 0x81, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE,
+0xF0, 0x11, 0x92, 0xE4, 0xFF, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0x93, 0x92, 0xE0,
+0xFD, 0x60, 0x40, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33,
+0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x0B, 0xE4, 0x90, 0x93,
+0x92, 0xF0, 0x90, 0x93, 0x94, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x8F, 0xE0, 0xD3, 0x9D, 0x50, 0x0A,
+0x31, 0x46, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x12, 0x54, 0x9B, 0x90, 0x93, 0x92,
+0xE0, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30,
+0xE0, 0x20, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x81, 0x30, 0xE1, 0x06,
+0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x02,
+0x11, 0x92, 0x7F, 0x01, 0x01, 0xC5, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x7F, 0x01, 0x90, 0x95,
+0x8D, 0xEF, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0x64, 0x02, 0x70, 0x2A, 0x90, 0x95, 0x8D, 0xE0, 0xFD,
+0x64, 0x01, 0x70, 0x30, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x8F, 0x32, 0xE0, 0xC4,
+0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80,
+0x13, 0xAF, 0x05, 0x80, 0x0C, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x95, 0x8D, 0xE0,
+0xFF, 0x12, 0x4D, 0x92, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x54,
+0xBF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xEF,
+0x44, 0x08, 0xF0, 0xED, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x7C, 0x00, 0xEF, 0x24, 0x08, 0xFF, 0xEC,
+0x3E, 0x90, 0x93, 0xB0, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x83, 0x7D, 0x00, 0x7B, 0x01,
+0x7A, 0x90, 0x79, 0x43, 0x12, 0x08, 0xAA, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93,
+0xB0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90, 0x44, 0xEF, 0xF0, 0x90, 0x93,
+0xB1, 0xE0, 0x24, 0x04, 0xFF, 0x90, 0x93, 0xB0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50,
+0x90, 0x90, 0x47, 0xEF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x05, 0xFF, 0x90, 0x93, 0xB0, 0xE0,
+0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90, 0x48, 0xEF, 0xF0, 0x90, 0x93, 0xB1, 0xE0,
+0x24, 0x06, 0xFF, 0x90, 0x93, 0xB0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90,
+0x49, 0xEF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x07, 0xFF, 0x90, 0x93, 0xB0, 0xE0, 0x34, 0x00,
+0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90, 0x4A, 0xEF, 0xF0, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x08,
+0xFF, 0x90, 0x93, 0xB0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x90, 0x4B, 0xEF,
+0xF0, 0xE4, 0x90, 0x93, 0xAF, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x50, 0x24,
+0x90, 0x93, 0xB1, 0xE0, 0x24, 0x09, 0xFD, 0x90, 0x93, 0xB0, 0xE0, 0x71, 0x43, 0x90, 0x93, 0xAF,
+0xE0, 0x24, 0x4C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAF, 0xE0,
+0x04, 0xF0, 0x80, 0xD2, 0xE4, 0x90, 0x93, 0xAF, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0xFF, 0xC3, 0x94,
+0x20, 0x50, 0x24, 0x90, 0x93, 0xB1, 0xE0, 0x24, 0x63, 0xFD, 0x90, 0x93, 0xB0, 0xE0, 0x71, 0x43,
+0x90, 0x93, 0xAF, 0xE0, 0x24, 0xA6, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90,
+0x93, 0xAF, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x90, 0x90, 0x48, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED,
+0xFF, 0x90, 0x93, 0xAD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x30, 0xE3, 0x0C, 0x7F, 0x01, 0x31, 0x4E,
+0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x3F, 0x90, 0x93, 0xAD, 0xA3, 0xE0, 0xFF, 0x7C, 0x00,
+0x54, 0x07, 0xFD, 0x64, 0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED, 0x64, 0x02, 0x4C,
+0x70, 0x25, 0xEF, 0x54, 0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF, 0xC4, 0x54, 0x0F,
+0x48, 0x90, 0x90, 0xDC, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0x9F, 0x37, 0x90, 0x06,
+0x31, 0xE0, 0x54, 0xF7, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93,
+0xA9, 0xE0, 0xFD, 0x90, 0x93, 0xA8, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCD,
+0x24, 0x10, 0xCD, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, 0x2F, 0xFF, 0xEE, 0x3C, 0xFE, 0xE4, 0xFD,
+0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x8D, 0xF9, 0xE0, 0x9B,
+0x90, 0x8D, 0xF8, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x8D, 0xF8, 0xE0,
+0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD, 0x11, 0xF0, 0xAF,
+0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF, 0x22, 0x90, 0x93,
+0xAB, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0xA9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90,
+0x93, 0xCF, 0xF0, 0xEF, 0x24, 0x24, 0xFF, 0xE4, 0x3E, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAC, 0xE0,
+0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAB, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD9, 0xF0, 0xA3, 0xCE, 0xF0,
+0xD0, 0x06, 0xE4, 0xFB, 0xFA, 0xFD, 0xD1, 0x54, 0x90, 0x93, 0xD0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x4E, 0x60, 0x52, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD,
+0x71, 0x50, 0x90, 0x93, 0xAE, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xAE, 0xE0,
+0xFF, 0x90, 0x93, 0xAD, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x2B, 0x90, 0x93, 0xD1, 0xE0, 0x24, 0x02,
+0xFD, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFC, 0xEE, 0x7E, 0x00, 0x2D, 0x71, 0x4A, 0x90, 0x93,
+0xAD, 0xE0, 0x24, 0xAF, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAD,
+0xE0, 0x04, 0xF0, 0x80, 0xC7, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x24, 0xFF, 0x90, 0x93, 0xA9, 0xE0,
+0x34, 0x00, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAB, 0xE0,
+0x34, 0xFF, 0x90, 0x93, 0xD9, 0xF0, 0xA3, 0xCE, 0xF0, 0xD0, 0x06, 0x7B, 0x03, 0xD1, 0x50, 0x90,
+0x93, 0xD0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x22, 0xFF, 0x90, 0x93,
+0xA9, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xD0, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x71, 0x50,
+0xEF, 0x20, 0xE4, 0x02, 0xA1, 0xBC, 0x90, 0x93, 0xCF, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0xAA, 0xE0,
+0x24, 0x24, 0xFF, 0x90, 0x93, 0xA9, 0xE0, 0x34, 0x00, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAC, 0xE0,
+0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAB, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD9, 0xF0, 0xA3, 0xCE, 0xF0,
+0xD0, 0x06, 0x7B, 0x30, 0xD1, 0x50, 0x90, 0x93, 0xD0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x4E, 0x60,
+0x69, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50,
+0x90, 0x93, 0xD3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xD3, 0xE0, 0xFF, 0x90,
+0x93, 0xAD, 0xE0, 0xC3, 0x9F, 0x50, 0x43, 0x90, 0x93, 0xD1, 0xE0, 0x24, 0x0D, 0xFF, 0x90, 0x93,
+0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x93, 0xD2, 0xEF, 0xF0, 0xBF, 0x02,
+0x09, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x0E, 0x90, 0x93, 0xD2, 0xE0, 0xB4, 0x04,
+0x07, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x40, 0xF0, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x04, 0x12,
+0x08, 0xD6, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0x80, 0xB0, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x24,
+0xFF, 0x90, 0x93, 0xA9, 0xE0, 0x34, 0x00, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0xDC,
+0xFE, 0x90, 0x93, 0xAB, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD9, 0xF0, 0xA3, 0xCE, 0xF0, 0xD0, 0x06,
+0x7B, 0xDD, 0x7A, 0x00, 0x7D, 0x01, 0xD1, 0x54, 0x90, 0x93, 0xD0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x4E, 0x60, 0x6E, 0xE0, 0x24, 0x0C, 0xFF, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD,
+0x71, 0x50, 0x90, 0x93, 0xD3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xD3, 0xE0,
+0xFF, 0x90, 0x93, 0xAD, 0xE0, 0xC3, 0x9F, 0x50, 0x48, 0x90, 0x93, 0xD1, 0xE0, 0x24, 0x11, 0xFF,
+0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x93, 0xD2, 0xEF, 0xF0,
+0xBF, 0x02, 0x09, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x02, 0xF0, 0x80, 0x0E, 0x90, 0x93, 0xD2, 0xE0,
+0xB4, 0x04, 0x07, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0x04, 0xF0, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0,
+0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0x80, 0xB0, 0xE4, 0x90, 0x93, 0xCF,
+0xF0, 0x90, 0x91, 0x33, 0xE0, 0x90, 0x04, 0xFD, 0xF0, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x91,
+0x33, 0xE0, 0xFF, 0x90, 0x93, 0xAD, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x73, 0x74, 0x43, 0x2E, 0xF5,
+0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0xAE, 0xE0, 0xFE, 0x6F, 0x70, 0x57,
+0x90, 0x04, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0xAD, 0xE0, 0x24, 0x53, 0xF5, 0x82, 0xE4, 0x34,
+0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0xCF, 0xE0, 0xFD, 0x4F, 0x60, 0x04, 0xED, 0x5F, 0x60,
+0x36, 0xEE, 0xFF, 0x7E, 0x00, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAD, 0xE0, 0x75, 0xF0, 0x20,
+0xA4, 0x24, 0x73, 0xF9, 0x74, 0x91, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0xAF, 0x7C, 0x93, 0x7D,
+0x01, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x45, 0xC7, 0xEF, 0x70, 0x0C, 0x90, 0x01, 0xC7, 0x74, 0x55,
+0xF0, 0x7F, 0x01, 0x31, 0x4E, 0xF1, 0xCD, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0xA1, 0xCE, 0x22,
+0x7A, 0x00, 0xE4, 0xFD, 0x90, 0x93, 0xD4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3,
+0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xC3, 0x90, 0x93, 0xDA, 0xE0, 0x94, 0x01, 0x90, 0x93, 0xD9, 0xE0,
+0x94, 0x00, 0x50, 0x02, 0xE1, 0x02, 0xE4, 0x90, 0x93, 0xDD, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0xD4,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFD, 0x71, 0x50, 0x90, 0x93, 0xD7, 0xE0, 0x70, 0x03, 0xA3,
+0xE0, 0x6F, 0x70, 0x24, 0x90, 0x93, 0xD5, 0xE0, 0x24, 0x02, 0xFF, 0x90, 0x93, 0xD4, 0xE0, 0x34,
+0x00, 0xFE, 0x90, 0x93, 0xD6, 0xE0, 0xFD, 0x12, 0xA6, 0x60, 0xBF, 0x01, 0x09, 0x90, 0x93, 0xD4,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x80, 0x00, 0x90, 0x93, 0xD5, 0xE0, 0x24, 0x01, 0xFF, 0x90,
+0x93, 0xD4, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x50, 0x7E, 0x00, 0x90, 0x93, 0xDB, 0xEE,
+0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x02, 0xFF, 0xEE, 0x33, 0xFE, 0x90, 0x93, 0xD4, 0x8F, 0xF0, 0x12,
+0x08, 0xD6, 0x90, 0x93, 0xDD, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD9, 0xE0, 0xFE,
+0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x93, 0xDE, 0xE0, 0x9F, 0x90, 0x93, 0xDD, 0xE0, 0x9E, 0x50, 0x02,
+0xC1, 0x7D, 0xE4, 0xFE, 0xFF, 0x22, 0x90, 0x93, 0xA9, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93,
+0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAC, 0xF0, 0xFD, 0x71, 0x50, 0xEF, 0x54,
+0x0C, 0x64, 0x08, 0x60, 0x02, 0xE1, 0xC7, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3,
+0xE0, 0x24, 0x06, 0xFD, 0x71, 0x50, 0xEF, 0x64, 0x88, 0x60, 0x02, 0xE1, 0xC7, 0x90, 0x93, 0xA7,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x07, 0xFD, 0x71, 0x50, 0xEF, 0x64, 0x8E, 0x70,
+0x76, 0x90, 0x93, 0xAC, 0x04, 0xF0, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93,
+0xAA, 0xE0, 0xFD, 0x90, 0x93, 0xA9, 0xE0, 0x2D, 0x04, 0xFD, 0x71, 0x50, 0xEF, 0x64, 0x03, 0x70,
+0x56, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xAA, 0xE0, 0xFD, 0x90, 0x93,
+0xA9, 0xE0, 0x2D, 0x24, 0x06, 0xFD, 0x71, 0x50, 0xEF, 0x30, 0xE3, 0x07, 0x90, 0x01, 0xC7, 0x74,
+0x01, 0x80, 0x2C, 0x90, 0x8F, 0x2E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90,
+0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x31, 0xA3, 0x80, 0x19, 0x90, 0x8F,
+0x31, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0D, 0x90, 0x01, 0xC7, 0x74, 0x02, 0xF0,
+0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0xAC, 0xE0, 0xFF, 0x22, 0x90, 0x8F, 0x2E,
+0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0x12, 0x86, 0x94, 0x12, 0x73, 0xD5, 0x22, 0xF1,
+0xE3, 0x80, 0xEA, 0x90, 0x8F, 0x2E, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x03,
+0x12, 0xA6, 0x6D, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x48, 0x39, 0x90, 0x93, 0xA6,
+0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x60, 0xE9, 0xC2, 0xAF, 0x30, 0xE1, 0x05,
+0x54, 0xFD, 0xF0, 0x11, 0xA6, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, 0xE2,
+0x05, 0x54, 0xFB, 0xF0, 0x11, 0x54, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30,
+0xE4, 0x0C, 0x54, 0xEF, 0xF0, 0x12, 0x8F, 0xE2, 0xBF, 0x01, 0x03, 0x12, 0x8A, 0xEE, 0xD2, 0xAF,
+0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, 0xE7, 0x06, 0x54, 0x7F, 0xF0, 0x12, 0x87, 0xA1,
+0xD2, 0xAF, 0x80, 0xB0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0x8D, 0xF7,
+0xE0, 0xFE, 0x90, 0x8D, 0xF6, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00,
+0xEE, 0x64, 0x01, 0x60, 0x2C, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x60, 0xF9, 0x74, 0x8D, 0x35,
+0xF0, 0xFA, 0x7B, 0x01, 0x31, 0x0A, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90, 0x8D, 0xF6, 0xE0, 0x04,
+0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF6,
+0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0x5F,
+0xE0, 0xFF, 0x90, 0x8D, 0x5E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF,
+0x70, 0x43, 0x90, 0x8D, 0x5E, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x8D, 0x0E, 0x12, 0x43, 0xFD,
+0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0F, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B,
+0x01, 0xAF, 0x05, 0x31, 0x80, 0x90, 0x8D, 0x5E, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A,
+0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0x5E, 0xF0, 0x12, 0x71, 0x86, 0x90, 0x8D,
+0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x90, 0x95, 0x62, 0x12, 0x44, 0x12, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x77, 0xFC, 0xEF, 0x60,
+0x5A, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC,
+0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x95, 0x65, 0xEF, 0xF0, 0xEE, 0xFF,
+0x90, 0xFD, 0x11, 0xF0, 0x90, 0x95, 0x65, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0,
+0x90, 0x95, 0x62, 0x12, 0x44, 0x09, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4,
+0x33, 0xFE, 0x12, 0x78, 0x52, 0x90, 0x95, 0x65, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x95, 0x62, 0x12,
+0x44, 0x09, 0x12, 0x78, 0xAD, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0x90, 0x93, 0xA8, 0x12, 0x44, 0x12, 0x90, 0x93, 0xA7, 0xEF, 0xF0, 0x12, 0x44, 0x1B, 0x61, 0xCB,
+0x00, 0x61, 0xD4, 0x01, 0x61, 0xDD, 0x02, 0x61, 0xE6, 0x03, 0x61, 0xEF, 0x04, 0x61, 0xF8, 0x12,
+0x62, 0x00, 0x14, 0x62, 0x08, 0x20, 0x62, 0x11, 0x21, 0x62, 0x1A, 0x23, 0x62, 0x22, 0x25, 0x62,
+0x2A, 0x27, 0x62, 0x3B, 0x80, 0x62, 0x32, 0x81, 0x62, 0x44, 0x82, 0x62, 0x4C, 0x83, 0x62, 0x55,
+0x84, 0x62, 0x66, 0x86, 0x62, 0x5E, 0x88, 0x00, 0x00, 0x62, 0x6F, 0x90, 0x93, 0xA8, 0x12, 0x44,
+0x09, 0x02, 0x6F, 0xC2, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x6C, 0x9C, 0x90, 0x93, 0xA8,
+0x12, 0x44, 0x09, 0x02, 0x70, 0x1A, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x89, 0x79, 0x90,
+0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x9C, 0xB5, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x80, 0x7F,
+0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xE1, 0xA2, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x70,
+0x5D, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x71, 0x42, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09,
+0xE1, 0x92, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xE1, 0x9A, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09,
+0x80, 0x61, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x75, 0xE6, 0x90, 0x93, 0xA8, 0x12, 0x44,
+0x09, 0x02, 0x90, 0x7F, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0xE1, 0xD6, 0x90, 0x93, 0xA8, 0x12,
+0x44, 0x09, 0x02, 0x9B, 0x3F, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x9B, 0xA1, 0x90, 0x93,
+0xA8, 0x12, 0x44, 0x09, 0xE1, 0xB1, 0x90, 0x93, 0xA8, 0x12, 0x44, 0x09, 0x02, 0x80, 0xBB, 0x90,
+0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0xA7, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12,
+0x06, 0x89, 0xFF, 0x90, 0x8D, 0xFA, 0xF0, 0xBF, 0x01, 0x08, 0x12, 0x79, 0x26, 0xE4, 0x90, 0x8D,
+0xFA, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x2A, 0xE0, 0x54, 0xFE,
+0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12,
+0x06, 0xA2, 0x90, 0x8F, 0x2B, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x2C, 0xF0,
+0x90, 0x8F, 0x2B, 0xE0, 0x90, 0x8F, 0x2D, 0xF0, 0x90, 0x8F, 0x2A, 0xE0, 0x54, 0x01, 0xFF, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x92, 0xEF, 0xF0, 0x54, 0x01, 0xFF, 0x90, 0x8F,
+0x2A, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F,
+0x30, 0xE0, 0x47, 0x90, 0x91, 0x3B, 0x12, 0x43, 0xE5, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x17, 0x90,
+0x93, 0x73, 0x12, 0x43, 0xF1, 0xD3, 0x12, 0x43, 0xD4, 0x40, 0x0B, 0xE4, 0x7F, 0x0A, 0xFE, 0xFD,
+0xFC, 0x90, 0x91, 0x3F, 0x80, 0x09, 0xE4, 0x7F, 0x0A, 0xFE, 0xFD, 0xFC, 0x90, 0x91, 0x37, 0x12,
+0x43, 0xF1, 0x12, 0x42, 0x9D, 0xC0, 0x07, 0x90, 0x8F, 0x2C, 0xE0, 0xFB, 0xE4, 0xFA, 0xF9, 0xF8,
+0xD0, 0x07, 0x12, 0x43, 0x28, 0x90, 0x8F, 0x2D, 0xEF, 0xF0, 0x90, 0x95, 0x92, 0xE0, 0x64, 0x01,
+0x70, 0x2C, 0x90, 0x01, 0x53, 0xF0, 0x90, 0x8F, 0x2C, 0xE0, 0x60, 0x10, 0x7D, 0x10, 0x7F, 0x03,
+0x71, 0xB5, 0x90, 0x8F, 0x2C, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x80, 0x23, 0x90, 0x01, 0x53, 0x74,
+0x03, 0xF0, 0x7D, 0x10, 0xFF, 0xD1, 0x33, 0x71, 0x84, 0x12, 0x55, 0xF2, 0x80, 0x11, 0x90, 0x01,
+0x53, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x71, 0xB5, 0x12, 0x57, 0xCC, 0x12, 0x56, 0x09, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x71, 0x8E, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15,
+0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
+0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74,
+0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F,
+0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x93, 0x93, 0xE0, 0x04, 0xF0,
+0x90, 0x8E, 0x87, 0xE0, 0x64, 0x02, 0x60, 0x22, 0x71, 0xFB, 0x90, 0x8E, 0x81, 0xE0, 0x13, 0x13,
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, 0x8E, 0x8A, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A,
+0x71, 0xA6, 0x71, 0x84, 0x90, 0x8E, 0x8B, 0xE0, 0x14, 0xF0, 0x22, 0x90, 0x8D, 0xFF, 0xE0, 0x64,
+0x01, 0x60, 0x02, 0x81, 0x9D, 0x90, 0x8E, 0x84, 0xE0, 0x70, 0x02, 0x81, 0x9D, 0x90, 0x8E, 0x82,
+0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, 0x8B,
+0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0x8E, 0x8A, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90,
+0x8E, 0x8A, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0x8E, 0x8B, 0xEF, 0xF0, 0x90,
+0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x6B, 0x24, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x04, 0xF0,
+0xE4, 0x90, 0x8E, 0x8D, 0xF0, 0x90, 0x8E, 0x8F, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01,
+0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x54, 0xFD, 0xF0,
+0x54, 0xEF, 0xF0, 0x90, 0x8E, 0x82, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80,
+0x02, 0xF1, 0x2E, 0x90, 0x8E, 0x81, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0E, 0x90,
+0x8E, 0x8A, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x04, 0x71, 0xA6, 0x71, 0x8A, 0x22, 0xEF, 0x70,
+0x4E, 0x7D, 0x78, 0x7F, 0x02, 0x71, 0x8E, 0x7D, 0x02, 0x7F, 0x03, 0x71, 0x8E, 0x7D, 0xC8, 0x7F,
+0x02, 0xD1, 0x33, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8D,
+0xFF, 0xE0, 0x70, 0x15, 0x12, 0x4F, 0x6A, 0x12, 0x56, 0x17, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xF7,
+0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x50, 0xD2,
+0x90, 0x8E, 0x80, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90,
+0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x12, 0x57, 0xD6, 0x7D,
+0x02, 0x7F, 0x03, 0x12, 0x57, 0xD6, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x8E, 0x8F,
+0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x8E, 0x81,
+0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x87, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, 0x04, 0x02,
+0x50, 0xD2, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x6F,
+0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x23, 0x90, 0x8E, 0x98, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x62,
+0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8,
+0xF9, 0xFF, 0x90, 0x8E, 0xB5, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E, 0x81, 0xE0, 0xFF, 0x13,
+0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x71, 0x84,
+0x90, 0x8E, 0x8A, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x95, 0x7F, 0xE4, 0x75, 0xF0, 0x01,
+0x12, 0x08, 0xD6, 0xC3, 0x90, 0x95, 0x80, 0xE0, 0x94, 0x80, 0x90, 0x95, 0x7F, 0xE0, 0x64, 0x80,
+0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12,
+0x9D, 0x05, 0xD1, 0x7B, 0xE4, 0x90, 0x93, 0x8C, 0xF0, 0xD1, 0x1A, 0x90, 0x8F, 0x2E, 0xE0, 0xC4,
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x52, 0x90, 0x90, 0xDD, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7C,
+0x00, 0x7D, 0x64, 0x12, 0x07, 0x15, 0x90, 0x91, 0x31, 0xE0, 0x6E, 0x70, 0x03, 0xA3, 0xE0, 0x6F,
+0x60, 0x0A, 0x90, 0x91, 0x31, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, 0x90, 0x90, 0xE1, 0xE0,
+0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x90, 0xEF, 0xE0, 0xB5, 0x06, 0x14, 0xA3, 0xE0, 0xB5, 0x07, 0x0F,
+0xEF, 0x4E, 0x60, 0x0B, 0x90, 0x01, 0xC7, 0x74, 0x31, 0xF0, 0x7F, 0x01, 0x02, 0x59, 0x4E, 0x12,
+0x7A, 0xF4, 0xE4, 0x90, 0x91, 0x31, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x8F, 0x2A, 0xE0, 0x30, 0xE0,
+0x11, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0A, 0x71, 0x84, 0x90, 0x8F, 0x2C, 0xE0, 0x90, 0x05,
+0x73, 0xF0, 0x22, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38,
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0x93, 0xAE, 0x12, 0x44,
+0x12, 0x12, 0x9D, 0x7F, 0x90, 0x8E, 0x84, 0xE0, 0xFF, 0x91, 0x9E, 0x90, 0x8E, 0x84, 0xE0, 0x60,
+0x19, 0x90, 0x93, 0xAE, 0x12, 0x44, 0x09, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xFF,
+0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x12, 0x9E, 0x0A, 0x22, 0x90, 0x93, 0x89, 0xE0, 0x30,
+0xE0, 0x37, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0x95, 0x8E, 0xE0, 0x04, 0xF0,
+0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0x93, 0x8B, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x95, 0x8E, 0xF0, 0x90,
+0x93, 0x8B, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0x90, 0x93, 0x8C, 0xE0,
+0x70, 0x07, 0xE4, 0x90, 0x93, 0x8B, 0xF0, 0xD1, 0xBA, 0x22, 0x90, 0x93, 0x89, 0xE0, 0xFF, 0x13,
+0x13, 0x54, 0x3F, 0x30, 0xE0, 0x17, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0x90, 0x95, 0x0D, 0x12,
+0x44, 0x12, 0xE4, 0x90, 0x95, 0x10, 0xF0, 0xA3, 0x04, 0xF0, 0x02, 0x93, 0xA0, 0x02, 0x54, 0x9B,
+0x90, 0x8F, 0x2A, 0xE0, 0x30, 0xE0, 0x46, 0x90, 0x8F, 0x2C, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90,
+0x8F, 0x2D, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x55, 0xF2, 0x90, 0x8F, 0x2B, 0xE0, 0x14, 0x90,
+0x8F, 0x2D, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x51, 0xCF, 0x12, 0x57, 0xCC,
+0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0D,
+0x90, 0x95, 0x46, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x12, 0x80, 0x2E, 0x22, 0xE4, 0xF5,
+0x58, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x58, 0x54, 0xC0, 0x70, 0x0D, 0x90, 0x8E, 0x88, 0xE0, 0x54,
+0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x58, 0x92, 0xE5, 0x58, 0x30, 0xE6, 0x23, 0x90, 0x8E, 0x84,
+0xE0, 0x64, 0x01, 0x70, 0x22, 0x90, 0x8E, 0x88, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x8E, 0x82, 0xE0,
+0x54, 0x0F, 0x64, 0x02, 0x60, 0x05, 0x12, 0x6D, 0x3F, 0x80, 0x0C, 0x12, 0x55, 0x5E, 0x80, 0x07,
+0x90, 0x8E, 0x88, 0xE0, 0x54, 0xFE, 0xF0, 0xE5, 0x58, 0x90, 0x8E, 0x88, 0x30, 0xE7, 0x0E, 0xE0,
+0x44, 0x02, 0x12, 0x50, 0x57, 0x90, 0x8E, 0x80, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD,
+0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, 0x8E, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8F, 0x29,
+0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x9B, 0xE0, 0x54, 0xFE, 0x4F, 0xF0,
+0x22, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0xEF, 0x2E, 0x90, 0x93, 0x87, 0xF0,
+0x22, 0x12, 0x50, 0x9E, 0x90, 0x8E, 0x8A, 0xE0, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F,
+0x02, 0x12, 0x57, 0xD6, 0xC1, 0xE0, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x93, 0xAB, 0xF0, 0x12, 0x06,
+0x89, 0x90, 0x93, 0x77, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x93, 0x78, 0xF0, 0x22,
+0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D,
+0xF0, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x67, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4,
+0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0,
+0x32, 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, 0x90, 0x01,
+0xC4, 0x74, 0x21, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0x4C, 0x5B, 0xE5, 0x14, 0x30, 0xE7, 0x03,
+0x12, 0x4F, 0x4E, 0x74, 0x21, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 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, 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, 0x90, 0x01, 0xC4, 0x74, 0x79, 0xF0, 0x74, 0x68, 0xA3, 0xF0,
+0xB1, 0x60, 0xE5, 0x19, 0x30, 0xE3, 0x02, 0x31, 0xD5, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x31, 0xC1,
+0xE5, 0x19, 0x30, 0xE5, 0x02, 0xB1, 0xEC, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x31, 0x18, 0xE5, 0x1B,
+0x30, 0xE1, 0x03, 0x12, 0x65, 0x3A, 0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, 0x63, 0xCA, 0xE5, 0x1B,
+0x30, 0xE3, 0x02, 0x91, 0x43, 0xE5, 0x1B, 0x30, 0xE4, 0x02, 0xB1, 0x8D, 0xE5, 0x1B, 0x30, 0xE5,
+0x02, 0x31, 0xE1, 0xE5, 0x1B, 0x30, 0xE6, 0x02, 0x91, 0x5F, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12,
+0x57, 0xEB, 0x74, 0x79, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 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, 0xE4, 0xF5, 0x58, 0x90, 0x8E, 0x84, 0xE0, 0x70,
+0x02, 0x21, 0xC0, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x21, 0xC0, 0x90, 0x8E, 0x80,
+0xE0, 0x30, 0xE0, 0x1D, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78,
+0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xB9, 0xEE, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0x8E, 0x82, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70,
+0x1E, 0x90, 0x8E, 0x8B, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x8E, 0x8D, 0xE0, 0x60,
+0x0E, 0xEF, 0x70, 0x08, 0x90, 0x8E, 0x8A, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x58, 0x01, 0xE5,
+0x58, 0x60, 0x3D, 0x90, 0x8E, 0x88, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, 0x8D, 0xE0, 0x60, 0x03,
+0xB4, 0x01, 0x0B, 0xE4, 0x90, 0x95, 0x43, 0xF0, 0x90, 0x8E, 0x8D, 0xE0, 0x80, 0x0F, 0xE4, 0x90,
+0x95, 0x43, 0xF0, 0x90, 0x8E, 0x8D, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E,
+0x8C, 0xE0, 0x2F, 0x12, 0x50, 0x61, 0x90, 0x8E, 0x87, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x50, 0xCE,
+0x22, 0x12, 0x71, 0x86, 0x7F, 0x02, 0x8F, 0x59, 0x7F, 0x02, 0x12, 0x48, 0x12, 0x90, 0x8D, 0x01,
+0xE0, 0x45, 0x59, 0xF0, 0x22, 0x90, 0x8F, 0x2E, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x31, 0xC6,
+0x22, 0x90, 0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x0F, 0x90, 0x8E,
+0x82, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0xA1, 0x3F, 0x12, 0x55, 0x5E, 0x22, 0x7F, 0x80,
+0x80, 0xC4, 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, 0x90,
+0x01, 0xC4, 0x74, 0x02, 0xF0, 0x74, 0x6A, 0xA3, 0xF0, 0xB1, 0xBC, 0xE5, 0x21, 0x30, 0xE0, 0x02,
+0x31, 0xFE, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x51, 0x8E, 0xE5, 0x21, 0x30, 0xE2, 0x02, 0x91, 0x28,
+0xE5, 0x22, 0x30, 0xE0, 0x02, 0x51, 0x97, 0xE5, 0x24, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0x31, 0xC6,
+0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x67, 0xC1, 0xE5, 0x24, 0x30, 0xE5, 0x03, 0x12, 0x58, 0x9C,
+0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0x59, 0x14, 0x74, 0x02, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74,
+0x6A, 0xA3, 0xF0, 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, 0x90, 0x8E,
+0x84, 0xE0, 0x60, 0x02, 0xD1, 0x28, 0x22, 0xD1, 0x72, 0x90, 0x94, 0x5E, 0xEF, 0xF0, 0x30, 0xE0,
+0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0xE8, 0x90, 0x94, 0x5E, 0xE0,
+0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01,
+0x2F, 0x74, 0x80, 0xF0, 0x90, 0x8E, 0x95, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x8E, 0x9A, 0xE0,
+0xFB, 0xAC, 0x07, 0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0x8E, 0x96, 0xE0, 0xD3, 0x94,
+0x03, 0x50, 0x07, 0x90, 0x8E, 0x8C, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, 0x90, 0x8E,
+0x8C, 0xF0, 0x7D, 0x03, 0x90, 0x8E, 0xBB, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C, 0xFF, 0x90, 0x8E,
+0x99, 0xF0, 0x90, 0x8E, 0x8F, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0x8E, 0x8F, 0xE4,
+0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x8C, 0xEB, 0xF0, 0x90, 0x8E, 0x8F, 0xA3, 0xE0, 0x90,
+0x05, 0x58, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x59, 0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0,
+0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9,
+0xFF, 0x90, 0x8E, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90,
+0x8E, 0xB7, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x28, 0xEB, 0x9F, 0xFF,
+0x90, 0x8E, 0x99, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFD, 0xC3, 0x94, 0x19, 0x50, 0x13,
+0x74, 0x9C, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x97,
+0xE0, 0x04, 0xF0, 0x71, 0xF6, 0x90, 0x8E, 0x97, 0xE0, 0xC3, 0x94, 0x64, 0x40, 0x67, 0xE4, 0x90,
+0x94, 0x5A, 0xF0, 0x90, 0x94, 0x59, 0xF0, 0x90, 0x94, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x19, 0x50,
+0x47, 0x74, 0x9C, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x94, 0x5A,
+0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x27, 0x90, 0x94, 0x59, 0xE0, 0xFF, 0x94, 0x0A,
+0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x8E, 0x96, 0xF0, 0xE4, 0x80, 0x0E, 0xE4, 0x90, 0x8E, 0x96,
+0xF0, 0x90, 0x94, 0x59, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90, 0x8E, 0x95, 0xF0, 0x80, 0x08,
+0x90, 0x94, 0x59, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x8E, 0x96, 0xE0, 0xFD, 0x7B, 0x08, 0xE4,
+0xFF, 0x51, 0xD1, 0x91, 0x7B, 0x22, 0x90, 0x8F, 0x23, 0xE0, 0xFF, 0x90, 0x8E, 0x8D, 0xE0, 0xD3,
+0x9F, 0x40, 0x24, 0x90, 0x8E, 0x9B, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90,
+0x8E, 0x95, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x8E, 0x9A, 0xF0, 0xFB, 0x90, 0x8E, 0x95,
+0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x51, 0xD1, 0x22, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x14, 0x90, 0x06,
+0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x56, 0x29, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xF7, 0xF0, 0x12,
+0x58, 0x92, 0x22, 0x90, 0x8D, 0xFF, 0xE0, 0x64, 0x01, 0x70, 0x13, 0x90, 0x8E, 0x84, 0xE0, 0x60,
+0x0D, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x12, 0x50, 0x57, 0x22, 0x90,
+0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x88, 0xE0,
+0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x92, 0x22, 0xE4, 0xFF, 0x74, 0x9C, 0x2F,
+0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x19, 0xEF, 0xE4, 0x90,
+0x8E, 0x97, 0xF0, 0x90, 0x8E, 0x9B, 0xF0, 0x90, 0x8E, 0x95, 0xF0, 0x22, 0x8B, 0x51, 0x8A, 0x52,
+0x89, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3,
+0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56,
+0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53,
+0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x74, 0xFF, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5,
+0x83, 0xEF, 0xF0, 0x74, 0xFF, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xAF,
+0x54, 0x70, 0x04, 0xB1, 0x2E, 0x80, 0x02, 0xB1, 0x1D, 0x05, 0x54, 0x80, 0xC6, 0x91, 0x7B, 0xE5,
+0x55, 0x70, 0x19, 0x90, 0x8D, 0xFF, 0xE0, 0x70, 0x13, 0x12, 0x4F, 0x6A, 0x12, 0x56, 0x17, 0x90,
+0x8E, 0x80, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x57, 0x75,
+0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x43, 0xFD, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57,
+0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x43, 0xFD, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90,
+0x04, 0x1D, 0xE0, 0x70, 0x1A, 0x90, 0x8D, 0x08, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x56,
+0xAE, 0x90, 0x95, 0x87, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22,
+0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0,
+0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0,
+0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x8D, 0xFF,
+0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0,
+0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x88,
+0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x92, 0x22, 0x90, 0x01, 0x3C, 0xE0,
+0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23,
+0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0,
+0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x01, 0xCF, 0xE0,
+0x90, 0x94, 0x59, 0xF0, 0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0,
+0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20,
+0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x12, 0x4E, 0x85, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD,
+0x7F, 0x03, 0x12, 0x49, 0x4F, 0x80, 0xFE, 0x22, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0x13, 0x13, 0x54,
+0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x54, 0xFD, 0xF0, 0x54,
+0x07, 0x70, 0x2E, 0x80, 0x29, 0x90, 0x8E, 0x8D, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x88, 0xE0, 0x54,
+0xEF, 0xF0, 0x90, 0x8F, 0x23, 0xE0, 0xFF, 0x90, 0x8E, 0x8D, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90,
+0x8D, 0xFF, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x58,
+0x92, 0x22, 0xE4, 0x90, 0x94, 0x5F, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4A, 0xE7,
+0x90, 0x94, 0x5F, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x4A, 0xE7, 0xAE, 0x07, 0x90, 0x94, 0x5F, 0xE0,
+0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x94, 0x61, 0xE0, 0x94, 0x64, 0x90, 0x94, 0x60, 0xE0,
+0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x94, 0x5F, 0xE0, 0xFF,
+0x22, 0x90, 0x94, 0x60, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x32, 0xC0, 0xE0,
+0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xBE, 0x90,
+0x01, 0xC4, 0xED, 0xF0, 0x74, 0x6E, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3,
+0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90,
+0x95, 0x8A, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x48, 0x12, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x90, 0x95,
+0x8A, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x01, 0xF0, 0x22, 0x90, 0x93, 0xB6, 0x74, 0x12, 0xF0,
+0x90, 0x93, 0xC4, 0x74, 0x05, 0xF0, 0x90, 0x93, 0xB8, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB,
+0xF0, 0x90, 0x93, 0xB4, 0xE0, 0x90, 0x93, 0xBB, 0xF0, 0x90, 0x93, 0xB5, 0xE0, 0x90, 0x93, 0xBC,
+0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB6, 0xF1, 0x3D, 0x7F, 0x04, 0x80, 0xB2, 0xD3, 0x10, 0xAF,
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF6, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60,
+0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF7, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F,
+0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90,
+0x8D, 0xF7, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x60, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xA8, 0x01,
+0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8D, 0xF7, 0xE0,
+0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D,
+0xF7, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x8B, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x48,
+0x12, 0x90, 0x8D, 0x02, 0xE0, 0xFF, 0x90, 0x95, 0x8B, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x02,
+0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x8D, 0x07,
+0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x08, 0xF0, 0x90, 0x00, 0x02,
+0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x09, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x25,
+0x51, 0x90, 0x8D, 0x0A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x0B,
+0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x0C, 0xF0, 0x90, 0x00, 0x06,
+0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x0D, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8E, 0x7F, 0xF0, 0xBF,
+0x01, 0x10, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x1C, 0x7D, 0x13, 0x7F, 0x6F,
+0x80, 0x13, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01,
+0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0xA5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0xAB,
+0x12, 0x44, 0x12, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x84, 0xF0, 0xEF, 0xC4, 0x13,
+0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4,
+0x54, 0x0F, 0xFE, 0x90, 0x8E, 0x82, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06,
+0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54,
+0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x8E, 0x82, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02,
+0x12, 0x06, 0xA2, 0x90, 0x8E, 0x83, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x30, 0xE0, 0x5E,
+0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8E, 0x96, 0x50, 0x04, 0xEF, 0xF0, 0x80,
+0x2E, 0x74, 0x03, 0xF0, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x09, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A,
+0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF,
+0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90,
+0x93, 0xAB, 0x12, 0x44, 0x09, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3,
+0x94, 0x04, 0x90, 0x8E, 0x8C, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x90, 0x93,
+0xAB, 0x12, 0x44, 0x09, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12, 0x52, 0xE8,
+0x90, 0x94, 0xD0, 0xE0, 0x60, 0x03, 0x12, 0x52, 0xDC, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x09, 0x02,
+0x66, 0x4B, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90,
+0x8F, 0x23, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x24, 0xF0, 0xEF, 0x54, 0xFE,
+0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x26,
+0xF0, 0x22, 0x90, 0x8F, 0x23, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28,
+0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x95, 0x7D, 0xF0,
+0x90, 0x95, 0x7D, 0xE0, 0xFD, 0x70, 0x02, 0x41, 0xD5, 0x90, 0x8D, 0x5E, 0xE0, 0xFF, 0x70, 0x06,
+0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0x5F, 0xE0, 0xB5, 0x07, 0x04,
+0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0,
+0x22, 0x90, 0x95, 0x7B, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3,
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0xB2, 0xE4, 0x90, 0x95,
+0x7E, 0xF0, 0x90, 0x95, 0x7E, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0x95, 0x7B, 0xE0,
+0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74,
+0xD0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, 0x5F, 0xE0, 0x75,
+0xF0, 0x08, 0x90, 0x8D, 0x0E, 0x12, 0x43, 0xFD, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83,
+0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35,
+0xF0, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D,
+0x5F, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x8D, 0x12, 0x12, 0x43, 0xFD, 0xE5, 0x82, 0x29, 0xF5, 0x82,
+0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x95, 0x7E, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90,
+0x95, 0x7D, 0xE0, 0xFF, 0x90, 0x95, 0x7B, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02,
+0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x95, 0x7D, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0xFF, 0x74,
+0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x95,
+0x7B, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5F, 0xE0, 0x04, 0xF0, 0xE0, 0x7F,
+0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x21, 0x90, 0xE4, 0x90, 0x8D, 0x5F, 0xF0,
+0x21, 0x90, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0x44, 0x80, 0x90,
+0x00, 0x8A, 0xF0, 0x90, 0x95, 0x7B, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x43, 0xFD,
+0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF6, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5E,
+0xF0, 0xA3, 0xF0, 0x22, 0xF1, 0xBF, 0x51, 0xD6, 0x12, 0x53, 0x57, 0x12, 0x9E, 0x7B, 0x71, 0x0C,
+0x12, 0x89, 0x62, 0x12, 0x9C, 0x9B, 0x90, 0x93, 0x96, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0,
+0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x93, 0x98, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x1F,
+0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x2E, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x90, 0xE0, 0x44,
+0x20, 0xF0, 0x12, 0x90, 0x1F, 0x12, 0xA6, 0x6D, 0x90, 0x8D, 0x06, 0xE0, 0xFF, 0x64, 0x02, 0x70,
+0x3A, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4C, 0xEE,
+0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4A, 0xEE,
+0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4B, 0xEE,
+0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x80, 0x6A, 0xEF, 0x64, 0x01, 0x70, 0x2D,
+0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4C, 0xEF, 0xF0,
+0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4A, 0xEF, 0xF0,
+0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x33, 0x90, 0x8D, 0x06,
+0xE0, 0x64, 0x03, 0x70, 0x30, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01,
+0x90, 0x8F, 0x4C, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01,
+0x90, 0x8F, 0x4A, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01,
+0x90, 0x8F, 0x4B, 0xEF, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0x90, 0x91, 0x33,
+0xF0, 0x90, 0x91, 0x3B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x91, 0x3F, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x91, 0x37, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90,
+0x93, 0x73, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x22, 0xEF, 0x60, 0x55, 0x90, 0x93, 0x79,
+0xE0, 0xFF, 0x60, 0x02, 0x91, 0xA4, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE,
+0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF8, 0xF0, 0xA3,
+0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x12, 0x4C, 0x19, 0x90, 0x02,
+0x86, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x8A, 0x9E, 0x91, 0x7F, 0x12, 0x4F, 0x6A, 0xE4, 0xFD, 0xFF,
+0x12, 0x52, 0xA5, 0x12, 0x9C, 0x03, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x02,
+0x57, 0xD6, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x63, 0x8E, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0,
+0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0x90, 0x32, 0x12, 0x5F, 0xDF, 0x61, 0x0C, 0xF1,
+0xBE, 0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x18, 0x90, 0x8D, 0xFB, 0xE0, 0xFF,
+0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x0D, 0x90, 0x95, 0x46, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x14,
+0x12, 0x80, 0x2E, 0x22, 0x91, 0xC7, 0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75,
+0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x08, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xF9, 0x02,
+0x35, 0x26, 0x90, 0x8D, 0xFD, 0xE0, 0xFF, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0,
+0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x90, 0x93, 0x84, 0xE0, 0xFF,
+0x91, 0xC7, 0x90, 0x93, 0xAB, 0xEF, 0xF0, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFD,
+0x90, 0x93, 0xAB, 0xE0, 0x24, 0x2C, 0xF1, 0x94, 0x90, 0x93, 0xAB, 0xE0, 0x2F, 0x24, 0x30, 0xA3,
+0xF0, 0xE0, 0xFD, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x05,
+0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E,
+0x90, 0x90, 0xE7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34,
+0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79,
+0xE9, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0x14, 0xF0, 0xE0, 0xFD, 0x24, 0x01, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0xED, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0x93, 0x85, 0xE0, 0xFF, 0x91, 0xC7, 0x90, 0x93, 0xAB, 0xEF, 0xF0, 0x90, 0x90, 0xE3,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x4E, 0x60, 0x1C, 0x90, 0x93, 0xAB, 0xE0, 0x24, 0x00, 0xF9, 0xE4,
+0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x8F, 0x43, 0x7B, 0x01, 0x7A, 0x90, 0x79,
+0xF1, 0x12, 0x35, 0x26, 0x90, 0x93, 0x86, 0xE0, 0xFF, 0x91, 0xC7, 0x90, 0x93, 0xAB, 0xEF, 0xF0,
+0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x90, 0xE5,
+0xA3, 0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A, 0x91, 0x79, 0x11, 0x02, 0x35, 0x26, 0xEF, 0x60, 0x05,
+0x12, 0xA6, 0xA2, 0x91, 0xDB, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89,
+0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02,
+0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54,
+0xFB, 0x4D, 0xFF, 0x90, 0x8F, 0x2E, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF,
+0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0x8F, 0x2E,
+0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54,
+0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x8F, 0x2E, 0xF0, 0xEE, 0x54, 0x80, 0xFE, 0xEF,
+0x54, 0x7F, 0x4E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFF, 0x90, 0x8F, 0x30,
+0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFF, 0x90, 0x8F,
+0x2F, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C,
+0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF8, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8F, 0x2E,
+0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0xD1, 0xD4, 0x90, 0x8F, 0x2E, 0xE0, 0x13, 0x13, 0x54, 0x01,
+0xFF, 0xF1, 0xC5, 0x90, 0x8F, 0x2E, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x9C, 0x3B,
+0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0xF1, 0xD0, 0x90, 0x8F, 0x2E, 0xE0, 0xC4, 0x13,
+0x13, 0x54, 0x01, 0xFF, 0xB1, 0xDD, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0x01, 0xFF, 0x91, 0x0A, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x07, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0xD1, 0xDF, 0x22, 0x91,
+0xC7, 0x90, 0x93, 0xAB, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAB, 0xF1, 0x77, 0x90, 0x93,
+0xAD, 0xEF, 0xF0, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40,
+0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x4D, 0x12, 0x35,
+0x26, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC,
+0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x53,
+0x12, 0x35, 0x26, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4,
+0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8F,
+0x79, 0x57, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48,
+0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01,
+0x7A, 0x8F, 0x79, 0x5D, 0x02, 0x35, 0x26, 0xA3, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
+0xFD, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF,
+0x30, 0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4, 0xFC, 0xED, 0x30, 0xE6, 0x09, 0xAF, 0x03, 0x12,
+0x7F, 0x28, 0xAE, 0x07, 0x80, 0x02, 0xE4, 0xFE, 0xEC, 0x24, 0x18, 0x2E, 0xFF, 0x22, 0x22, 0xE4,
+0x90, 0x8D, 0xFF, 0xF0, 0x22, 0xEF, 0x60, 0x07, 0x90, 0x93, 0x7F, 0xE0, 0xFF, 0xF1, 0xDE, 0x22,
+0xEF, 0x60, 0x0A, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x80, 0xF0, 0x12, 0xA8, 0xA5, 0x22, 0x91, 0xC7,
+0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42,
+0x75, 0x43, 0x70, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x61, 0x02, 0x35, 0x26, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x5A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0,
+0x90, 0x95, 0x5A, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90,
+0x95, 0x5D, 0xE0, 0x94, 0xE8, 0x90, 0x95, 0x5C, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0,
+0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0x95, 0x5C, 0xE4, 0x75, 0xF0, 0x01, 0x12,
+0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92,
+0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4,
+0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83,
+0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83,
+0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0,
+0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B,
+0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x95, 0x5E,
+0xEF, 0xF0, 0xA3, 0x12, 0x44, 0x12, 0x90, 0x95, 0x7C, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01,
+0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03,
+0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x5F, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42,
+0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x5E, 0xE0,
+0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3,
+0x12, 0x44, 0x09, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90,
+0x95, 0x5F, 0x12, 0x44, 0x09, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0,
+0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAB, 0x7F, 0xF5, 0x7E, 0x01,
+0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0x93, 0xAB, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93,
+0x79, 0xAB, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0,
+0x90, 0x93, 0xAD, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAB, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34,
+0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0, 0x90, 0x93, 0xAE, 0xF0, 0x7B, 0x01, 0x7A, 0x93,
+0x79, 0xAB, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0,
+0x90, 0x93, 0xAF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAB, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34,
+0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAB, 0xE0, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x93, 0xAC, 0xE0,
+0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0xB4, 0xF0, 0x90, 0x93, 0xB0,
+0xE0, 0x90, 0x93, 0xB5, 0xF0, 0x02, 0x6F, 0x0A, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF,
+0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF,
+0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22,
+0x90, 0x95, 0x72, 0x12, 0x44, 0x12, 0xE4, 0xFF, 0x90, 0x95, 0x72, 0x12, 0x44, 0x09, 0x8F, 0x82,
+0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5,
+0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4,
+0x54, 0x0F, 0xFF, 0x22, 0x75, 0x15, 0x10, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x02,
+0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5,
+0x18, 0xF0, 0x22, 0x75, 0x1D, 0x07, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x90,
+0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0, 0xA3, 0xE5, 0x20,
+0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90,
+0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90,
+0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xC7,
+0x74, 0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x84, 0xF0, 0x74, 0x7A, 0xA3, 0xF0,
+0x90, 0x93, 0x88, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8,
+0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x8D,
+0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x1B,
+0xF0, 0xA3, 0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D,
+0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44,
+0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x94, 0x5C, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44,
+0x20, 0xF0, 0x51, 0xC6, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x61, 0x8F, 0x90, 0x93, 0x84, 0xE0, 0xFF,
+0x7B, 0x08, 0x7D, 0x01, 0x12, 0x56, 0xAE, 0x90, 0x94, 0x59, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
+0x94, 0x59, 0x12, 0x77, 0x77, 0x90, 0x94, 0x5B, 0xEF, 0xF0, 0x90, 0x94, 0x59, 0xA3, 0xE0, 0x24,
+0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xE4, 0xFD, 0xD1, 0x4C, 0x90, 0x94, 0x5B, 0xE0,
+0xFF, 0x90, 0x94, 0x5A, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0x59, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30,
+0xCF, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x5C, 0xF0, 0xA3, 0xEF, 0xF0, 0xD1, 0xF6, 0x90, 0x94, 0x5C,
+0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x93, 0x84, 0xE0, 0xFB, 0xE4, 0xFF, 0x71, 0x90, 0x90, 0x94,
+0x5C, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x93, 0x80, 0xE0, 0xFB, 0x7F, 0x11, 0x71, 0x90, 0x90,
+0x04, 0x1F, 0x74, 0x20, 0xF0, 0x90, 0x90, 0xEF, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x22,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x2A, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3,
+0xEB, 0xF0, 0xAA, 0x07, 0x90, 0x95, 0x31, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x95,
+0x2C, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEA, 0x24, 0xEF, 0x60, 0x6E, 0x24, 0xD7, 0x70,
+0x02, 0xA1, 0x97, 0x24, 0x3A, 0x60, 0x02, 0xC1, 0x20, 0x90, 0x95, 0x2A, 0xA3, 0xE0, 0xFF, 0x24,
+0x0A, 0xFD, 0xE4, 0x33, 0x90, 0x95, 0x35, 0xF0, 0xA3, 0xED, 0xF0, 0xFE, 0x24, 0x00, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE4, 0xF0, 0xFE, 0x74, 0x00, 0x2F, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x7D, 0x14,
+0x7C, 0x00, 0x12, 0x26, 0x4E, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x7B, 0x00, 0x7A, 0x00, 0x79,
+0x00, 0x90, 0xAC, 0x67, 0x12, 0x44, 0x12, 0x90, 0x95, 0x31, 0x12, 0x43, 0xE5, 0x90, 0xAC, 0x6A,
+0x12, 0x08, 0x6D, 0x7D, 0x14, 0x7C, 0x00, 0xE4, 0xFF, 0xA1, 0x92, 0x90, 0x95, 0x2A, 0xE4, 0x75,
+0xF0, 0x14, 0x12, 0x08, 0xD6, 0x90, 0x95, 0x2A, 0xA3, 0xE0, 0xFB, 0xFF, 0x24, 0x06, 0xFC, 0xE4,
+0x33, 0x90, 0x95, 0x35, 0xF0, 0xA3, 0xCC, 0xF0, 0x90, 0x95, 0x35, 0xA3, 0xE0, 0xFE, 0x24, 0x00,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
+0xFE, 0xA9, 0x03, 0x74, 0x05, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x7C, 0x00,
+0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0x90, 0x95, 0x2F, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x2A,
+0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0xEF, 0x94, 0x00, 0xEE, 0x94, 0x01,
+0x90, 0x95, 0x2A, 0x50, 0x02, 0xA1, 0x2C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE9, 0x7C, 0x00, 0x24,
+0x00, 0xF9, 0xEC, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC3, 0xE4, 0x9F, 0xFD, 0x74, 0x01, 0x9E, 0xFC,
+0x12, 0x26, 0x4E, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x2C, 0xE0, 0x24, 0x01, 0xFF,
+0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x95, 0x31, 0x12, 0x43,
+0xF1, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0x7B, 0x01, 0x7A, 0xFC, 0x79, 0x00, 0x90,
+0x95, 0x2A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xE4, 0x9F, 0xFF, 0x74, 0x01, 0x9E, 0xFE, 0x90,
+0x95, 0x2F, 0xE0, 0xFC, 0xA3, 0xE0, 0xC3, 0x9F, 0xFD, 0xEC, 0x9E, 0xFC, 0x12, 0x26, 0x4E, 0xD0,
+0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D,
+0x90, 0x95, 0x2C, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x80, 0x1E, 0xA3, 0xE0, 0x7E, 0x00,
+0x24, 0x00, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x95, 0x2F, 0xE0, 0xFC, 0xA3, 0xE0,
+0xFD, 0x12, 0x26, 0x4E, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x2A, 0x74, 0xFF, 0x75,
+0xF0, 0xEC, 0x12, 0x08, 0xD6, 0x90, 0x95, 0x2A, 0xA3, 0xE0, 0xFF, 0x7E, 0x00, 0x24, 0x0C, 0xF9,
+0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0x74, 0x10, 0x2F, 0xF9, 0xEE, 0x34,
+0xFC, 0xFA, 0x90, 0xAC, 0x67, 0x12, 0x44, 0x12, 0x90, 0x95, 0x31, 0x12, 0x43, 0xE5, 0x90, 0xAC,
+0x6A, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x2F, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD0, 0x01, 0xD0, 0x02,
+0x7F, 0x11, 0x12, 0x1B, 0xAC, 0xC1, 0x18, 0x90, 0x95, 0x2A, 0xA3, 0xE0, 0xFF, 0x24, 0x2A, 0xFD,
+0xE4, 0x33, 0x90, 0x95, 0x35, 0xF0, 0xA3, 0xED, 0xF0, 0xFE, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4,
+0xF0, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x7D, 0x48, 0x7C, 0x00, 0x12,
+0x26, 0x4E, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x31, 0x12, 0x43, 0xE5, 0x78, 0x10,
+0x12, 0x08, 0x47, 0x90, 0x95, 0x31, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x90, 0xE4, 0xFD, 0xFC, 0x90,
+0x95, 0x31, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x31, 0x12, 0x43, 0xE5, 0x78, 0x10, 0x12, 0x08, 0x47,
+0x90, 0x95, 0x31, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x90, 0x90, 0x95, 0x31, 0x12, 0x08, 0x6D, 0x90,
+0x95, 0x31, 0x12, 0x43, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0x95, 0x2D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x90, 0x95, 0x2D, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, 0x95, 0x35, 0xA3, 0xE0, 0xFE,
+0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x4E, 0xED,
+0xF0, 0x90, 0x95, 0x4B, 0x12, 0x44, 0x12, 0xE4, 0x90, 0x95, 0x4F, 0xF0, 0xA3, 0xF0, 0x12, 0x06,
+0x89, 0xFF, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFD, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFB,
+0x12, 0x77, 0x9D, 0x90, 0x95, 0x4F, 0xEF, 0xF0, 0x90, 0x95, 0x4B, 0x12, 0x44, 0x09, 0x90, 0x00,
+0x04, 0x12, 0x06, 0xA2, 0xFF, 0xF1, 0x28, 0x90, 0x95, 0x50, 0xEF, 0xF0, 0x90, 0x90, 0x02, 0xE0,
+0x24, 0xFE, 0x60, 0x1D, 0x24, 0xFE, 0x60, 0x19, 0x14, 0x60, 0x07, 0x14, 0x60, 0x04, 0x24, 0x05,
+0x70, 0x53, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xF9, 0x90, 0x95, 0x4E, 0xE0, 0xFD, 0xF1, 0x67, 0x80,
+0x16, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xF9, 0x90, 0x95, 0x4E, 0xE0, 0xFD, 0x90, 0x90, 0x02, 0xE0,
+0x90, 0x95, 0x20, 0xF0, 0x12, 0xA5, 0x3E, 0x90, 0x95, 0x50, 0xE0, 0xFF, 0x90, 0x95, 0x4B, 0x12,
+0x44, 0x09, 0x90, 0x95, 0x4F, 0xE0, 0x7C, 0x00, 0x29, 0xF9, 0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F,
+0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xF9, 0xA3, 0xE0,
+0xF5, 0x43, 0x12, 0x35, 0x26, 0x22, 0xAD, 0x07, 0x90, 0x90, 0xE7, 0xE4, 0x75, 0xF0, 0x01, 0x12,
+0x08, 0xD6, 0x90, 0x90, 0xE7, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x04, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0xE7, 0xA3, 0xE0, 0xFF, 0x74, 0x05, 0x2E, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF,
+0x20, 0xE0, 0x05, 0x90, 0x93, 0x77, 0x80, 0x03, 0x90, 0x93, 0x78, 0xE0, 0x90, 0x90, 0x02, 0xF0,
+0x90, 0x90, 0x02, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14, 0x60,
+0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E, 0x08,
+0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x3A, 0xED, 0xF0, 0x90, 0x95, 0x37, 0x12,
+0x44, 0x12, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x3E, 0xF0, 0x90, 0x95, 0x37, 0x12,
+0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x03, 0x7B, 0x01, 0x7A, 0x95, 0x79,
+0x3B, 0x12, 0x35, 0x26, 0x90, 0x95, 0x3A, 0xE0, 0x70, 0x46, 0xFF, 0x74, 0x3B, 0x2F, 0xF5, 0x82,
+0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0x3B, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
+0x95, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x3B, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5,
+0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x03, 0xD0, 0x75, 0x40, 0x01, 0x75, 0x41,
+0x95, 0x75, 0x42, 0x3B, 0x75, 0x43, 0x03, 0x90, 0x95, 0x37, 0x12, 0x44, 0x09, 0x12, 0x35, 0x26,
+0x22, 0x90, 0x93, 0xD2, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xD1, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x94,
+0x55, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x7C, 0xE0, 0xFD, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A,
+0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
+0xC0, 0xD0, 0xE4, 0xFF, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6B, 0xF5, 0x82, 0xE4, 0x34, 0x94,
+0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xEB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90,
+0x95, 0x4A, 0xF0, 0x7F, 0x03, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x45, 0xEF,
+0xF0, 0xD1, 0x94, 0x90, 0x95, 0x45, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6B, 0xF5, 0x82,
+0xE4, 0x34, 0x94, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0x95, 0x4A, 0xE0, 0xFE, 0xEF, 0x75, 0xF0,
+0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x95, 0x45,
+0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x95, 0x46, 0x12, 0x43, 0xE5, 0x78, 0x10, 0x12, 0x08, 0x47,
+0xAB, 0x07, 0x90, 0x95, 0x46, 0x12, 0x43, 0xE5, 0x78, 0x08, 0x12, 0x08, 0x47, 0x90, 0x95, 0x43,
+0xEF, 0xF0, 0x90, 0x95, 0x46, 0x12, 0x43, 0xE5, 0x90, 0x95, 0x44, 0xEF, 0xF0, 0x7D, 0x01, 0x7F,
+0x50, 0x7E, 0x01, 0x12, 0x50, 0x6C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
+0xC0, 0xD0, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8D,
+0xFB, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF,
+0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8D, 0xFB,
+0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2,
+0xFF, 0xED, 0x2F, 0x90, 0x8D, 0xFC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05,
+0xED, 0x2F, 0x90, 0x8D, 0xFD, 0xF0, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13, 0x13,
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x09, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x40, 0xF0, 0xF1, 0x16, 0x90,
+0x8D, 0xFB, 0xE0, 0xFF, 0x30, 0xE0, 0x3D, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x06,
+0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0xEF, 0x13, 0x13, 0x54,
+0x3F, 0x30, 0xE0, 0x0D, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0xCF, 0x74, 0x01,
+0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x57, 0xD6, 0x90, 0x95, 0x46, 0x12, 0x08, 0x79, 0x00, 0x00,
+0x27, 0x10, 0x11, 0x2E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
+0x90, 0x94, 0xC7, 0xE0, 0xFF, 0xD1, 0xB0, 0xEF, 0x60, 0x70, 0x90, 0x94, 0xC8, 0xE0, 0xFB, 0xD3,
+0x94, 0x00, 0x40, 0x1C, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0F, 0xAF, 0x03,
+0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x6D, 0x7F, 0x08, 0x7E, 0x0E, 0x51, 0x43,
+0x90, 0x94, 0xC7, 0xE0, 0xFF, 0x90, 0x06, 0x33, 0xF0, 0x90, 0x94, 0xBF, 0xE0, 0x90, 0x95, 0x69,
+0xF0, 0xE4, 0xFB, 0xFD, 0x91, 0xBA, 0x90, 0x8D, 0xFC, 0xE0, 0xFF, 0x12, 0x56, 0x68, 0x90, 0x94,
+0xC9, 0xE0, 0x90, 0x93, 0xA8, 0xF0, 0x90, 0x94, 0xB4, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0xD1, 0xDB,
+0x90, 0x93, 0xA8, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x95, 0x46, 0x12, 0x08, 0x6D, 0xE4,
+0x90, 0x95, 0x4A, 0xF0, 0x7F, 0x04, 0x11, 0x35, 0x80, 0x40, 0xE4, 0x90, 0x94, 0xB4, 0xF0, 0x90,
+0x94, 0xD0, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x54, 0xFB, 0xF0, 0x91, 0x30, 0x90, 0x8D, 0xFF, 0xE0,
+0xB4, 0x01, 0x0D, 0x90, 0x94, 0xCC, 0xE0, 0xFD, 0x7F, 0x02, 0x12, 0x52, 0xE8, 0x12, 0x57, 0xC1,
+0x90, 0x93, 0xA9, 0x74, 0x07, 0xF0, 0x90, 0x93, 0xB7, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xA9,
+0x12, 0x6F, 0x3D, 0x7F, 0x04, 0x12, 0x6E, 0xEF, 0xD1, 0x3C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F,
+0x58, 0x7E, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xF8, 0xEE, 0xF0, 0xA3,
+0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0x95, 0x02, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xFA, 0x12, 0x43,
+0xE5, 0x12, 0x08, 0x3A, 0x90, 0x95, 0x02, 0x12, 0x43, 0xF1, 0x12, 0x43, 0xBA, 0xC0, 0x04, 0xC0,
+0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0xFA, 0x12, 0x43, 0xE5, 0x90, 0x94, 0xFE, 0x12, 0x43,
+0xF1, 0x12, 0x43, 0xBA, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x43, 0xC7, 0x90,
+0x95, 0x06, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x06, 0x12, 0x43, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08,
+0x6D, 0x90, 0x94, 0xF8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x8C, 0xED, 0xF0, 0xEF, 0x14, 0x60,
+0x02, 0x61, 0xC0, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x95, 0x8C, 0xE0, 0xC4, 0x33,
+0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0x94, 0xFA, 0x12,
+0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01,
+0x7F, 0x00, 0x7E, 0x08, 0x51, 0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01,
+0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x51, 0x43,
+0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0x95, 0x8C, 0xE0, 0xFF, 0xE4,
+0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0x12,
+0x08, 0x5A, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0A, 0x51, 0x43, 0x90, 0x94,
+0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x95, 0x8C, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD,
+0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0x12, 0x08, 0x5A, 0x90, 0x94, 0xFE, 0x12, 0x08,
+0x6D, 0x7F, 0x00, 0x7E, 0x0D, 0x51, 0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00,
+0x00, 0x90, 0x95, 0x8C, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78,
+0x1A, 0x12, 0x08, 0x5A, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08, 0x51, 0x43,
+0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79,
+0x00, 0x00, 0x00, 0x00, 0x7F, 0x84, 0x7E, 0x08, 0x51, 0x43, 0x90, 0x94, 0xE8, 0x12, 0x08, 0x79,
+0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xEC, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x69,
+0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00,
+0x01, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0x51,
+0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xFE, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0x51, 0x43, 0x90, 0x94, 0xFA, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x7F,
+0x84, 0x7E, 0x08, 0x51, 0x43, 0x90, 0x94, 0xE8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90,
+0x94, 0xEC, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0xB1, 0x3B, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0x90, 0x02, 0x86, 0xE0,
+0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x94, 0xCF, 0xF0, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00,
+0x00, 0x7F, 0x90, 0x94, 0xB5, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xFE, 0x12, 0x08,
+0x6D, 0x7F, 0x50, 0x7E, 0x0C, 0x51, 0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00,
+0x7F, 0x90, 0x94, 0xB6, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x6D,
+0x51, 0x3F, 0x90, 0x94, 0xCB, 0xE0, 0x90, 0x06, 0x08, 0xF0, 0x90, 0x94, 0xCD, 0xA3, 0xE0, 0x90,
+0x06, 0xA0, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x94, 0xB9, 0xE0, 0xFF, 0x60, 0x05, 0xA3, 0xE0, 0xFD,
+0x51, 0xB1, 0x90, 0x94, 0xB8, 0xE0, 0xFF, 0x60, 0x10, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0x90,
+0x94, 0xBF, 0xE0, 0x90, 0x95, 0x69, 0xF0, 0x91, 0xBA, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x90, 0x95, 0x66, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x2F, 0xEB, 0xB4, 0x01, 0x07, 0xE0,
+0x24, 0x02, 0xF5, 0x5A, 0x80, 0x08, 0x90, 0x95, 0x66, 0xE0, 0x24, 0xFE, 0xF5, 0x5A, 0x90, 0x94,
+0xE8, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x5A, 0xB1, 0x31, 0x90, 0x94, 0xE8, 0x12,
+0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x5A, 0x80, 0x20, 0x90, 0x94, 0xE8, 0x12, 0x08, 0x79,
+0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, 0x66, 0xE0, 0xFF, 0xB1, 0x31, 0x90, 0x94, 0xE8, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, 0x66, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94,
+0xEC, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0xB1, 0x41, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xEC, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0xE4,
+0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xE6, 0xEC, 0xF0, 0xA3, 0xED, 0xF0,
+0x90, 0x94, 0xE5, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0x94, 0xF0, 0x12,
+0x08, 0x6D, 0x90, 0x94, 0xE8, 0x12, 0x43, 0xE5, 0x12, 0x08, 0x3A, 0x90, 0x94, 0xF0, 0x12, 0x43,
+0xF1, 0x12, 0x43, 0xBA, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0xE8, 0x12,
+0x43, 0xE5, 0x90, 0x94, 0xEC, 0x12, 0x43, 0xF1, 0x12, 0x43, 0xBA, 0xD0, 0x03, 0xD0, 0x02, 0xD0,
+0x01, 0xD0, 0x00, 0x12, 0x43, 0xC7, 0x90, 0x94, 0xF4, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xE6, 0xA3,
+0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x94, 0xF4, 0x12, 0x43, 0xE5, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D,
+0x90, 0x94, 0xE5, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F,
+0x50, 0x7E, 0x0C, 0x12, 0x37, 0x4E, 0x90, 0x94, 0xB5, 0xEF, 0xF0, 0x7F, 0x58, 0x7E, 0x0C, 0x12,
+0x37, 0x4E, 0x90, 0x94, 0xB6, 0xEF, 0xF0, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00,
+0x7F, 0x90, 0x94, 0xFE, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x7F, 0x50, 0x7E, 0x0C, 0x51,
+0x43, 0x90, 0x94, 0xFA, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94, 0xFE, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0x17, 0x51, 0x3F, 0x90, 0x06, 0x08, 0xE0, 0x90, 0x94, 0xCB, 0xF0, 0x90,
+0x06, 0xA1, 0xE0, 0xFE, 0x90, 0x06, 0xA0, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90,
+0x94, 0xCD, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0xA0,
+0x74, 0x20, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0xE4, 0xFD, 0xFF, 0x41, 0xB1, 0x90, 0x8D, 0xFB, 0xE0,
+0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3C, 0x90, 0x91, 0x3B, 0x12, 0x43, 0xE5, 0xEC,
+0x4D, 0x4E, 0x4F, 0x60, 0x18, 0x90, 0x93, 0x73, 0x12, 0x43, 0xF1, 0xD3, 0x12, 0x43, 0xD4, 0x40,
+0x0C, 0xE4, 0x7F, 0xE8, 0x7E, 0x03, 0xFD, 0xFC, 0x90, 0x91, 0x3F, 0x80, 0x0A, 0xE4, 0x7F, 0xE8,
+0x7E, 0x03, 0xFD, 0xFC, 0x90, 0x91, 0x37, 0x12, 0x43, 0xF1, 0x12, 0x42, 0x9D, 0x90, 0x95, 0x46,
+0x12, 0x08, 0x6D, 0x11, 0x2E, 0x22, 0xEF, 0x24, 0xFC, 0x60, 0x06, 0x04, 0x70, 0x05, 0x02, 0x55,
+0x6D, 0x31, 0x79, 0x22, 0x90, 0x01, 0x53, 0xE4, 0xF0, 0xFF, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24,
+0x6B, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xEB, 0x22,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xB7, 0xE0, 0xFE, 0x90, 0x94, 0xB4, 0xE0,
+0xC3, 0x9E, 0x40, 0x04, 0x7F, 0x00, 0x80, 0x0E, 0xEF, 0x60, 0x05, 0xD3, 0x94, 0x0E, 0x40, 0x04,
+0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
+0xC0, 0xD0, 0x90, 0x93, 0xB8, 0xEF, 0xF0, 0x12, 0x74, 0xC2, 0x74, 0x10, 0x2F, 0xFF, 0x90, 0x93,
+0xB8, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x2F, 0xFF, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40,
+0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0xC7, 0x12, 0x35,
+0x26, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x74, 0xC2, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xB7, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0x90, 0x94, 0xB8, 0xF0, 0x74, 0x02, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE0, 0x90, 0x94, 0xB9, 0xF0, 0x74, 0x03, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xE0, 0x90, 0x94, 0xBA, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
+0x90, 0x94, 0xBB, 0xF0, 0x74, 0x05, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90,
+0x94, 0xBC, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94,
+0xBD, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xBE,
+0xF0, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xBF, 0xF0,
+0x22, 0xE4, 0x90, 0x93, 0xA7, 0xF0, 0x90, 0x93, 0xA7, 0xE0, 0xFF, 0xC3, 0x94, 0x08, 0x40, 0x03,
+0x02, 0x88, 0xAA, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6B, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5,
+0x83, 0xE0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x88, 0xA1, 0x90, 0x93, 0xA7, 0xE0, 0x75, 0xF0, 0x0A,
+0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x43, 0xE5, 0xE4, 0x7B, 0x01,
+0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0xD4, 0x70, 0x63, 0x90, 0x93, 0xA7, 0xE0, 0xFB, 0x75, 0xF0,
+0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0x60, 0x2E, 0x14, 0x60,
+0x02, 0x01, 0xA1, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x66, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5,
+0x83, 0x12, 0x43, 0xE5, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94,
+0xF5, 0x83, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xA7, 0xE0, 0xFF, 0x80, 0x1B, 0x90, 0x93, 0xA7, 0xE0,
+0xFB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0x12, 0x86, 0x86, 0x80, 0x55, 0x90, 0x93, 0xA7, 0xE0,
+0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x43, 0xE5,
+0xE4, 0xFB, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x43, 0xD4, 0x50, 0x36, 0x90, 0x93, 0xA7, 0xE0, 0xFB,
+0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x43, 0xE5,
+0xEF, 0x24, 0xFF, 0xFF, 0xEE, 0x34, 0xFF, 0xFE, 0xED, 0x34, 0xFF, 0xFD, 0xEC, 0x34, 0xFF, 0xFC,
+0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x08,
+0x6D, 0x90, 0x93, 0xA7, 0xE0, 0x04, 0xF0, 0x02, 0x87, 0xA6, 0x22, 0x7B, 0x01, 0x7A, 0x93, 0x79,
+0x9C, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0x93, 0x9C, 0xE0, 0x54,
+0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0x93, 0x95, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x95,
+0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E,
+0x90, 0x93, 0x9E, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0x93, 0xA2,
+0x12, 0x08, 0x6D, 0x90, 0x93, 0x9E, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD,
+0xFC, 0xEF, 0x60, 0x24, 0x90, 0x93, 0x9E, 0x12, 0x43, 0xE5, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90,
+0x93, 0x9E, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x9E, 0x12, 0x43, 0xE5, 0x90, 0xAA, 0xB9, 0x12, 0x08,
+0x6D, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0x93, 0xA2, 0x12, 0x43, 0xE5, 0xEF, 0x54,
+0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0x93, 0xA2, 0x12, 0x43, 0xE5, 0xEF,
+0x54, 0xFE, 0xFF, 0xEC, 0x90, 0x93, 0xA2, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xA2, 0x12, 0x43, 0xE5,
+0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92,
+0xAF, 0x22, 0x90, 0x93, 0x89, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3,
+0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE,
+0x90, 0x93, 0x89, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB,
+0x4F, 0xF0, 0x12, 0x06, 0x89, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2,
+0x90, 0x93, 0x8A, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE,
+0xA3, 0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E,
+0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x93, 0xAB, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
+0x02, 0x87, 0xE0, 0xF9, 0x90, 0x8F, 0x2E, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0x9D, 0xEC, 0xC3, 0x99,
+0x40, 0x02, 0x41, 0x9D, 0x90, 0x93, 0xAB, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0xFD, 0x11,
+0xF0, 0xAF, 0x03, 0xAD, 0x07, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0,
+0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00,
+0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0x93, 0xAD, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5,
+0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x74,
+0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xFB, 0xEF, 0x24, 0x18,
+0xFF, 0xE4, 0x33, 0xCF, 0x2B, 0xCF, 0x3A, 0x90, 0x93, 0xAD, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90,
+0x93, 0xAD, 0xD1, 0xCC, 0x90, 0x93, 0xAD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAB, 0xEE,
+0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93,
+0xAC, 0xE0, 0x9F, 0x90, 0x93, 0xAB, 0xE0, 0x9E, 0x40, 0x1B, 0x90, 0x8D, 0xF9, 0xE0, 0x24, 0x01,
+0xFF, 0x90, 0x8D, 0xF8, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0x90, 0x93, 0xAC, 0xE0, 0x9F, 0xF0, 0x90,
+0x93, 0xAB, 0xE0, 0x9E, 0xF0, 0x90, 0x93, 0xAB, 0x31, 0xA5, 0x0C, 0x21, 0xDD, 0x22, 0xD1, 0xB6,
+0xAD, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x9E, 0xF0, 0x74, 0x8A, 0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60,
+0x22, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74,
+0x40, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x41, 0xF0, 0x7F, 0x01,
+0x02, 0x59, 0x4E, 0x31, 0xB8, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF8, 0x90, 0x06, 0x90, 0xE0, 0x44,
+0x02, 0xF0, 0x74, 0x9E, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8A, 0xA3, 0xF0, 0x22, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x94, 0xDA, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0,
+0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0xE2, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90,
+0x01, 0xC4, 0x74, 0xEE, 0xF0, 0x74, 0x8A, 0xA3, 0xF0, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01,
+0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x94, 0xD1, 0xF0, 0xA3, 0xEF, 0xF0,
+0x90, 0x02, 0x82, 0xE0, 0x90, 0x94, 0xD9, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x20, 0xE0, 0x02, 0xC1,
+0xA6, 0xE4, 0x90, 0x94, 0xD8, 0xF0, 0x90, 0x94, 0xD9, 0xE0, 0xFF, 0x90, 0x94, 0xD8, 0xE0, 0xC3,
+0x9F, 0x40, 0x02, 0xC1, 0xA6, 0x90, 0x94, 0xD1, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90,
+0xFD, 0x11, 0xF0, 0x90, 0x94, 0xE2, 0xEF, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB,
+0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A,
+0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0xFE, 0x90, 0x94, 0xD3, 0xF0, 0xA3, 0xEF, 0xF0,
+0x90, 0x94, 0xDE, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB,
+0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x74, 0x03, 0x2D, 0xF5, 0x82,
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x94,
+0xE3, 0xF0, 0x90, 0x94, 0xD2, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0xD1, 0xE0, 0x34, 0x00, 0xFE, 0x90,
+0x94, 0xD5, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xC0, 0x07, 0x90, 0x94, 0xD5,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5B, 0x50, 0xC0, 0x07, 0x90, 0x94, 0xD5, 0xE0,
+0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x04, 0x12, 0x5B, 0x50, 0xAB, 0x07, 0xD0, 0x05, 0xD0, 0x07, 0x12,
+0x77, 0x9D, 0x90, 0x94, 0xDA, 0xEF, 0xF0, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4,
+0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x54, 0xFC, 0x90, 0x94, 0xD7, 0xF0, 0x90, 0x94, 0xE3, 0xE0, 0xFF,
+0x90, 0x94, 0xD3, 0xE4, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x94, 0xD3, 0xD1, 0xCC, 0x90, 0x94,
+0xD3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xD1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x0F,
+0x12, 0x5B, 0x50, 0x90, 0x94, 0xD3, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x94, 0xD1, 0xEC, 0x8D,
+0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF8, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x94, 0xD2,
+0xE0, 0x9D, 0x90, 0x94, 0xD1, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x8D, 0xF9, 0xE0, 0x24, 0x01, 0xFD,
+0x90, 0x8D, 0xF8, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x94, 0xD2, 0xE0, 0x9D, 0xF0, 0x90, 0x94,
+0xD1, 0xE0, 0x9C, 0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0xEF, 0x30,
+0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7, 0x74,
+0x23, 0xF0, 0x90, 0x94, 0xD0, 0xE0, 0x60, 0x4E, 0x90, 0x94, 0xD7, 0xE0, 0x24, 0xB0, 0x60, 0x1D,
+0x24, 0xD0, 0x60, 0x02, 0xC1, 0x41, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x22,
+0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x02, 0xC1, 0x41, 0x80, 0x15, 0x90, 0x8D, 0xFB,
+0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x02,
+0xC1, 0x41, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x94, 0xDE, 0xE0, 0xFC, 0xA3,
+0xE0, 0xFD, 0xF1, 0x97, 0xC1, 0x41, 0x90, 0x94, 0xD7, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20,
+0x70, 0x2C, 0x90, 0x8F, 0x31, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x02,
+0xC1, 0x41, 0x90, 0x8F, 0x43, 0xE0, 0x04, 0xF0, 0xD1, 0xFA, 0xEF, 0x70, 0x02, 0xC1, 0x41, 0x90,
+0x94, 0xD7, 0xE0, 0xFF, 0xF1, 0x5C, 0x90, 0x8F, 0x44, 0xE0, 0x04, 0xF0, 0xC1, 0x41, 0x90, 0x8F,
+0x2E, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x7B, 0x90, 0x94, 0xDA, 0xE0, 0xFF, 0x90,
+0x94, 0xD6, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0xD5, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x08, 0xCF, 0x34,
+0x00, 0xFE, 0x90, 0x94, 0xE0, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x64,
+0x45, 0x70, 0x52, 0x90, 0x94, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0xA8, 0x20, 0xEF, 0x64,
+0x01, 0x70, 0x42, 0x90, 0x94, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0xA8, 0x65, 0xEF, 0x64,
+0x01, 0x70, 0x32, 0x90, 0x94, 0xE4, 0x04, 0xF0, 0x90, 0x94, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
+0xA3, 0xE0, 0xFD, 0x12, 0xA7, 0x65, 0xEF, 0x70, 0x14, 0x90, 0x94, 0xE2, 0xE0, 0xFD, 0x90, 0xFD,
+0x11, 0xF0, 0x90, 0x94, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0xA7, 0xC8, 0x90, 0x94, 0xE2,
+0xE0, 0x90, 0xFD, 0x11, 0xF0, 0xD1, 0xFA, 0xEF, 0x60, 0x26, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3,
+0xE0, 0xFF, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0x90, 0x94, 0xDD, 0xE0, 0xFB, 0x90, 0x94, 0xE2, 0xE0,
+0x90, 0x93, 0xAB, 0xF0, 0x12, 0x5F, 0x06, 0xEF, 0x60, 0x06, 0x90, 0x94, 0xE4, 0x74, 0x01, 0xF0,
+0x90, 0x8F, 0x2E, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x19, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, 0xE0,
+0xFF, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0x12, 0x91, 0xBB, 0xEF, 0x60, 0x06, 0x90, 0x94, 0xE4, 0x74,
+0x01, 0xF0, 0x90, 0x8F, 0x2E, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x10, 0x90, 0x94, 0xD5,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0x12, 0x95, 0x64, 0x90, 0x8F, 0x2E,
+0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x16, 0x90, 0x94, 0xE4, 0xE0, 0x70,
+0x10, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x94, 0xDA, 0xE0, 0xFD, 0x12, 0x9A,
+0x56, 0xF1, 0x73, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x05, 0x7F,
+0x01, 0x12, 0x59, 0x4E, 0xF1, 0xBC, 0xEF, 0x64, 0x01, 0x70, 0x3A, 0x90, 0x8F, 0x45, 0xE0, 0x04,
+0xF0, 0xD1, 0xB6, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60, 0x24, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01,
+0xF0, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04,
+0x06, 0x90, 0x01, 0xC7, 0x74, 0x43, 0xF0, 0x7F, 0x01, 0x12, 0x59, 0x4E, 0x80, 0x18, 0x90, 0x94,
+0xD1, 0x31, 0xA5, 0x80, 0x09, 0x90, 0x8F, 0x2E, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x94,
+0xD8, 0xE0, 0x04, 0xF0, 0x61, 0x46, 0x74, 0xEE, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8A, 0xA3,
+0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE2, 0x03, 0x7F, 0x04, 0x22,
+0x90, 0x02, 0x86, 0xE0, 0x7F, 0x01, 0x20, 0xE1, 0x02, 0x7F, 0x02, 0x22, 0xE0, 0xFE, 0xA3, 0xE0,
+0xFF, 0x7D, 0x07, 0xEF, 0x5D, 0xC3, 0x60, 0x14, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00,
+0x5E, 0xFE, 0xED, 0x5F, 0x24, 0x08, 0xFF, 0xE4, 0x3E, 0xFE, 0x80, 0x0D, 0x74, 0xFF, 0x9D, 0xFD,
+0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0xFF, 0x22, 0x90, 0x94, 0xD5, 0xE0, 0xFE, 0xA3,
+0xE0, 0xFF, 0x90, 0x93, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xBF, 0xF0, 0x90,
+0x93, 0xBF, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x28, 0x90, 0x93, 0xB8, 0xE0, 0x24, 0x04, 0xFF,
+0x90, 0x93, 0xB7, 0xE0, 0x34, 0x00, 0xFE, 0x12, 0x5B, 0x50, 0x90, 0x93, 0xBF, 0xE0, 0x24, 0xB9,
+0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xBF, 0xE0, 0x04, 0xF0, 0x80,
+0xCE, 0x78, 0x37, 0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB9, 0x7E, 0x00, 0x7F,
+0x06, 0x12, 0x45, 0xC7, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0xEF, 0x90, 0x01, 0xC7,
+0xB4, 0xA0, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90, 0x8F, 0x36, 0xE0, 0x44,
+0x01, 0xF0, 0x22, 0x90, 0x8F, 0x36, 0xE0, 0x30, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x90, 0x06, 0x90,
+0xE0, 0x20, 0xE5, 0x10, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x09, 0x90, 0x01, 0xC7, 0x74, 0x25,
+0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
+0x94, 0xB2, 0xE0, 0x64, 0x01, 0xF0, 0xE0, 0x24, 0x97, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8F, 0xA3,
+0xF0, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x5B, 0x8E, 0x90, 0x8F, 0x36, 0xE0,
+0xFF, 0x20, 0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x8F,
+0x36, 0xF0, 0x90, 0x8F, 0x31, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F,
+0x01, 0x22, 0xE4, 0x90, 0x95, 0x85, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x2C,
+0xC3, 0x90, 0x95, 0x86, 0xE0, 0x94, 0xD0, 0x90, 0x95, 0x85, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90,
+0x01, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x95, 0x85, 0xE4, 0x75, 0xF0, 0x01,
+0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x49, 0x4F, 0xD0, 0xD0, 0x92,
+0xAF, 0x22, 0x11, 0x1F, 0x11, 0x57, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x06, 0xE0,
+0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90,
+0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0xF9, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
+0x8F, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xEE,
+0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xE3, 0x90, 0x90, 0x01, 0xE0, 0x90, 0x04, 0x8C, 0xF0, 0x22, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x12, 0x12, 0x06, 0x89, 0x20,
+0xE0, 0x04, 0x11, 0x32, 0x21, 0xB6, 0x90, 0x90, 0x01, 0x74, 0x05, 0xF0, 0x90, 0x93, 0xAB, 0x12,
+0x44, 0x09, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x31, 0xE0, 0x54, 0xFE, 0x4E,
+0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE,
+0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x8F, 0x31, 0xF0, 0xEE, 0x54, 0x08, 0xFE,
+0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF,
+0x4D, 0xFF, 0x90, 0x8F, 0x31, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0,
+0x12, 0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x8F, 0x31, 0xF0,
+0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54,
+0x80, 0xFF, 0x90, 0x8F, 0x32, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0x13, 0x13, 0x54,
+0x3F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0xAB, 0x12, 0x44,
+0x09, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0,
+0x44, 0x08, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x02, 0x0D, 0x90, 0x8F, 0x32, 0xE0, 0xC4, 0x13,
+0x13, 0x13, 0x54, 0x01, 0x20, 0xE0, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x7F, 0xFF,
+0x90, 0x8F, 0x32, 0xE0, 0x54, 0x80, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x8F,
+0x33, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x34, 0xE0,
+0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x8F,
+0x32, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00,
+0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x4B, 0x1A, 0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x01, 0x07, 0x90,
+0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0,
+0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0xB0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40,
+0x79, 0x56, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x78, 0xB6, 0x7C, 0x93, 0x7D, 0x01, 0x7B,
+0xFF, 0x7A, 0x40, 0x79, 0x5C, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0x78, 0xBA, 0x7C, 0x93,
+0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x60, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0xE4,
+0x90, 0x93, 0xBF, 0xF0, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x2F, 0xFF, 0x90,
+0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x06, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B,
+0x50, 0xEF, 0x64, 0x08, 0x60, 0x02, 0x61, 0x9A, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8,
+0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE,
+0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x64, 0x06, 0x60, 0x02, 0x61, 0x9A, 0x90, 0x93, 0xBF, 0x04,
+0xF0, 0xE4, 0x90, 0x93, 0xBE, 0xF0, 0x90, 0x93, 0xBE, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x25,
+0x90, 0x93, 0xA8, 0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x12, 0x5B, 0x43, 0x90, 0x93,
+0xBE, 0xE0, 0x24, 0xAA, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xBE,
+0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, 0xAA, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79,
+0x3D, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x45, 0xC7, 0xEF, 0x60, 0x02, 0x61, 0x9A, 0x90, 0x93, 0xBE,
+0xF0, 0x90, 0x93, 0xBE, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2E, 0x90, 0x93, 0xA9, 0xE0, 0xFD,
+0x90, 0x93, 0xA8, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x20, 0x12,
+0x5B, 0x42, 0x90, 0x93, 0xBE, 0xE0, 0x24, 0xBA, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF,
+0xF0, 0x90, 0x93, 0xBE, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x78, 0xBA, 0x7C, 0x93, 0x7D, 0x01, 0x7B,
+0x01, 0x7A, 0x8F, 0x79, 0x53, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x45, 0xC7, 0xEF, 0x60, 0x02, 0x61,
+0x91, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x01, 0x54, 0xDF, 0xF0, 0x90, 0x8F, 0x30, 0xE0, 0x30, 0xE0,
+0x0F, 0x90, 0x01, 0xC7, 0x74, 0x09, 0xF0, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0x61, 0x9A,
+0xE4, 0x90, 0x93, 0xBE, 0xF0, 0x90, 0x93, 0xBE, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x1A, 0x12,
+0x5B, 0x2E, 0x90, 0x93, 0xBE, 0xE0, 0x24, 0xB0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF,
+0xF0, 0x90, 0x93, 0xBE, 0xE0, 0x04, 0xF0, 0x80, 0xDC, 0xE4, 0x90, 0x93, 0xBE, 0xF0, 0x90, 0x93,
+0xBE, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2E, 0x90, 0x93, 0xA9, 0xE0, 0xFD, 0x90, 0x93, 0xA8,
+0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x16, 0x12, 0x5B, 0x42, 0x90,
+0x93, 0xBE, 0xE0, 0x24, 0xB6, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93,
+0xBE, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB0, 0x90, 0x95, 0x0D, 0x12,
+0x44, 0x12, 0xE4, 0x90, 0x95, 0x10, 0xF0, 0xA3, 0xF0, 0x7A, 0x93, 0x79, 0xB6, 0x71, 0xA0, 0x80,
+0x09, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0xBF, 0xE0, 0xFF, 0x22,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x0A, 0x12, 0x44, 0x12, 0x78, 0x16, 0x7C,
+0x95, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x64, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63,
+0x90, 0x05, 0x22, 0xE0, 0x90, 0x95, 0x15, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0A, 0x7D, 0x33,
+0x12, 0x57, 0xF4, 0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x93, 0x7A, 0x12, 0x56, 0xA8, 0x90, 0x95,
+0x12, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x12, 0x12, 0x77, 0x77, 0x90, 0x95, 0x14, 0xEF,
+0xF0, 0x90, 0x95, 0x12, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90,
+0x95, 0x10, 0xE0, 0xFD, 0x12, 0x7E, 0x4C, 0x90, 0x95, 0x11, 0xE0, 0x60, 0x02, 0x81, 0x96, 0xA3,
+0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0,
+0x01, 0x90, 0x95, 0x0D, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06,
+0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x12, 0xA3, 0xE0, 0xFF, 0xA3,
+0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0,
+0x01, 0x90, 0x95, 0x0D, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06,
+0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x12, 0xA3, 0xE0, 0xFF, 0xA3,
+0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0,
+0x01, 0x90, 0x95, 0x0A, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04,
+0xD0, 0x01, 0xD0, 0x02, 0x80, 0x69, 0x90, 0x95, 0x11, 0xE0, 0x64, 0x01, 0x70, 0x66, 0xA3, 0xA3,
+0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41,
+0x8F, 0x75, 0x42, 0x4D, 0x75, 0x43, 0x06, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x12, 0xA3,
+0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03,
+0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x57, 0x75, 0x43, 0x06, 0xD0, 0x03, 0x12, 0x35, 0x26,
+0x90, 0x95, 0x12, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA,
+0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x5D, 0x75, 0x43, 0x04, 0xD0,
+0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x30, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x95, 0x15, 0xE0, 0xFF,
+0x7D, 0x34, 0x12, 0x52, 0xA5, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0x90, 0x93, 0xD4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x2F, 0xFF, 0xE4, 0x3E, 0xCF,
+0x24, 0x06, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xBF, 0x86, 0x23, 0x90, 0x93,
+0xD6, 0xE0, 0xFF, 0x90, 0x93, 0xD5, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xD4, 0xE0, 0x34, 0x00, 0xCF,
+0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xBF, 0xDD, 0x03, 0x7F, 0x01,
+0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78,
+0xAA, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x6A, 0x7E, 0x00, 0x7F, 0x06, 0x12,
+0x06, 0x63, 0x78, 0xB0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x70, 0x7E, 0x00,
+0x7F, 0x10, 0x12, 0x06, 0x63, 0x78, 0xC0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79,
+0x80, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x06, 0x63, 0xE4, 0x90, 0x93, 0xD3, 0xF0, 0x90, 0x93, 0xA7,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xB1, 0x20, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xE1,
+0xAF, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA7, 0xE0,
+0x34, 0x00, 0xCF, 0x24, 0x0E, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x64,
+0x3A, 0x60, 0x02, 0xE1, 0xAF, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x2F, 0xFF,
+0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12,
+0x5B, 0x50, 0xEF, 0x64, 0x87, 0x60, 0x02, 0xE1, 0xAF, 0x90, 0x93, 0xD3, 0x04, 0xF0, 0xE4, 0x90,
+0x93, 0xD0, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x2E, 0x90, 0x93, 0xA9,
+0xE0, 0xFD, 0x90, 0x93, 0xA8, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xCD, 0x24,
+0x38, 0x12, 0x5B, 0x42, 0x90, 0x93, 0xD0, 0xE0, 0x24, 0xC0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5,
+0x83, 0xEF, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x93, 0xD1, 0xF0,
+0x90, 0x93, 0xD1, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, 0xE1, 0xAF, 0x75, 0xF0, 0x38, 0xEF,
+0x90, 0x8F, 0x61, 0x12, 0x43, 0xFD, 0xE0, 0x20, 0xE0, 0x02, 0xE1, 0xAF, 0xE4, 0x90, 0x93, 0xD2,
+0xF0, 0x90, 0x93, 0xD1, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0x90, 0x8F, 0x62, 0x12, 0x43, 0xFD, 0xE0,
+0xFE, 0x90, 0x93, 0xD2, 0xE0, 0xC3, 0x9E, 0x40, 0x02, 0xE1, 0xA7, 0xEF, 0x75, 0xF0, 0x38, 0xA4,
+0x24, 0x79, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xE0, 0x75, 0xF0, 0x10, 0xA4, 0x29,
+0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x78, 0xC0, 0x7C, 0x93, 0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12,
+0x45, 0xC7, 0xEF, 0x60, 0x02, 0xE1, 0x98, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x01, 0x54, 0xFB, 0xF0,
+0xE4, 0x90, 0x93, 0xD0, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x2E, 0x90,
+0x93, 0xA9, 0xE0, 0xFD, 0x90, 0x93, 0xA8, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00,
+0xCD, 0x24, 0x4A, 0x12, 0x5B, 0x42, 0x90, 0x93, 0xD0, 0xE0, 0x24, 0xAA, 0xF5, 0x82, 0xE4, 0x34,
+0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x93,
+0xD0, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x1A, 0x12, 0x5B, 0x2E, 0x90,
+0x93, 0xD0, 0xE0, 0x24, 0xB0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93,
+0xD0, 0xE0, 0x04, 0xF0, 0x80, 0xDC, 0x90, 0x93, 0xD1, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0x90, 0x8F,
+0x61, 0x12, 0x43, 0xFD, 0xE0, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x21, 0xEF, 0x75, 0xF0, 0x38, 0xA4,
+0x24, 0x69, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0xB0, 0x7C, 0x93, 0x7D, 0x01,
+0x7E, 0x00, 0x7F, 0x10, 0x12, 0x45, 0xC7, 0xEF, 0x70, 0x45, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0x93,
+0x79, 0xAA, 0x90, 0x93, 0xD7, 0x12, 0x44, 0x12, 0x7A, 0x93, 0x79, 0xC0, 0x90, 0x93, 0xDA, 0x12,
+0x44, 0x12, 0x90, 0x93, 0xD1, 0xE0, 0x75, 0xF0, 0x38, 0xA4, 0x24, 0x63, 0xF9, 0x74, 0x8F, 0x35,
+0xF0, 0xFA, 0x90, 0x93, 0xDD, 0x12, 0x44, 0x12, 0xE4, 0x90, 0x93, 0xE0, 0xF0, 0xA3, 0xF0, 0x7A,
+0x93, 0x79, 0xB0, 0x12, 0x98, 0x00, 0x80, 0x07, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x05, 0xF0, 0x90,
+0x93, 0xD2, 0xE0, 0x04, 0xF0, 0xC1, 0x71, 0x90, 0x93, 0xD1, 0xE0, 0x04, 0xF0, 0xC1, 0x50, 0x90,
+0x93, 0xD3, 0xE0, 0xFF, 0x22, 0x90, 0x94, 0x0F, 0x12, 0x44, 0x12, 0x90, 0x94, 0x12, 0x12, 0x44,
+0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xD1,
+0x12, 0x35, 0x26, 0x90, 0x94, 0x0F, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75,
+0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xE1, 0x12, 0x35, 0x26, 0x90, 0x94, 0x15, 0x12, 0x43,
+0xE5, 0x90, 0x8F, 0xF1, 0x12, 0x08, 0x6D, 0x90, 0x94, 0x19, 0xE0, 0x90, 0x8F, 0xF8, 0xF0, 0x22,
+0x90, 0x93, 0xD4, 0x12, 0x44, 0x12, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0xE5, 0xF0, 0x90, 0x04,
+0x1D, 0xE0, 0x60, 0x0A, 0x7D, 0x39, 0x12, 0x57, 0xF4, 0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x93,
+0x7B, 0x12, 0x56, 0xA8, 0x90, 0x93, 0xE2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xE2, 0x12,
+0x77, 0x77, 0x90, 0x93, 0xE4, 0xEF, 0xF0, 0x90, 0x93, 0xE2, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4,
+0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x93, 0xE0, 0xE0, 0xFD, 0x12, 0x7E, 0x4C, 0x90, 0x93, 0xE1,
+0xE0, 0x60, 0x02, 0x21, 0x3F, 0xA3, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B,
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xD7, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A,
+0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90,
+0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B,
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xD4, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A,
+0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90,
+0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B,
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xDA, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A,
+0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90,
+0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x60, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B,
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xDA, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A,
+0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90,
+0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x72, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B,
+0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0xDD, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A,
+0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90,
+0x93, 0xDA, 0x12, 0x44, 0x09, 0x90, 0x94, 0x12, 0x12, 0x44, 0x12, 0x90, 0x94, 0x15, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0x20, 0x90, 0x94, 0x19, 0x74, 0x3A, 0xF0, 0x90, 0x93, 0xD4, 0x12, 0x44,
+0x09, 0x12, 0x97, 0xB5, 0x90, 0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9,
+0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x28, 0x7B, 0x01, 0x7A,
+0x93, 0x79, 0xE7, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE2, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24,
+0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75,
+0x42, 0xD1, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE4, 0xE0, 0xFF, 0x90,
+0x93, 0xE3, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xE2, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xFD, 0xE4,
+0x3F, 0xFC, 0x90, 0x93, 0x7B, 0xE0, 0xFB, 0x7F, 0x3A, 0x12, 0x7B, 0x90, 0x90, 0x93, 0xE2, 0xA3,
+0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03,
+0x8B, 0x40, 0x75, 0x41, 0x93, 0x75, 0x42, 0xE7, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26,
+0x90, 0x06, 0x33, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x93, 0xE5, 0xE0, 0xFF, 0x7D, 0x3A, 0x12, 0x52,
+0xA5, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0xB7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x7D, 0x09, 0x12, 0x5B, 0x50, 0xEF, 0x64, 0x06, 0x70, 0x39, 0x90, 0x93, 0xB7, 0xE0, 0xFE, 0xA3,
+0xE0, 0xFF, 0x7D, 0x14, 0x12, 0x5B, 0x50, 0xEF, 0x70, 0x29, 0x90, 0x93, 0xB7, 0xE0, 0xFE, 0xA3,
+0xE0, 0xFF, 0x7D, 0x15, 0x12, 0x5B, 0x50, 0xEF, 0x64, 0x50, 0x70, 0x17, 0x90, 0x93, 0xB7, 0xE0,
+0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x21, 0x12, 0x5B, 0x50, 0xEF, 0x20, 0xE0, 0x03, 0x30, 0xE2, 0x03,
+0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED,
+0xF0, 0x78, 0xAA, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x90, 0x7E, 0x00, 0x7F,
+0x06, 0x12, 0x06, 0x63, 0x78, 0xB1, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x96,
+0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0x90, 0x93, 0xA7, 0x12, 0x8E, 0xFD, 0xEF, 0x70, 0x02,
+0x61, 0x3E, 0x90, 0x93, 0xA9, 0xE0, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA7,
+0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xB5, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x06, 0xFF, 0xE4, 0x3E,
+0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0xEF, 0x64, 0x08, 0x60, 0x02, 0x61, 0x3E, 0x90, 0x93, 0xB6,
+0xE0, 0x24, 0x07, 0xFF, 0x90, 0x93, 0xB5, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50,
+0xEF, 0x70, 0x6B, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x93, 0xB0, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50,
+0x25, 0x90, 0x93, 0xB6, 0xE0, 0x24, 0x18, 0xFD, 0x90, 0x93, 0xB5, 0xE0, 0x12, 0x5B, 0x43, 0x90,
+0x93, 0xB0, 0xE0, 0x24, 0xB1, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93,
+0xB0, 0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, 0xB1, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F,
+0x79, 0x53, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x45, 0xC7, 0xEF, 0x70, 0x22, 0x90, 0x93, 0xB6, 0xE0,
+0x24, 0x08, 0xFF, 0x90, 0x93, 0xB5, 0xE0, 0x34, 0x00, 0xFE, 0x51, 0x08, 0xEF, 0x64, 0x01, 0x60,
+0x0D, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0x90, 0x8F, 0x36, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90,
+0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, 0x79, 0xF0,
+0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7A, 0xF0, 0x90, 0x00, 0x02,
+0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2,
+0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F,
+0x90, 0x93, 0x7D, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7E,
+0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x7F, 0xF0,
+0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93,
+0x80, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x81, 0xF0, 0x90,
+0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x82, 0xF0, 0x90, 0x00, 0x03, 0x12,
+0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF,
+0xED, 0x2F, 0x90, 0x93, 0x84, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90,
+0x93, 0x85, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93,
+0x86, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0x18, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0,
+0xFE, 0x74, 0x3D, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x10, 0x2F,
+0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x37, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
+0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x06, 0xCB, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60,
+0x59, 0x90, 0x93, 0x7D, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x7C, 0x00, 0xAD, 0x07, 0x74, 0x00, 0x2F,
+0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x12, 0x90, 0x93, 0xAB,
+0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x40, 0x7B, 0x01, 0x7A, 0x90,
+0x79, 0x03, 0x12, 0x35, 0x26, 0xE4, 0xFD, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x90, 0x93, 0x7E, 0xE0,
+0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF,
+0x12, 0x39, 0xD6, 0x7D, 0x01, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x22, 0x7E, 0x00, 0x7F, 0x08, 0x7D,
+0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x8D, 0x12, 0x08, 0xAA, 0x90, 0x93, 0x8E, 0x74, 0x08, 0xF0,
+0xA3, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x93, 0xAB, 0x12, 0x44, 0x12, 0x91, 0x9B, 0x90, 0x93, 0xAB,
+0x12, 0x44, 0x09, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFE,
+0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x2C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x93,
+0x8E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x93, 0x8F, 0xF0, 0x12, 0x06, 0x89, 0x54,
+0x04, 0xFF, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2,
+0x90, 0x93, 0x90, 0xF0, 0x22, 0x90, 0x93, 0x8D, 0xE0, 0x30, 0xE0, 0x72, 0x90, 0x93, 0x91, 0xE0,
+0x04, 0xF0, 0x90, 0x93, 0x94, 0xE0, 0x64, 0x01, 0x70, 0x27, 0x90, 0x93, 0x8D, 0xE0, 0x13, 0x13,
+0x54, 0x3F, 0x30, 0xE0, 0x1C, 0x90, 0x93, 0x93, 0xE0, 0x70, 0x16, 0x90, 0x93, 0x90, 0xE0, 0xFF,
+0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x0B, 0x12, 0x59, 0x46, 0x90, 0x93, 0x8D, 0xE0, 0x54, 0xFE, 0xF0,
+0x22, 0x90, 0x93, 0x91, 0xE0, 0xFF, 0x90, 0x93, 0x8E, 0xE0, 0xD3, 0x9F, 0x50, 0x30, 0x90, 0x06,
+0x92, 0xE0, 0x20, 0xE2, 0x1A, 0x90, 0x93, 0x93, 0xE0, 0x70, 0x14, 0x7D, 0x08, 0xFF, 0x12, 0x54,
+0x9F, 0x90, 0x93, 0x92, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x8C, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90,
+0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93, 0x93, 0xF0, 0x22, 0x90,
+0x8E, 0x80, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x8D, 0xF0, 0x90, 0x8E, 0x88, 0xF0, 0x90,
+0x8E, 0x81, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x57, 0xD2, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x57, 0xD6,
+0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07,
+0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xB1, 0xA0, 0xEF, 0x64, 0x01, 0x70, 0x47,
+0x90, 0x8E, 0x88, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x8E, 0x86, 0xE0, 0xFE, 0xE4, 0xC3,
+0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x8E, 0x88, 0xE0, 0x20, 0xE4, 0x29, 0x90, 0x8E,
+0x81, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x8F, 0x29, 0xE0, 0x70, 0x18, 0x90,
+0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC,
+0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04,
+0x70, 0x27, 0x90, 0x8E, 0x8A, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, 0x90, 0x8F, 0x26,
+0xE0, 0x90, 0x8E, 0x8A, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x8A, 0xED, 0xF0, 0x90, 0x8E, 0x8A, 0xE0,
+0xA3, 0xF0, 0x90, 0x8E, 0x81, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x8F, 0x2A, 0xE0, 0xC3, 0x13,
+0x20, 0xE0, 0x21, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x24, 0x90, 0x8F, 0x2E, 0xE0, 0x30, 0xE0, 0x06,
+0x90, 0x02, 0x82, 0xE0, 0x70, 0x17, 0x90, 0x8F, 0x36, 0xE0, 0x20, 0xE0, 0x10, 0x90, 0x02, 0x86,
+0xE0, 0x30, 0xE1, 0x09, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22,
+0x90, 0x8E, 0x80, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x4F, 0xC1, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D,
+0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x2A, 0x02, 0x08, 0xAA, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90,
+0x95, 0x52, 0xE0, 0xFB, 0x7D, 0x01, 0x12, 0x56, 0xAE, 0x90, 0x95, 0x53, 0xEE, 0xF0, 0xFC, 0xA3,
+0xEF, 0xF0, 0xFD, 0x90, 0x95, 0x51, 0xE0, 0xFF, 0x12, 0x57, 0x76, 0x90, 0x95, 0x53, 0xE0, 0xFE,
+0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90,
+0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x90, 0x93, 0xB4, 0xED, 0xF0, 0x90, 0x93, 0xB2, 0xEE,
+0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0xA3, 0x1C, 0x90, 0x93, 0xB2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3,
+0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB5, 0xEE, 0xF0, 0xA3, 0xEF,
+0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0xCD, 0x74, 0x18, 0xF0, 0x7E, 0x00, 0x7F, 0x80, 0x7D, 0x00,
+0x7B, 0x01, 0x7A, 0x93, 0x79, 0xD5, 0x12, 0x08, 0xAA, 0x90, 0x01, 0xC4, 0x74, 0x52, 0xF0, 0x74,
+0x9F, 0xA3, 0xF0, 0x90, 0x93, 0x7C, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x90, 0x93, 0xCC, 0xEF, 0xF0,
+0xF9, 0xE0, 0xFE, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x41, 0xF0, 0xEE,
+0x24, 0x28, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0xCD, 0xE0, 0x7A, 0x00, 0x2D, 0xFE, 0xEA, 0x3C,
+0x90, 0x93, 0xD1, 0xF0, 0xA3, 0xCE, 0xF0, 0x74, 0x28, 0x29, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B,
+0x01, 0x90, 0x93, 0xB7, 0xE0, 0xFD, 0x12, 0x7E, 0x4C, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x08,
+0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1,
+0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0xCF, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xD5, 0x74,
+0x01, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0x74, 0x5F, 0xF0, 0x90, 0x93, 0xD1,
+0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x90, 0x47, 0xE0, 0xFF, 0x7E, 0x02, 0xB4, 0xFE,
+0x02, 0x7E, 0xFE, 0x90, 0x93, 0xD1, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
+0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90,
+0x93, 0xD9, 0xF0, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x90, 0x90, 0xDC,
+0xE0, 0x90, 0x93, 0xB5, 0xB4, 0x01, 0x0B, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x10, 0xFD,
+0x80, 0x09, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x20, 0xFD, 0x90, 0x93, 0xD3, 0xEC, 0xF0,
+0xA3, 0xED, 0xF0, 0x90, 0x93, 0xDA, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x12, 0xF0, 0x90, 0x93, 0xD1,
+0xE4, 0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, 0xEF, 0x64, 0xFE, 0x70, 0x37, 0x90, 0x93, 0xD1, 0xA3,
+0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41,
+0x90, 0x75, 0x42, 0x4A, 0x75, 0x43, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x75, 0x40, 0x01, 0x75,
+0x41, 0x90, 0x75, 0x42, 0x4A, 0x75, 0x43, 0x02, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xDC, 0x12, 0x35,
+0x26, 0x80, 0x60, 0x90, 0x93, 0x77, 0xE0, 0xFF, 0xB4, 0x02, 0x2B, 0x90, 0x93, 0xD1, 0xE0, 0xFC,
+0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01,
+0x2D, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0x74, 0x20, 0xF0, 0xE4, 0x90, 0x93, 0xDC, 0xF0,
+0xA3, 0x74, 0x20, 0xF0, 0x80, 0x2D, 0xEF, 0xB4, 0x04, 0x29, 0x90, 0x93, 0xD1, 0xE0, 0xFE, 0xA3,
+0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F,
+0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0x74, 0x10, 0xF0, 0xE4, 0x90, 0x93, 0xDC, 0xF0, 0xA3,
+0x74, 0x10, 0xF0, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93,
+0xCE, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0x24, 0x4C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83,
+0xE0, 0xFE, 0x90, 0x93, 0xD1, 0xA3, 0xE0, 0xFD, 0xEF, 0x2D, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0x24, 0x4C, 0xF5, 0x82, 0xE4, 0x34,
+0x90, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xDE, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEE,
+0xF0, 0x90, 0x93, 0xCE, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xB7, 0x90, 0x93, 0xD1, 0xE4, 0x75,
+0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x20, 0x12, 0x08, 0xD6, 0x90,
+0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x08,
+0x12, 0x08, 0xD6, 0x90, 0x93, 0xD1, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x94,
+0x58, 0xF0, 0xE4, 0x90, 0x93, 0xCE, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50,
+0x1C, 0x12, 0x7F, 0xE1, 0x90, 0x93, 0xCC, 0xEF, 0xF0, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0x04, 0xF0, 0x80, 0xDA, 0x7F, 0x64, 0x7E,
+0x00, 0x12, 0x3E, 0x50, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x7D, 0xE0, 0xFD,
+0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF,
+0x90, 0xAC, 0x7B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0xFF, 0x90, 0x93, 0x7C, 0xE0, 0xC3, 0x9F,
+0xFF, 0xE4, 0x94, 0x00, 0xFE, 0xEF, 0x78, 0x07, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF,
+0x90, 0x93, 0xCD, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, 0xCF, 0x24, 0x38, 0xCF, 0x34, 0x00,
+0xFE, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0x7B, 0x63, 0xE4, 0xFD, 0x12, 0x39, 0x9C, 0x7B, 0x01,
+0x7A, 0x93, 0x79, 0xD5, 0x90, 0xAC, 0xA0, 0x12, 0x44, 0x12, 0x7A, 0x93, 0x79, 0xB8, 0x90, 0xAC,
+0xA3, 0x12, 0x44, 0x12, 0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, 0x90, 0x79, 0x03, 0x12, 0x35,
+0x86, 0x90, 0x94, 0x58, 0xE0, 0x04, 0xF0, 0x90, 0x06, 0x31, 0xE0, 0x30, 0xE2, 0x0B, 0x90, 0x94,
+0x58, 0xE0, 0xC3, 0x94, 0x0A, 0x50, 0x02, 0x21, 0xA2, 0x90, 0x94, 0x58, 0xE0, 0xC3, 0x94, 0x0A,
+0x40, 0x0A, 0x90, 0x06, 0x35, 0xE0, 0x44, 0x20, 0x90, 0x06, 0x34, 0xF0, 0xE4, 0x90, 0x93, 0xCE,
+0xF0, 0x90, 0x93, 0xCE, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x2E, 0x12, 0x7F, 0xE1, 0x90, 0x93,
+0xCC, 0xEF, 0xF0, 0x90, 0x93, 0xCE, 0xE0, 0x24, 0xB8, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83,
+0xE0, 0xFF, 0x90, 0x93, 0xCC, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF,
+0xF0, 0x90, 0x93, 0xCE, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x2C, 0x90,
+0x05, 0x22, 0xE0, 0x90, 0x94, 0x57, 0xF0, 0x7D, 0x1D, 0x12, 0x57, 0xF4, 0xBF, 0x01, 0x10, 0x12,
+0x56, 0xA5, 0x90, 0x93, 0xCC, 0xEF, 0xF0, 0x90, 0x93, 0x7C, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90,
+0x94, 0x57, 0xE0, 0xFF, 0x7D, 0x1E, 0x12, 0x52, 0xA5, 0x80, 0x10, 0x12, 0x56, 0xA5, 0x90, 0x93,
+0xCC, 0xEF, 0xF0, 0x90, 0x93, 0x7C, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20,
+0xF0, 0x90, 0x8E, 0x87, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x52, 0x83, 0x74, 0x52, 0x04, 0x90,
+0x01, 0xC4, 0xF0, 0x74, 0x9F, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x78, 0xE0, 0xFD, 0xB4, 0x02, 0x0C, 0x90, 0x94, 0x05, 0x74, 0x80,
+0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x80, 0x0E, 0xED, 0xB4, 0x04, 0x0A, 0x90, 0x94, 0x05, 0x74, 0x80,
+0xF0, 0xA3, 0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, 0x60, 0x02, 0x81, 0x13, 0x90, 0x90, 0x44,
+0xE0, 0xFF, 0x64, 0xFE, 0x70, 0x02, 0x81, 0x13, 0xEF, 0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, 0x03,
+0x60, 0x02, 0x81, 0x13, 0x90, 0x90, 0xA4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x94,
+0x07, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93,
+0x79, 0xC5, 0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79,
+0xE5, 0x12, 0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B,
+0x20, 0xFD, 0xFC, 0xFF, 0xFE, 0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xA6, 0x90, 0xAC,
+0x89, 0x12, 0x44, 0x12, 0x7A, 0x93, 0x79, 0xE5, 0x90, 0xAC, 0x8C, 0x12, 0x44, 0x12, 0x90, 0xAC,
+0x8F, 0x74, 0x20, 0xF0, 0x7A, 0x90, 0x79, 0x13, 0x12, 0x34, 0x5B, 0x75, 0x40, 0x01, 0x75, 0x41,
+0x93, 0x75, 0x42, 0xED, 0x75, 0x43, 0x18, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xC5, 0x12, 0x35, 0x26,
+0x75, 0x40, 0x01, 0x75, 0x41, 0x93, 0x75, 0x42, 0xCD, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x93,
+0x79, 0xB5, 0x12, 0x35, 0x26, 0x90, 0x93, 0xCB, 0xE0, 0x54, 0x03, 0xFF, 0xC3, 0x94, 0x04, 0x90,
+0x90, 0x01, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79,
+0xB5, 0x91, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0x09, 0xEF, 0xF0, 0xA3, 0x12, 0x44,
+0x12, 0x90, 0x94, 0x0A, 0x12, 0x44, 0x09, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04,
+0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0D, 0x12, 0x35, 0x26, 0x90, 0x94, 0x09, 0xE0, 0x75, 0xF0, 0x08,
+0xA4, 0x24, 0x02, 0x91, 0xFC, 0x90, 0x94, 0x0A, 0x12, 0x44, 0x09, 0xE9, 0x24, 0x04, 0xF9, 0xE4,
+0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0D,
+0x12, 0x35, 0x26, 0x90, 0x94, 0x09, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0x91, 0xFC, 0x90,
+0x94, 0x0A, 0x12, 0x44, 0x09, 0xE9, 0x24, 0x08, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89,
+0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0D, 0x12, 0x35, 0x26, 0x90, 0x94, 0x09,
+0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0x91, 0xFC, 0x90, 0x94, 0x0A, 0x12, 0x44, 0x09, 0xE9,
+0x24, 0x0C, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01,
+0x7A, 0x94, 0x79, 0x0D, 0x12, 0x35, 0x26, 0x90, 0x94, 0x09, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24,
+0x05, 0x91, 0xFC, 0x90, 0x94, 0x09, 0xE0, 0xFE, 0x44, 0x10, 0x90, 0x94, 0x0D, 0xF0, 0xA3, 0x74,
+0x80, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x91, 0xFC, 0x90,
+0x94, 0x0D, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0x09, 0xE0, 0x75,
+0xF0, 0x08, 0xA4, 0x04, 0x91, 0xFC, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0xFF, 0x7B, 0x01, 0x7A,
+0x94, 0x79, 0x0D, 0x12, 0x06, 0x89, 0x90, 0x06, 0x74, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2,
+0x90, 0x06, 0x75, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x76, 0xF0, 0x90, 0x00,
+0x03, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x77, 0xF0, 0x90, 0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0,
+0xA3, 0x04, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0x95,
+0x1C, 0x12, 0x44, 0x12, 0x12, 0x06, 0x89, 0x90, 0x95, 0x21, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06,
+0xA2, 0x90, 0x95, 0x22, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x23, 0xF0, 0x90,
+0x00, 0x05, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x24, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x90,
+0x95, 0x25, 0xF0, 0x90, 0x00, 0x07, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x26, 0xF0, 0x90, 0x00, 0x03,
+0x12, 0x06, 0xA2, 0x90, 0x95, 0x29, 0xF0, 0xED, 0x70, 0x31, 0xFF, 0x74, 0x21, 0x2F, 0xF5, 0x82,
+0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
+0x95, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5,
+0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xD0, 0x90, 0x95, 0x20, 0xE0, 0xFF,
+0xB4, 0x04, 0x25, 0xA3, 0xE0, 0xFE, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0xEE, 0x12, 0x06, 0xCF,
+0x90, 0x95, 0x22, 0xE0, 0xFE, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0x90, 0x00, 0x01, 0xEE, 0x12,
+0x06, 0xE1, 0x90, 0x00, 0x02, 0xE4, 0x80, 0x30, 0xEF, 0xB4, 0x02, 0x2F, 0x90, 0x95, 0x22, 0xE0,
+0xFF, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0xEF, 0x12, 0x06, 0xCF, 0x90, 0x95, 0x22, 0xE0, 0x44,
+0x20, 0x54, 0x7F, 0xFF, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06,
+0xE1, 0x90, 0x95, 0x21, 0xE0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x1C, 0x12, 0x44,
+0x09, 0xE9, 0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0x44, 0x20, 0x12, 0x06, 0xCF,
+0x90, 0x95, 0x23, 0xE0, 0xFF, 0x90, 0x95, 0x1C, 0x12, 0x44, 0x09, 0x90, 0x00, 0x04, 0xEF, 0x12,
+0x06, 0xE1, 0x90, 0x95, 0x24, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x25, 0xE0,
+0x90, 0x00, 0x06, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x26, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, 0xE1,
+0xED, 0x14, 0x60, 0x06, 0x04, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x01, 0x22, 0x90, 0x8F, 0x2E,
+0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x93, 0x83, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90,
+0x90, 0xDD, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
+0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xEF, 0xF0, 0xA3, 0xF0, 0x90, 0x91, 0x31, 0xF0, 0xA3,
+0xF0, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x7C, 0x00, 0xAD,
+0x07, 0xAB, 0x05, 0x74, 0x01, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74,
+0x00, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA,
+0x3E, 0x90, 0x90, 0xDD, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x02, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24,
+0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xDF, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x05, 0x2B, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x04, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xE1, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x07,
+0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x06, 0x2B, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xE3, 0xF0, 0xA3, 0xEF,
+0xF0, 0x74, 0x09, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x08, 0x2B,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0xE5,
+0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0,
+0x90, 0x90, 0xE3, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x3A, 0xE4, 0x90, 0x93, 0xAA, 0xF0, 0x90,
+0x93, 0xAA, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x50, 0x2E, 0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0,
+0xFF, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x5B, 0x50, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0xF1, 0xF5, 0x82,
+0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xAA, 0xE0,
+0x04, 0xF0, 0x80, 0xCB, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x40, 0xF0, 0xE4, 0x90,
+0x90, 0xEF, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xAA, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x50, 0x28,
+0x90, 0x93, 0xA7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x5B, 0x50, 0x90,
+0x93, 0xAA, 0xE0, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xB5, 0x07, 0x1D,
+0x90, 0x93, 0xAA, 0xE0, 0x04, 0xF0, 0x80, 0xCE, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0, 0x90,
+0x01, 0xC7, 0x74, 0x30, 0xF0, 0x7F, 0x01, 0x12, 0x59, 0x4E, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22,
+0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xA9, 0xE0, 0xFD,
+0xC3, 0x94, 0x04, 0x50, 0x2D, 0x90, 0x93, 0xA8, 0xE0, 0x24, 0x10, 0xFF, 0x90, 0x93, 0xA7, 0xE0,
+0x34, 0x00, 0xFE, 0x12, 0x5B, 0x50, 0x90, 0x93, 0xA9, 0xE0, 0x24, 0xE9, 0xF5, 0x82, 0xE4, 0x34,
+0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA9, 0xE0, 0x04, 0xF0,
+0x80, 0xC9, 0x7F, 0x01, 0x22, 0x90, 0x93, 0xA7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x16, 0xFF,
+0xE4, 0x3E, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x50, 0x90, 0x90, 0xED, 0xA3, 0xE0, 0xB5, 0x07, 0x1F,
+0x90, 0x93, 0xA8, 0xE0, 0x24, 0x16, 0xFF, 0x90, 0x93, 0xA7, 0xE0, 0x34, 0x00, 0xFE, 0x7D, 0x01,
+0x12, 0x5B, 0x50, 0xEF, 0xFD, 0x90, 0x90, 0xED, 0xE0, 0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F,
+0x00, 0x22, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x93, 0xAB,
+0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x7E, 0x00, 0x90, 0x93, 0xAB,
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90,
+0x91, 0x33, 0xF0, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAB,
+0xA3, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD,
+0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB,
+0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD,
+0xFE, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42,
+0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x01,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12,
+0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xA8, 0x04, 0xA9,
+0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x42, 0x90, 0x90, 0x91, 0x37, 0x12,
+0x08, 0x6D, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAB, 0xA3,
+0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE,
+0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB,
+0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD,
+0xFE, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42,
+0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x01,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12,
+0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xA8, 0x04, 0xA9,
+0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x42, 0x90, 0x90, 0x91, 0x3B, 0x12,
+0x08, 0x6D, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAB, 0xA3,
+0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE,
+0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB,
+0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD,
+0xFE, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42,
+0x90, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x01,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12,
+0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x42, 0x90, 0xA8, 0x04, 0xA9,
+0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x12, 0x42, 0x90, 0x90, 0x91, 0x3F, 0x12,
+0x08, 0x6D, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, 0xAD,
+0xF0, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x43, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83,
+0xEF, 0xF0, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x10, 0xD5, 0x90, 0x93, 0xAB, 0xE4,
+0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xAB, 0xA3, 0xE0,
+0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF,
+0x74, 0x53, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAD, 0xE0,
+0x04, 0xF0, 0xE0, 0xB4, 0x10, 0xD5, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6,
+0xE4, 0x90, 0x93, 0xAD, 0xF0, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x24,
+0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x63, 0x2E, 0xF5, 0x82, 0xE4,
+0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x10, 0xD5,
+0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0x90, 0x93, 0x87, 0xE0, 0x04, 0x90,
+0x93, 0xAF, 0xF0, 0xE4, 0x90, 0x93, 0xAE, 0xF0, 0x90, 0x91, 0x33, 0xE0, 0x13, 0x13, 0x54, 0x3F,
+0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x93, 0xAE, 0xE0, 0xFD, 0xC3, 0x9F, 0xEE, 0x64, 0x80,
+0xF8, 0x74, 0x80, 0x98, 0x50, 0x78, 0xA3, 0xE0, 0x2D, 0xF0, 0xE0, 0xFF, 0x12, 0x74, 0xC7, 0x90,
+0x93, 0xAB, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xAD, 0xE0, 0xFD, 0xC3,
+0x94, 0x04, 0x50, 0x52, 0xA3, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x7C, 0x00, 0x2D, 0xFF, 0xEC, 0x35,
+0xF0, 0xFE, 0xEF, 0x78, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x24, 0x73, 0xF9, 0x74,
+0x91, 0x3E, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x01, 0x90, 0x93, 0xAB, 0xA3, 0xE0, 0x24, 0x00,
+0xF9, 0xE4, 0x34, 0xFC, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x20, 0xD0, 0x01, 0xD0,
+0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAB, 0xE4, 0x75, 0xF0, 0x20, 0x12, 0x08, 0xD6, 0x90, 0x93,
+0xAD, 0xE0, 0x04, 0xF0, 0x80, 0xA4, 0x90, 0x93, 0xAE, 0xE0, 0x04, 0xF0, 0x61, 0x78, 0xE4, 0x90,
+0x93, 0xAD, 0xF0, 0xE4, 0xFF, 0x0F, 0xEF, 0xB4, 0x20, 0xFB, 0x90, 0x93, 0xAD, 0xE0, 0x04, 0xF0,
+0xE0, 0xB4, 0x10, 0xEF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x00, 0xC9, 0xBB
+};
+u4Byte ArrayLength_MP_8723B_FW_WoWLAN = 27724;
+
+
+void
+ODM_ReadFirmware_MP_8723B_FW_WoWLAN(
+ IN PDM_ODM_T pDM_Odm,
+ OUT u1Byte *pFirmware,
+ OUT u4Byte *pFirmwareSize
+)
+{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
+ *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8723B_FW_WoWLAN;
+ *pFirmwareSize = ArrayLength_MP_8723B_FW_WoWLAN;
+#else
+ ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8723B_FW_WoWLAN, ArrayLength_MP_8723B_FW_WoWLAN);
+ *pFirmwareSize = ArrayLength_MP_8723B_FW_WoWLAN;
+#endif
+}
+
+
+u1Byte Array_MP_8723B_FW_MP[] = {
+0x01, 0x53, 0x10, 0x00, 0x17, 0x00, 0x03, 0x00, 0x03, 0x04, 0x13, 0x42, 0x5E, 0x7C, 0x00, 0x00,
+0x7D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x02, 0x45, 0xED, 0x02, 0x70, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x70, 0xDD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x7F, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x70, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x5F, 0x0D, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0x79, 0x56, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F,
0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00,
0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00,
0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00,
@@ -1764,8 +5467,8 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x05, 0x22, 0xE0, 0x90, 0xA3, 0xBF, 0xF0, 0x7D, 0x26, 0x91, 0x04, 0xEF, 0x64, 0x01, 0x70, 0x0B,
0x51, 0x0B, 0x90, 0xA2, 0x2C, 0xE0, 0x20, 0xE0, 0x1A, 0x80, 0x15, 0x90, 0xA1, 0xD1, 0xE0, 0xC4,
0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0C, 0x51, 0x0B, 0x90, 0xA2, 0x2C, 0xE0, 0x20, 0xE0, 0x03,
-0x12, 0xB7, 0xA7, 0x90, 0xA3, 0xBF, 0xE0, 0xFF, 0x7D, 0x27, 0x31, 0x5E, 0x12, 0xB8, 0x33, 0x80,
-0x0F, 0x12, 0xB8, 0x33, 0x51, 0x0B, 0x90, 0xA2, 0x2C, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xB7, 0xA7,
+0x12, 0xBB, 0x50, 0x90, 0xA3, 0xBF, 0xE0, 0xFF, 0x7D, 0x27, 0x31, 0x5E, 0x12, 0xBB, 0xDC, 0x80,
+0x0F, 0x12, 0xBB, 0xDC, 0x51, 0x0B, 0x90, 0xA2, 0x2C, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xBB, 0x50,
0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03,
0x30, 0xE0, 0x0B, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x28, 0x31, 0x5E, 0x90, 0x04,
0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0x9F, 0xE0, 0xFF,
@@ -1780,7 +5483,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA3, 0xB0, 0xA3, 0xE0, 0xFF, 0x7B, 0x08,
0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xF1, 0xED, 0xF0, 0xA3, 0xEB,
-0xF0, 0x90, 0xA3, 0xF0, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xB8, 0x9E, 0x7C, 0x00, 0xAD, 0x07,
+0xF0, 0x90, 0xA3, 0xF0, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xBC, 0x47, 0x7C, 0x00, 0xAD, 0x07,
0x90, 0xA3, 0xF0, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA3, 0xF1, 0xE0, 0x60, 0x0E, 0x74, 0x21,
0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20,
0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5,
@@ -1821,7 +5524,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x04, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x90, 0xA2, 0x2F, 0x12, 0x45, 0xA9, 0xE0, 0xFC, 0x75, 0xF0,
0x0D, 0xE5, 0x54, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13,
0x13, 0x54, 0x07, 0xFB, 0x90, 0xA2, 0x2C, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x90, 0xA3, 0xDB, 0xF0,
-0xAF, 0x04, 0x12, 0xB3, 0x58, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x12, 0xB1, 0x42, 0x75, 0xF0, 0x0D,
+0xAF, 0x04, 0x12, 0xB7, 0x01, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x12, 0xB4, 0xEB, 0x75, 0xF0, 0x0D,
0xE5, 0x54, 0x31, 0x4D, 0xAD, 0x54, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
0xA3, 0xDC, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA3, 0xDE, 0xE0, 0xFF, 0xC3,
0x94, 0x02, 0x40, 0x02, 0xC1, 0x4C, 0x90, 0xA3, 0xDD, 0xE0, 0xFE, 0x75, 0xF0, 0x0D, 0x90, 0xA2,
@@ -1843,8 +5546,8 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x91, 0x08, 0x90, 0xA2, 0x2C, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x75, 0xF0, 0x0D, 0x90,
0xA2, 0x2F, 0x12, 0x45, 0xA9, 0xE0, 0xFA, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA2, 0x30, 0x12, 0x45,
0xA9, 0xE0, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, 0xC4, 0x54, 0x0F,
-0x90, 0xA3, 0xDB, 0xF0, 0xAF, 0x02, 0x12, 0xB3, 0x58, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54,
-0x07, 0x75, 0xF0, 0x0D, 0x12, 0xB1, 0x42, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF,
+0x90, 0xA3, 0xDB, 0xF0, 0xAF, 0x02, 0x12, 0xB7, 0x01, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54,
+0x07, 0x75, 0xF0, 0x0D, 0x12, 0xB4, 0xEB, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF,
0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x3A, 0x12, 0x45, 0xA9, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0D, 0xEF,
0x31, 0x4D, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0xE4, 0xFF, 0xA1, 0x68, 0x90,
0x9F, 0xA1, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x51, 0xB2, 0x90, 0xA3, 0x19, 0xEE, 0xF0, 0xFC,
@@ -1857,7 +5560,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x83, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0xA3, 0x1F, 0xE0, 0xFF, 0x90, 0xA3, 0x1D, 0xA3, 0xE0, 0xFE,
0x24, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0x20, 0xE0, 0xFF,
0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2C, 0x2E, 0xF5,
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x12, 0xB6, 0x20, 0x90, 0xA1,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x12, 0xB9, 0xC9, 0x90, 0xA1,
0x1D, 0xE0, 0x64, 0x0C, 0x60, 0x12, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x56, 0x56, 0xE4, 0xFD, 0xFF,
0x31, 0x5E, 0x7D, 0x08, 0xE4, 0xFF, 0x31, 0x74, 0x22, 0x90, 0x9F, 0xA2, 0xE0, 0xFF, 0xE4, 0xFB,
0x7D, 0x01, 0x51, 0xB2, 0x90, 0xA3, 0x1A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x18, 0xE0,
@@ -1915,17 +5618,17 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8, 0x51, 0x80, 0x90, 0x00, 0x03,
0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x46, 0xAC, 0x80, 0xFE, 0x22, 0x7F, 0x81, 0x12, 0x46,
0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0xAC, 0x7F, 0x80, 0x12, 0x46, 0xD6, 0xEF,
-0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0xAC, 0x12, 0x9A, 0x9A, 0x12, 0x3E, 0x11, 0x12, 0x9A,
-0xA7, 0x12, 0x9B, 0x6B, 0x7F, 0x01, 0x12, 0x43, 0xA5, 0x90, 0xA2, 0x2B, 0x74, 0x02, 0xF0, 0xFF,
+0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0xAC, 0x12, 0x9E, 0x51, 0x12, 0x3E, 0x11, 0x12, 0x9E,
+0x5E, 0x12, 0x9F, 0x22, 0x7F, 0x01, 0x12, 0x43, 0xA5, 0x90, 0xA2, 0x2B, 0x74, 0x02, 0xF0, 0xFF,
0x12, 0x43, 0xA5, 0x90, 0xA2, 0x2B, 0xE0, 0x04, 0xF0, 0x31, 0xEA, 0x71, 0xC5, 0x7F, 0x80, 0x12,
0x46, 0xD6, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x46, 0xAC, 0x75, 0x28, 0xFF, 0xF1, 0xF4,
-0x12, 0x9A, 0xE8, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDA, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1,
+0x12, 0x9E, 0x9F, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDA, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1,
0xEF, 0x64, 0x01, 0x70, 0x27, 0x90, 0xA2, 0xDA, 0xE0, 0x54, 0x07, 0xF0, 0xE0, 0xFF, 0x64, 0x07,
-0x60, 0x04, 0xEF, 0xB4, 0x04, 0x16, 0x12, 0x9A, 0x8F, 0xBF, 0x01, 0x10, 0x7F, 0x16, 0x12, 0x46,
+0x60, 0x04, 0xEF, 0xB4, 0x04, 0x16, 0x12, 0x9E, 0x46, 0xBF, 0x01, 0x10, 0x7F, 0x16, 0x12, 0x46,
0xD6, 0xEF, 0x54, 0x0F, 0x44, 0x60, 0xFD, 0x7F, 0x16, 0x12, 0x46, 0xAC, 0x7F, 0x81, 0x12, 0x46,
-0xD6, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0xAC, 0x12, 0x9B, 0x79, 0x12, 0xB3, 0xCF,
-0xE4, 0xFF, 0x02, 0x44, 0x2E, 0x12, 0xB4, 0x86, 0x12, 0x98, 0x9C, 0x12, 0x9D, 0xC6, 0x12, 0xB4,
-0x8C, 0x91, 0xAB, 0x12, 0xB7, 0x98, 0x12, 0x8D, 0x61, 0x7E, 0x00, 0x7F, 0x19, 0x7D, 0x00, 0x7B,
+0xD6, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0xAC, 0x12, 0x9F, 0x30, 0x12, 0xB7, 0x78,
+0xE4, 0xFF, 0x02, 0x44, 0x2E, 0x12, 0xB8, 0x2F, 0x12, 0x9C, 0x53, 0x12, 0xA1, 0x7D, 0x12, 0xB8,
+0x35, 0x91, 0xAB, 0x12, 0xBB, 0x41, 0x12, 0x85, 0xF8, 0x7E, 0x00, 0x7F, 0x19, 0x7D, 0x00, 0x7B,
0x01, 0x7A, 0xA1, 0x79, 0xFD, 0x12, 0x08, 0xAA, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90,
0xA2, 0x04, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0x04, 0x12, 0x45, 0x71, 0x90, 0xA2, 0x00, 0x12, 0x08,
0x6D, 0x90, 0x9F, 0x9C, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x2A, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00,
@@ -1936,8 +5639,8 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xE1, 0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x9F, 0x9C, 0xE0, 0x64, 0x03, 0x70, 0x20, 0x90, 0xFD,
0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0xA2, 0x0C, 0xEF, 0xF0, 0x90, 0xFD,
0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0xA2, 0x0D, 0xEF, 0xF0, 0x90, 0xFD,
-0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x12, 0x85, 0x37, 0x12, 0x85,
-0xAD, 0x90, 0xA1, 0xE6, 0x74, 0x01, 0xF0, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x63, 0x7F, 0x90, 0xA2,
+0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x12, 0x8F, 0x3E, 0x12, 0x86,
+0x07, 0x90, 0xA1, 0xE6, 0x74, 0x01, 0xF0, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x63, 0x7F, 0x90, 0xA2,
0x19, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x04, 0x8F, 0xE4, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0xA3, 0x7D,
0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x16, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0x19, 0x74, 0x02, 0xF0,
0x90, 0xA1, 0x20, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0xA1, 0x25, 0xE4, 0xF0,
@@ -1949,7 +5652,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x30, 0xE2, 0x06, 0x90, 0xA1, 0x51, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xB9, 0x74, 0x03, 0xF0, 0xA3,
0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0xA1,
0x51, 0xE0, 0x24, 0x04, 0x90, 0xA1, 0x2F, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0xA1, 0xC4, 0xE0,
-0x54, 0xFE, 0xF0, 0x12, 0x89, 0x08, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1,
+0x54, 0xFE, 0xF0, 0x12, 0x92, 0xFC, 0x7E, 0x00, 0x7F, 0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1,
0x79, 0xBD, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0,
0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0xE4, 0x90, 0xA1, 0xBF, 0xF0, 0x22, 0xE0,
0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4,
@@ -1971,35 +5674,35 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xE1, 0xA8, 0xEF, 0x70, 0x02, 0xE1, 0x1B, 0x24, 0xFE, 0x70, 0x02,
0xE1, 0x56, 0x24, 0xFE, 0x60, 0x4B, 0x24, 0xFC, 0x70, 0x02, 0xE1, 0x93, 0x24, 0xFC, 0x60, 0x02,
0xE1, 0xA8, 0xEE, 0xB4, 0x0E, 0x02, 0xD1, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01,
-0x12, 0x6E, 0xD9, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0xF6, 0x90, 0xA1, 0x1D, 0xE0,
-0xB4, 0x04, 0x0F, 0x90, 0xA4, 0x0B, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0xB6, 0xD0, 0x80, 0x03, 0x12,
-0x88, 0xF4, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x08, 0x60, 0x02, 0xE1, 0xA8, 0x12, 0x60, 0x3B, 0xE1,
-0xA8, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x6E, 0xD9, 0x90, 0xA1, 0x1D, 0xE0,
+0x12, 0x6E, 0xEC, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0xF6, 0x90, 0xA1, 0x1D, 0xE0,
+0xB4, 0x04, 0x0F, 0x90, 0xA4, 0x0B, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0xBA, 0x79, 0x80, 0x03, 0x12,
+0x92, 0xE8, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x08, 0x60, 0x02, 0xE1, 0xA8, 0x12, 0x60, 0x3B, 0xE1,
+0xA8, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x6E, 0xEC, 0x90, 0xA1, 0x1D, 0xE0,
0xB4, 0x06, 0x02, 0xB1, 0xF6, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0xAD, 0xBF, 0x01,
0x02, 0xD1, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0xE1, 0xA8, 0xF1, 0xAD, 0xEF,
-0x64, 0x01, 0x60, 0x02, 0xE1, 0xA8, 0x12, 0xB7, 0x0F, 0xE1, 0xA8, 0x90, 0xA1, 0x1D, 0xE0, 0xB4,
+0x64, 0x01, 0x60, 0x02, 0xE1, 0xA8, 0x12, 0xBA, 0xB8, 0xE1, 0xA8, 0x90, 0xA1, 0x1D, 0xE0, 0xB4,
0x0E, 0x07, 0xF1, 0xAD, 0xBF, 0x01, 0x02, 0xD1, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02,
-0xB1, 0xF6, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x08, 0xF1, 0xAD, 0xBF, 0x01, 0x03, 0x12, 0xB7,
-0x0F, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x5F, 0x12, 0xB6, 0x60, 0xEF, 0x64, 0x01, 0x70,
-0x57, 0x12, 0xB7, 0x40, 0x80, 0x52, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0xAD, 0xBF,
+0xB1, 0xF6, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x08, 0xF1, 0xAD, 0xBF, 0x01, 0x03, 0x12, 0xBA,
+0xB8, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x5F, 0x12, 0xBA, 0x09, 0xEF, 0x64, 0x01, 0x70,
+0x57, 0x12, 0xBA, 0xE9, 0x80, 0x52, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, 0x07, 0xF1, 0xAD, 0xBF,
0x01, 0x02, 0xD1, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0xB1, 0xF6, 0x90, 0xA1, 0x1D,
-0xE0, 0xB4, 0x0C, 0x08, 0xF1, 0xAD, 0xBF, 0x01, 0x03, 0x12, 0xB7, 0x0F, 0x90, 0xA1, 0x1D, 0xE0,
-0x70, 0x05, 0x7F, 0x01, 0x12, 0x6E, 0xD9, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x04, 0x1A, 0x12, 0xB7,
-0x61, 0x80, 0x15, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x13,
+0xE0, 0xB4, 0x0C, 0x08, 0xF1, 0xAD, 0xBF, 0x01, 0x03, 0x12, 0xBA, 0xB8, 0x90, 0xA1, 0x1D, 0xE0,
+0x70, 0x05, 0x7F, 0x01, 0x12, 0x6E, 0xEC, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x04, 0x1A, 0x12, 0xBB,
+0x0A, 0x80, 0x15, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x13,
0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xF1, 0xE2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xCD,
0xE0, 0x30, 0xE0, 0x0D, 0x90, 0xA1, 0xD3, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x08, 0x80,
-0x1E, 0x12, 0x73, 0x81, 0xBF, 0x01, 0x18, 0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F,
+0x1E, 0x12, 0x73, 0xF1, 0xBF, 0x01, 0x18, 0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F,
0x20, 0xE0, 0x0C, 0x90, 0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01, 0x22, 0x7F,
0x00, 0x22, 0x7D, 0x2F, 0x12, 0x46, 0xF8, 0x7D, 0x08, 0x7F, 0x01, 0xB1, 0x87, 0x90, 0xA1, 0x15,
0x74, 0x08, 0xF0, 0x22, 0x75, 0xE8, 0x07, 0x75, 0xA8, 0x85, 0x22, 0xE4, 0x90, 0xA2, 0xDD, 0xF0,
0x90, 0xA2, 0xDD, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0xFB, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x57, 0xA3,
0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0E,
0x90, 0xA1, 0x1D, 0xE0, 0xFF, 0x90, 0xA1, 0x1C, 0xE0, 0x6F, 0x60, 0x02, 0x11, 0x4D, 0xC2, 0xAF,
-0x12, 0x9B, 0x42, 0xBF, 0x01, 0x03, 0x12, 0x7D, 0xEF, 0xD2, 0xAF, 0x90, 0xA2, 0x56, 0xE0, 0xB4,
-0x01, 0x03, 0x12, 0xB3, 0xF6, 0x12, 0x4F, 0xFA, 0x12, 0x42, 0xDD, 0x80, 0xB3, 0x90, 0xA1, 0x11,
+0x12, 0x9E, 0xF9, 0xBF, 0x01, 0x03, 0x12, 0x7E, 0x60, 0xD2, 0xAF, 0x90, 0xA2, 0x56, 0xE0, 0xB4,
+0x01, 0x03, 0x12, 0xB7, 0x9F, 0x12, 0x4F, 0xFA, 0x12, 0x42, 0xDD, 0x80, 0xB3, 0x90, 0xA1, 0x11,
0xE0, 0x90, 0xA1, 0x1C, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0x80, 0x21, 0xE0, 0xFF, 0x7D, 0x01, 0x02,
0x56, 0x56, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x13, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02,
-0xB6, 0x20, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x11, 0x4D, 0x22, 0xAE, 0x07, 0x11, 0x9C,
+0xB9, 0xC9, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x11, 0x4D, 0x22, 0xAE, 0x07, 0x11, 0x9C,
0xBF, 0x01, 0x16, 0x90, 0xA1, 0x11, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x0A, 0xAF,
0x06, 0x7D, 0x01, 0x12, 0x56, 0x56, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x05, 0x43, 0xE0,
0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B,
@@ -2016,23 +5719,23 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x43, 0x54, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x14, 0x90, 0xA1, 0x11,
0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x80, 0x90, 0xA1, 0x11, 0xE0, 0xC4,
0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0,
-0x90, 0xA1, 0x14, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x74, 0x97, 0x90, 0xA1, 0x11, 0xE0, 0xFF,
+0x90, 0xA1, 0x14, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x75, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0xFF,
0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x21, 0x11, 0x9C, 0xEF, 0x60,
0x04, 0x7F, 0x01, 0x80, 0x18, 0x7F, 0x02, 0x80, 0x14, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5,
-0x54, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x41, 0x83, 0xFF, 0x12, 0x74, 0x97,
+0x54, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x41, 0x83, 0xFF, 0x12, 0x75, 0x07,
0x41, 0x83, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x20, 0xE0, 0x02, 0x41, 0x4F, 0x43, 0x54, 0x31, 0x13,
0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0x51, 0x88, 0x43, 0x54, 0x08, 0x80, 0x06, 0x7D, 0x40, 0xE4,
0xFF, 0x51, 0xB0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03,
0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x04, 0x90, 0x05, 0x27,
0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E,
0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, 0x6B, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x22, 0x90, 0x05,
-0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x19, 0x12, 0xB7, 0x7D, 0x11,
+0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x19, 0x12, 0xBB, 0x26, 0x11,
0x9C, 0xBF, 0x01, 0x09, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF,
0x12, 0x56, 0x56, 0x80, 0x3E, 0x90, 0xA1, 0x1D, 0xE0, 0x90, 0xA1, 0x15, 0xF0, 0x80, 0x34, 0x75,
0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x06, 0x7D,
0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C,
-0x12, 0x56, 0x56, 0x12, 0x73, 0x79, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x56, 0x56,
-0x12, 0xB4, 0x8C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4,
+0x12, 0x56, 0x56, 0x12, 0x73, 0xE9, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x56, 0x56,
+0x12, 0xB8, 0x35, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4,
0xFF, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x51, 0xB0, 0x7D, 0x01, 0x7F, 0x02,
0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82,
@@ -2045,10 +5748,10 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, 0x35, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x04, 0xEF, 0x30,
0xE0, 0x0A, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x02, 0x60, 0x23, 0x91, 0x5B, 0x90, 0xA1, 0x17, 0xE0,
0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90, 0xA1, 0x20, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F,
-0x70, 0x0B, 0x12, 0x7F, 0xA4, 0x51, 0xA6, 0x90, 0xA1, 0x21, 0xE0, 0x14, 0xF0, 0x22, 0xEF, 0x70,
+0x70, 0x0B, 0x12, 0x7F, 0xFC, 0x51, 0xA6, 0x90, 0xA1, 0x21, 0xE0, 0x14, 0xF0, 0x22, 0xEF, 0x70,
0x4E, 0x7D, 0x78, 0x7F, 0x02, 0x51, 0xB0, 0x7D, 0x02, 0x7F, 0x03, 0x51, 0xB0, 0x7D, 0xC8, 0x7F,
0x02, 0xF1, 0xF3, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA0,
-0x90, 0xE0, 0x70, 0x15, 0x12, 0x60, 0x4D, 0x12, 0x88, 0xF4, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7,
+0x90, 0xE0, 0x70, 0x15, 0x12, 0x60, 0x4D, 0x12, 0x92, 0xE8, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7,
0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x56, 0x56,
0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x90,
0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x51, 0x91, 0x7D, 0x02,
@@ -2061,29 +5764,29 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xB4, 0x02, 0x05, 0xE4, 0x90, 0xA3, 0x15, 0xF0, 0x11, 0x9C, 0xEF, 0x70, 0x04, 0x90, 0xA3, 0x15,
0xF0, 0x90, 0xA3, 0x15, 0xE0, 0x60, 0x23, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x10, 0xF0, 0xE4, 0x90,
0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0x22, 0xE0, 0x90, 0xA3, 0xAF, 0x12, 0x48, 0x21, 0x90, 0xA1, 0x1D,
-0xE0, 0x20, 0xE2, 0x03, 0x12, 0x56, 0x52, 0x12, 0x80, 0x16, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64,
+0xE0, 0x20, 0xE2, 0x03, 0x12, 0x56, 0x52, 0x12, 0x8A, 0x1D, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64,
0x01, 0x60, 0x02, 0xA1, 0x0A, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02, 0xA1, 0x0A, 0x90, 0xA1, 0x18,
0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA1, 0x21,
0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0xA1, 0x20, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90,
0xA1, 0x20, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0xA1, 0x21, 0xEF, 0xF0, 0x90,
-0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x89, 0x29, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0,
+0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0x93, 0x1D, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0,
0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01,
0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0,
0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80,
-0x0E, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0xB5, 0x5C, 0x80, 0x02, 0xB1, 0x1B, 0x90,
+0x0E, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0xB9, 0x05, 0x80, 0x02, 0xB1, 0x1B, 0x90,
0xA1, 0x17, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x20, 0xE0, 0xFF,
-0xA3, 0xE0, 0xB5, 0x07, 0x05, 0x12, 0x7F, 0xA4, 0x51, 0xAC, 0x90, 0xA1, 0x11, 0xE0, 0xC3, 0x13,
+0xA3, 0xE0, 0xB5, 0x07, 0x05, 0x12, 0x7F, 0xFC, 0x51, 0xAC, 0x90, 0xA1, 0x11, 0xE0, 0xC3, 0x13,
0x20, 0xE0, 0x07, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06,
0xA9, 0xE0, 0xF5, 0x63, 0x54, 0xC0, 0x70, 0x0C, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x54,
0xFD, 0xF0, 0x01, 0x4D, 0xE5, 0x63, 0x30, 0xE6, 0x23, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x01, 0x70,
0x22, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02,
-0x60, 0x05, 0x12, 0xB5, 0xF5, 0x80, 0x0C, 0x12, 0x4F, 0x9B, 0x80, 0x07, 0x90, 0xA1, 0x1E, 0xE0,
+0x60, 0x05, 0x12, 0xB9, 0x9E, 0x80, 0x0C, 0x12, 0x4F, 0x9B, 0x80, 0x07, 0x90, 0xA1, 0x1E, 0xE0,
0x54, 0xFE, 0xF0, 0xE5, 0x63, 0x90, 0xA1, 0x1E, 0x30, 0xE7, 0x1B, 0xE0, 0x44, 0x02, 0xF0, 0xE4,
0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x90, 0xA3, 0xAF, 0x12, 0x48, 0x21, 0x90, 0xA1,
0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0xE8, 0xE0, 0x30,
-0xE0, 0x05, 0x12, 0x87, 0x1B, 0x80, 0x03, 0x12, 0x63, 0x03, 0x90, 0xA2, 0x13, 0xE0, 0x30, 0xE0,
+0xE0, 0x05, 0x12, 0x91, 0x0F, 0x80, 0x03, 0x12, 0x63, 0x03, 0x90, 0xA2, 0x13, 0xE0, 0x30, 0xE0,
0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA2, 0x14, 0xE0, 0x64, 0x08, 0x70, 0x1B, 0x90, 0xA2, 0x13,
-0xE0, 0x30, 0xE0, 0x0F, 0x12, 0x7B, 0x8A, 0x90, 0xA2, 0x13, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3,
+0xE0, 0x30, 0xE0, 0x0F, 0x12, 0x7B, 0xFA, 0x90, 0xA2, 0x13, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3,
0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0x14, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0xC4, 0x13, 0x13,
0x54, 0x03, 0x30, 0xE0, 0x13, 0x90, 0xA2, 0x15, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90,
0x04, 0x9C, 0xE4, 0xF0, 0x90, 0xA2, 0x15, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x06, 0x90,
@@ -2100,20 +5803,20 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xB7, 0x90, 0x9F, 0x97, 0xE0, 0x45, 0x71, 0xF0, 0x22, 0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF,
0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xB6, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x45, 0xBE,
0x12, 0x46, 0xC6, 0xEF, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0,
-0x13, 0x90, 0xA3, 0xB6, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x45, 0xB5, 0x12, 0x90, 0x23,
+0x13, 0x90, 0xA3, 0xB6, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0x12, 0x45, 0xB5, 0x12, 0x97, 0xC7,
0x7F, 0x01, 0x80, 0x0E, 0x7F, 0x01, 0xD1, 0x86, 0x7F, 0x02, 0x80, 0x06, 0x7F, 0x02, 0xD1, 0x86,
0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3,
0x8B, 0x74, 0x15, 0xF0, 0x90, 0xA3, 0x99, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x8D, 0xEF, 0xF0, 0x7B,
-0x01, 0x7A, 0xA3, 0x79, 0x8B, 0x12, 0x6F, 0x6E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0,
+0x01, 0x7A, 0xA3, 0x79, 0x8B, 0x12, 0x6F, 0xEA, 0xD0, 0xD0, 0x92, 0xAF, 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, 0x90, 0x01, 0xC4, 0x74, 0x0D, 0xF0,
-0x74, 0x5F, 0xA3, 0xF0, 0x12, 0x9B, 0xB1, 0xE5, 0x21, 0x30, 0xE1, 0x03, 0x12, 0x9C, 0x62, 0xE5,
+0x74, 0x5F, 0xA3, 0xF0, 0x12, 0x9F, 0x68, 0xE5, 0x21, 0x30, 0xE1, 0x03, 0x12, 0xA0, 0x19, 0xE5,
0x21, 0x30, 0xE2, 0x02, 0x11, 0x62, 0xE5, 0x21, 0x30, 0xE5, 0x02, 0xF1, 0xD7, 0xE5, 0x22, 0x30,
-0xE0, 0x03, 0x12, 0x8A, 0x80, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0x74, 0x07, 0xE5, 0x23, 0x30,
-0xE0, 0x03, 0x12, 0x73, 0x9A, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xD6, 0xE5, 0x23, 0x30, 0xE2,
-0x0A, 0x12, 0x81, 0x3F, 0x90, 0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, 0x04,
+0xE0, 0x03, 0x12, 0x94, 0x74, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0x74, 0x77, 0xE5, 0x23, 0x30,
+0xE0, 0x03, 0x12, 0x74, 0x0A, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xD6, 0xE5, 0x23, 0x30, 0xE2,
+0x0A, 0x12, 0x8B, 0x46, 0x90, 0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30, 0xE1, 0x04,
0x7F, 0x04, 0xD1, 0x8A, 0xE5, 0x24, 0x30, 0xE4, 0x02, 0x71, 0x03, 0xE5, 0x24, 0x30, 0xE5, 0x03,
-0x12, 0x9C, 0xB7, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0x9C, 0xF3, 0xE5, 0x24, 0x30, 0xE7, 0x03,
+0x12, 0xA0, 0x6E, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0xA0, 0xAA, 0xE5, 0x24, 0x30, 0xE7, 0x03,
0x12, 0x67, 0xB1, 0x74, 0x0D, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x5F, 0xA3, 0xF0, 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, 0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x05,
@@ -2122,7 +5825,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x20, 0xE4, 0xFF, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38,
0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xAC, 0x07, 0xEF, 0x54, 0x01,
0xFE, 0x90, 0xA1, 0xC0, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x12,
-0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x7F, 0xB3, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0x05, 0x73,
+0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x80, 0x0B, 0x90, 0xA1, 0xC2, 0xE0, 0x90, 0x05, 0x73,
0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x12, 0x5F, 0xF3, 0x11, 0x4D, 0xE4, 0xFD, 0xFF,
0x12, 0x49, 0x5E, 0x12, 0x55, 0x83, 0x90, 0xA1, 0x15, 0x74, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF,
0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF,
@@ -2162,7 +5865,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xE0, 0x70, 0x04, 0x7D, 0x04, 0x80, 0x0A, 0x90, 0xA3, 0xC0, 0xE0, 0x64, 0x03, 0x70, 0x34, 0x7D,
0x0B, 0x7F, 0x6F, 0x80, 0x2B, 0x90, 0xA3, 0xC0, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, 0x21, 0x90,
0xA3, 0xC0, 0xE0, 0xB4, 0x03, 0x1D, 0x90, 0xA1, 0xCD, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20,
-0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0xB5, 0xF5, 0xE4, 0xFD, 0xFF,
+0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0xB9, 0x9E, 0xE4, 0xFD, 0xFF,
0x12, 0x49, 0x5E, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04,
0x7F, 0x01, 0xF1, 0xE7, 0x90, 0xA1, 0xD1, 0xE0, 0xC3, 0x13, 0x90, 0x06, 0xCD, 0x30, 0xE0, 0x0D,
0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0B, 0xE0, 0x54, 0xEF,
@@ -2175,7 +5878,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xCE, 0x51, 0xED, 0x90, 0xA1, 0xE0, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xDF, 0x74, 0x01, 0xF0, 0x90,
0xA1, 0xBF, 0xE0, 0x60, 0x07, 0x7D, 0x05, 0x7F, 0x6F, 0x02, 0x49, 0x5E, 0xE4, 0xFD, 0xFF, 0x12,
0x49, 0x5E, 0x90, 0xA1, 0xCD, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13,
-0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0xB5, 0xF5, 0x22, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD3,
+0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0xB9, 0x9E, 0x22, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xD3,
0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13,
0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xA1, 0x22, 0x90, 0xA2, 0x0D, 0xE0, 0x60, 0x02, 0x81, 0x42,
0xE5, 0x26, 0x64, 0x02, 0x60, 0x4A, 0xE5, 0x27, 0x70, 0x46, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37,
@@ -2226,20 +5929,20 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xD0, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0xA1, 0xD0, 0xE0, 0xC4,
0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x04, 0xE4, 0xFF, 0xF1, 0xE7, 0x90, 0xA1, 0xD1, 0xE0,
0xC3, 0x13, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0,
-0x22, 0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x36, 0x12, 0x81, 0x72, 0x90, 0xA1, 0xE0, 0xE0, 0xFF,
+0x22, 0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x36, 0x12, 0x8B, 0x79, 0x90, 0xA1, 0xE0, 0xE0, 0xFF,
0xB4, 0x01, 0x02, 0x80, 0x1C, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, 0xB4, 0x02, 0x02, 0x80, 0x1D, 0x90,
0xA1, 0xE0, 0xE0, 0xFF, 0xB4, 0x03, 0x02, 0x01, 0xCE, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, 0xB4, 0x04,
-0x03, 0x02, 0x83, 0xE4, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, 0xB4, 0x05, 0x02, 0xB1, 0x27, 0x22, 0xD3,
+0x03, 0x02, 0x8D, 0xEB, 0x90, 0xA1, 0xE0, 0xE0, 0xFF, 0xB4, 0x05, 0x02, 0xB1, 0x27, 0x22, 0xD3,
0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x13, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13,
0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4, 0xF0, 0x80, 0x34, 0x90, 0xA1, 0xD1,
0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x03,
0x74, 0x03, 0xF0, 0x90, 0xA2, 0x19, 0xE0, 0x30, 0xE0, 0x17, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0B,
0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80, 0x03, 0x90, 0x06, 0xCC, 0x74, 0x03,
0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x20,
-0xE0, 0xB4, 0x01, 0x02, 0x80, 0x4C, 0x90, 0xA2, 0x20, 0xE0, 0xB4, 0x02, 0x12, 0x12, 0x81, 0x18,
-0x7F, 0x01, 0xD1, 0xDF, 0x12, 0x87, 0x4A, 0x90, 0xA2, 0x20, 0x74, 0x03, 0xF0, 0x80, 0x4D, 0x90,
-0xA2, 0x20, 0xE0, 0x64, 0x03, 0x70, 0x24, 0x90, 0xA2, 0x23, 0x12, 0x81, 0x1B, 0xE4, 0xFF, 0xD1,
-0xDF, 0x12, 0x87, 0x4A, 0x90, 0xA2, 0x19, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0xE4, 0xFB, 0xFD,
+0xE0, 0xB4, 0x01, 0x02, 0x80, 0x4C, 0x90, 0xA2, 0x20, 0xE0, 0xB4, 0x02, 0x12, 0x12, 0x8B, 0x1F,
+0x7F, 0x01, 0xD1, 0xDF, 0x12, 0x91, 0x3E, 0x90, 0xA2, 0x20, 0x74, 0x03, 0xF0, 0x80, 0x4D, 0x90,
+0xA2, 0x20, 0xE0, 0x64, 0x03, 0x70, 0x24, 0x90, 0xA2, 0x23, 0x12, 0x8B, 0x22, 0xE4, 0xFF, 0xD1,
+0xDF, 0x12, 0x91, 0x3E, 0x90, 0xA2, 0x19, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0xE4, 0xFB, 0xFD,
0x12, 0x4C, 0xA9, 0x90, 0xA2, 0x20, 0x74, 0x04, 0xF0, 0x80, 0x21, 0x90, 0xA2, 0x20, 0xE0, 0xB4,
0x04, 0x1A, 0x90, 0xA2, 0x19, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0x7B, 0x01, 0x7D, 0x01, 0x12,
0x4C, 0xA9, 0x90, 0xA2, 0x20, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0x1E, 0xF0, 0xD0, 0xD0, 0x92, 0xAF,
@@ -2251,12 +5954,12 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x22, 0xE4, 0xFB,
0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44, 0xDE, 0x90, 0xA2, 0xE6, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9F,
0x97, 0xE0, 0x60, 0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x0A, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x31, 0xBD,
-0x12, 0xA4, 0xA0, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE1, 0x05, 0x54,
+0x12, 0xA8, 0x5D, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE1, 0x05, 0x54,
0xFD, 0xF0, 0x11, 0xE3, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE2, 0x05,
0x54, 0xFB, 0xF0, 0x11, 0x91, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE6,
0x05, 0x54, 0xBF, 0xF0, 0x11, 0x6A, 0xD2, 0xAF, 0x80, 0xB4, 0xE4, 0x7B, 0x01, 0x7A, 0xA2, 0x79,
0x16, 0x12, 0x5E, 0x99, 0xEF, 0xB4, 0x02, 0x18, 0x90, 0xA3, 0xE4, 0xE0, 0x64, 0x04, 0x60, 0x0B,
-0x7F, 0x40, 0x91, 0xCC, 0x90, 0xA3, 0xE4, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0xE4, 0xF0,
+0x7F, 0x40, 0x91, 0xE0, 0x90, 0xA3, 0xE4, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0xE4, 0xF0,
0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xFE, 0x90,
0xA0, 0x8B, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01, 0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01,
0x60, 0x2C, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B,
@@ -2266,212 +5969,219 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x9F, 0xF3, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x43, 0x90,
0x9F, 0xF3, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA3, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0xEE,
0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA4, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05,
-0x71, 0x16, 0x90, 0x9F, 0xF3, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01,
-0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0xF3, 0xF0, 0x12, 0x97, 0x48, 0x90, 0x9F, 0x97, 0xE0, 0x44,
+0x71, 0x15, 0x90, 0x9F, 0xF3, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01,
+0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0xF3, 0xF0, 0x12, 0x9B, 0x03, 0x90, 0x9F, 0x97, 0xE0, 0x44,
0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3,
-0xD0, 0x12, 0x45, 0xBE, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x98, 0xAA, 0xEF, 0x60, 0x5A, 0x90, 0x01,
+0xD0, 0x12, 0x45, 0xBE, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x9C, 0x61, 0xEF, 0x60, 0x5A, 0x90, 0x01,
0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF,
0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0xA3, 0xD3, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11,
0xF0, 0x90, 0xA3, 0xD3, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0xD0,
0x12, 0x45, 0xB5, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12,
-0x99, 0x00, 0x90, 0xA3, 0xD3, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA3, 0xD0, 0x12, 0x45, 0xB5, 0x12,
-0x99, 0x5B, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x58,
-0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x50, 0x48, 0x74,
+0x9C, 0xB7, 0x90, 0xA3, 0xD3, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA3, 0xD0, 0x12, 0x45, 0xB5, 0x12,
+0x9D, 0x12, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x58,
+0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x50, 0x47, 0x74,
0x5A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90,
0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA2, 0x59, 0x30, 0xE7, 0x0E, 0xE0, 0x24, 0x81, 0xF5,
-0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x15, 0xE0, 0xFF, 0x12, 0xB0, 0xC1, 0x90,
-0xA2, 0x59, 0xE0, 0x24, 0x5A, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90,
-0xA2, 0x59, 0xE0, 0x04, 0xF0, 0x80, 0xAE, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90,
-0xA2, 0x59, 0xF0, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x61, 0x15, 0x74,
-0x5A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x61, 0x0D, 0x90, 0xA2,
-0x59, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x06, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0,
-0x10, 0xEF, 0x90, 0x81, 0x07, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x59, 0xE0,
-0xFC, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF,
-0xF0, 0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10,
-0xEC, 0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x59, 0xE0, 0x75,
-0xF0, 0x0A, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, 0x01, 0x90,
-0xA2, 0x59, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F,
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, 0x01,
-0x12, 0x45, 0xA9, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xED, 0xF0, 0x0F,
-0xEF, 0xB4, 0x05, 0xCB, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x09, 0x12,
-0x45, 0xA9, 0xE0, 0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEE, 0xF0,
-0x90, 0xA2, 0x59, 0xE0, 0xFF, 0x90, 0xA2, 0x58, 0xE0, 0xFD, 0x12, 0x78, 0x59, 0x90, 0xA2, 0x59,
-0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x59,
-0xE0, 0x04, 0xF0, 0x41, 0x23, 0x22, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0xE7, 0xEF,
-0xF0, 0x12, 0x45, 0xC7, 0x6B, 0x82, 0x00, 0x6B, 0x8B, 0x01, 0x6B, 0x94, 0x02, 0x6B, 0x9D, 0x10,
-0x6B, 0xA6, 0x11, 0x6B, 0xAF, 0x12, 0x6B, 0xB7, 0x14, 0x6B, 0xC0, 0x20, 0x6B, 0xC9, 0x21, 0x6B,
-0xD2, 0x23, 0x6B, 0xDA, 0x24, 0x6B, 0xE3, 0x25, 0x6B, 0xEC, 0x27, 0x6B, 0xF5, 0x28, 0x6B, 0xFD,
-0x40, 0x6C, 0x06, 0x42, 0x6C, 0x0F, 0x44, 0x6C, 0x17, 0x60, 0x6C, 0x20, 0x61, 0x6C, 0x28, 0x62,
-0x6C, 0x31, 0x63, 0x6C, 0x3A, 0x64, 0x6C, 0x43, 0x65, 0x6C, 0x4C, 0x66, 0x6C, 0x54, 0x67, 0x6C,
-0x5C, 0x68, 0x6C, 0x65, 0x69, 0x6C, 0x6E, 0x6B, 0x6C, 0x77, 0x6C, 0x6C, 0x80, 0x6D, 0x00, 0x00,
-0x6C, 0x89, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x88, 0x06, 0x90, 0xA2, 0xE8, 0x12, 0x45,
-0xB5, 0x02, 0x88, 0x52, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x74, 0x4F, 0x90, 0xA2, 0xE8,
-0x12, 0x45, 0xB5, 0x02, 0x8B, 0x07, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x8B, 0x2F, 0x90,
-0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x81, 0x99, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x8D, 0x70,
-0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x8D, 0x7F, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02,
-0x8F, 0x69, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0xDC, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5,
-0x02, 0x58, 0xA8, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x8F, 0xAF, 0x90, 0xA2, 0xE8, 0x12,
-0x45, 0xB5, 0x02, 0x8F, 0xEF, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xC1, 0x10, 0x90, 0xA2, 0xE8,
-0x12, 0x45, 0xB5, 0x02, 0xAF, 0x55, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0xA0, 0x76, 0x90,
-0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xA1, 0x7C, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x90, 0x9A,
-0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x81, 0xAD, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x5F,
-0xE9, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x94, 0x43, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5,
-0x02, 0x94, 0x57, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x94, 0xB9, 0x90, 0xA2, 0xE8, 0x12,
-0x45, 0xB5, 0xE1, 0x2E, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x81, 0xE7, 0x90, 0xA2, 0xE8, 0x12,
-0x45, 0xB5, 0x02, 0x94, 0xCB, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x94, 0xEA, 0x90, 0xA2,
-0xE8, 0x12, 0x45, 0xB5, 0x02, 0x95, 0x98, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x96, 0xBC,
-0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x96, 0xE6, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0,
-0x90, 0xA2, 0xE7, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0xA0, 0x8F,
-0xF0, 0xBF, 0x01, 0x08, 0x12, 0x99, 0xD4, 0xE4, 0x90, 0xA0, 0x8F, 0xF0, 0x22, 0x90, 0xA1, 0xF3,
-0xE0, 0x44, 0x04, 0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x5E, 0x9D, 0x8F, 0x51, 0xE5, 0x51, 0xB4,
-0x03, 0x09, 0xE4, 0xFF, 0x12, 0x7B, 0x01, 0x7F, 0x04, 0x91, 0xCC, 0x22, 0x90, 0xA4, 0x05, 0xEF,
-0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x90, 0xA4, 0x05, 0xE0, 0xFE,
-0xEF, 0x4E, 0x90, 0x9F, 0x97, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06,
-0x89, 0x90, 0xA2, 0xEB, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEC, 0xF0, 0x90,
-0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xED, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90,
-0xA2, 0xEE, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0,
-0xA3, 0xF0, 0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA2, 0xEC, 0xE0, 0xB4, 0x0C, 0x06,
-0xE5, 0x70, 0x70, 0x11, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7D, 0x07, 0x7F, 0x30,
-0x12, 0x5E, 0x9D, 0x8F, 0x51, 0x90, 0xA2, 0xEC, 0xE0, 0xB4, 0x0D, 0x0E, 0xE5, 0x51, 0x64, 0x01,
-0x60, 0x05, 0x75, 0x70, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x70, 0xE5, 0x51, 0xB4, 0x01, 0x05, 0x75,
-0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, 0xA2, 0xEB, 0xE0, 0xFB, 0xAD, 0x52, 0xE4, 0xFF,
-0x12, 0x7F, 0x14, 0x7F, 0x04, 0x91, 0xCC, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xEB, 0x12,
-0x45, 0xBE, 0xE4, 0x90, 0xA2, 0xF0, 0xF0, 0xFD, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x8D, 0x82,
-0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xF4, 0x60, 0x4D, 0x90, 0xA2, 0xF0, 0xE0, 0xFF, 0x90, 0xA2,
-0xEB, 0x12, 0x45, 0xB5, 0x8D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x75, 0xF0, 0x10,
-0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFC, 0xA8, 0x05,
-0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x90, 0xA2, 0xF0, 0xF0, 0x75, 0xF0, 0x10, 0xEE,
-0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x74, 0xF1, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA2,
-0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0D, 0x74, 0xF1, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83,
-0x74, 0xFF, 0xF0, 0x0D, 0xED, 0xB4, 0x07, 0x90, 0x90, 0xA2, 0xEE, 0x74, 0x05, 0xF0, 0x90, 0xA2,
-0xFC, 0x74, 0x08, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEE, 0xF1, 0x6E, 0x7F, 0x04, 0x81, 0xCC,
-0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xC4, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF,
-0x54, 0x02, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xEF, 0x4F, 0xF0,
-0x90, 0xA1, 0xC4, 0xE0, 0x54, 0x01, 0xFF, 0xEF, 0x64, 0x01, 0x70, 0x6B, 0x12, 0xB7, 0x40, 0x90,
-0x01, 0x38, 0xE0, 0x90, 0xA1, 0xC5, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90, 0xA1, 0xC6, 0xF0, 0x90,
-0x01, 0x3A, 0xE0, 0x90, 0xA1, 0xC7, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90, 0xA1, 0xC8, 0xF0, 0x90,
-0x01, 0x30, 0xE0, 0x90, 0xA1, 0xC9, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90, 0xA1, 0xCA, 0xF0, 0x90,
-0x01, 0x32, 0xE0, 0x90, 0xA1, 0xCB, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90, 0xA1, 0xCC, 0xF0, 0x90,
-0x01, 0x38, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x30, 0xF0, 0xA3, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x30, 0x74, 0x10, 0xF0, 0x90, 0x01, 0x39, 0x74, 0x01, 0xF0,
-0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0x12, 0x7E, 0xA2, 0x90, 0xA1, 0xCA, 0xE0, 0x90, 0x01,
-0x31, 0xF0, 0x90, 0xA1, 0xCB, 0xE0, 0x90, 0x01, 0x32, 0xF0, 0x90, 0xA1, 0xCC, 0xE0, 0x90, 0x01,
-0x33, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0x90, 0x01, 0x38, 0xF0, 0x90, 0xA1, 0xC8, 0xE0, 0x90, 0x01,
-0x3B, 0xF0, 0x7F, 0x01, 0xD1, 0xD9, 0x02, 0x54, 0xAB, 0x90, 0xA4, 0x0A, 0xEF, 0xF0, 0x12, 0x60,
-0x4D, 0x90, 0xA4, 0x0A, 0xE0, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x7D, 0x04, 0x7F,
-0x01, 0x12, 0x55, 0x87, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA2, 0xF6, 0x74, 0x12,
-0xF0, 0x90, 0xA3, 0x04, 0x74, 0x05, 0xF0, 0x90, 0xA2, 0xF8, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3,
-0xEB, 0xF0, 0x90, 0xA2, 0xF4, 0xE0, 0x90, 0xA2, 0xFB, 0xF0, 0x90, 0xA2, 0xF5, 0xE0, 0x90, 0xA2,
-0xFC, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xF6, 0xF1, 0x6E, 0x7F, 0x04, 0x81, 0xCC, 0x90, 0xA2,
-0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0x90, 0xA2, 0x16,
-0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x17, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06,
-0xA2, 0x90, 0xA2, 0x18, 0xF0, 0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA2, 0xEB, 0x12,
-0x45, 0xB5, 0x12, 0x5E, 0x99, 0xEF, 0xB4, 0x02, 0x04, 0x7F, 0x40, 0x91, 0xCC, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA0, 0x8B, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09,
-0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02,
-0x7F, 0x00, 0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01,
-0x90, 0xA0, 0x8C, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xA8,
-0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0xA0, 0x8C,
-0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90,
-0xA0, 0x8C, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0x21, 0xBD, 0x12, 0x06, 0x89, 0x90,
-0xA1, 0x24, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0,
-0x05, 0xC0, 0x07, 0x7D, 0xE4, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x6F, 0xFF, 0xA3, 0xF0, 0xED,
+0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x14, 0xE0, 0xFF, 0xF1, 0x9C, 0x90, 0xA2,
+0x59, 0xE0, 0x24, 0x5A, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2,
+0x59, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA2,
+0x59, 0xF0, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x61, 0x14, 0x74, 0x5A,
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x61, 0x0C, 0x90, 0xA2, 0x59,
+0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x06, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10,
+0xEF, 0x90, 0x81, 0x07, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x59, 0xE0, 0xFC,
+0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x75, 0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEC,
+0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x59, 0xE0, 0x75, 0xF0,
+0x0A, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, 0x01, 0x90, 0xA2,
+0x59, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5,
+0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, 0x01, 0x12,
+0x45, 0xA9, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xED, 0xF0, 0x0F, 0xEF,
+0xB4, 0x05, 0xCB, 0x90, 0xA2, 0x59, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x09, 0x12, 0x45,
+0xA9, 0xE0, 0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEE, 0xF0, 0x90,
+0xA2, 0x59, 0xE0, 0xFF, 0x90, 0xA2, 0x58, 0xE0, 0xFD, 0x12, 0x78, 0xC9, 0x90, 0xA2, 0x59, 0xE0,
+0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x59, 0xE0,
+0x04, 0xF0, 0x41, 0x22, 0x22, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0xE7, 0xEF, 0xF0,
+0x12, 0x45, 0xC7, 0x6B, 0x87, 0x00, 0x6B, 0x90, 0x01, 0x6B, 0x99, 0x02, 0x6B, 0xA2, 0x10, 0x6B,
+0xAB, 0x11, 0x6B, 0xB4, 0x12, 0x6B, 0xBC, 0x14, 0x6B, 0xC4, 0x20, 0x6B, 0xCD, 0x21, 0x6B, 0xD6,
+0x23, 0x6B, 0xDE, 0x24, 0x6B, 0xE7, 0x25, 0x6B, 0xF0, 0x27, 0x6B, 0xF9, 0x28, 0x6C, 0x01, 0x40,
+0x6C, 0x0A, 0x42, 0x6C, 0x13, 0x44, 0x6C, 0x1B, 0x60, 0x6C, 0x24, 0x61, 0x6C, 0x2C, 0x62, 0x6C,
+0x35, 0x63, 0x6C, 0x3D, 0x64, 0x6C, 0x46, 0x65, 0x6C, 0x4E, 0x66, 0x6C, 0x56, 0x67, 0x6C, 0x5E,
+0x68, 0x6C, 0x67, 0x69, 0x6C, 0x70, 0x6A, 0x6C, 0x79, 0x6B, 0x6C, 0x82, 0x6C, 0x6C, 0x8B, 0x6D,
+0x6C, 0x94, 0x6E, 0x00, 0x00, 0x6C, 0x9D, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x91, 0xFA,
+0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x92, 0x46, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02,
+0x74, 0xBF, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x94, 0xFB, 0x90, 0xA2, 0xE8, 0x12, 0x45,
+0xB5, 0x02, 0x80, 0x20, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x81, 0xAD, 0x90, 0xA2, 0xE8, 0x12,
+0x45, 0xB5, 0xE1, 0x8D, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x95, 0x23, 0x90, 0xA2, 0xE8,
+0x12, 0x45, 0xB5, 0x02, 0x97, 0x0D, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x85, 0x90, 0xA2,
+0xE8, 0x12, 0x45, 0xB5, 0x02, 0x58, 0xA8, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x97, 0x53,
+0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x97, 0x93, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xC1,
+0x24, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0xB3, 0x0F, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5,
+0x02, 0xA4, 0x2D, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xA1, 0x90, 0x90, 0xA2, 0xE8, 0x12, 0x45,
+0xB5, 0x02, 0x82, 0x51, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x81, 0xC1, 0x90, 0xA2, 0xE8, 0x12,
+0x45, 0xB5, 0x02, 0x5F, 0xE9, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0xBD, 0x90, 0xA2, 0xE8,
+0x12, 0x45, 0xB5, 0x02, 0x98, 0x3E, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0xE1, 0xAB, 0x90, 0xA2,
+0xE8, 0x12, 0x45, 0xB5, 0xE1, 0x41, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x81, 0xFB, 0x90, 0xA2,
+0xE8, 0x12, 0x45, 0xB5, 0x02, 0x98, 0xA0, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x89, 0x70,
+0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x98, 0xBF, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02,
+0x99, 0x22, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x9A, 0x46, 0x90, 0xA2, 0xE8, 0x12, 0x45,
+0xB5, 0x02, 0x9A, 0x70, 0x90, 0xA2, 0xE8, 0x12, 0x45, 0xB5, 0x02, 0x9A, 0xD2, 0x90, 0x01, 0xC0,
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA2, 0xE7, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89,
+0xFF, 0x90, 0xA0, 0x8F, 0xF0, 0xBF, 0x01, 0x08, 0x12, 0x9D, 0x8B, 0xE4, 0x90, 0xA0, 0x8F, 0xF0,
+0x22, 0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x5E, 0x9D, 0x8F,
+0x51, 0xE5, 0x51, 0xB4, 0x03, 0x09, 0xE4, 0xFF, 0x12, 0x7B, 0x71, 0x7F, 0x04, 0x91, 0xE0, 0x22,
+0x90, 0xA4, 0x05, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x90,
+0xA4, 0x05, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x97, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
+0xC0, 0xD0, 0x12, 0x06, 0x89, 0x90, 0xA2, 0xEB, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90,
+0xA2, 0xEC, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xED, 0xF0, 0x90, 0x00, 0x03,
+0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEE, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEF,
+0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA2, 0xEC,
+0xE0, 0xB4, 0x0C, 0x06, 0xE5, 0x70, 0x70, 0x11, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB,
+0x7D, 0x07, 0x7F, 0x30, 0x12, 0x5E, 0x9D, 0x8F, 0x51, 0x90, 0xA2, 0xEC, 0xE0, 0xB4, 0x0D, 0x0E,
+0xE5, 0x51, 0x64, 0x01, 0x60, 0x05, 0x75, 0x70, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x70, 0xE5, 0x51,
+0xB4, 0x01, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90, 0xA2, 0xEB, 0xE0, 0xFB,
+0xAD, 0x52, 0xE4, 0xFF, 0x12, 0x7F, 0x6C, 0x7F, 0x04, 0x91, 0xE0, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0xE4, 0x90, 0xA2, 0xF0, 0xF0, 0xFD, 0x90, 0xA2, 0xEB, 0x12,
+0x45, 0xB5, 0x8D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xF4, 0x60, 0x4D, 0x90, 0xA2, 0xF0,
+0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x8D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2,
+0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54,
+0x01, 0xFC, 0xA8, 0x05, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x90, 0xA2, 0xF0, 0xF0,
+0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x74, 0xF1, 0x2D, 0xF5,
+0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0D, 0x74, 0xF1, 0x2D, 0xF5, 0x82, 0xE4,
+0x34, 0xA2, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x0D, 0xED, 0xB4, 0x07, 0x90, 0x90, 0xA2, 0xEE, 0x74,
+0x05, 0xF0, 0x90, 0xA2, 0xFC, 0x74, 0x08, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEE, 0xF1, 0xEA,
+0x7F, 0x04, 0x81, 0xE0, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xC4, 0xE0, 0x54,
+0xFE, 0x4E, 0xF0, 0xEF, 0x54, 0x02, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x90, 0xA1, 0x16, 0xE0,
+0x54, 0xEF, 0x4F, 0xF0, 0x90, 0xA1, 0xC4, 0xE0, 0x54, 0x01, 0xFF, 0xEF, 0x64, 0x01, 0x70, 0x6B,
+0x12, 0xBA, 0xE9, 0x90, 0x01, 0x38, 0xE0, 0x90, 0xA1, 0xC5, 0xF0, 0x90, 0x01, 0x39, 0xE0, 0x90,
+0xA1, 0xC6, 0xF0, 0x90, 0x01, 0x3A, 0xE0, 0x90, 0xA1, 0xC7, 0xF0, 0x90, 0x01, 0x3B, 0xE0, 0x90,
+0xA1, 0xC8, 0xF0, 0x90, 0x01, 0x30, 0xE0, 0x90, 0xA1, 0xC9, 0xF0, 0x90, 0x01, 0x31, 0xE0, 0x90,
+0xA1, 0xCA, 0xF0, 0x90, 0x01, 0x32, 0xE0, 0x90, 0xA1, 0xCB, 0xF0, 0x90, 0x01, 0x33, 0xE0, 0x90,
+0xA1, 0xCC, 0xF0, 0x90, 0x01, 0x38, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01,
+0x30, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x30, 0x74, 0x10, 0xF0, 0x90, 0x01,
+0x39, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0xF1, 0xD1, 0x90, 0xA1, 0xCA,
+0xE0, 0x90, 0x01, 0x31, 0xF0, 0x90, 0xA1, 0xCB, 0xE0, 0x90, 0x01, 0x32, 0xF0, 0x90, 0xA1, 0xCC,
+0xE0, 0x90, 0x01, 0x33, 0xF0, 0x90, 0xA1, 0xC5, 0xE0, 0x90, 0x01, 0x38, 0xF0, 0x90, 0xA1, 0xC8,
+0xE0, 0x90, 0x01, 0x3B, 0xF0, 0x7F, 0x01, 0xD1, 0xEC, 0x02, 0x54, 0xAB, 0x90, 0xA4, 0x0A, 0xEF,
+0xF0, 0x12, 0x60, 0x4D, 0x90, 0xA4, 0x0A, 0xE0, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E,
+0x7D, 0x04, 0x7F, 0x01, 0x12, 0x55, 0x87, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA2,
+0xF6, 0x74, 0x12, 0xF0, 0x90, 0xA3, 0x04, 0x74, 0x05, 0xF0, 0x90, 0xA2, 0xF8, 0xEF, 0xF0, 0xA3,
+0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0xF4, 0xE0, 0x90, 0xA2, 0xFB, 0xF0, 0x90, 0xA2, 0xF5,
+0xE0, 0x90, 0xA2, 0xFC, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xF6, 0xF1, 0xEA, 0x7F, 0x04, 0x81,
+0xE0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89,
+0x90, 0xA2, 0x16, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x17, 0xF0, 0x90, 0x00,
+0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x18, 0xF0, 0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x01, 0xF0, 0x90,
+0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x5E, 0x99, 0xEF, 0xB4, 0x02, 0x04, 0x7F, 0x40, 0x91, 0xE0,
+0x22, 0xE4, 0xFF, 0x21, 0xBD, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x24, 0xF0, 0x22, 0x12, 0x06, 0x89,
+0x54, 0x01, 0xFF, 0x90, 0xA2, 0x57, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x75, 0xF0, 0x10, 0xEF,
+0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA2,
+0x0C, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x0D, 0xF0, 0x22, 0x90, 0xA1, 0xF3,
+0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x5E, 0x9D, 0x90, 0xA2, 0xEB, 0xEF, 0xF0,
+0x22, 0x90, 0xA1, 0xC9, 0xE0, 0x90, 0x01, 0x30, 0xF0, 0x90, 0xA1, 0xC6, 0xE0, 0x90, 0x01, 0x39,
+0xF0, 0x90, 0xA1, 0xC7, 0xE0, 0x90, 0x01, 0x3A, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x90, 0xA0, 0x8B, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14,
+0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60,
+0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0xA0, 0x8C, 0xE0,
+0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01,
+0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0xA0, 0x8C, 0xE0, 0x04, 0xF0, 0xE0,
+0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA0, 0x8C, 0xF0, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0,
+0x05, 0xC0, 0x07, 0x7D, 0x54, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x70, 0xFF, 0xA3, 0xF0, 0xED,
0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82,
0xD0, 0x83, 0xD0, 0xE0, 0x32, 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, 0x90, 0x01, 0xC4, 0x74, 0x15, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x12, 0x47, 0x7C, 0xE5,
-0x14, 0x30, 0xE7, 0x03, 0x12, 0x47, 0xDE, 0x74, 0x15, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70,
+0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x85, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x12, 0x47, 0x7C, 0xE5,
+0x14, 0x30, 0xE7, 0x03, 0x12, 0x47, 0xDE, 0x74, 0x85, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70,
0xA3, 0xF0, 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, 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, 0x90, 0x01, 0xC4, 0x74, 0x6D, 0xF0,
-0x74, 0x70, 0xA3, 0xF0, 0x12, 0x9B, 0x84, 0xE5, 0x19, 0x30, 0xE1, 0x02, 0x51, 0x1C, 0xE5, 0x19,
-0x30, 0xE4, 0x02, 0x51, 0xA2, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x52, 0xE1, 0xE5, 0x19, 0x30,
-0xE6, 0x03, 0x12, 0x9B, 0xE1, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x51, 0xAA, 0xE5, 0x1B, 0x30, 0xE1,
+0xC0, 0x03, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0xDD, 0xF0,
+0x74, 0x70, 0xA3, 0xF0, 0x12, 0x9F, 0x3B, 0xE5, 0x19, 0x30, 0xE1, 0x02, 0x51, 0x8C, 0xE5, 0x19,
+0x30, 0xE4, 0x02, 0x71, 0x12, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x52, 0xE1, 0xE5, 0x19, 0x30,
+0xE6, 0x03, 0x12, 0x9F, 0x98, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x71, 0x1A, 0xE5, 0x1B, 0x30, 0xE1,
0x03, 0x12, 0x5D, 0x8B, 0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, 0x5B, 0x18, 0xE5, 0x1B, 0x30, 0xE3,
-0x03, 0x12, 0x9B, 0xEE, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x9C, 0x17, 0xE5, 0x1B, 0x30, 0xE5,
-0x02, 0x51, 0xC7, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x9C, 0x46, 0xE5, 0x1C, 0x30, 0xE1, 0x02,
-0x51, 0xE5, 0xE5, 0x1C, 0x30, 0xE4, 0x03, 0x12, 0x6F, 0xD8, 0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31,
-0x27, 0x74, 0x6D, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06,
+0x03, 0x12, 0x9F, 0xA5, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x9F, 0xCE, 0xE5, 0x1B, 0x30, 0xE5,
+0x02, 0x71, 0x37, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x9F, 0xFD, 0xE5, 0x1C, 0x30, 0xE1, 0x02,
+0x71, 0x55, 0xE5, 0x1C, 0x30, 0xE4, 0x03, 0x12, 0x6F, 0x81, 0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31,
+0x97, 0x74, 0xDD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 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, 0xE4, 0xF5, 0x63, 0x74, 0x90, 0x25, 0x63, 0xF5, 0x82,
-0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x41, 0x10, 0xE5, 0x63, 0x13, 0x13, 0x13, 0x54,
+0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x41, 0x80, 0xE5, 0x63, 0x13, 0x13, 0x13, 0x54,
0x1F, 0xFF, 0xE5, 0x63, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5,
0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33,
-0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0x10, 0x75, 0xF0, 0x10, 0xE5,
+0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x41, 0x80, 0x75, 0xF0, 0x10, 0xE5,
0x63, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x20, 0xE7, 0x02, 0x80, 0x10, 0x75, 0xF0, 0x10,
0xE5, 0x63, 0x90, 0x81, 0x02, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1,
0xE0, 0x44, 0x20, 0xF0, 0x80, 0x7A, 0xEF, 0x30, 0xE6, 0x21, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90,
0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x05, 0x12,
0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0xE4, 0xFB, 0x80, 0x51, 0x74, 0x96, 0x25, 0x63, 0xF5,
0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74, 0x96, 0x25, 0x63, 0xF5, 0x82, 0xE4,
-0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x13, 0xAF, 0x63, 0xD1, 0x2C, 0x74, 0x96,
+0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x13, 0xAF, 0x63, 0xD1, 0x9C, 0x74, 0x96,
0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x23, 0x75, 0xF0, 0x10,
0xE5, 0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90,
-0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0x7B, 0x01, 0xAF, 0x63, 0xD1, 0xA1,
-0x05, 0x63, 0xE5, 0x63, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0x2A, 0x22, 0xE4, 0xFF, 0x90, 0xA3,
+0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0x7B, 0x01, 0xAF, 0x63, 0xF1, 0x11,
+0x05, 0x63, 0xE5, 0x63, 0xC3, 0x94, 0x80, 0x50, 0x02, 0x21, 0x9A, 0x22, 0xE4, 0xFF, 0x90, 0xA3,
0x05, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5, 0x64, 0xA3, 0xE0, 0xF5, 0x65, 0x65, 0x64, 0x60,
0x70, 0x90, 0xA3, 0x06, 0x74, 0x03, 0xF0, 0x90, 0xA3, 0x14, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x04,
0x54, 0x0F, 0xF5, 0x66, 0xE4, 0xF5, 0x63, 0xE5, 0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5,
0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5,
0x83, 0xE0, 0xFF, 0x74, 0x08, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xEF, 0xF0,
-0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x06, 0x12, 0x6F, 0x6E,
+0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x06, 0x12, 0x6F, 0xEA,
0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x65, 0xB4, 0x0F, 0x03, 0xE4, 0xF5, 0x65, 0x90, 0x04, 0x7F,
0xE5, 0x65, 0xF0, 0x90, 0xA3, 0x05, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, 0x5E, 0x8A, 0x12, 0x6C,
-0xCC, 0x22, 0x12, 0x97, 0x48, 0x7F, 0x02, 0x02, 0x5E, 0x8A, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0,
+0xE0, 0x22, 0x12, 0x9B, 0x03, 0x7F, 0x02, 0x02, 0x5E, 0x8A, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0,
0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x71,
-0x20, 0x12, 0x80, 0x50, 0x02, 0x5F, 0xC9, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x16, 0x90, 0xA1,
-0x1A, 0xE0, 0x60, 0x10, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x03, 0x02, 0xB5,
-0xF5, 0x12, 0x4F, 0x9B, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0x30,
+0x90, 0x12, 0x8A, 0x57, 0x02, 0x5F, 0xC9, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x16, 0x90, 0xA1,
+0x1A, 0xE0, 0x60, 0x10, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x03, 0x02, 0xB9,
+0x9E, 0x12, 0x4F, 0x9B, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0x30,
0xE0, 0x11, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x08, 0x12, 0x58, 0x9C, 0xBF, 0x01, 0x04, 0x80,
-0x03, 0x71, 0x45, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x13, 0x90, 0xA1, 0x18, 0xE0,
-0x54, 0x0F, 0x60, 0x0B, 0x71, 0x81, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, 0x56, 0x56, 0x22,
+0x03, 0x71, 0xB5, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x13, 0x90, 0xA1, 0x18, 0xE0,
+0x54, 0x0F, 0x60, 0x0B, 0x71, 0xF1, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, 0x56, 0x56, 0x22,
0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x10, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04,
-0x80, 0x0C, 0x12, 0x58, 0x9C, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x91, 0x97,
+0x80, 0x0C, 0x12, 0x58, 0x9C, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0xB1, 0x07,
0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xCD, 0xE0, 0x20, 0xE0, 0x2C, 0x90, 0xA1, 0x1A, 0xE0,
-0x64, 0x01, 0x70, 0x24, 0x12, 0x80, 0x16, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x60, 0x10, 0xE4,
-0xFD, 0x7F, 0x0C, 0x12, 0x56, 0x56, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x02, 0xB6, 0x20, 0x90,
-0xA1, 0x1D, 0xE0, 0x70, 0x03, 0x12, 0x56, 0x52, 0x22, 0x71, 0x81, 0xEF, 0x70, 0x02, 0x71, 0x45,
+0x64, 0x01, 0x70, 0x24, 0x12, 0x8A, 0x1D, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x60, 0x10, 0xE4,
+0xFD, 0x7F, 0x0C, 0x12, 0x56, 0x56, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x02, 0xB9, 0xC9, 0x90,
+0xA1, 0x1D, 0xE0, 0x70, 0x03, 0x12, 0x56, 0x52, 0x22, 0x71, 0xF1, 0xEF, 0x70, 0x02, 0x71, 0xB5,
0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54,
0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30,
0xE0, 0x3D, 0x90, 0xA1, 0x15, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x14,
0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x23, 0xEF, 0xC3, 0x13, 0x30,
-0xE0, 0x02, 0x61, 0x20, 0x71, 0xE0, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F,
+0xE0, 0x02, 0x61, 0x90, 0x91, 0x50, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F,
0x0C, 0x80, 0x09, 0x90, 0xA1, 0x15, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x56, 0x56, 0x22,
0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x15,
0xE0, 0x64, 0x02, 0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x56, 0x56, 0x90, 0xA1, 0x15, 0xE0,
-0x64, 0x02, 0x60, 0x02, 0x71, 0x04, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90,
+0x64, 0x02, 0x60, 0x02, 0x71, 0x74, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90,
0xA1, 0x15, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x14, 0xE0, 0x7D, 0x00,
0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x61,
-0x20, 0x12, 0xB5, 0x0D, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80,
+0x90, 0x12, 0xB8, 0xB6, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80,
0x0A, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x56, 0x56, 0x22, 0xD3,
0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF,
0x90, 0xA1, 0x10, 0xF0, 0xBF, 0x01, 0x0C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60,
0x21, 0x80, 0x1D, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64,
-0x01, 0x60, 0x0F, 0x90, 0xA1, 0x11, 0xE0, 0x20, 0xE0, 0x06, 0xE4, 0xFF, 0x91, 0x97, 0x80, 0x02,
-0x71, 0x20, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1,
-0x14, 0xE0, 0x90, 0xA4, 0x08, 0xF0, 0x6F, 0x70, 0x02, 0xA1, 0xA3, 0xEF, 0x14, 0x60, 0x42, 0x14,
-0x60, 0x6C, 0x14, 0x70, 0x02, 0xA1, 0x4B, 0x14, 0x70, 0x02, 0xA1, 0x78, 0x24, 0x04, 0x60, 0x02,
-0xA1, 0xA3, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x04, 0x04, 0xB1, 0xE4, 0xA1, 0xA3, 0x90, 0xA4, 0x08,
-0xE0, 0xB4, 0x02, 0x04, 0xB1, 0xF3, 0xA1, 0xA3, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x04, 0xB1,
-0xF7, 0xA1, 0xA3, 0x90, 0xA4, 0x08, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0xA3, 0xB1, 0xE6, 0xA1,
-0xA3, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x04, 0x04, 0xD1, 0x18, 0xA1, 0xA3, 0x90, 0xA4, 0x08, 0xE0,
-0xB4, 0x02, 0x04, 0xD1, 0x08, 0xA1, 0xA3, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0xFB,
-0xA1, 0xA3, 0x90, 0xA4, 0x08, 0xE0, 0x60, 0x02, 0xA1, 0xA3, 0xB1, 0xCD, 0xA1, 0xA3, 0x90, 0xA4,
-0x08, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0xB4, 0xC3, 0x80, 0x79, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x01,
-0x04, 0xB1, 0xC1, 0x80, 0x6E, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0xB4, 0xEE, 0x80,
-0x62, 0x90, 0xA4, 0x08, 0xE0, 0x70, 0x5C, 0xB1, 0xBF, 0x80, 0x58, 0x90, 0xA4, 0x08, 0xE0, 0xB4,
-0x04, 0x05, 0x12, 0xB4, 0xAE, 0x80, 0x4C, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x01, 0x04, 0xB1, 0xD6,
+0x01, 0x60, 0x0F, 0x90, 0xA1, 0x11, 0xE0, 0x20, 0xE0, 0x06, 0xE4, 0xFF, 0xB1, 0x07, 0x80, 0x02,
+0x71, 0x90, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1,
+0x14, 0xE0, 0x90, 0xA4, 0x08, 0xF0, 0x6F, 0x70, 0x02, 0xC1, 0x13, 0xEF, 0x14, 0x60, 0x42, 0x14,
+0x60, 0x6C, 0x14, 0x70, 0x02, 0xA1, 0xBB, 0x14, 0x70, 0x02, 0xA1, 0xE8, 0x24, 0x04, 0x60, 0x02,
+0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x04, 0x04, 0xD1, 0x54, 0xC1, 0x13, 0x90, 0xA4, 0x08,
+0xE0, 0xB4, 0x02, 0x04, 0xD1, 0x63, 0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x04, 0xD1,
+0x67, 0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x13, 0xD1, 0x56, 0xC1,
+0x13, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x04, 0x04, 0xD1, 0x88, 0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0,
+0xB4, 0x02, 0x04, 0xD1, 0x78, 0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x04, 0xD1, 0x6B,
+0xC1, 0x13, 0x90, 0xA4, 0x08, 0xE0, 0x60, 0x02, 0xC1, 0x13, 0xD1, 0x3D, 0xC1, 0x13, 0x90, 0xA4,
+0x08, 0xE0, 0xB4, 0x04, 0x05, 0x12, 0xB8, 0x6C, 0x80, 0x79, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x01,
+0x04, 0xD1, 0x31, 0x80, 0x6E, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0xB8, 0x97, 0x80,
+0x62, 0x90, 0xA4, 0x08, 0xE0, 0x70, 0x5C, 0xD1, 0x2F, 0x80, 0x58, 0x90, 0xA4, 0x08, 0xE0, 0xB4,
+0x04, 0x05, 0x12, 0xB8, 0x57, 0x80, 0x4C, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0x46,
0x80, 0x41, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x67, 0xDE, 0x80, 0x35, 0x90, 0xA4,
-0x08, 0xE0, 0x70, 0x2F, 0xB1, 0xD4, 0x80, 0x2B, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x05, 0x12,
-0xB4, 0xF8, 0x80, 0x1F, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x01, 0x04, 0xB1, 0xAA, 0x80, 0x14, 0x90,
-0xA4, 0x08, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0xB4, 0xD6, 0x80, 0x08, 0x90, 0xA4, 0x08, 0xE0, 0x70,
-0x02, 0xB1, 0xA8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xB1, 0xCD, 0x7D, 0x1F, 0x7F, 0x6F, 0x12, 0x49,
-0x5E, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0xB1,
-0xCD, 0x7D, 0x20, 0x12, 0x46, 0xF8, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x90, 0xA1, 0x14,
-0x74, 0x01, 0xF0, 0x22, 0xB1, 0xCD, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0xA1, 0x14,
-0x74, 0x03, 0xF0, 0x22, 0xD1, 0x18, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0xA1,
-0x14, 0xF0, 0x22, 0xD1, 0x08, 0x80, 0xEF, 0xB1, 0xFB, 0x80, 0xEB, 0xE4, 0xFD, 0xFF, 0x12, 0x49,
+0x08, 0xE0, 0x70, 0x2F, 0xD1, 0x44, 0x80, 0x2B, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x03, 0x05, 0x12,
+0xB8, 0xA1, 0x80, 0x1F, 0x90, 0xA4, 0x08, 0xE0, 0xB4, 0x01, 0x04, 0xD1, 0x1A, 0x80, 0x14, 0x90,
+0xA4, 0x08, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0xB8, 0x7F, 0x80, 0x08, 0x90, 0xA4, 0x08, 0xE0, 0x70,
+0x02, 0xD1, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x3D, 0x7D, 0x1F, 0x7F, 0x6F, 0x12, 0x49,
+0x5E, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0xD1,
+0x3D, 0x7D, 0x20, 0x12, 0x46, 0xF8, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x90, 0xA1, 0x14,
+0x74, 0x01, 0xF0, 0x22, 0xD1, 0x3D, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0xA1, 0x14,
+0x74, 0x03, 0xF0, 0x22, 0xD1, 0x88, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0xA1,
+0x14, 0xF0, 0x22, 0xD1, 0x78, 0x80, 0xEF, 0xD1, 0x6B, 0x80, 0xEB, 0xE4, 0xFD, 0xFF, 0x12, 0x49,
0x5E, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0x12, 0x60, 0x4D, 0xE4, 0xFD, 0xFF, 0x12, 0x49,
0x5E, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0x05,
0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0x75, 0xF0, 0x10, 0xEF,
@@ -2509,7 +6219,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5,
0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x54, 0x03, 0x4F,
0xFF, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x7D, 0x01,
-0xAF, 0x67, 0x11, 0x59, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
+0xAF, 0x67, 0x11, 0xC9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
0xED, 0x60, 0x62, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3,
0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x03, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75,
0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x05, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A,
@@ -2520,11 +6230,11 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x54, 0xBF, 0x44, 0x80, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xEE,
0xF0, 0xD0, 0xD0, 0x92, 0xAF, 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, 0x90, 0x01, 0xC4, 0x74, 0xE6, 0xF0, 0x74, 0x78, 0xA3, 0xF0, 0x31, 0x38, 0x53,
-0x91, 0xBF, 0x74, 0xE6, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x78, 0xA3, 0xF0, 0xD0, 0x07, 0xD0,
+0x06, 0xC0, 0x07, 0x90, 0x01, 0xC4, 0x74, 0x56, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 0x31, 0xA8, 0x53,
+0x91, 0xBF, 0x74, 0x56, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x79, 0xA3, 0xF0, 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, 0x90, 0xFD, 0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60,
-0xE0, 0x90, 0xA3, 0x24, 0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x61, 0x00, 0x90, 0xA3, 0xE6, 0xE0, 0x70,
+0xE0, 0x90, 0xA3, 0x24, 0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x61, 0x70, 0x90, 0xA3, 0xE6, 0xE0, 0x70,
0x1A, 0x7F, 0x2E, 0x12, 0x46, 0xD6, 0x90, 0xA2, 0x08, 0xEF, 0xF0, 0x7F, 0x2D, 0x12, 0x46, 0xD6,
0x90, 0xA2, 0x09, 0xEF, 0xF0, 0x90, 0xA3, 0xE6, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x24, 0xE0, 0x64,
0x15, 0x70, 0x6E, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x1C, 0xF4, 0x54, 0x3F, 0x04, 0xFE,
@@ -2534,22 +6244,22 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x90, 0xA3, 0x23, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFE, 0xEF, 0x25, 0xE0, 0x25, 0xE0,
0x4E, 0x90, 0xA3, 0x21, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, 0x46, 0xAC, 0x90, 0xA3, 0x23, 0xE0,
0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA2, 0x09, 0xE0, 0x54, 0x0F, 0x4F, 0xFD, 0x7F, 0x2D, 0x12, 0x46,
-0xAC, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x21, 0x0C, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xD1, 0xBB, 0x7F,
-0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x23, 0x09, 0x7F, 0x01, 0x71, 0x01, 0x7F,
-0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x27, 0x09, 0x7F, 0x02, 0x71, 0x01, 0x7F,
+0xAC, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x21, 0x0C, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0xF1, 0x13, 0x7F,
+0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x23, 0x09, 0x7F, 0x01, 0x71, 0x71, 0x7F,
+0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x27, 0x09, 0x7F, 0x02, 0x71, 0x71, 0x7F,
0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x30, 0x0C, 0xE4, 0xFB, 0xFD, 0x7F, 0x01,
-0xF1, 0x14, 0x7F, 0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0x64, 0x34, 0x70, 0x70, 0x90,
+0xF1, 0x6C, 0x7F, 0x04, 0x12, 0x5E, 0x8A, 0x90, 0xA3, 0x24, 0xE0, 0x64, 0x34, 0x70, 0x70, 0x90,
0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x4F, 0x90, 0xA1, 0xF2, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x5F,
0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x0D, 0xE0, 0xFB, 0x90,
-0xA2, 0x0C, 0xE0, 0x90, 0xA3, 0xC7, 0xF0, 0x7D, 0x01, 0x71, 0xA3, 0x90, 0xA3, 0x21, 0x74, 0x01,
+0xA2, 0x0C, 0xE0, 0x90, 0xA3, 0xC7, 0xF0, 0x7D, 0x01, 0x91, 0x13, 0x90, 0xA3, 0x21, 0x74, 0x01,
0xF0, 0xFB, 0x7A, 0xA3, 0x79, 0x21, 0xFD, 0x7F, 0x34, 0x12, 0x5E, 0x9D, 0x90, 0xA2, 0x13, 0xE0,
0x44, 0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xE7, 0xE0,
-0x54, 0xFE, 0xF0, 0x80, 0x1A, 0x71, 0x8A, 0x90, 0xA2, 0x13, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3,
+0x54, 0xFE, 0xF0, 0x80, 0x1A, 0x71, 0xFA, 0x90, 0xA2, 0x13, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3,
0xF0, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x90,
0xA3, 0x24, 0xE0, 0xFD, 0xB4, 0x35, 0x07, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4,
0x36, 0x23, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA3, 0x21, 0xF0, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA3,
0x22, 0xF0, 0x90, 0xA3, 0x24, 0xE0, 0xFF, 0x90, 0xA3, 0x21, 0xE0, 0xFD, 0x7B, 0x01, 0x7A, 0xA3,
-0x79, 0x22, 0x12, 0x5E, 0x9D, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x37, 0x02, 0xD1, 0x0F, 0x90, 0xA3,
+0x79, 0x22, 0x12, 0x5E, 0x9D, 0x90, 0xA3, 0x24, 0xE0, 0xB4, 0x37, 0x02, 0xD1, 0x80, 0x90, 0xA3,
0x24, 0xE0, 0xB4, 0x40, 0x14, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0xF0, 0x74,
0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xF0, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x01, 0xF0,
0x22, 0x90, 0xA3, 0x6D, 0x74, 0x09, 0xF0, 0x90, 0xA3, 0x7B, 0x74, 0x07, 0xF0, 0x90, 0xA3, 0x6F,
@@ -2560,10 +6270,10 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0xE0, 0x90, 0xA3, 0x71, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x72, 0xF0, 0x90, 0xFD, 0x65,
0xE0, 0x90, 0xA3, 0x73, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x74, 0xF0, 0x90, 0xFD, 0x67,
0xE0, 0x90, 0xA3, 0x75, 0xF0, 0x90, 0xA3, 0x70, 0xE0, 0x54, 0x01, 0x90, 0xA1, 0xE6, 0xF0, 0xA3,
-0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x6D, 0x02, 0x6F, 0x6E, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13,
+0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x6D, 0x02, 0x6F, 0xEA, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13,
0x13, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x0D, 0xE0, 0xFB, 0x90, 0xA2, 0x0C, 0xE0, 0x90, 0xA3, 0xC7,
0xF0, 0xE4, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xC4, 0xEF, 0xF0, 0x90,
-0xA3, 0xC6, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0x81, 0xBA, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0,
+0xA3, 0xC6, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0xA1, 0x2A, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0,
0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90, 0xA3, 0xC6, 0xE0, 0x70, 0x6D, 0x7F, 0x67, 0x12,
0x46, 0xD6, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90, 0xA3, 0xC4, 0xE0, 0x70,
0x4F, 0x90, 0xA3, 0xC7, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x20, 0x12, 0x37, 0x4E, 0xE4, 0xFF,
@@ -2571,7 +6281,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x45, 0x7F, 0x64, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0x80, 0x1F, 0x12, 0x37, 0x4E, 0xE4, 0xFE,
0x74, 0x80, 0xFF, 0xE4, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12,
0x38, 0x45, 0x7F, 0x64, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x12, 0x46, 0xAC,
-0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x80, 0xA1, 0x2C, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF,
+0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x80, 0xA1, 0x9C, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF,
0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12, 0x46, 0xAC, 0x90, 0xA3, 0xC4, 0xE0, 0x70, 0x18, 0x7F, 0x48,
0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F,
0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0x7F, 0xFD, 0x7F,
@@ -2579,7 +6289,7 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x46, 0xAC, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x66, 0xFF, 0xEC, 0x90, 0xAA,
0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12,
0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08,
-0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xA1, 0x40, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7,
+0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xA1, 0xB0, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7,
0xF0, 0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x90, 0xA3, 0xC4, 0xE0, 0x70, 0x56, 0x90, 0xA3,
0xC6, 0xE0, 0x60, 0x19, 0x7F, 0x67, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x12,
0x46, 0xAC, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x80, 0x28, 0x7F, 0x67, 0x12,
@@ -2588,255 +6298,71 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E,
0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12,
0x46, 0xAC, 0x7F, 0x4F, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x4F, 0x12, 0x46, 0xAC,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0xD5, 0x7F, 0x08, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xEF, 0xFD,
-0x7F, 0x08, 0x12, 0x46, 0xAC, 0xE4, 0xFF, 0xD1, 0x3A, 0x71, 0x8A, 0x90, 0xA1, 0x16, 0xE0, 0xFF,
-0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0xD1, 0xA2, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0xB1, 0x79, 0xB1, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x13,
-0x54, 0x01, 0xFF, 0x90, 0xA2, 0x0D, 0xE0, 0xFB, 0x90, 0xA2, 0x0C, 0xE0, 0x90, 0xA3, 0xC7, 0xF0,
-0x7D, 0x01, 0x71, 0xA3, 0x90, 0xA1, 0x24, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0xAC, 0x90, 0xA1,
-0x1B, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06,
-0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x10, 0xFD, 0x7F,
-0x08, 0x12, 0x46, 0xAC, 0x7F, 0x01, 0xD1, 0x3A, 0x7F, 0x90, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x01,
-0xFD, 0x7F, 0x90, 0x12, 0x46, 0xAC, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0xA1, 0x1D,
-0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0xD1, 0xF4, 0xBF, 0x01, 0x02, 0xB1, 0x69, 0x22, 0x90,
-0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x0E, 0xC3, 0x13,
-0x30, 0xE0, 0x07, 0xD1, 0x95, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xB1, 0xDD, 0x22, 0x90,
-0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x1E, 0x90, 0xFD, 0x62, 0xE0, 0x30,
-0xE0, 0x17, 0xE0, 0x90, 0xA3, 0x25, 0x30, 0xE1, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02,
-0xF0, 0x90, 0xA3, 0x25, 0xE0, 0xFF, 0x12, 0x85, 0xC3, 0x22, 0x90, 0xA3, 0xF3, 0xEF, 0xF0, 0xE4,
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90,
-0xA3, 0xF3, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0xA3, 0xF5, 0xE0, 0x94, 0x88, 0x90, 0xA3, 0xF4,
-0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA3, 0xF4,
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90,
-0xA3, 0xF5, 0xE0, 0x94, 0x32, 0x90, 0xA3, 0xF4, 0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6,
-0xE0, 0x30, 0xE0, 0xB0, 0x22, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F,
-0x00, 0x22, 0x90, 0xA1, 0xC9, 0xE0, 0x90, 0x01, 0x30, 0xF0, 0x90, 0xA1, 0xC6, 0xE0, 0x90, 0x01,
-0x39, 0xF0, 0x90, 0xA1, 0xC7, 0xE0, 0x90, 0x01, 0x3A, 0xF0, 0x22, 0x90, 0xA3, 0x25, 0x74, 0x08,
-0xF0, 0x90, 0xA3, 0x33, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x27, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA3,
-0x79, 0x25, 0x02, 0x6F, 0x6E, 0x90, 0x01, 0xC4, 0x74, 0xD5, 0xF0, 0x74, 0x7E, 0xA3, 0xF0, 0x7F,
-0x90, 0x12, 0x46, 0xD6, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0xD5, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74,
-0x7E, 0xA3, 0xF0, 0x22, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11,
-0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, 0xA2, 0x13, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01,
-0x22, 0x7F, 0x00, 0x22, 0x90, 0xA3, 0x7C, 0x74, 0x0B, 0xF0, 0x90, 0xA3, 0x8A, 0x74, 0x07, 0xF0,
-0x90, 0xA3, 0x7E, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA3, 0x7F, 0xF0, 0x90,
-0xFD, 0x61, 0xE0, 0x90, 0xA3, 0x80, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x81, 0xF0, 0x90,
-0xFD, 0x65, 0xE0, 0x90, 0xA3, 0x82, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x83, 0xF0, 0x90,
-0xFD, 0x67, 0xE0, 0x90, 0xA3, 0x84, 0xF0, 0x80, 0x11, 0x90, 0xA3, 0x7F, 0xED, 0xF0, 0xA3, 0xEB,
-0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x7C,
-0x02, 0x6F, 0x6E, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05,
-0xC0, 0x07, 0x7D, 0x73, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x7F, 0xFF, 0xA3, 0xF0, 0xED, 0x04,
-0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0,
-0x83, 0xD0, 0xE0, 0x32, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0,
-0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82,
-0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x90, 0xA2, 0xEB, 0x74, 0x0A, 0xF0, 0x90, 0xA2,
-0xF9, 0x74, 0x06, 0xF0, 0x12, 0x06, 0x89, 0x90, 0xA2, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06,
-0xA2, 0x90, 0xA2, 0xEE, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEF, 0xF0, 0x90,
-0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xF0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90,
-0xA2, 0xF1, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xF2, 0xF0, 0x7B, 0x01, 0x7A,
-0xA2, 0x79, 0xEB, 0x02, 0x6F, 0x6E, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F,
-0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F,
-0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0xA1, 0xBE, 0xE0, 0x13, 0x13,
-0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22,
-0xE4, 0xF5, 0x63, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02, 0x21, 0x17, 0x90, 0xA0, 0x90, 0xE0, 0x64,
-0x01, 0x60, 0x02, 0x21, 0x17, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x1D, 0x90, 0x05, 0x62, 0xE0,
-0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9,
-0xFF, 0x90, 0xA1, 0x4F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, 0x54,
-0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0xA1, 0x21, 0xE0, 0x14, 0xF0,
-0xE0, 0xFF, 0x60, 0x06, 0x90, 0xA1, 0x23, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0xA1, 0x20,
-0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x12, 0x90,
-0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x12, 0x58, 0x9C, 0xEF, 0x70, 0x02, 0xF5,
-0x63, 0xE5, 0x63, 0x60, 0x42, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, 0x23, 0xE0,
-0x60, 0x03, 0xB4, 0x01, 0x0B, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x80, 0x0F,
-0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF,
-0x90, 0xA1, 0x22, 0xE0, 0x2F, 0x90, 0xA3, 0xAF, 0x12, 0x48, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0x20,
-0xE2, 0x03, 0x12, 0x56, 0x52, 0x11, 0x16, 0x22, 0x90, 0xA2, 0x25, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-0xAD, 0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, 0xFB,
-0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0xD3,
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x19, 0xE0, 0x30, 0xE0, 0x20, 0x90, 0xA2, 0x1E,
-0xE0, 0xB4, 0x01, 0x0C, 0xA3, 0xE0, 0xB4, 0x01, 0x14, 0x74, 0x02, 0xF0, 0x31, 0x18, 0x80, 0x0D,
-0x90, 0xA2, 0x1E, 0xE0, 0xB4, 0x02, 0x06, 0x74, 0x03, 0xF0, 0x12, 0x67, 0x36, 0xD0, 0xD0, 0x92,
-0xAF, 0x22, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0x61, 0xE3,
-0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x01, 0x70, 0x38, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90,
-0x04, 0xE3, 0xE0, 0x60, 0x20, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xE2, 0xE0, 0x04,
-0xF0, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0xB5, 0x07,
-0x02, 0x80, 0x02, 0x61, 0xC8, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x90, 0xA1, 0xE0, 0x04, 0xF0, 0x22,
-0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x04, 0x70, 0x35, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90,
-0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xE2, 0xE0, 0x04,
-0xF0, 0x90, 0xA1, 0xD8, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0x61,
-0xC8, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x90, 0xA1, 0xE0, 0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xD5,
-0xE0, 0x64, 0x06, 0x60, 0x02, 0x61, 0x29, 0x90, 0xA1, 0xE3, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0,
-0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA1, 0xD9, 0xE0,
-0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08,
-0x90, 0xA1, 0xE3, 0xE0, 0x94, 0x03, 0x40, 0x11, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x90,
-0xA1, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0xCB, 0x61, 0x71, 0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0x13, 0x13,
-0x54, 0x3F, 0x30, 0xE0, 0x7A, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xD0, 0xE0,
-0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xF2, 0xE0, 0x30, 0xE0, 0x02, 0x61, 0x57, 0x90,
-0xA1, 0xE0, 0x61, 0x71, 0x90, 0xA1, 0xE3, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x2F, 0xFF, 0xE4,
-0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA1, 0xD9, 0xE0, 0x2F, 0xFF, 0xEC,
-0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0E, 0x90, 0xA1, 0xF2,
-0xE0, 0x30, 0xE0, 0x02, 0x61, 0x57, 0x90, 0xA1, 0xE0, 0x61, 0x71, 0x90, 0xA1, 0xF2, 0xE0, 0x30,
-0xE0, 0x16, 0x90, 0xA1, 0xD5, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90,
-0xA1, 0xE2, 0xF0, 0x90, 0xA3, 0xE5, 0x61, 0x7D, 0x90, 0xA1, 0xE0, 0x74, 0x02, 0xF0, 0x22, 0x12,
-0x49, 0x69, 0x90, 0xA1, 0xE3, 0xE0, 0x04, 0xF0, 0x7F, 0x03, 0x12, 0x62, 0xF1, 0x90, 0xA1, 0xE3,
-0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12,
-0x07, 0x03, 0x90, 0xA1, 0xD9, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE,
-0x64, 0x80, 0x94, 0x80, 0x50, 0x0A, 0x90, 0xA1, 0xE3, 0xE0, 0x94, 0x03, 0x50, 0x02, 0x61, 0xE3,
-0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12,
-0x49, 0x5E, 0x90, 0x04, 0x9C, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x07, 0x70,
-0x4F, 0x90, 0xA1, 0xE3, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0xA1, 0xE0, 0x80, 0x34, 0x90, 0xA1, 0xD4,
-0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x2C, 0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0,
-0x90, 0xA1, 0xF2, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA1, 0xD5, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92,
-0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xE2, 0xF0, 0x90, 0xA3, 0xE5, 0x04, 0x80, 0x0F, 0x90, 0xA1,
-0xE0, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x49, 0x69, 0x90, 0xA1, 0xE3, 0xE0, 0x04, 0xF0, 0x80, 0x48,
-0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x09, 0x70, 0x5B, 0x90, 0xA1, 0xD4, 0xE0, 0x30, 0xE0, 0x0E, 0x90,
-0xA1, 0xE0, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xD4, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x06, 0x92,
-0xE0, 0x30, 0xE2, 0x29, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xE2, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x02,
-0x17, 0x90, 0xA3, 0xE5, 0xE0, 0x90, 0xA1, 0xE0, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74,
-0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x22, 0x7F, 0x03, 0x02, 0x62, 0xF1, 0x90, 0xA3, 0xE5,
-0xE0, 0x90, 0xA1, 0xE0, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90,
-0xA1, 0xD5, 0xF0, 0x22, 0x90, 0xA3, 0x15, 0xEF, 0xF0, 0x7F, 0x03, 0x12, 0x62, 0xF1, 0x90, 0xA1,
-0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xE0, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03,
-0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x09, 0xEF,
-0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3C, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x30,
-0xE0, 0x0A, 0x90, 0xA1, 0xCE, 0xE0, 0xFF, 0x90, 0xA1, 0xDE, 0x80, 0x21, 0x90, 0xA3, 0x15, 0xE0,
-0xFC, 0xB4, 0x01, 0x0D, 0x90, 0xA1, 0xCE, 0xE0, 0xFE, 0x90, 0xA1, 0xDD, 0xE0, 0xC3, 0x9E, 0x80,
-0x0F, 0xEC, 0xB4, 0x04, 0x0F, 0x90, 0xA1, 0xCF, 0xE0, 0xFF, 0x90, 0xA1, 0xDD, 0xE0, 0xC3, 0x9F,
-0x90, 0xA1, 0xE4, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2C, 0x90,
-0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x02, 0xA1, 0x02, 0x90, 0xA1, 0xE4, 0xE0,
-0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05,
-0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x12, 0x4C, 0x71, 0x80, 0x77, 0x90, 0xA1, 0xCD, 0xE0, 0xC4,
-0x54, 0x0F, 0x30, 0xE0, 0x54, 0x90, 0xA1, 0xD3, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04,
-0x12, 0x56, 0x56, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0x90,
-0xA1, 0xD4, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0xE3, 0xF0, 0x90, 0xA1,
-0xE0, 0xF0, 0x90, 0xA3, 0x15, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0xD5, 0x74, 0x06, 0xF0,
-0x80, 0x0A, 0xEF, 0xB4, 0x04, 0x06, 0x90, 0xA1, 0xD5, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0xBF, 0xE0,
-0x60, 0x07, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3, 0x15, 0xE0, 0xB4, 0x01, 0x04,
-0x7D, 0x06, 0x80, 0x09, 0x90, 0xA3, 0x15, 0xE0, 0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12,
-0x49, 0x5E, 0x90, 0xA1, 0xD1, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x1B, 0x90, 0xA1,
-0xE4, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, 0x7F, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE,
-0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0x12, 0x4B, 0xBB, 0x90, 0xA1, 0xD0, 0xE0, 0x30, 0xE0, 0x06,
-0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x22, 0x7E, 0x00, 0x7F, 0x30, 0x7D, 0x00, 0x7B, 0x01, 0x7A,
-0xA1, 0x79, 0xCD, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0xCE, 0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0,
-0x90, 0x9F, 0x9C, 0xE0, 0xFC, 0x64, 0x02, 0x70, 0x1D, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30,
-0xE2, 0x02, 0x7E, 0x01, 0xEE, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFE, 0x90, 0xA1, 0xD0,
-0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0x22, 0xEC, 0x64, 0x01, 0x70, 0x0D, 0x90, 0xFD, 0x70, 0xE0, 0x7F,
-0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x13, 0x90, 0x9F, 0x9C, 0xE0, 0x64, 0x03, 0x70, 0x1C,
-0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0xEF, 0x54, 0x01, 0xC4, 0x33,
-0x33, 0x54, 0xC0, 0xFF, 0x90, 0xA1, 0xD0, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0x22, 0x7E, 0x00, 0x7F,
-0x0A, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xF3, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0xE1, 0x74,
-0x02, 0xF0, 0x22, 0x90, 0xA3, 0x26, 0xEF, 0xF0, 0x90, 0xA2, 0x0D, 0xE0, 0x70, 0x7D, 0x7F, 0x48,
-0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEE, 0x54, 0x0F, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12,
-0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x8D, 0xC3,
-0x12, 0x45, 0x60, 0x70, 0x05, 0x90, 0xA1, 0xEE, 0x80, 0x31, 0xE4, 0xFF, 0xFE, 0xFD, 0xFC, 0x90,
-0xA3, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x0A, 0x90, 0xA1, 0xEE, 0x04, 0xF0,
-0xE4, 0xA3, 0xF0, 0xC1, 0xA7, 0xE4, 0xFF, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, 0x45,
-0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x09, 0x90, 0xA1, 0xEE, 0x04, 0xF0, 0xA3, 0xF0, 0x80, 0x77,
-0xE4, 0x7F, 0x80, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60,
-0x70, 0x65, 0x90, 0xA1, 0xEE, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x5C, 0x7F, 0x2C, 0x7E, 0x09, 0x12,
-0x37, 0x4E, 0xEF, 0x54, 0x02, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x6D,
-0x90, 0xA3, 0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x08, 0x90, 0xA1, 0xEE, 0x74,
-0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xEE, 0xF0, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E,
-0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x6D, 0x90, 0xA3,
-0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xEF, 0xF0, 0x80,
-0x06, 0x90, 0xA1, 0xEF, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xE8, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x11,
-0x12, 0x46, 0xF8, 0x90, 0x07, 0x78, 0xE0, 0x90, 0xA1, 0xED, 0xF0, 0x90, 0xA2, 0x0C, 0xE0, 0xFF,
-0xE4, 0xFD, 0x12, 0x63, 0x7F, 0x90, 0xA3, 0x26, 0xE0, 0xFD, 0x70, 0x02, 0x80, 0x24, 0xED, 0xB4,
-0x01, 0x0A, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22, 0x90, 0xA3, 0x26, 0xE0,
-0xFD, 0xB4, 0x02, 0x0A, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4,
-0x03, 0x07, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0x1F, 0xF0, 0x22, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0xFE,
-0xF0, 0x54, 0xE1, 0xF0, 0x90, 0xA1, 0xED, 0xE0, 0x90, 0x07, 0x78, 0xF0, 0x90, 0xA1, 0xEE, 0x12,
-0x63, 0x7A, 0x12, 0x60, 0x4D, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5E, 0x12, 0x67, 0xC8, 0x90, 0xA1,
-0xE8, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, 0xEF, 0xC3, 0x13, 0x54, 0x0F, 0xC3, 0x9E, 0x40,
-0x02, 0x80, 0xC7, 0x90, 0xA1, 0xE8, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xE1,
-0xFF, 0xEE, 0x04, 0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0xEF, 0x70, 0x1C, 0x90, 0xA2, 0x1A,
-0xE0, 0x54, 0x03, 0xFE, 0x70, 0x02, 0x80, 0x1B, 0xBE, 0x01, 0x02, 0x80, 0x20, 0xBE, 0x02, 0x02,
-0x80, 0x26, 0xEE, 0x64, 0x03, 0x70, 0x32, 0x80, 0x2A, 0x90, 0xA2, 0x1A, 0xE0, 0xC4, 0x54, 0x03,
-0xFE, 0x70, 0x07, 0x90, 0x07, 0x78, 0x04, 0xF0, 0x80, 0x1F, 0xBE, 0x01, 0x08, 0x90, 0x07, 0x78,
-0x74, 0x03, 0xF0, 0x80, 0x14, 0xBE, 0x02, 0x08, 0x90, 0x07, 0x78, 0x74, 0x09, 0xF0, 0x80, 0x09,
-0xBE, 0x03, 0x06, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x90, 0xA2, 0x19, 0xE0, 0xFE, 0xC4, 0x13,
-0x54, 0x07, 0x30, 0xE0, 0x45, 0xEF, 0x70, 0x1F, 0xA3, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0,
-0x07, 0xE4, 0x90, 0xA3, 0x15, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x15, 0x74, 0x01, 0xF0, 0x90, 0xA3,
-0x15, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x20, 0x90, 0xA2, 0x1A, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03,
-0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0x15, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x15, 0x74, 0x01, 0xF0,
-0x90, 0xA3, 0x15, 0xE0, 0xFD, 0x7F, 0x01, 0x12, 0x63, 0x7F, 0x22, 0x90, 0xA4, 0x06, 0xEF, 0xF0,
-0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x90, 0xA4, 0x06, 0xE0, 0xFE, 0xEF,
-0x4E, 0x90, 0x9F, 0x98, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25,
-0x51, 0x90, 0x9F, 0x9D, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9E,
-0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9F, 0xF0, 0x90, 0x00, 0x03,
-0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x25,
-0x51, 0x90, 0x9F, 0xA1, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA2,
-0xF0, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xF5,
-0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2,
-0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x33,
-0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x74, 0x90, 0x25, 0x54,
-0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x90, 0x25, 0x54, 0xF5, 0x82, 0xE4,
-0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xAF, 0x54, 0x70, 0x04, 0x11, 0xE3, 0x80, 0x02, 0x11, 0xD2, 0x05,
-0x54, 0x80, 0xC6, 0x31, 0x08, 0xE5, 0x55, 0x70, 0x18, 0x90, 0xA0, 0x90, 0xE0, 0x70, 0x12, 0x12,
-0x60, 0x4D, 0x11, 0xF4, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F,
-0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54,
-0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0,
-0x44, 0x04, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x49,
-0x5E, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x55, 0x87, 0xE4, 0xFF, 0x74, 0x32, 0x2F, 0xF5, 0x82, 0xE4,
-0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x19, 0xEF, 0xE4, 0x90, 0xA1, 0x2D, 0xF0,
-0x90, 0xA1, 0x31, 0xF0, 0x90, 0xA1, 0x2B, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0x05, 0xF0, 0xFD, 0xA3,
-0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3,
-0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x4D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0xA1, 0x4D, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E,
-0x40, 0x28, 0xEB, 0x9F, 0xFF, 0x90, 0xA1, 0x2F, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFD,
-0xC3, 0x94, 0x19, 0x50, 0x13, 0x74, 0x32, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0,
-0x04, 0xF0, 0x90, 0xA1, 0x2D, 0xE0, 0x04, 0xF0, 0x31, 0xFB, 0x90, 0xA1, 0x2D, 0xE0, 0xC3, 0x94,
-0x64, 0x40, 0x67, 0xE4, 0x90, 0xA3, 0x06, 0xF0, 0x90, 0xA3, 0x05, 0xF0, 0x90, 0xA3, 0x05, 0xE0,
-0xFF, 0xC3, 0x94, 0x19, 0x50, 0x47, 0x74, 0x32, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83,
-0xE0, 0xFF, 0x90, 0xA3, 0x06, 0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x27, 0x90, 0xA3,
-0x05, 0xE0, 0xFF, 0x94, 0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0xA1, 0x2C, 0xF0, 0xE4, 0x80,
-0x0E, 0xE4, 0x90, 0xA1, 0x2C, 0xF0, 0x90, 0xA3, 0x05, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90,
-0xA1, 0x2B, 0xF0, 0x80, 0x08, 0x90, 0xA3, 0x05, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0xA1, 0x2C,
-0xE0, 0xFD, 0x7B, 0x08, 0xE4, 0xFF, 0x51, 0x2D, 0x31, 0x08, 0x22, 0x90, 0xA1, 0xB9, 0xE0, 0xFF,
-0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x24, 0x90, 0xA1, 0x31, 0xE0, 0x04, 0xF0, 0xE0, 0xFF,
-0x94, 0x04, 0x50, 0x18, 0x90, 0xA1, 0x2B, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0xA1, 0x30,
-0xF0, 0xFB, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x51, 0x2D, 0x22, 0xAC, 0x07, 0x90,
-0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0xA1, 0x2C, 0xE0, 0xD3, 0x94, 0x03, 0x50, 0x07, 0x90,
-0xA1, 0x22, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, 0x90, 0xA1, 0x22, 0xF0, 0x7D, 0x03,
-0x90, 0xA1, 0x51, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C, 0xFF, 0x90, 0xA1, 0x2F, 0xF0, 0x90, 0xA1,
-0x25, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0xA1, 0x25, 0xE4, 0xF0, 0xA3, 0x74, 0x02,
-0xF0, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22,
-0x51, 0xBC, 0x90, 0xA3, 0x15, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4,
-0xFD, 0xFF, 0x12, 0x55, 0x87, 0x90, 0xA3, 0x15, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0,
-0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0xA1, 0x2B,
-0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA1, 0x30, 0xE0, 0xFB, 0x41, 0x2D, 0xE4, 0x90, 0xA3, 0x16,
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x46, 0xD6, 0x90, 0xA3, 0x16, 0xEF, 0xF0, 0x7F,
-0x83, 0x12, 0x46, 0xD6, 0xAE, 0x07, 0x90, 0xA3, 0x16, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3,
-0x90, 0xA3, 0x18, 0xE0, 0x94, 0x64, 0x90, 0xA3, 0x17, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01,
-0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA3, 0x16, 0xE0, 0xFF, 0x22, 0x90, 0xA3, 0x17, 0xE4, 0x75,
-0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x90, 0x04, 0x24, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89,
-0x25, 0x51, 0x90, 0xA2, 0x3B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0xA2,
-0x48, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0xA2, 0x55, 0xF0, 0x22, 0x8B,
-0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x1B, 0x90,
-0xA2, 0x2C, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x5F, 0xEF, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12,
-0x06, 0x89, 0x54, 0x0F, 0xFF, 0x12, 0x4D, 0x1B, 0xA1, 0x61, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53,
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0,
-0x0D, 0x90, 0xA2, 0x2F, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54,
-0x03, 0xFF, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0x4F,
-0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0x75, 0xF0,
-0x0D, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE3, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12,
-0x06, 0xA2, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0,
-0x54, 0x1F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F,
-0xFD, 0xE4, 0xFB, 0x91, 0x57, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x05, 0x12, 0x06,
-0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x7B, 0x01, 0x91, 0x57, 0xAB, 0x51, 0xAA, 0x52,
-0xA9, 0x53, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x12, 0x06,
-0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x38, 0x12, 0x45, 0xA9, 0xEF, 0xF0,
-0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0xED, 0x90,
-0xA2, 0x39, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70, 0x26,
-0x90, 0xA2, 0x2D, 0xEF, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xC4, 0x54, 0xF0,
-0xFF, 0x90, 0xA2, 0x2C, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, 0x01, 0xF0, 0x7D,
-0x20, 0xE4, 0xFF, 0x12, 0x7F, 0xB3, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, 0x03, 0x74, 0x1F, 0xC3,
-0x95, 0x54, 0x40, 0x14, 0x90, 0xA2, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0xE4, 0xFD, 0x91, 0xEA, 0x90,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x2D, 0x7F, 0x08, 0x12, 0x46, 0xD6, 0xEF, 0x54, 0xEF, 0xFD,
+0x7F, 0x08, 0x12, 0x46, 0xAC, 0xE4, 0xFF, 0xD1, 0xAB, 0x71, 0xFA, 0x90, 0xA1, 0x16, 0xE0, 0xFF,
+0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0x6F, 0xD1, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0xB1, 0xEA, 0xB1, 0xB5, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13,
+0x13, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x0D, 0xE0, 0xFB, 0x90, 0xA2, 0x0C, 0xE0, 0x90, 0xA3, 0xC7,
+0xF0, 0x7D, 0x01, 0x91, 0x13, 0x90, 0xA1, 0x24, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0xAC, 0x90,
+0xA1, 0x1B, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80,
+0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x46, 0xD6, 0xEF, 0x44, 0x10, 0xFD,
+0x7F, 0x08, 0x12, 0x46, 0xAC, 0x7F, 0x01, 0xD1, 0xAB, 0x7F, 0x90, 0x12, 0x46, 0xD6, 0xEF, 0x44,
+0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0xAC, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0xA1,
+0x1D, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0xF1, 0x4C, 0xBF, 0x01, 0x02, 0xB1, 0xDA, 0x22,
+0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x0E, 0xC3,
+0x13, 0x30, 0xE0, 0x07, 0xF1, 0x06, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xD1, 0x4E, 0x22,
+0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x1E, 0x90, 0xFD, 0x62, 0xE0,
+0x30, 0xE0, 0x17, 0xE0, 0x90, 0xA3, 0x25, 0x30, 0xE1, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74,
+0x02, 0xF0, 0x90, 0xA3, 0x25, 0xE0, 0xFF, 0x12, 0x8F, 0xB4, 0x22, 0x90, 0xA3, 0xF3, 0xEF, 0xF0,
+0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01,
+0x90, 0xA3, 0xF3, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0xA3, 0xF5, 0xE0, 0x94, 0x88, 0x90, 0xA3,
+0xF4, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA3,
+0xF4, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3,
+0x90, 0xA3, 0xF5, 0xE0, 0x94, 0x32, 0x90, 0xA3, 0xF4, 0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, 0x01,
+0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02,
+0x7F, 0x00, 0x22, 0x90, 0xA3, 0x25, 0x74, 0x08, 0xF0, 0x90, 0xA3, 0x33, 0x74, 0x01, 0xF0, 0x90,
+0xA3, 0x27, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x25, 0x02, 0x6F, 0xEA, 0x90, 0x01, 0xC4,
+0x74, 0x2D, 0xF0, 0x74, 0x7F, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x46, 0xD6, 0xEF, 0x20, 0xE0, 0xF7,
+0x74, 0x2D, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x7F, 0xA3, 0xF0, 0x22, 0x90, 0x02, 0x87, 0xE0,
+0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90,
+0xA2, 0x13, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0xA3, 0x7C, 0x74,
+0x0B, 0xF0, 0x90, 0xA3, 0x8A, 0x74, 0x07, 0xF0, 0x90, 0xA3, 0x7E, 0xEF, 0xF0, 0x60, 0x32, 0x90,
+0xFD, 0x63, 0xE0, 0x90, 0xA3, 0x7F, 0xF0, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA3, 0x80, 0xF0, 0x90,
+0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x81, 0xF0, 0x90, 0xFD, 0x65, 0xE0, 0x90, 0xA3, 0x82, 0xF0, 0x90,
+0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x83, 0xF0, 0x90, 0xFD, 0x67, 0xE0, 0x90, 0xA3, 0x84, 0xF0, 0x80,
+0x11, 0x90, 0xA3, 0x7F, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
+0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x7C, 0x02, 0x6F, 0xEA, 0xC0, 0xE0, 0xC0, 0x83, 0xC0,
+0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xCB, 0x90, 0x01, 0xC4, 0xED,
+0xF0, 0x74, 0x7F, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0,
+0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xEF, 0x14, 0x90, 0x05,
+0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6,
+0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22,
+0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x1B,
+0x90, 0xA2, 0x2C, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x5F, 0xEF, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53,
+0x12, 0x06, 0x89, 0x54, 0x0F, 0xFF, 0x12, 0x4D, 0x1B, 0xA1, 0xF8, 0xAB, 0x51, 0xAA, 0x52, 0xA9,
+0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75,
+0xF0, 0x0D, 0x90, 0xA2, 0x2F, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2,
+0x54, 0x03, 0xFF, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC,
+0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0x75,
+0xF0, 0x0D, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE3, 0x4F, 0xF0, 0x90, 0x00, 0x02,
+0x12, 0x06, 0xA2, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9,
+0xE0, 0x54, 0x1F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54,
+0x0F, 0xFD, 0xE4, 0xFB, 0x31, 0x47, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x05, 0x12,
+0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x7B, 0x01, 0x31, 0x47, 0xAB, 0x51, 0xAA,
+0x52, 0xA9, 0x53, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x12,
+0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x38, 0x12, 0x45, 0xA9, 0xEF,
+0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0xED,
+0x90, 0xA2, 0x39, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70,
+0x25, 0x90, 0xA2, 0x2D, 0xEF, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xC4, 0x54,
+0xF0, 0xFF, 0x90, 0xA2, 0x2C, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, 0x01, 0xF0,
+0x7D, 0x20, 0xE4, 0xFF, 0x11, 0x0B, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, 0x03, 0x74, 0x1F, 0xC3,
+0x95, 0x54, 0x40, 0x14, 0x90, 0xA2, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0xE4, 0xFD, 0x31, 0xDA, 0x90,
0xA2, 0xEB, 0xEF, 0xF0, 0x24, 0xD4, 0x80, 0x55, 0x74, 0x3F, 0xC3, 0x95, 0x54, 0x40, 0x16, 0x90,
-0xA2, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x20, 0xAF, 0x54, 0x91, 0xEA, 0x90, 0xA2, 0xEB, 0xEF,
+0xA2, 0xEF, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x20, 0xAF, 0x54, 0x31, 0xDA, 0x90, 0xA2, 0xEB, 0xEF,
0xF0, 0x24, 0x88, 0x80, 0x38, 0x74, 0x5F, 0xC3, 0x95, 0x54, 0x40, 0x16, 0x90, 0xA2, 0xEF, 0xEE,
-0xF0, 0xAB, 0x55, 0x7D, 0x40, 0xAF, 0x54, 0x91, 0xEA, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0x24, 0xD0,
+0xF0, 0xAB, 0x55, 0x7D, 0x40, 0xAF, 0x54, 0x31, 0xDA, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0x24, 0xD0,
0x80, 0x1B, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x30, 0x90, 0xA2, 0xEF, 0xEE, 0xF0, 0xAB, 0x55,
-0x7D, 0x60, 0xAF, 0x54, 0x91, 0xEA, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0x24, 0x84, 0xFD, 0xE4, 0x34,
+0x7D, 0x60, 0xAF, 0x54, 0x31, 0xDA, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0x24, 0x84, 0xFD, 0xE4, 0x34,
0x04, 0xFC, 0x75, 0xF0, 0x0D, 0xE5, 0x55, 0x90, 0xA2, 0x31, 0x12, 0x45, 0xA9, 0x75, 0xF0, 0x03,
0xEE, 0x12, 0x45, 0xA9, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0xC3, 0xEF, 0x9D, 0xF5, 0x56, 0xC3,
0x94, 0x08, 0x50, 0x24, 0xE4, 0xF5, 0x57, 0x75, 0xF0, 0x0D, 0xEB, 0x90, 0xA2, 0x33, 0x12, 0x45,
@@ -2846,3400 +6372,72 @@ u1Byte Array_MP_8723B_FW_NIC[] = {
0x57, 0x02, 0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8, 0xFF,
0x75, 0xF0, 0x0D, 0xEB, 0x90, 0xA2, 0x33, 0x12, 0x45, 0xA9, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2,
0xEF, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0xAF, 0x57,
-0x22, 0x7E, 0x00, 0x7F, 0x2A, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0x2C, 0x02, 0x08, 0xAA,
-0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x57, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x90,
-0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0xA1, 0x1A, 0xF0, 0xEF,
-0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54,
-0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03,
-0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFD, 0x4E, 0xF0,
-0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90,
-0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x19, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x30,
-0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0xA1, 0x2C, 0x50, 0x04, 0xEF,
-0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0xE9, 0x24, 0x06, 0xF9,
-0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F,
-0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06,
-0xCF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xC4, 0x54, 0x0F,
-0xFF, 0xC3, 0x94, 0x04, 0x90, 0xA1, 0x22, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0,
-0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12,
-0x55, 0x87, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0x54,
-0x01, 0xFE, 0x90, 0xA1, 0xBE, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE,
-0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF,
-0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xBE, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E,
-0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D,
-0xFF, 0x90, 0xA1, 0xBE, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x90,
-0x00, 0x05, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0x90, 0xA1, 0xBE, 0xF0,
-0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x29, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x0B,
-0x75, 0x52, 0x01, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x0B, 0x80, 0x0E, 0xE4, 0xF5, 0x52, 0x90, 0xA2,
-0x0C, 0xE0, 0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, 0x75, 0x51, 0x01, 0xAD, 0x52, 0xAF, 0x51,
-0x12, 0x63, 0x7F, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0xA2, 0xEE, 0x12, 0x45, 0xBE, 0xF1,
-0x28, 0x90, 0xA1, 0x1A, 0xE0, 0xFF, 0x12, 0x5B, 0x5E, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x18, 0x90,
-0xA2, 0xEE, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00,
-0x02, 0x12, 0x06, 0xA2, 0xFD, 0xF1, 0x39, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFB, 0xF0, 0xE4,
-0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x1E, 0xF0, 0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70,
-0x27, 0x90, 0xA1, 0x20, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A, 0x90, 0xA1, 0xBC, 0xE0,
-0x90, 0xA1, 0x20, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x20, 0xED, 0xF0, 0x90, 0xA1, 0x20, 0xE0, 0xA3,
-0xF0, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF,
-0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xB9, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2,
-0x90, 0xA1, 0xBA, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00,
-0x03, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xBC, 0xF0, 0x22, 0x90, 0xA1, 0xB9, 0x74, 0x03, 0xF0, 0xA3,
-0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x22, 0x12,
-0x06, 0x89, 0x90, 0xA1, 0xBF, 0xF0, 0x60, 0x36, 0x90, 0xA1, 0xCD, 0xE0, 0x20, 0xE0, 0x2F, 0xE4,
-0xFD, 0x7F, 0x04, 0x12, 0x56, 0x56, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x1E,
-0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x15, 0x90, 0xA1, 0xBE, 0xE0, 0x13, 0x13, 0x54,
-0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x12,
-0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA1, 0xC0, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01,
-0x12, 0x06, 0xA2, 0x90, 0xA1, 0xC1, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xC2,
-0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0x90, 0xA1, 0xC3, 0xF0, 0x90, 0xA1, 0xC0, 0xE0, 0x54, 0x01, 0xFF,
-0x02, 0x60, 0x0B, 0x90, 0xA3, 0xE7, 0x12, 0x45, 0xBE, 0xE4, 0xFE, 0x90, 0xFD, 0x50, 0xEF, 0xF0,
-0x64, 0x30, 0x60, 0x3B, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0xA3, 0xE7, 0x12,
-0x45, 0xB5, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82,
-0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x06, 0x50, 0x33,
-0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80, 0xEB, 0xEE,
-0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0xA3, 0xE7, 0x12, 0x45, 0xB5, 0x8E, 0x82, 0x75, 0x83, 0x00,
-0x12, 0x06, 0xA2, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0,
-0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1,
-0xCD, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF,
-0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xCD,
-0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54,
-0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0xCD, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF,
-0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90,
-0xA1, 0xCD, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xD0,
-0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0,
-0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90,
-0xA1, 0xD0, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03,
-0x12, 0x06, 0xA2, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0xD0, 0xF0,
-0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2,
-0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, 0xD0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06,
-0xA2, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0xA1, 0xD1, 0xE0, 0x54, 0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54,
-0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54,
-0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xFF, 0x90, 0xA1, 0xD1, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF,
-0x54, 0xFE, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF,
-0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xD1, 0xF0, 0xEE, 0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E,
-0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D,
-0xFF, 0x90, 0xA1, 0xD1, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0xE0, 0xFF,
-0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x09, 0x12, 0x60, 0x4D, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E,
-0x90, 0xA1, 0xD1, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0,
-0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89,
-0x20, 0xE0, 0x02, 0x61, 0x8F, 0x90, 0x05, 0x54, 0xE0, 0x90, 0xA1, 0xDE, 0xF0, 0xE0, 0xC3, 0x13,
-0x90, 0xA1, 0xDD, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x00,
-0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xCE, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1,
-0xCF, 0xF0, 0x80, 0x48, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12,
-0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA1, 0xCE, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0,
-0x80, 0x06, 0x90, 0xA1, 0xCE, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xC3,
-0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA1, 0xCF, 0x50, 0x05, 0x74, 0x03, 0xF0,
-0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xCF, 0x74, 0x2A, 0xF0, 0x90, 0xA1, 0xD1, 0xE0,
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3D, 0x90, 0xA1, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0x84,
-0x90, 0xA1, 0xD6, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA1, 0xCF, 0xE0, 0x75, 0xF0, 0x03,
-0x84, 0x90, 0xA1, 0xD8, 0xF0, 0x90, 0xA1, 0xCE, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0xD9, 0xF0, 0x90,
-0xA1, 0xCF, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0xDA, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD,
-0x7F, 0x02, 0x12, 0x7F, 0xB3, 0xE4, 0x90, 0xA2, 0x0A, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5,
-0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x3C, 0x90, 0xA1,
-0xCD, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x0A, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30,
-0xE0, 0x28, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0xA2, 0x0C,
-0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x05, 0x75, 0x51, 0x01, 0x80, 0x03,
-0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x12, 0x63, 0x7F, 0x90, 0xA1, 0xCD, 0xE0, 0xC4, 0x54,
-0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D,
-0x04, 0x7F, 0x02, 0x12, 0x55, 0x87, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0,
-0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xD5, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1,
-0xE0, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, 0x08, 0x90, 0xA1, 0xE0, 0x74, 0x04, 0xF0,
-0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA1, 0xE0, 0x74, 0x02, 0xF0, 0x80, 0x0A, 0xEF, 0xB4,
-0x07, 0x06, 0x90, 0xA1, 0xE0, 0x74, 0x05, 0xF0, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x80, 0x6E, 0x90,
-0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0xC4, 0x13, 0x13, 0x54,
-0x03, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x14, 0x12, 0x06, 0x89, 0xFF, 0x13, 0x13, 0x13,
-0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x12, 0x85, 0xAD,
-0x7D, 0x2C, 0x7F, 0x40, 0x12, 0x46, 0xAC, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03,
-0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03,
-0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xAD, 0x52, 0x7F, 0x02, 0x12, 0x63, 0x7F, 0xE4, 0xFD, 0xFF,
-0x12, 0x49, 0x5E, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x43, 0xF0, 0x90, 0xA1, 0xD3,
-0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0xDF, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x13, 0x13,
-0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA1, 0xFD, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F,
-0x01, 0x12, 0x67, 0xE7, 0x90, 0xA1, 0xFD, 0xE0, 0x54, 0xFD, 0xF0, 0x7F, 0x03, 0x12, 0x66, 0xDF,
-0x90, 0xA1, 0xCD, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0xA1, 0xD1, 0xE0, 0x54, 0xBF, 0xF0, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0x90, 0xA1, 0xF3, 0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x5E,
-0x9D, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0x22, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA3, 0xEA,
-0xE0, 0x70, 0x13, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA2, 0x04, 0x12, 0x08, 0x6D,
-0x90, 0xA3, 0xEA, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0xFF,
-0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, 0x90, 0xA2, 0x04, 0x12, 0x45, 0x71, 0xEC,
-0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, 0xAD,
-0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00,
-0x12, 0x45, 0x53, 0x90, 0xA2, 0x00, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA2, 0x0C, 0xF0,
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x0D, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
-0xC0, 0xD0, 0x90, 0xA1, 0xF4, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01, 0x7F, 0x28, 0x12, 0x5E, 0x9D,
-0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x90,
-0x00, 0x01, 0x12, 0x06, 0xA2, 0xF5, 0x54, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x55, 0x90,
-0x00, 0x03, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xF5, 0x57, 0x90,
-0x00, 0x05, 0x12, 0x06, 0xA2, 0xF5, 0x58, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xF5, 0x59, 0xE5,
-0x51, 0x12, 0x45, 0xC7, 0x95, 0x3D, 0x00, 0x95, 0x45, 0x01, 0x95, 0x4D, 0x02, 0x95, 0x55, 0x03,
-0x95, 0x5D, 0x04, 0x95, 0x65, 0x05, 0x95, 0x6E, 0x06, 0x00, 0x00, 0x95, 0x85, 0x75, 0x52, 0x02,
-0x75, 0x53, 0x29, 0x80, 0x46, 0x75, 0x52, 0x06, 0x75, 0x53, 0x2A, 0x80, 0x3E, 0x75, 0x52, 0x01,
-0x75, 0x53, 0x31, 0x80, 0x36, 0x75, 0x52, 0x01, 0x75, 0x53, 0x32, 0x80, 0x2E, 0x75, 0x52, 0x06,
-0x75, 0x53, 0x33, 0x80, 0x26, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0x02, 0x7F, 0xC8, 0x90, 0xA2,
-0x0E, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xA3, 0xE5, 0x56, 0xF0, 0xA3, 0xE5, 0x57, 0xF0,
-0xA3, 0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, 0x7B, 0x00, 0x7A, 0x00, 0x79,
-0x54, 0xAD, 0x52, 0xAF, 0x53, 0x02, 0x5E, 0x9D, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90,
-0xA2, 0x19, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F,
-0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA2,
-0x19, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54,
-0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x90, 0xA2, 0x19, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2,
-0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA2, 0x1A, 0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04,
-0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x30,
-0xFD, 0xEF, 0x54, 0xCF, 0x4D, 0xFF, 0x90, 0xA2, 0x1A, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54,
-0xBF, 0x4E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x1B, 0xF0, 0x90, 0x00, 0x03,
-0x12, 0x06, 0xA2, 0x90, 0xA2, 0x1C, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x1D,
-0xF0, 0x90, 0xA2, 0x1B, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF,
-0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x23, 0xEE, 0xF0, 0xA3,
-0xEF, 0xF0, 0x90, 0xA2, 0x1C, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03,
-0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x25, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x1D, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07,
-0x03, 0x90, 0xA2, 0x27, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x19, 0xE0, 0x30, 0xE0, 0x17,
-0x90, 0xA2, 0x1E, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90,
-0x07, 0x83, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x1E, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0x90, 0xA2, 0xEB, 0x12,
-0x45, 0xBE, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0x90, 0xA2, 0x29, 0xF0, 0x90,
-0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x2A, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x7D,
-0x02, 0x7F, 0x38, 0x02, 0x5E, 0x9D, 0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0xFF, 0x90, 0xA1,
-0xF2, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0xE0, 0xC3, 0x13, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xE6, 0xF0,
-0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE0, 0x37, 0x12, 0x46, 0xC6, 0xEF, 0x54, 0x0F, 0x64,
-0x04, 0x70, 0x25, 0x90, 0xA2, 0x13, 0xE0, 0x30, 0xE0, 0x02, 0x80, 0x24, 0x90, 0xFD, 0x62, 0xE0,
-0xB4, 0xAD, 0x13, 0xA3, 0xE0, 0xB4, 0x35, 0x0E, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x90,
-0x01, 0xE5, 0x74, 0xDF, 0xF0, 0x22, 0x80, 0x00, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x22,
-0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA3,
-0xF6, 0xF0, 0x90, 0xA3, 0xF6, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0x98, 0x9B, 0x90, 0x9F, 0xF3, 0xE0,
-0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xF4, 0xE0,
-0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0,
-0x44, 0x01, 0xF0, 0x22, 0x90, 0xA3, 0xEB, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08,
-0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x03, 0x02, 0x98,
-0x78, 0xE4, 0x90, 0xA3, 0xF7, 0xF0, 0x90, 0xA3, 0xF7, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73,
-0x90, 0xA3, 0xEB, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC,
-0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90,
-0x9F, 0xF4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA3, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, 0xF5,
-0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0x75, 0xF0, 0x04, 0xA4,
-0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83,
-0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA7, 0x12, 0x45, 0xA9, 0xE5,
-0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xF7, 0xE0, 0x04,
-0xF0, 0x80, 0x83, 0x90, 0xA3, 0xF6, 0xE0, 0xFF, 0x90, 0xA3, 0xEB, 0xE0, 0xFE, 0x74, 0x01, 0xA8,
-0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0xF6, 0xF0, 0x90, 0xA3,
-0xEB, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01,
-0xCC, 0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xF4, 0xE0,
-0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x03, 0x02, 0x97, 0x52,
-0xE4, 0x90, 0x9F, 0xF4, 0xF0, 0x02, 0x97, 0x52, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90,
-0xA3, 0xEB, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0x75, 0xF0, 0x04,
-0x90, 0x01, 0xD0, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x8B,
-0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0xF3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x90, 0xA3, 0xC8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA3,
-0xC8, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA3, 0xCB,
-0xE0, 0x94, 0xE8, 0x90, 0xA3, 0xCA, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44,
-0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0xA3, 0xCA, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6,
-0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C,
-0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0,
-0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0,
-0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03,
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5,
-0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA3, 0xCC, 0xEF, 0xF0,
-0xA3, 0x12, 0x45, 0xBE, 0x90, 0xA3, 0xEC, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12,
-0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02,
-0xC0, 0x01, 0x90, 0xA3, 0xCD, 0x12, 0x45, 0xB5, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43,
-0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0xA3, 0xCC, 0xE0, 0x24, 0x02,
-0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45,
-0xB5, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA3, 0xCD,
-0x12, 0x45, 0xB5, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0,
-0x03, 0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34,
-0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA2, 0xEB, 0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB,
-0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2,
-0xED, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF,
-0x01, 0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xEE, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB,
-0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2,
-0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF,
-0x01, 0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xF0, 0xF0, 0x90, 0xA2, 0xEC, 0xE0, 0xFF, 0xA3,
-0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA2, 0xF4, 0xF0, 0x90, 0xA2, 0xF0, 0xE0, 0x90,
-0xA2, 0xF5, 0xF0, 0x02, 0x6E, 0xFB, 0x90, 0xA3, 0xED, 0x12, 0x45, 0xBE, 0xE4, 0xFF, 0x90, 0xA3,
-0xED, 0x12, 0x45, 0xB5, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90,
-0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01,
-0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01,
-0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x01, 0x99, 0xE0,
-0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0,
-0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0,
-0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0xA2, 0xDB, 0xF0, 0xA3, 0xF0, 0x51,
-0xCA, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0xA2, 0xDC, 0xE0, 0x94, 0x88, 0x90, 0xA2, 0xDB,
-0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74,
-0xFD, 0xF0, 0x80, 0x27, 0x90, 0xA2, 0xDB, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14,
-0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA2, 0xDC, 0xE0, 0x94, 0x32, 0x90, 0xA2, 0xDB, 0xE0,
-0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0xFE,
-0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x42, 0xF0, 0x74, 0x9B, 0xA3, 0xF0, 0x90, 0xA2,
-0x2B, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30,
-0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x9F, 0x97, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x17, 0xF0, 0xA3,
-0x74, 0x02, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16,
-0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01,
-0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0,
-0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3,
-0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21,
-0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF,
-0x22, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA0,
-0x90, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x1A, 0x90, 0x01, 0x57, 0xE4,
-0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0xBA, 0xE0,
-0x90, 0xA3, 0xAF, 0x12, 0x48, 0x21, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90,
-0xA1, 0x1A, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0,
-0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07,
-0x70, 0x03, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0x1A,
-0xE0, 0x60, 0x0E, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58,
-0x4D, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x02, 0x91, 0x6D, 0x02, 0x48, 0x5B, 0x90, 0xA1, 0x16,
-0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E,
-0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80, 0x29, 0x90, 0xA1, 0x23, 0xE0, 0x04, 0xF0,
-0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0xB9, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0,
-0xD3, 0x9F, 0x40, 0x0F, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA1, 0x17, 0xE0, 0x54,
-0xFB, 0xF0, 0x22, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54,
-0x03, 0x30, 0xE0, 0x2E, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30,
-0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0xD3, 0xE0,
-0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x02, 0x56, 0x56, 0x12,
-0x58, 0x4D, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0,
-0x21, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30, 0xE1, 0x06, 0xE0,
-0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x03, 0x12,
-0x58, 0x4D, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x22, 0x90,
-0xA1, 0xD4, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xFD, 0xF0, 0x90, 0x04, 0xE0,
-0xE0, 0x90, 0xA1, 0xD4, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB,
-0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x02, 0xB1, 0x5B, 0x22, 0x90, 0xA2, 0x2C, 0xE0, 0x30,
-0xE0, 0x35, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x37, 0x12, 0x45, 0xA9,
-0xE0, 0xFE, 0x30, 0xE0, 0x22, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x37, 0x12, 0x45, 0xA9, 0xEE,
-0x54, 0xFE, 0xF0, 0x90, 0xA2, 0x2E, 0x74, 0x05, 0xF0, 0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54,
-0x07, 0xFD, 0x7F, 0x01, 0x12, 0x4D, 0x68, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
-0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0,
-0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F,
-0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xE4, 0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4,
-0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0xBE,
-0x03, 0x12, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74,
-0x80, 0xF0, 0x80, 0x0F, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5,
-0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E,
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xAD, 0x0F, 0xBF, 0x80,
-0xA7, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, 0x94, 0x91, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00,
-0xE4, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0xA9, 0x75, 0xF0,
-0x02, 0xEE, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0, 0x0E, 0xBE, 0x05, 0xE7, 0x74, 0x16, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4,
-0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83,
-0x74, 0xC0, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4,
-0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0xEF,
-0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF,
-0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75,
-0xF0, 0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0xA9, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x04, 0xEF,
-0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12,
-0x45, 0xA9, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12,
-0x45, 0xA9, 0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9,
-0xE0, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x44,
-0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xCF, 0xF0,
-0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x40, 0xF0, 0x75, 0xF0,
-0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x7F, 0xF0, 0x75, 0xF0, 0x04, 0xEF,
-0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12,
-0x45, 0xA9, 0xEE, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0,
-0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0xC1, 0x32, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98,
-0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0xA3, 0x36, 0xEB, 0xF0, 0x70, 0x6C, 0x90, 0xA3, 0x36,
-0xE0, 0xFE, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFC, 0x90, 0xA3, 0x37,
-0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x53, 0x90, 0xA3, 0x3B, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05,
-0xEE, 0x25, 0xE0, 0x4F, 0xFF, 0x90, 0x9F, 0x96, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90,
-0xA3, 0x3D, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x90, 0xA3, 0x3F, 0xF0, 0x90, 0xA3, 0x39, 0x74, 0x0C,
-0xF0, 0x90, 0xA3, 0x47, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x39, 0x12, 0x6F, 0x6E,
-0x7F, 0x04, 0x12, 0x6C, 0xCC, 0x90, 0xA3, 0x37, 0xE0, 0xFF, 0x90, 0xA3, 0x36, 0xE0, 0x24, 0x96,
-0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xE4, 0xF5, 0x5E, 0x74, 0x96, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3, 0x94, 0x11,
-0x40, 0x29, 0x80, 0x1F, 0xEE, 0xB4, 0x01, 0x08, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x1D, 0x80, 0x13,
-0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0x70, 0x0B, 0xED, 0xC3, 0x94,
-0x03, 0x40, 0x08, 0x75, 0x5E, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x5E, 0xAF, 0x5E, 0x22, 0x8F, 0x52,
-0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xE0, 0xFF,
-0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x16, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x2F, 0xFF, 0xE4,
-0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA2, 0xEE, 0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40,
-0x02, 0x80, 0x19, 0xE5, 0x53, 0xD3, 0x94, 0x19, 0x40, 0x05, 0x90, 0xA2, 0xEE, 0x80, 0x0B, 0x75,
-0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4,
-0xFB, 0xAF, 0x52, 0x02, 0x76, 0xA1, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x12, 0x06, 0x89, 0xF5,
-0x51, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0x9C, 0xF0, 0x74, 0x16,
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90,
-0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E,
-0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83,
-0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12,
-0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51,
-0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB,
-0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, 0x82,
-0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83,
-0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2,
-0x54, 0x20, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50,
-0x16, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34,
-0x99, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0F, 0xE5, 0x51, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12,
-0x06, 0xA2, 0x90, 0x95, 0x95, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5,
-0x83, 0xE0, 0x30, 0xE5, 0x22, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9,
-0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5,
-0x83, 0xE0, 0xFD, 0xAF, 0x51, 0x11, 0x1E, 0x22, 0xAB, 0x07, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81,
-0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x5E, 0xE4, 0xF5, 0x62, 0xE5, 0x5E, 0x54, 0x7F, 0xF9, 0xE5,
-0x5E, 0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x16, 0x12, 0x45, 0xA9, 0xE0, 0xF5,
-0x60, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x54, 0x03,
-0xF5, 0x61, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83,
-0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE,
-0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x5E, 0x4A, 0xFF, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F,
-0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54,
-0x03, 0xF5, 0x5F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5F, 0xF0,
-0xE9, 0x64, 0x2C, 0x70, 0x33, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0,
-0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5F, 0xC3, 0x9E, 0x50, 0x1E, 0x05, 0x5F, 0xE5, 0x5F, 0x54, 0x03,
-0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xEF,
-0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0x61, 0x10, 0xE9, 0xC3, 0x95, 0x60, 0x50, 0x6B, 0xE9, 0x04,
-0xFD, 0xED, 0xD3, 0x95, 0x60, 0x40, 0x02, 0x61, 0x10, 0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF,
-0x75, 0xF0, 0x08, 0xEB, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4,
-0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01,
-0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE,
-0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1D, 0xB9, 0x13, 0x14, 0x79, 0x18, 0x89, 0x5E,
-0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x60,
-0xA9, 0x05, 0x89, 0x5E, 0x80, 0x5A, 0x0D, 0x80, 0x98, 0xE9, 0x65, 0x60, 0x70, 0x43, 0x75, 0xF0,
-0x04, 0xEB, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0,
-0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44, 0x80, 0xF5, 0x5E, 0x80, 0x33, 0xE9, 0x25, 0xE0,
-0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25,
-0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80,
-0x0F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60, 0xF0, 0xF5, 0x5E,
-0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD, 0x5E, 0x02, 0x76, 0xA1, 0xAA, 0x07, 0xAB, 0x05,
-0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF5,
-0x60, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA2, 0xFB, 0xF0,
-0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x16, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEA,
-0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0xE5, 0x60, 0x25, 0xE0, 0x24,
-0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA,
-0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0,
-0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0xC4, 0x54, 0x03, 0x90,
-0xA2, 0xF9, 0xF0, 0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60, 0xF0,
-0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE5, 0x60, 0xD3,
-0x9F, 0x40, 0x04, 0x8F, 0x60, 0x8F, 0x5E, 0xEB, 0x70, 0x02, 0x81, 0x94, 0xAF, 0x03, 0x8F, 0x61,
-0xE5, 0x5E, 0x30, 0xE7, 0x05, 0x85, 0x60, 0x5E, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x02, 0x81, 0x94,
-0xE5, 0x60, 0x64, 0x2C, 0x70, 0x2A, 0xE5, 0x5F, 0xD3, 0x94, 0x00, 0x40, 0x23, 0xE5, 0x5F, 0xD3,
-0x94, 0x02, 0x50, 0x1C, 0x15, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75,
-0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61,
-0xE5, 0x61, 0x70, 0x02, 0x81, 0x94, 0x90, 0xA2, 0xFB, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x40,
-0x7D, 0xE4, 0x90, 0xA2, 0xFA, 0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90,
-0xA2, 0xFB, 0xE0, 0xFF, 0xEC, 0xC3, 0x9F, 0x40, 0x5F, 0xEC, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF,
-0x75, 0xF0, 0x08, 0xEA, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4,
-0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xEC, 0x54, 0x07, 0xFF, 0x74, 0x01,
-0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE,
-0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02,
-0x7D, 0x0C, 0x90, 0xA2, 0xFA, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF,
-0xED, 0xD3, 0x9F, 0x40, 0x03, 0x1C, 0x80, 0x97, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA2,
-0xFB, 0xE0, 0xF5, 0x5E, 0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x02, 0x76, 0xA1,
-0xE4, 0xF5, 0x51, 0x74, 0x90, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70,
-0x03, 0x02, 0xAC, 0x98, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0,
-0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0xAC, 0x98, 0xE5, 0x51, 0x25,
-0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94,
-0x00, 0xEE, 0x94, 0x00, 0x50, 0x03, 0x02, 0xAC, 0x98, 0xE5, 0x51, 0x75, 0xF0, 0x0A, 0xA4, 0x24,
-0x01, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xBE, 0xE5,
-0x51, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xF5, 0x56, 0xA3,
-0xE0, 0xF5, 0x57, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF,
-0x90, 0xA2, 0xED, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE,
-0xF0, 0x12, 0x07, 0x80, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB,
-0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35,
-0xF0, 0xFE, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0xA2,
-0xEF, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFD, 0xC3, 0xEF, 0x9D, 0xFF, 0xEE, 0x95, 0xF0,
-0x90, 0xA2, 0xF1, 0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x00, 0x12,
-0x45, 0xA9, 0xE0, 0xF5, 0x52, 0x54, 0x7F, 0xF5, 0x53, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96,
-0x16, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0xA2, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96,
-0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0xF4, 0xF0, 0x74, 0x96,
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x03, 0x02,
-0xA8, 0x92, 0x90, 0xA2, 0xF3, 0xE0, 0xFF, 0xE5, 0x53, 0x9F, 0x40, 0x08, 0x8F, 0x53, 0x53, 0x52,
-0x80, 0xEF, 0x42, 0x52, 0xE5, 0x53, 0x90, 0x41, 0x5F, 0x93, 0xFF, 0x74, 0x96, 0x25, 0x51, 0xF5,
-0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xC3, 0x9F, 0xE5, 0x53, 0x40, 0x05, 0x90, 0x41, 0x37,
-0x80, 0x03, 0x90, 0x41, 0x4B, 0x93, 0xF5, 0x58, 0x90, 0xA2, 0x0E, 0xE0, 0x60, 0x7D, 0xE5, 0x53,
-0x64, 0x13, 0x60, 0x05, 0xE5, 0x53, 0xB4, 0x0B, 0x05, 0x90, 0xA2, 0x10, 0x80, 0x23, 0xE5, 0x53,
-0x64, 0x12, 0x60, 0x05, 0xE5, 0x53, 0xB4, 0x0A, 0x05, 0x90, 0xA2, 0x11, 0x80, 0x13, 0xE5, 0x53,
-0x64, 0x11, 0x60, 0x05, 0xE5, 0x53, 0xB4, 0x09, 0x05, 0x90, 0xA2, 0x12, 0x80, 0x03, 0x90, 0xA2,
-0x0F, 0xE0, 0xF5, 0x5C, 0xE5, 0x5C, 0xC3, 0x94, 0x80, 0x50, 0x28, 0xE5, 0x5C, 0x94, 0x1B, 0x40,
-0x02, 0x80, 0x13, 0xE5, 0x58, 0x25, 0x5C, 0xFF, 0xE4, 0x33, 0xFE, 0xD3, 0xEF, 0x94, 0x1B, 0xEE,
-0x64, 0x80, 0x94, 0x80, 0x40, 0x05, 0x75, 0x58, 0x1B, 0x80, 0x20, 0xE5, 0x5C, 0x25, 0x58, 0xF5,
-0x58, 0x80, 0x18, 0xC3, 0xE4, 0x95, 0x5C, 0xF5, 0x5C, 0xE5, 0x58, 0xD3, 0x95, 0x5C, 0x40, 0x08,
-0xE5, 0x58, 0x95, 0x5C, 0xF5, 0x58, 0x80, 0x03, 0xE4, 0xF5, 0x58, 0xE5, 0x58, 0x75, 0xF0, 0x06,
-0xA4, 0x24, 0x95, 0xF9, 0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x90, 0xA2, 0xE7, 0x12, 0x45,
-0xBE, 0xC3, 0xE5, 0x57, 0x94, 0x0F, 0xE5, 0x56, 0x94, 0x00, 0x50, 0x61, 0x90, 0xA2, 0xEA, 0x12,
-0x45, 0xB5, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x07,
-0xAB, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF,
-0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x03, 0x02, 0xA8, 0x63, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x02,
-0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5,
-0x57, 0x13, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x12, 0x07, 0x80,
-0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x50, 0x03, 0x02, 0xA8, 0x6A, 0x02, 0xA8, 0x43, 0xE5, 0x51, 0x70,
-0x50, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0,
-0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08,
-0x90, 0x9F, 0x96, 0x74, 0x01, 0xF0, 0x80, 0x29, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3,
-0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13,
-0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0xE4, 0x90, 0x9F, 0x96,
-0xF0, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80,
-0x13, 0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80,
-0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5,
-0x83, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, 0x55, 0xE4, 0xF5, 0x5D, 0x90, 0xA2, 0xEA, 0x12, 0x45,
-0xB5, 0x75, 0xF0, 0x02, 0xE5, 0x5D, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE,
-0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2,
-0xE7, 0x12, 0x45, 0xB5, 0x85, 0x5D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00,
-0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0x05, 0x5D, 0xE5,
-0x5D, 0xB4, 0x05, 0xB7, 0x90, 0xA2, 0xE7, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2,
-0xFD, 0x7C, 0x00, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE,
-0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54, 0x9E, 0x40, 0x0C,
-0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54, 0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4, 0xF5, 0x54, 0xF5,
-0x55, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE5, 0x54,
-0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xAE, 0x54, 0xFF, 0xE4, 0xFC, 0xFD, 0xE5, 0x53, 0x25, 0xE0, 0x25,
-0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x99, 0xC3, 0x12, 0x45,
-0x60, 0x50, 0x07, 0xAF, 0x51, 0x12, 0xA1, 0x88, 0x80, 0x20, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0xC3,
-0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xD3, 0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95,
-0x54, 0x40, 0x07, 0x7D, 0x01, 0xAF, 0x51, 0x12, 0xA3, 0x1C, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95,
-0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xA3, 0xE0, 0x90, 0xA3, 0x38, 0xF0, 0x90, 0xA3, 0x37,
-0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD, 0xFF, 0x12, 0x9F, 0x66, 0xE4, 0xF5, 0x54, 0xF5, 0x55,
-0x61, 0x6F, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFC, 0x64,
-0x05, 0x60, 0x02, 0x41, 0x05, 0xAD, 0x53, 0xAF, 0x51, 0x12, 0x9F, 0xDA, 0x74, 0x16, 0x25, 0x51,
-0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81,
-0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4,
-0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xC3, 0x94, 0x30, 0x50, 0x11, 0xE4, 0xF5, 0x5B, 0x74, 0x96,
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0x21, 0x8A, 0x74, 0x16, 0x25, 0x51,
-0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x21, 0xB3, 0x74, 0x96,
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x4D, 0xEF, 0x24,
-0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83,
-0xE0, 0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x2E, 0xED, 0x24, 0x05,
-0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0,
-0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x10, 0x74, 0x16, 0x25, 0x51, 0xF5,
-0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x65, 0x53, 0x60, 0x3B, 0xE5, 0x5B, 0x70, 0x05, 0x75,
-0x5B, 0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4, 0x01, 0x05, 0x75, 0x5B, 0x03, 0x80, 0x03, 0x75, 0x5B,
-0x05, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x01,
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5,
-0x82, 0xE4, 0x34, 0x9A, 0x80, 0x29, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5,
-0x83, 0xE4, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x04,
-0xF0, 0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5,
-0x83, 0xE4, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x53,
-0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13,
-0x54, 0x03, 0x20, 0xE0, 0x02, 0x61, 0x4C, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A,
-0xF5, 0x83, 0xE4, 0xF0, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5,
-0x83, 0xE4, 0xF0, 0x61, 0x4C, 0xEC, 0x64, 0x06, 0x60, 0x02, 0x61, 0x6F, 0xF5, 0x54, 0xF5, 0x55,
-0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, 0xF5, 0x5B,
-0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13,
-0xD3, 0xE5, 0x57, 0x94, 0xFA, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03,
-0xE4, 0xF5, 0x59, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE,
-0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x42, 0x24, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90,
-0xA2, 0xF6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x5A, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5,
-0x75, 0xF0, 0x02, 0xE5, 0x5A, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0,
-0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90,
-0x42, 0x1F, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35,
-0x54, 0xF5, 0x54, 0xC3, 0x90, 0xA2, 0xF7, 0xE0, 0x95, 0x55, 0x90, 0xA2, 0xF6, 0xE0, 0x95, 0x54,
-0x40, 0x07, 0x05, 0x5A, 0xE5, 0x5A, 0xB4, 0x05, 0xB1, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5,
-0x5B, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40,
-0x06, 0xEF, 0x95, 0x5A, 0xFF, 0x80, 0x02, 0xE4, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4,
-0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13, 0xFE, 0xEF, 0xC4, 0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE,
-0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x01, 0x25,
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01,
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x51,
-0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x25, 0xE0, 0xFF,
-0x70, 0x04, 0xF5, 0x5B, 0x80, 0x04, 0xEF, 0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA2, 0xEE, 0xE0, 0x94,
-0x03, 0x90, 0xA2, 0xED, 0xE0, 0x94, 0x00, 0x40, 0x03, 0xE4, 0xF5, 0x5B, 0x75, 0xF0, 0x10, 0xE5,
-0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF8, 0x90, 0xA2, 0xF8, 0xF0, 0x45, 0x5B,
-0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x74,
-0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x96,
-0x50, 0x0E, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B,
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x81, 0x25, 0x51, 0xF5,
-0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x91, 0x90, 0xA2, 0xED,
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51,
-0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3,
-0x9D, 0xEA, 0x9C, 0xE5, 0x51, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B,
-0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82,
-0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xEF, 0xE0, 0xFE, 0xA3,
-0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24,
-0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C,
-0xE5, 0x51, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE,
-0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C,
-0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xF1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFB, 0xC3,
-0x74, 0xFF, 0x9B, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x74, 0xFF, 0x94, 0x00, 0xFD, 0x74, 0xFF, 0x94,
-0x00, 0xFC, 0x90, 0x94, 0x91, 0x12, 0x45, 0x8D, 0xD3, 0x12, 0x45, 0x60, 0x90, 0x94, 0x91, 0x50,
-0x19, 0x12, 0x45, 0x8D, 0x90, 0xA2, 0xF1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x12,
-0x45, 0x39, 0x90, 0x94, 0x91, 0x12, 0x08, 0x6D, 0x80, 0x07, 0x12, 0x08, 0x79, 0xFF, 0xFF, 0xFF,
-0xFF, 0xE4, 0xFD, 0xAF, 0x51, 0x12, 0x78, 0x59, 0x05, 0x51, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50,
-0x03, 0x02, 0xA4, 0xA3, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xD4, 0xEF,
-0xF0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x1F, 0xFB, 0x24, 0xF1,
-0x50, 0x02, 0xA1, 0x47, 0xE4, 0xF5, 0x6B, 0x90, 0xA3, 0xD4, 0xE0, 0xFD, 0x75, 0xF0, 0x08, 0x90,
-0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83,
-0xE0, 0xFE, 0xEB, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83,
-0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0xEE, 0x5C,
-0x90, 0xA3, 0xD7, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54,
-0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x6B, 0x70, 0x07, 0x90, 0xA3, 0xD7, 0xE0, 0x54, 0xF0, 0xF0,
-0x90, 0xA3, 0xD7, 0xE0, 0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12,
-0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05,
-0x6B, 0xE5, 0x6B, 0x64, 0x07, 0x70, 0x80, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96,
-0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA3, 0xD5, 0xF0, 0x75,
-0x6C, 0x06, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90,
-0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0,
-0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45,
-0xA9, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0xD6,
-0xF0, 0x90, 0xA3, 0xD6, 0xE0, 0x60, 0x41, 0x75, 0x6B, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B,
-0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xD6, 0xE0, 0xFB,
-0xEF, 0x5B, 0x60, 0x1B, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0x90, 0xA3, 0xD5, 0xF0,
-0xED, 0x60, 0x24, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x1E, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x18, 0x15,
-0x6B, 0xE5, 0x6B, 0xC3, 0x94, 0x00, 0x50, 0xC2, 0xE5, 0x6C, 0x60, 0x0B, 0x15, 0x6C, 0xE5, 0x6C,
-0xC3, 0x94, 0x00, 0x40, 0x02, 0xA1, 0x62, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, 0x06, 0x1D,
-0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82,
-0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3, 0xD4,
-0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82,
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0xD6, 0xF0, 0x90, 0xA3, 0xD6, 0xE0, 0x60, 0x3C,
-0xE4, 0xF5, 0x6B, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33,
-0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xD6, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x18, 0xE5, 0x6C, 0x75,
-0xF0, 0x08, 0xA4, 0x25, 0x6B, 0xFC, 0xED, 0x60, 0x1D, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x17, 0x74,
-0x20, 0x2C, 0xFC, 0x80, 0x11, 0x05, 0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xC7, 0x05, 0x6C, 0xE5, 0x6C,
-0x64, 0x07, 0x60, 0x02, 0xA1, 0xFB, 0x90, 0xA3, 0xD5, 0xE0, 0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0xFE,
-0x75, 0xF0, 0x04, 0x90, 0x96, 0x16, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90,
-0x96, 0x17, 0x12, 0x45, 0xA9, 0xEC, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x45,
-0xA9, 0xE0, 0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3, 0x9F, 0x40,
-0x09, 0x90, 0xA3, 0xD5, 0xE0, 0x4E, 0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C, 0x50, 0x06,
-0xAF, 0x06, 0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA3, 0xD4, 0xE0, 0xFF, 0x24, 0x16, 0xF5, 0x82, 0xE4,
-0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x6D, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45,
-0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x6A, 0x90, 0xA3, 0xD4, 0xE0, 0xFF, 0xE4, 0xFB, 0xAD,
-0x6D, 0x12, 0x76, 0xA1, 0x90, 0xA3, 0xD4, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x03, 0x12,
-0x45, 0xA9, 0xE4, 0xF0, 0x90, 0xA3, 0xD5, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x0F, 0x74, 0x96,
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x23, 0xEE, 0xC3, 0x94,
-0x04, 0x90, 0xA3, 0xD4, 0xE0, 0x40, 0x0E, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83,
-0x74, 0x01, 0xF0, 0x80, 0x0B, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE4, 0xF0,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12,
-0x06, 0xA2, 0xFF, 0x54, 0x1F, 0xF5, 0x53, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01,
-0xF5, 0x52, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, 0x30,
-0xC4, 0x54, 0x0F, 0xF5, 0x57, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x40, 0xC4, 0x13,
-0x13, 0x54, 0x03, 0xF5, 0x55, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x56,
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF5, 0x59,
-0xEF, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x54, 0x01, 0xC4, 0x33, 0x33,
-0x33, 0x54, 0x80, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0,
-0x54, 0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, 0x75, 0xF0,
-0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59,
-0x60, 0x03, 0x02, 0xB0, 0xC0, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90,
-0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0xFF, 0x75,
-0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0xEF,
-0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9,
-0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0,
-0x04, 0xE5, 0x51, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57,
-0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45,
-0xA9, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5,
-0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83,
-0xE0, 0xFF, 0xE5, 0x5A, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85,
-0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5,
-0x51, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x58, 0xF5, 0x82, 0xE4, 0x35, 0x83,
-0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, 0x04, 0xD4, 0xAF, 0x51, 0x12, 0xAC, 0xA5,
-0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x40, 0xF0, 0x22,
-0x7F, 0x84, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x5B, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA3, 0x65, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x5D, 0x12,
-0x45, 0x71, 0x12, 0x08, 0x3A, 0x90, 0xA3, 0x65, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04,
-0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x5D, 0x12, 0x45, 0x71, 0x90, 0xA3, 0x61, 0x12,
-0x45, 0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53,
-0x90, 0xA3, 0x69, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x69, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12,
-0x08, 0x6D, 0x90, 0xA3, 0x5B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92,
-0xAF, 0x22, 0x90, 0xA2, 0x30, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13,
-0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x07, 0xED, 0xF0, 0xEF,
-0x14, 0x60, 0x02, 0x41, 0x5E, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA4, 0x07, 0xE0,
-0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA3,
-0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x00, 0x01, 0x7F, 0x00, 0x7E, 0x08, 0x11, 0xD4, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x00, 0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09,
-0x11, 0xD4, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA4, 0x07, 0xE0,
-0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78,
-0x04, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0A, 0x11, 0xD4,
-0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA4, 0x07, 0xE0, 0xFF, 0xE4,
-0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x61,
-0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0D, 0x11, 0xD4, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x0C,
-0x00, 0x00, 0x00, 0x90, 0xA4, 0x07, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF,
-0xE4, 0x78, 0x1A, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08,
-0x11, 0xD4, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x61, 0x12,
-0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x11, 0xD0, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x0C, 0x00, 0x90, 0xA3, 0x4F, 0x12, 0x08, 0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x65, 0x90, 0x06,
-0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90,
-0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0x11, 0xD4, 0x90,
-0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00,
-0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0x11, 0xD4, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00,
-0x00, 0x0C, 0x00, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x11, 0xD0, 0x90,
-0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x4F, 0x12, 0x08, 0x79, 0x00,
-0x00, 0x0C, 0x00, 0x51, 0xD4, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3,
-0x4F, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x90, 0xA3, 0x49, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0xA3, 0x48, 0xEF, 0xF0, 0xA3, 0xA3,
-0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA3, 0x53, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x4B, 0x12, 0x45,
-0x71, 0x12, 0x08, 0x3A, 0x90, 0xA3, 0x53, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04, 0xC0,
-0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x4B, 0x12, 0x45, 0x71, 0x90, 0xA3, 0x4F, 0x12, 0x45,
-0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90,
-0xA3, 0x57, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x49, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA3, 0x57,
-0x12, 0x45, 0x71, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x48, 0xE0, 0xFF, 0xD0, 0x05,
-0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
-0xA3, 0xD8, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x2F, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02,
-0xF5, 0x72, 0x80, 0x08, 0x90, 0xA3, 0xD8, 0xE0, 0x24, 0xFE, 0xF5, 0x72, 0x90, 0xA3, 0x4B, 0x12,
-0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x51, 0xCA, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79,
-0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x80, 0x20, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x00, 0xFF, 0x90, 0xA3, 0xD8, 0xE0, 0xFF, 0x51, 0xCA, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00,
-0x00, 0x00, 0xFF, 0x90, 0xA3, 0xD8, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x4F, 0x12,
-0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0x51, 0xDA, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7B,
-0x01, 0x7A, 0xA2, 0x79, 0xDB, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90,
-0xA2, 0xDB, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0xA2, 0x56, 0x74, 0x01, 0xF0, 0x22,
-0xE4, 0x90, 0xA2, 0x56, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E,
-0x08, 0x12, 0x37, 0x4E, 0x90, 0xA2, 0xDE, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37,
-0x4E, 0x90, 0xA2, 0xE2, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54, 0x01,
-0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54,
-0xFE, 0xFF, 0xEC, 0x90, 0xA2, 0xDE, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x71, 0x90,
-0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0xA2, 0xE2, 0x12,
-0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA2, 0xE2,
-0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA2, 0xE2, 0x12, 0x08, 0x6D, 0x90, 0xA2,
-0xE2, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38,
-0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA0, 0x90, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x01,
-0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0x11, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0x11, 0xE0, 0x54,
-0xFD, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x22,
-0x7F, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74,
-0x03, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x23, 0x12, 0x46, 0xF8, 0x90,
-0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x60, 0x4D, 0x7D, 0x24, 0x7F, 0x6F, 0x12, 0x49, 0x5E,
-0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x46,
-0xFD, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x7D, 0x25, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x90,
-0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x57,
-0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xFF,
-0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54,
-0xFD, 0xF0, 0x22, 0x90, 0xA1, 0x23, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xEF, 0xF0,
-0x90, 0xA1, 0xB9, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0x90, 0xA0, 0x90,
-0xE0, 0xB4, 0x01, 0x07, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0,
-0x90, 0xA3, 0x05, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE,
-0xF0, 0x80, 0x7E, 0xED, 0x30, 0xE6, 0x4D, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x70, 0x2B, 0x90,
-0xA1, 0x16, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0,
-0x80, 0x29, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x2F, 0x90, 0xA1, 0x1E, 0xE0,
-0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x4B, 0x58, 0x80, 0x21, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01,
-0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x04, 0xB1, 0xF5, 0x80, 0x0C, 0x12,
-0x4F, 0x9B, 0x80, 0x07, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA3, 0x05, 0xE0, 0x90,
-0xA1, 0x1E, 0x30, 0xE7, 0x1B, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1,
-0xBA, 0xE0, 0x90, 0xA3, 0xAF, 0x12, 0x48, 0x21, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22,
-0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0xBE, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x20, 0x90,
-0x04, 0x1D, 0xE0, 0x70, 0x1A, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x4A,
-0xB2, 0x90, 0xA4, 0x02, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22,
-0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4,
-0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA3,
-0xAE, 0xF0, 0x90, 0xA1, 0xBB, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0xA3, 0xAF, 0xF0, 0xE4, 0xFB,
-0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x48, 0x29, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x08, 0xF0, 0x22,
-0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA1, 0xDF, 0xE0, 0x70, 0x60, 0x90, 0xA1, 0x1C,
-0xE0, 0xD3, 0x94, 0x00, 0x50, 0x57, 0x90, 0xA1, 0xBF, 0xE0, 0x60, 0x4E, 0x80, 0x4F, 0x12, 0x73,
-0x81, 0xEF, 0x64, 0x01, 0x70, 0x47, 0x90, 0xA1, 0x1E, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90,
-0xA1, 0x1C, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0xA1, 0x1E,
-0xE0, 0x20, 0xE4, 0x29, 0x90, 0xA1, 0x17, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90,
-0xA1, 0xBF, 0xE0, 0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0,
-0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22,
-0xEF, 0x60, 0x3B, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x33, 0x90, 0xA1, 0x17, 0xE0, 0x54,
-0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x49, 0x5E, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0,
-0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x49, 0x74, 0xBF, 0x01, 0x14, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x40,
-0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x12, 0x55, 0x87, 0x90, 0xA1, 0x15, 0x74, 0x06, 0xF0, 0x22, 0x90,
-0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x28, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C,
-0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x12, 0x49, 0x69, 0xBF, 0x01, 0x14, 0x90, 0xA1, 0x16, 0xE0, 0x44,
-0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x12, 0x55, 0x87, 0x90, 0xA1, 0x15, 0x74, 0x0E, 0xF0, 0x22,
-0x7D, 0x2D, 0x12, 0x4C, 0x04, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x5A,
-0x91, 0x12, 0x46, 0xFD, 0xE4, 0xFD, 0x7F, 0x01, 0x12, 0x55, 0x87, 0xE4, 0x90, 0xA1, 0x15, 0xF0,
-0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x55, 0x87, 0x90,
-0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFD, 0xFF,
-0x12, 0x49, 0x5E, 0x7D, 0x04, 0x7F, 0x01, 0x12, 0x55, 0x87, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40,
-0xF0, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01,
-0x7A, 0xA1, 0x79, 0xC0, 0x02, 0x08, 0xAA, 0x90, 0xA3, 0xBD, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90,
-0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
-0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44,
-0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44,
-0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF,
-0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xED, 0xF0, 0x22, 0x90, 0xA3, 0xBB, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
-0xA4, 0x0C, 0xEF, 0xF0, 0x90, 0x9F, 0x9F, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x49,
-0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0xA4, 0x0C, 0xE0, 0x70, 0x3B, 0x90, 0xA1,
-0x16, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x12, 0x55, 0x7F, 0x80, 0x26, 0x90, 0xA1, 0x1D,
-0xE0, 0x64, 0x06, 0x70, 0x24, 0x90, 0xA4, 0x0C, 0xE0, 0x60, 0x1E, 0x90, 0xA1, 0x16, 0xE0, 0x54,
-0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x1D,
-0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFE,
-0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF,
-0x06, 0x22, 0x21, 0x68
-};
-u4Byte ArrayLength_MP_8723B_FW_NIC = 30932;
-
-
-
-void
-ODM_ReadFirmware_MP_8723B_FW_NIC(
- IN PDM_ODM_T pDM_Odm,
- OUT u1Byte *pFirmware,
- OUT u4Byte *pFirmwareSize
-)
-{
-#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
- *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8723B_FW_NIC;
-#else
- ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8723B_FW_NIC, ArrayLength_MP_8723B_FW_NIC);
-#endif
- *pFirmwareSize = ArrayLength_MP_8723B_FW_NIC;
-}
-
-// v23.02 20140214 by Isaachsu <isaachsu@realtek.com>
-u1Byte Array_MP_8723B_FW_WoWLAN[] = {
-0x01, 0x53, 0x30, 0x00, 0x17, 0x00, 0x02, 0x00, 0x02, 0x14, 0x16, 0x40, 0x34, 0x6C, 0x00, 0x00,
-0x16, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x02, 0x47, 0xC6, 0x02, 0x68, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x68, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x75, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x68, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x70, 0x73, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x75, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x94, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0,
-0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C,
-0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00,
-0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1,
-0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF,
-0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30,
-0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8,
-0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8,
-0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5,
-0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD,
-0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86,
-0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF,
-0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F,
-0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6,
-0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80,
-0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x48, 0x65, 0x74, 0x01, 0x93,
-0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2,
-0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81,
-0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE,
-0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18,
-0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09,
-0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81,
-0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02,
-0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09,
-0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F,
-0x04, 0x90, 0x48, 0x65, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3,
-0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4,
-0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F,
-0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0xDD, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02,
-0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C,
-0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5,
-0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01,
-0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC,
-0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5,
-0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22,
-0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4,
-0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0xDC, 0x8F, 0xF0,
-0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08,
-0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6,
-0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30,
-0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC,
-0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0xDD, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF,
-0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED,
-0x39, 0xFD, 0xEC, 0x38, 0xFC, 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, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC, 0x58,
-0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22, 0xEB,
-0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0, 0x22,
-0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE0, 0xF8, 0xA3, 0xE0,
-0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0, 0x35,
-0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0, 0xA3,
-0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12, 0x74,
-0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83, 0xE4,
-0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0xE3, 0xF5, 0xF0, 0x09,
-0xE2, 0x08, 0xB5, 0xF0, 0x6B, 0xDF, 0xF5, 0x80, 0x67, 0xE3, 0xF5, 0xF0, 0x09, 0xE6, 0x08, 0xB5,
-0xF0, 0x5E, 0xDF, 0xF5, 0x80, 0x5A, 0x87, 0xF0, 0x09, 0xE6, 0x08, 0xB5, 0xF0, 0x52, 0xDF, 0xF6,
-0x80, 0x4E, 0x87, 0xF0, 0x09, 0xE2, 0x08, 0xB5, 0xF0, 0x46, 0xDF, 0xF6, 0x80, 0x42, 0x88, 0x82,
-0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x36, 0xDF, 0xF6, 0x80, 0x32, 0x88, 0x82,
-0x8C, 0x83, 0x87, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, 0x25, 0xDF, 0xF5, 0x80, 0x21, 0x88,
-0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE0, 0xA3, 0xB5, 0xF0, 0x14, 0xDF, 0xF5, 0x80, 0x10,
-0x88, 0x82, 0x8C, 0x83, 0xE3, 0xF5, 0xF0, 0x09, 0xE4, 0x93, 0xA3, 0xB5, 0xF0, 0x02, 0xDF, 0xF4,
-0x02, 0x47, 0x4B, 0x80, 0x87, 0x80, 0xE9, 0x80, 0x90, 0x80, 0xD4, 0x80, 0x3E, 0x80, 0x15, 0x80,
-0x6E, 0x80, 0x7E, 0x80, 0x9D, 0x80, 0xB7, 0x80, 0x8D, 0x80, 0xA3, 0x80, 0x51, 0x80, 0x74, 0x80,
-0x3C, 0x02, 0x47, 0x57, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xC8,
-0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5,
-0x83, 0xCC, 0xB5, 0xF0, 0x76, 0xDF, 0xE3, 0xDE, 0xE1, 0x80, 0x70, 0x89, 0x82, 0x8A, 0x83, 0xE4,
-0x93, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x62, 0xDF, 0xF4, 0x80, 0x5E, 0x89, 0x82, 0x8A,
-0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x51, 0xDF, 0xF5, 0x80, 0x4D, 0x89, 0x82,
-0x8A, 0x83, 0xE0, 0xF5, 0xF0, 0xA3, 0xE2, 0x08, 0xB5, 0xF0, 0x40, 0xDF, 0xF5, 0x80, 0x3C, 0x89,
-0x82, 0x8A, 0x83, 0xE4, 0x93, 0xF5, 0xF0, 0xA3, 0xE6, 0x08, 0xB5, 0xF0, 0x2E, 0xDF, 0xF4, 0x80,
-0x2A, 0x80, 0x02, 0x80, 0x57, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE4, 0x93, 0xF5, 0xF0, 0xA3,
-0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5,
-0x83, 0xCC, 0xB5, 0xF0, 0x06, 0xDF, 0xE4, 0xDE, 0xE2, 0x80, 0x00, 0x7F, 0xFF, 0xB5, 0xF0, 0x02,
-0x0F, 0x22, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x89, 0x82, 0x8A, 0x83, 0xEC, 0xFA, 0xE0, 0xF5, 0xF0,
-0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC,
-0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xD5, 0xDF, 0xE5, 0xDE, 0xE3, 0x80, 0xCF, 0x89, 0x82, 0x8A, 0x83,
-0xEC, 0xFA, 0xE0, 0xF5, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xE4, 0x93,
-0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCC, 0xC5, 0x83, 0xCC, 0xB5, 0xF0, 0xAF, 0xDF, 0xE4, 0xDE, 0xE2,
-0x80, 0xA9, 0x88, 0xF0, 0xEF, 0x60, 0x01, 0x0E, 0x4E, 0x60, 0xAB, 0xED, 0x24, 0x02, 0xB4, 0x04,
-0x00, 0x50, 0x98, 0xF5, 0x82, 0xEB, 0x24, 0x02, 0xB4, 0x04, 0x00, 0x50, 0x8E, 0x23, 0x23, 0x45,
-0x82, 0x23, 0x90, 0x46, 0x93, 0x73, 0x02, 0x48, 0x04, 0x02, 0x43, 0x6D, 0xE4, 0x93, 0xA3, 0xF8,
-0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2, 0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93,
-0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33, 0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83,
-0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF, 0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08,
-0x10, 0x20, 0x40, 0x80, 0x90, 0x48, 0x49, 0xE4, 0x7E, 0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54,
-0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93, 0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0,
-0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3, 0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93,
-0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA,
-0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x00, 0x41, 0x95, 0x7E, 0x00, 0x41, 0x95,
-0x7F, 0x00, 0x41, 0x95, 0x93, 0x00, 0x41, 0x94, 0xCF, 0x00, 0x41, 0x94, 0xB1, 0x00, 0x44, 0x95,
-0x71, 0x00, 0x50, 0xF2, 0x01, 0x4B, 0xCD, 0x58, 0x40, 0x60, 0x18, 0x7F, 0x02, 0x51, 0x19, 0xEF,
-0x44, 0x01, 0xFD, 0x7F, 0x02, 0x11, 0x81, 0x7F, 0x02, 0x51, 0x19, 0xEF, 0x54, 0xFE, 0xFD, 0x7F,
-0x02, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F,
-0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
-0xC0, 0xD0, 0x90, 0x95, 0x55, 0xEF, 0xF0, 0x90, 0x95, 0x57, 0xEB, 0xF0, 0xED, 0x60, 0x02, 0x21,
-0x86, 0x90, 0x07, 0x6E, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x90,
-0x95, 0x57, 0xE0, 0x70, 0x47, 0x7F, 0x67, 0x51, 0x19, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x11,
-0x81, 0x90, 0x95, 0x55, 0xE0, 0x70, 0x2C, 0x90, 0x95, 0x58, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70,
-0x0F, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x74, 0x02, 0xFE, 0x51, 0x09, 0xEF, 0x54, 0xFE, 0x80, 0x0E,
-0x12, 0x37, 0x4E, 0xE4, 0xFE, 0x74, 0x80, 0xFF, 0xE4, 0x51, 0x09, 0xEF, 0x44, 0x01, 0xFD, 0x7F,
-0x64, 0x11, 0x81, 0x7F, 0x4E, 0x51, 0x19, 0xEF, 0x44, 0x80, 0x21, 0xF3, 0x7F, 0x67, 0x51, 0x19,
-0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x11, 0x81, 0x90, 0x95, 0x55, 0xE0, 0x70, 0x18, 0x7F, 0x48,
-0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F,
-0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x51, 0x19, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E,
-0x11, 0x81, 0x7F, 0x4F, 0x51, 0x19, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x4F, 0x11, 0x81, 0x7F, 0x30,
-0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0x74, 0x66, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D,
-0x7F, 0x30, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54,
-0xFC, 0xFF, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E,
-0x09, 0x12, 0x38, 0x45, 0x80, 0x7E, 0x90, 0x07, 0x6E, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x07, 0x65,
-0xE0, 0x44, 0x18, 0xF0, 0x90, 0x95, 0x55, 0xE0, 0x70, 0x52, 0x90, 0x95, 0x57, 0xE0, 0x60, 0x17,
-0x7F, 0x67, 0x51, 0x19, 0xEF, 0x44, 0x20, 0xFD, 0x7F, 0x67, 0x11, 0x81, 0x7F, 0x48, 0x7E, 0x09,
-0x12, 0x37, 0x4E, 0xE4, 0xFF, 0x80, 0x26, 0x7F, 0x67, 0x51, 0x19, 0xEF, 0x54, 0xDF, 0xFD, 0x7F,
-0x67, 0x11, 0x81, 0x90, 0x95, 0x58, 0xE0, 0x7F, 0x48, 0x7E, 0x09, 0x70, 0x0B, 0x12, 0x37, 0x4E,
-0xE4, 0x74, 0x80, 0xFF, 0x74, 0x02, 0x80, 0x05, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xFE, 0xEC, 0x90,
-0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x4E, 0x51, 0x19,
-0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x11, 0x81, 0x7F, 0x4F, 0x51, 0x19, 0xEF, 0x54, 0xFE, 0xFD,
-0x7F, 0x4F, 0x11, 0x81, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEC, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D,
-0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x7F, 0x64, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x8F, 0x82, 0x75, 0x83, 0x00, 0xE0, 0x90, 0x95, 0x8E, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E,
-0x50, 0x90, 0x95, 0x8E, 0xE0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0x31, 0xE0, 0x54,
-0x7F, 0xFF, 0x90, 0x8F, 0x30, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x01, 0xFD, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x87, 0xED, 0xF0, 0x90, 0x95, 0x86, 0xEF, 0xF0, 0xD3, 0x94, 0x07,
-0x50, 0x6D, 0x7F, 0x47, 0x51, 0x19, 0x90, 0x95, 0x86, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08,
-0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x47, 0x11, 0x81, 0x7F, 0x46, 0x51,
-0x19, 0x90, 0x95, 0x86, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8,
-0xFC, 0x4F, 0xFD, 0x7F, 0x46, 0x11, 0x81, 0x90, 0x95, 0x87, 0xE0, 0x60, 0x17, 0x7F, 0x45, 0x51,
-0x19, 0x90, 0x95, 0x86, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8,
-0xFC, 0x4F, 0x80, 0x16, 0x7F, 0x45, 0x51, 0x19, 0x90, 0x95, 0x86, 0xE0, 0xFE, 0x74, 0x01, 0xA8,
-0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x45, 0x80, 0x75, 0x90,
-0x95, 0x86, 0xE0, 0x24, 0xF8, 0xF0, 0x7F, 0x63, 0x51, 0x19, 0x90, 0x95, 0x86, 0xE0, 0xFE, 0x74,
-0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xFD, 0x7F, 0x63, 0x11,
-0x81, 0x7F, 0x62, 0x51, 0x19, 0x90, 0x95, 0x86, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80,
-0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x62, 0x11, 0x81, 0x90, 0x95, 0x87, 0xE0, 0x60,
-0x1A, 0x7F, 0x61, 0x51, 0x19, 0x90, 0x95, 0x86, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80,
-0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xFD, 0x7F, 0x61, 0x80, 0x19, 0x7F, 0x61, 0x51, 0x19, 0x90,
-0x95, 0x86, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4,
-0x5F, 0xFD, 0x7F, 0x61, 0x11, 0x81, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0x12, 0x52, 0x4D,
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x8F, 0x4A, 0xE0, 0xFF, 0x90, 0x8F, 0x49, 0xE0,
-0xFB, 0x90, 0x8F, 0x4B, 0xE0, 0x90, 0x95, 0x58, 0xF0, 0x7D, 0x01, 0x11, 0x9B, 0x12, 0x80, 0xD0,
-0x11, 0x77, 0x11, 0x6B, 0x11, 0x6B, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD,
-0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0x51,
-0x19, 0xE5, 0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x51, 0x19, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F,
-0x56, 0x51, 0x19, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x51, 0x19, 0xE5, 0x10, 0x5F, 0xF5,
-0x14, 0xAD, 0x11, 0x7F, 0x54, 0x11, 0x81, 0xAD, 0x12, 0x7F, 0x55, 0x11, 0x81, 0xAD, 0x13, 0x7F,
-0x56, 0x11, 0x81, 0xAD, 0x14, 0x7F, 0x57, 0x11, 0x81, 0x53, 0x91, 0xEF, 0x22, 0x7F, 0x81, 0x51,
-0x19, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x81, 0x11, 0x81, 0x7F, 0x80, 0x51, 0x19, 0xEF, 0x44, 0x80,
-0xFD, 0x7F, 0x80, 0x11, 0x81, 0x12, 0x7E, 0x55, 0x12, 0x3E, 0x11, 0xF1, 0xFB, 0x12, 0x7E, 0xB0,
-0x7F, 0x01, 0x12, 0x43, 0xA5, 0x90, 0x93, 0x87, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0xA5, 0x90,
-0x93, 0x87, 0xE0, 0x04, 0xF0, 0x91, 0x39, 0x12, 0x7B, 0x93, 0x7F, 0x80, 0x51, 0x19, 0xEF, 0x44,
-0x40, 0xFD, 0x7F, 0x80, 0x11, 0x81, 0x75, 0x28, 0xFF, 0x12, 0x60, 0x11, 0x12, 0x7E, 0x80, 0x12,
-0x86, 0x1C, 0x7F, 0x81, 0x51, 0x19, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x11, 0x81, 0x12, 0x7E,
-0xBE, 0x12, 0x8A, 0xBC, 0xE4, 0xFF, 0x02, 0x44, 0x2E, 0x12, 0x5F, 0xF7, 0x90, 0x8D, 0x06, 0xEF,
-0xF0, 0xB1, 0xDE, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0,
-0x7F, 0x17, 0x51, 0x19, 0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x11, 0x81, 0x7F, 0x16,
-0x51, 0x19, 0xEF, 0x54, 0x0F, 0x44, 0x40, 0xFD, 0x7F, 0x16, 0x11, 0x81, 0x7F, 0x38, 0x51, 0x19,
-0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x38, 0x11, 0x81, 0x02, 0x37, 0x99, 0x90, 0x8E, 0x8D, 0xE0, 0xFD,
-0x7F, 0x93, 0x11, 0x81, 0x90, 0x8E, 0x84, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7,
-0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x51, 0x19,
-0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x11, 0x81, 0x7F, 0x01, 0xF1, 0xA0, 0x7F, 0x90, 0x51, 0x19,
-0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x11, 0x81, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0xAD,
-0x07, 0x90, 0x8F, 0x32, 0xE0, 0x75, 0xF0, 0x40, 0xA4, 0xFF, 0x90, 0x95, 0x69, 0xE5, 0xF0, 0xF0,
-0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x8F, 0x33, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x95,
-0x6C, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x8F, 0x90, 0x95, 0x69, 0xE0, 0x70, 0x02, 0xA3,
-0xE0, 0x60, 0x0B, 0x90, 0x95, 0x69, 0x74, 0xFF, 0x75, 0xF0, 0xD0, 0x12, 0x08, 0xD6, 0x90, 0x8F,
-0x31, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x30, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00,
-0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0x4C, 0x51, 0x3B, 0x90, 0x8F, 0x33, 0xE0, 0x30, 0xE0, 0x6F,
-0x90, 0x95, 0x69, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E, 0x50, 0x90, 0x8F, 0x31, 0xE0, 0x54,
-0x7F, 0xFF, 0x90, 0x8F, 0x30, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02,
-0x7D, 0x01, 0x51, 0x4C, 0xE4, 0x90, 0x95, 0x6B, 0xF0, 0x90, 0x95, 0x6C, 0xE0, 0xFF, 0x90, 0x95,
-0x6B, 0xE0, 0xC3, 0x9F, 0x50, 0x39, 0x90, 0x95, 0x69, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E,
-0x50, 0x51, 0x3B, 0x90, 0x95, 0x69, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x3E, 0x50, 0x90, 0x8F,
-0x31, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x30, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00,
-0x20, 0xE0, 0x02, 0x7D, 0x01, 0x51, 0x4C, 0x90, 0x95, 0x6B, 0xE0, 0x04, 0xF0, 0x80, 0xBA, 0x22,
-0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0x11, 0x81,
-0xAD, 0x0E, 0x7F, 0x51, 0x11, 0x81, 0xAD, 0x0F, 0x7F, 0x52, 0x11, 0x81, 0xAD, 0x10, 0x7F, 0x53,
-0x01, 0x81, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38,
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50, 0x11, 0x81, 0xE4, 0xFD, 0x7F, 0x51,
-0x11, 0x81, 0xE4, 0xFD, 0x7F, 0x52, 0x11, 0x81, 0xE4, 0xFD, 0x7F, 0x53, 0x01, 0x81, 0xB1, 0xB2,
-0xB1, 0xEA, 0x12, 0x7E, 0x17, 0x12, 0x7E, 0x36, 0x80, 0xA6, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-0xFD, 0x7F, 0x54, 0x11, 0x81, 0x7D, 0xFF, 0x7F, 0x55, 0x11, 0x81, 0x7D, 0xFF, 0x7F, 0x56, 0x11,
-0x81, 0x7D, 0xFF, 0x7F, 0x57, 0x01, 0x81, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F,
-0x51, 0x19, 0xEF, 0x30, 0xE6, 0x1E, 0x90, 0x00, 0x8C, 0xE0, 0xF5, 0x26, 0x7F, 0x8D, 0x51, 0x19,
-0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x27, 0x7F, 0x8F, 0x51, 0x19, 0xEF, 0x30, 0xE0, 0x06, 0xE4, 0xFD,
-0x7F, 0x8D, 0x11, 0x81, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, 0x7F, 0xA3, 0x7D, 0x00, 0x7B,
-0x01, 0x7A, 0x8E, 0x79, 0x7F, 0x12, 0x08, 0xAA, 0x90, 0x8E, 0x82, 0x74, 0x02, 0xF0, 0x90, 0x8E,
-0x89, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x8E, 0x8E, 0xE4, 0xF0, 0xA3, 0x74,
-0x02, 0xF0, 0x90, 0x8E, 0xBA, 0xE0, 0x24, 0x04, 0x90, 0x8E, 0x98, 0xF0, 0xA3, 0x74, 0x08, 0xF0,
-0xE4, 0xFD, 0xFF, 0xF1, 0x22, 0x7D, 0x0C, 0x7F, 0x02, 0xF1, 0x22, 0x7D, 0x0C, 0x7F, 0x01, 0xF1,
-0x22, 0x90, 0x8D, 0x06, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x8E, 0x8D, 0x74, 0xDD, 0xF0, 0x80,
-0x0F, 0xEF, 0x90, 0x8E, 0x8D, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0,
-0x7F, 0x79, 0x51, 0x19, 0xEF, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0E, 0x7F, 0x28, 0x51, 0x19, 0xEF,
-0x30, 0xE2, 0x06, 0x90, 0x8E, 0xBA, 0x74, 0x02, 0xF0, 0x90, 0x8F, 0x22, 0x74, 0x05, 0xF0, 0xA3,
-0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0x90, 0x8E, 0xBA, 0xE0,
-0x24, 0x04, 0x90, 0x8E, 0x98, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x12, 0x73, 0x5A, 0x7E, 0x00, 0x7F,
-0x02, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x26, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x04, 0xE0,
-0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0x4D,
-0xE4, 0x90, 0x8F, 0x28, 0xF0, 0x22, 0x90, 0x8E, 0x85, 0xE0, 0x90, 0x94, 0xCB, 0xF0, 0x7D, 0x02,
-0x7F, 0x02, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x94, 0xEF, 0xF0, 0x14, 0x60,
-0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED, 0x54, 0x01, 0xFF, 0x90, 0x8E, 0x7F, 0xE0,
-0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0x8E, 0x86, 0xED, 0xF0, 0x80, 0x05, 0x90, 0x8E, 0x85,
-0xED, 0xF0, 0x7F, 0x8F, 0x51, 0x19, 0xEF, 0x30, 0xE4, 0x30, 0x90, 0x95, 0x94, 0xE0, 0x14, 0x60,
-0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x22, 0x90, 0x8E, 0x7F, 0xE0, 0x54, 0x01, 0xC4, 0x33,
-0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0x8E, 0x86, 0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80,
-0x07, 0x90, 0x8E, 0x85, 0xE0, 0xFD, 0x7F, 0x89, 0x11, 0x81, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12,
-0x85, 0xFD, 0x7F, 0x08, 0x51, 0x19, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x11, 0x81, 0xE4, 0xFF,
-0x90, 0x95, 0x7B, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00,
-0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x95, 0x7B, 0xE0, 0x6F, 0x60, 0x3E, 0xC3, 0x90, 0x95, 0x7D,
-0xE0, 0x94, 0x88, 0x90, 0x95, 0x7C, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44,
-0x10, 0xF0, 0x22, 0x90, 0x95, 0x7C, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E,
-0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0x95, 0x7D, 0xE0, 0x94, 0x32, 0x90, 0x95, 0x7C, 0xE0, 0x94,
-0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0x22, 0xF0, 0xE4, 0x90, 0x95,
-0x42, 0xF0, 0x90, 0x8F, 0x23, 0xE0, 0x90, 0x95, 0x43, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E,
-0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x3E, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x95, 0x42, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0x95, 0x3E,
-0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x29, 0x90, 0x8D, 0xFE, 0xE0, 0x64, 0x01, 0x70,
-0x21, 0x90, 0x8E, 0x8A, 0xF0, 0x04, 0x60, 0x1A, 0x90, 0x8E, 0x87, 0xE0, 0x44, 0x10, 0xF0, 0xE4,
-0x90, 0x95, 0x42, 0xF0, 0x90, 0x8E, 0x8B, 0x11, 0x05, 0x90, 0x8E, 0x86, 0xE0, 0x20, 0xE2, 0x02,
-0x11, 0x73, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95,
-0x96, 0xED, 0xF0, 0x90, 0x8E, 0x7F, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02,
-0x21, 0xBF, 0xEE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x21, 0xBF, 0x90, 0x8E,
-0x86, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x21, 0xBF, 0xEF, 0x70, 0x02, 0x21, 0x36, 0x24, 0xFE, 0x70,
-0x02, 0x21, 0x70, 0x24, 0xFE, 0x60, 0x47, 0x24, 0xFC, 0x70, 0x02, 0x21, 0xAA, 0x24, 0xFC, 0x60,
-0x02, 0x21, 0xBF, 0xEE, 0xB4, 0x0E, 0x02, 0x51, 0x07, 0x90, 0x8E, 0x86, 0xE0, 0x70, 0x04, 0x7F,
-0x01, 0x51, 0x2B, 0x90, 0x8E, 0x86, 0xE0, 0xB4, 0x06, 0x02, 0x31, 0xE5, 0x90, 0x8E, 0x86, 0xE0,
-0xB4, 0x04, 0x0D, 0x90, 0x95, 0x96, 0xE0, 0xFF, 0x60, 0x04, 0xF1, 0x3E, 0x80, 0x02, 0xF1, 0xD7,
-0x90, 0x8E, 0x86, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x21, 0xBF, 0xF1, 0xC9, 0x21, 0xBF, 0x90, 0x8E,
-0x86, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x2B, 0x90, 0x8E, 0x86, 0xE0, 0xB4, 0x06, 0x02, 0x31,
-0xE5, 0x90, 0x8E, 0x86, 0xE0, 0xB4, 0x0E, 0x07, 0x31, 0xC4, 0xBF, 0x01, 0x02, 0x51, 0x07, 0x90,
-0x8E, 0x86, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x21, 0xBF, 0x31, 0xC4, 0xEF, 0x64, 0x01, 0x60, 0x02,
-0x21, 0xBF, 0x51, 0x58, 0x21, 0xBF, 0x90, 0x8E, 0x86, 0xE0, 0xB4, 0x0E, 0x07, 0x31, 0xC4, 0xBF,
-0x01, 0x02, 0x51, 0x07, 0x90, 0x8E, 0x86, 0xE0, 0xB4, 0x06, 0x02, 0x31, 0xE5, 0x90, 0x8E, 0x86,
-0xE0, 0xB4, 0x0C, 0x07, 0x31, 0xC4, 0xBF, 0x01, 0x02, 0x51, 0x58, 0x90, 0x8E, 0x86, 0xE0, 0x64,
-0x04, 0x70, 0x5C, 0x12, 0x9E, 0xCE, 0xEF, 0x64, 0x01, 0x70, 0x54, 0x12, 0x64, 0xD8, 0x80, 0x4F,
-0x90, 0x8E, 0x86, 0xE0, 0xB4, 0x0E, 0x07, 0x31, 0xC4, 0xBF, 0x01, 0x02, 0x51, 0x07, 0x90, 0x8E,
-0x86, 0xE0, 0xB4, 0x06, 0x02, 0x31, 0xE5, 0x90, 0x8E, 0x86, 0xE0, 0xB4, 0x0C, 0x07, 0x31, 0xC4,
-0xBF, 0x01, 0x02, 0x51, 0x58, 0x90, 0x8E, 0x86, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x2B, 0x90,
-0x8E, 0x86, 0xE0, 0xB4, 0x04, 0x19, 0xF1, 0xBC, 0x80, 0x15, 0x90, 0x8E, 0x86, 0xE0, 0xB4, 0x0C,
-0x0E, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xF1, 0xB0, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x12, 0x9E, 0xB5, 0xBF, 0x01, 0x18, 0x90, 0x8E, 0x7F, 0xE0, 0x13, 0x13,
-0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0C, 0x90, 0x8E, 0x85, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F,
-0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x8E, 0x80, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x08, 0xE0,
-0x44, 0x40, 0xF0, 0x7D, 0x04, 0x80, 0x06, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0x12,
-0x4F, 0x22, 0xE4, 0xFD, 0xFF, 0x80, 0x46, 0x90, 0x8E, 0x80, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04,
-0x7D, 0x0C, 0x80, 0x0D, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D,
-0x04, 0x7F, 0x01, 0x12, 0x4F, 0x22, 0xE4, 0xFD, 0xFF, 0x80, 0x22, 0x90, 0x95, 0x95, 0xEF, 0xF0,
-0xF1, 0xF3, 0x90, 0x95, 0x95, 0xE0, 0x60, 0x05, 0xE4, 0xFD, 0xFF, 0x51, 0x4D, 0x7D, 0x04, 0x7F,
-0x01, 0x02, 0x4F, 0x22, 0xE4, 0xFD, 0x7F, 0x0C, 0x11, 0x77, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22,
-0xEF, 0xF0, 0x90, 0x8D, 0x05, 0xED, 0xF0, 0x22, 0x90, 0x8D, 0xFE, 0xE0, 0x64, 0x01, 0x70, 0x24,
-0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x51, 0x4D, 0x7D, 0x08, 0x7F,
-0x01, 0x51, 0xA6, 0xBF, 0x01, 0x0E, 0x90, 0x8E, 0x7F, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F,
-0x01, 0x12, 0x4F, 0x22, 0x22, 0x90, 0x8E, 0x83, 0xE0, 0x64, 0x01, 0x70, 0x14, 0x90, 0x8E, 0x81,
-0xE0, 0x54, 0x0F, 0x60, 0x04, 0x51, 0x44, 0xE1, 0x71, 0x90, 0x8E, 0x86, 0xE0, 0x70, 0x02, 0x11,
-0x73, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x50,
-0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x8D, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60,
-0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x95, 0x54, 0xF0, 0x7D, 0x26, 0x12, 0x80, 0xCB, 0xEF, 0x64,
-0x01, 0x70, 0x03, 0x12, 0x9F, 0x85, 0x90, 0x95, 0x54, 0xE0, 0xFF, 0x7D, 0x27, 0x51, 0x4D, 0x71,
-0x04, 0x80, 0x05, 0x71, 0x04, 0x12, 0x9F, 0x85, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x71, 0x90, 0x8E, 0x86, 0xE0, 0x64, 0x0C, 0x60, 0x04, 0x51,
-0x44, 0x51, 0xA2, 0x22, 0x90, 0x95, 0x50, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x90, 0x95, 0x97, 0xEF, 0xF0, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70,
-0x50, 0x90, 0x8E, 0x86, 0xE0, 0x64, 0x0E, 0x70, 0x1D, 0x90, 0x95, 0x97, 0xE0, 0x70, 0x42, 0x90,
-0x8E, 0x7F, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F,
-0x01, 0x12, 0x4F, 0x22, 0x80, 0x26, 0x90, 0x8E, 0x86, 0xE0, 0x64, 0x06, 0x70, 0x23, 0x90, 0x95,
-0x97, 0xE0, 0x60, 0x1D, 0x90, 0x8E, 0x7F, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44,
-0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x8E, 0x86, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x51,
-0x4D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB4,
-0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0xCC, 0x74, 0x18, 0xF0, 0x7E, 0x00,
-0x7F, 0x80, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xD4, 0x12, 0x08, 0xAA, 0x90, 0x01, 0xC4,
-0x74, 0x76, 0xF0, 0x74, 0x53, 0xA3, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0xFF, 0x12, 0x6B, 0x30, 0x90,
-0x93, 0xCB, 0xEF, 0xF0, 0xF9, 0xE0, 0xFE, 0x24, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0x74, 0x41, 0xF0, 0xEE, 0x24, 0x28, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x93, 0xCC, 0xE0, 0x7A, 0x00,
-0x2D, 0xFE, 0xEA, 0x3C, 0x90, 0x93, 0xD0, 0xF0, 0xA3, 0xCE, 0xF0, 0x74, 0x28, 0x29, 0xF9, 0xE4,
-0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x93, 0xB6, 0xE0, 0xFD, 0x12, 0x6D, 0x32, 0x90, 0x93, 0xD0,
-0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08,
-0xD6, 0x90, 0x93, 0xD0, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0xCE, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x93, 0xD4, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0x74, 0x5F,
-0xF0, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x90, 0x46, 0xE0, 0xFF,
-0x7E, 0x02, 0xB4, 0xFE, 0x02, 0x7E, 0xFE, 0x90, 0x93, 0xD0, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5,
-0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
-0xF5, 0x83, 0xE0, 0x90, 0x93, 0xD8, 0xF0, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08,
-0xD6, 0x90, 0x90, 0xDB, 0xE0, 0x90, 0x93, 0xB4, 0xB4, 0x01, 0x0B, 0xE0, 0x44, 0x03, 0xFC, 0xA3,
-0xE0, 0x44, 0x10, 0xFD, 0x80, 0x09, 0xE0, 0x44, 0x03, 0xFC, 0xA3, 0xE0, 0x44, 0x20, 0xFD, 0x90,
-0x93, 0xD2, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0xD9, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x12,
-0xF0, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x02, 0x12, 0x08, 0xD6, 0xEF, 0x64, 0xFE, 0x70, 0x37,
-0x90, 0x93, 0xD0, 0xA3, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03,
-0x8B, 0x40, 0x75, 0x41, 0x90, 0x75, 0x42, 0x49, 0x75, 0x43, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26,
-0x75, 0x40, 0x01, 0x75, 0x41, 0x90, 0x75, 0x42, 0x49, 0x75, 0x43, 0x02, 0x7B, 0x01, 0x7A, 0x93,
-0x79, 0xDB, 0x12, 0x35, 0x26, 0x80, 0x60, 0x90, 0x93, 0x76, 0xE0, 0xFF, 0xB4, 0x02, 0x2B, 0x90,
-0x93, 0xD0, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83,
-0xE4, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0x74, 0xFC, 0x3C, 0xF5, 0x83, 0x74, 0x20, 0xF0, 0xE4,
-0x90, 0x93, 0xDB, 0xF0, 0xA3, 0x74, 0x20, 0xF0, 0x80, 0x2D, 0xEF, 0xB4, 0x04, 0x29, 0x90, 0x93,
-0xD0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0xE4,
-0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0x74, 0xFC, 0x3E, 0xF5, 0x83, 0x74, 0x10, 0xF0, 0xE4, 0x90,
-0x93, 0xDB, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x02, 0x12, 0x08,
-0xD6, 0xE4, 0x90, 0x93, 0xCD, 0xF0, 0x90, 0x93, 0xCD, 0xE0, 0xFF, 0x24, 0x4B, 0xF5, 0x82, 0xE4,
-0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0x93, 0xD0, 0xA3, 0xE0, 0xFD, 0xEF, 0x2D, 0x24, 0x00,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0xCD, 0xE0, 0xFF, 0x24, 0x4B,
-0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0xDD, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x93, 0xCD, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x08, 0xB7, 0x90,
-0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x20,
-0x12, 0x08, 0xD6, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD0,
-0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD0, 0xE4, 0x75, 0xF0, 0x08, 0x12, 0x08,
-0xD6, 0xE4, 0x90, 0x94, 0x57, 0xF0, 0xE4, 0x90, 0x93, 0xCD, 0xF0, 0x90, 0x93, 0xCD, 0xE0, 0xFF,
-0xC3, 0x94, 0x10, 0x50, 0x1C, 0x12, 0x80, 0x7C, 0x90, 0x93, 0xCB, 0xEF, 0xF0, 0xE0, 0x24, 0x00,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x90, 0x93, 0xCD, 0xE0, 0x04, 0xF0, 0x80,
-0xDA, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xFB, 0xF0, 0x90,
-0x93, 0x7C, 0xE0, 0xFD, 0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE,
-0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xAC, 0x7B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xED, 0xFF, 0x90, 0x93,
-0x7B, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x94, 0x00, 0xFE, 0xEF, 0x78, 0x07, 0xC3, 0x33, 0xCE, 0x33,
-0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0x93, 0xCC, 0xE0, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x3E, 0xCF, 0x24,
-0x38, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0x7B, 0x63, 0xE4, 0xFD, 0x12,
-0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xD4, 0x90, 0xAC, 0xA0, 0x12, 0x45, 0xED, 0x7A, 0x93,
-0x79, 0xB7, 0x90, 0xAC, 0xA3, 0x12, 0x45, 0xED, 0x90, 0xAC, 0xA6, 0x74, 0x10, 0xF0, 0x7A, 0x90,
-0x79, 0x02, 0x12, 0x35, 0x86, 0x90, 0x94, 0x57, 0xE0, 0x04, 0xF0, 0x90, 0x06, 0x31, 0xE0, 0x30,
-0xE2, 0x0B, 0x90, 0x94, 0x57, 0xE0, 0xC3, 0x94, 0x0A, 0x50, 0x02, 0xA1, 0xC6, 0x90, 0x94, 0x57,
-0xE0, 0xC3, 0x94, 0x0A, 0x40, 0x0A, 0x90, 0x06, 0x35, 0xE0, 0x44, 0x20, 0x90, 0x06, 0x34, 0xF0,
-0xE4, 0x90, 0x93, 0xCD, 0xF0, 0x90, 0x93, 0xCD, 0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x2E, 0x12,
-0x80, 0x7C, 0x90, 0x93, 0xCB, 0xEF, 0xF0, 0x90, 0x93, 0xCD, 0xE0, 0x24, 0xB7, 0xF5, 0x82, 0xE4,
-0x34, 0x93, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0xCB, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
-0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xCD, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x90, 0x04, 0x1D,
-0xE0, 0x60, 0x2B, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0x56, 0xF0, 0x7D, 0x1D, 0x12, 0x80, 0xCB,
-0xBF, 0x01, 0x10, 0x12, 0x6A, 0x5B, 0x90, 0x93, 0xCB, 0xEF, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0x90,
-0x04, 0x25, 0xF0, 0x90, 0x94, 0x56, 0xE0, 0xFF, 0x7D, 0x1E, 0x51, 0x4D, 0x80, 0x10, 0x12, 0x6A,
-0x5B, 0x90, 0x93, 0xCB, 0xEF, 0xF0, 0x90, 0x93, 0x7B, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x04,
-0x1F, 0x74, 0x20, 0xF0, 0x90, 0x8E, 0x86, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x51, 0x2B, 0x74, 0x76,
-0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x53, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60,
-0x2F, 0x90, 0x8D, 0xFE, 0xE0, 0x64, 0x01, 0x70, 0x27, 0x90, 0x8E, 0x80, 0xE0, 0x54, 0xFE, 0xF0,
-0x7D, 0x2B, 0x7F, 0x0F, 0x51, 0x4D, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x51, 0xA2, 0xBF,
-0x01, 0x0E, 0x90, 0x8E, 0x7F, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x12, 0x4F, 0x22,
-0x22, 0x90, 0x8E, 0x7F, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B,
-0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90,
-0x95, 0x42, 0xF0, 0x90, 0x8F, 0x24, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0x95, 0x43, 0xF0, 0xE4,
-0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x11, 0x11, 0x90, 0x8E, 0x7F, 0xE0, 0x44, 0x08, 0xF0, 0x22,
-0x7D, 0x2F, 0x12, 0x4B, 0x4B, 0x7D, 0x08, 0x7F, 0x01, 0x02, 0x4F, 0x22, 0x7D, 0x2E, 0x7F, 0x6F,
-0x51, 0x4D, 0x7D, 0x02, 0x7F, 0x01, 0x02, 0x4F, 0x22, 0xF1, 0xF3, 0xE4, 0xFD, 0xFF, 0x51, 0x4D,
-0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x4F, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD,
-0xFF, 0x51, 0x4D, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x4F, 0x22, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x02,
-0x51, 0x85, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x02,
-0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4,
-0x74, 0x86, 0xF0, 0x90, 0x8F, 0x4A, 0xE0, 0xFF, 0x90, 0x8F, 0x49, 0xE0, 0xFB, 0x90, 0x8F, 0x4B,
-0xE0, 0x90, 0x95, 0x58, 0xF0, 0xE4, 0xFD, 0x12, 0x48, 0x9B, 0x7F, 0x02, 0x12, 0x4A, 0x19, 0xEF,
-0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x48, 0x81, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x02, 0x4E, 0x17,
-0xE4, 0x90, 0x93, 0x9C, 0xF0, 0x90, 0x93, 0x9C, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x40, 0x90, 0x01,
-0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03, 0x12, 0x31, 0xFC, 0x90,
-0x8E, 0x83, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x86, 0xE0, 0xFF, 0x90, 0x8E, 0x85, 0xE0, 0x6F, 0x60,
-0x02, 0x11, 0xAE, 0xC2, 0xAF, 0x12, 0x7E, 0x87, 0xBF, 0x01, 0x02, 0x11, 0x90, 0xD2, 0xAF, 0x90,
-0x93, 0x94, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0x8A, 0xE3, 0x11, 0x3D, 0x12, 0x42, 0xDD, 0x80, 0xB5,
-0x90, 0x8E, 0x7F, 0xE0, 0x30, 0xE0, 0x02, 0x11, 0x9A, 0x22, 0x90, 0x8E, 0x86, 0xE0, 0xFF, 0x60,
-0x03, 0xB4, 0x08, 0x09, 0x12, 0x9F, 0x1F, 0xBF, 0x01, 0x03, 0x12, 0x9F, 0x59, 0x22, 0x90, 0x8E,
-0x85, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x50, 0x77, 0x90, 0x8E, 0x7F, 0xE0, 0xFF, 0xC4, 0x13, 0x13,
-0x54, 0x03, 0x30, 0xE0, 0x1A, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x80,
-0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x11, 0xAE, 0xE4,
-0xFF, 0x90, 0x93, 0x8C, 0xE0, 0x30, 0xE0, 0x47, 0x90, 0x93, 0x91, 0xE0, 0xFD, 0x60, 0x40, 0x74,
-0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF,
-0x90, 0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x0B, 0xE4, 0x90, 0x93, 0x91, 0xF0, 0x90, 0x93,
-0x93, 0x04, 0xF0, 0x22, 0x90, 0x93, 0x8E, 0xE0, 0xD3, 0x9D, 0x50, 0x0A, 0x31, 0x62, 0x90, 0x93,
-0x8C, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x12, 0x52, 0xA2, 0x90, 0x93, 0x91, 0xE0, 0x04, 0xF0, 0x22,
-0x90, 0x8E, 0x7F, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x20, 0xEF, 0x54,
-0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x8E, 0x80, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0,
-0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x02, 0x11, 0xAE, 0x7F, 0x01,
-0x01, 0xE1, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0x7F, 0x01, 0x90, 0x95, 0x92, 0xEF, 0xF0, 0x90,
-0x8D, 0x06, 0xE0, 0x64, 0x02, 0x70, 0x1F, 0x90, 0x95, 0x92, 0xE0, 0xFF, 0x64, 0x01, 0x70, 0x25,
-0x90, 0x8F, 0x31, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x14, 0x90, 0x01,
-0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x22, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x95, 0x92,
-0xE0, 0xFF, 0x12, 0x4C, 0xBF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x06, 0x31,
-0xE0, 0x54, 0xEF, 0x44, 0x08, 0xF0, 0xED, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0x7C, 0x00, 0xEF, 0x24,
-0x08, 0xFF, 0xEC, 0x3E, 0x90, 0x93, 0xAF, 0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x83, 0x7D,
-0x00, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x42, 0x12, 0x08, 0xAA, 0x90, 0x93, 0xB0, 0xE0, 0x24, 0x01,
-0xFF, 0x90, 0x93, 0xAF, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x53, 0x90, 0x90, 0x43, 0xEF,
-0xF0, 0x90, 0x93, 0xB0, 0xE0, 0x24, 0x04, 0xFF, 0x90, 0x93, 0xAF, 0xE0, 0x34, 0x00, 0xFE, 0xE4,
-0xFD, 0x71, 0x53, 0x90, 0x90, 0x46, 0xEF, 0xF0, 0x90, 0x93, 0xB0, 0xE0, 0x24, 0x05, 0xFF, 0x90,
-0x93, 0xAF, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x53, 0x90, 0x90, 0x47, 0xEF, 0xF0, 0x90,
-0x93, 0xB0, 0xE0, 0x24, 0x06, 0xFF, 0x90, 0x93, 0xAF, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71,
-0x53, 0x90, 0x90, 0x48, 0xEF, 0xF0, 0x90, 0x93, 0xB0, 0xE0, 0x24, 0x07, 0xFF, 0x90, 0x93, 0xAF,
-0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x53, 0x90, 0x90, 0x49, 0xEF, 0xF0, 0x90, 0x93, 0xB0,
-0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0xAF, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x53, 0x90,
-0x90, 0x4A, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAE, 0xF0, 0x90, 0x93, 0xAE, 0xE0, 0xFF, 0xC3, 0x94,
-0x08, 0x50, 0x24, 0x90, 0x93, 0xB0, 0xE0, 0x24, 0x09, 0xFD, 0x90, 0x93, 0xAF, 0xE0, 0x71, 0x46,
-0x90, 0x93, 0xAE, 0xE0, 0x24, 0x4B, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xEF, 0xF0, 0x90,
-0x93, 0xAE, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0xE4, 0x90, 0x93, 0xAE, 0xF0, 0x90, 0x93, 0xAE, 0xE0,
-0xFF, 0xC3, 0x94, 0x20, 0x50, 0x24, 0x90, 0x93, 0xB0, 0xE0, 0x24, 0x63, 0xFD, 0x90, 0x93, 0xAF,
-0xE0, 0x71, 0x46, 0x90, 0x93, 0xAE, 0xE0, 0x24, 0xA5, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83,
-0xEF, 0xF0, 0x90, 0x93, 0xAE, 0xE0, 0x04, 0xF0, 0x80, 0xD2, 0x90, 0x90, 0x47, 0xE0, 0xFE, 0xA3,
-0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x93, 0xAC, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x30, 0xE3, 0x0C, 0x7F,
-0x01, 0x31, 0x6A, 0x90, 0x01, 0xC7, 0x74, 0x03, 0xF0, 0x80, 0x3F, 0x90, 0x93, 0xAC, 0xA3, 0xE0,
-0xFF, 0x7C, 0x00, 0x54, 0x07, 0xFD, 0x64, 0x01, 0x60, 0x05, 0xED, 0x64, 0x02, 0x70, 0x2B, 0xED,
-0x64, 0x02, 0x4C, 0x70, 0x25, 0xEF, 0x54, 0x30, 0xFF, 0xE4, 0xC4, 0xF8, 0x54, 0xF0, 0xC8, 0xEF,
-0xC4, 0x54, 0x0F, 0x48, 0x90, 0x90, 0xDB, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xE4, 0xFD, 0x12, 0xA0,
-0x7D, 0x90, 0x06, 0x31, 0xE0, 0x54, 0xF7, 0x44, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF,
-0x22, 0x90, 0x93, 0xA8, 0xE0, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA6, 0xE0,
-0x34, 0x00, 0xCD, 0x24, 0x10, 0xCD, 0x34, 0x00, 0xFC, 0x7E, 0x00, 0xED, 0x2F, 0xFF, 0xEE, 0x3C,
-0xFE, 0xE4, 0xFD, 0xAB, 0x07, 0xAA, 0x06, 0xED, 0x2B, 0xFB, 0xE4, 0x3A, 0xFA, 0xC3, 0x90, 0x8D,
-0xF8, 0xE0, 0x9B, 0x90, 0x8D, 0xF7, 0xE0, 0x9A, 0x50, 0x13, 0xA3, 0xE0, 0x24, 0x01, 0xFF, 0x90,
-0x8D, 0xF7, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xEB, 0x9F, 0xFB, 0xEA, 0x9E, 0xFA, 0xEA, 0x90, 0xFD,
-0x11, 0xF0, 0xAF, 0x03, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFF,
-0x22, 0x90, 0x93, 0xAA, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0xA8, 0xEE, 0xF0, 0xA3, 0xEF,
-0xF0, 0xE4, 0x90, 0x93, 0xCE, 0xF0, 0xEF, 0x24, 0x24, 0xFF, 0xE4, 0x3E, 0xFE, 0xC0, 0x06, 0x90,
-0x93, 0xAB, 0xE0, 0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAA, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD8, 0xF0,
-0xA3, 0xCE, 0xF0, 0xD0, 0x06, 0xE4, 0xFB, 0xFA, 0xFD, 0xD1, 0x57, 0x90, 0x93, 0xCF, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x4E, 0x60, 0x52, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x93, 0xCF, 0xE0, 0x34, 0x00,
-0xFE, 0xE4, 0xFD, 0x71, 0x53, 0x90, 0x93, 0xAD, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAC, 0xF0, 0x90,
-0x93, 0xAD, 0xE0, 0xFF, 0x90, 0x93, 0xAC, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x2B, 0x90, 0x93, 0xD0,
-0xE0, 0x24, 0x02, 0xFD, 0x90, 0x93, 0xCF, 0xE0, 0x34, 0x00, 0xFC, 0xEE, 0x7E, 0x00, 0x2D, 0x71,
-0x4D, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0,
-0x90, 0x93, 0xAC, 0xE0, 0x04, 0xF0, 0x80, 0xC7, 0x90, 0x93, 0xA9, 0xE0, 0x24, 0x24, 0xFF, 0x90,
-0x93, 0xA8, 0xE0, 0x34, 0x00, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAB, 0xE0, 0x24, 0xDC, 0xFE, 0x90,
-0x93, 0xAA, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD8, 0xF0, 0xA3, 0xCE, 0xF0, 0xD0, 0x06, 0x7B, 0x03,
-0xD1, 0x53, 0x90, 0x93, 0xCF, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xA9, 0xE0, 0x24, 0x22,
-0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4,
-0xFD, 0x71, 0x53, 0xEF, 0x20, 0xE4, 0x02, 0xA1, 0xBF, 0x90, 0x93, 0xCE, 0xE0, 0x04, 0xF0, 0x90,
-0x93, 0xA9, 0xE0, 0x24, 0x24, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x34, 0x00, 0xFE, 0xC0, 0x06, 0x90,
-0x93, 0xAB, 0xE0, 0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAA, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD8, 0xF0,
-0xA3, 0xCE, 0xF0, 0xD0, 0x06, 0x7B, 0x30, 0xD1, 0x53, 0x90, 0x93, 0xCF, 0xEE, 0xF0, 0xA3, 0xEF,
-0xF0, 0x4E, 0x60, 0x69, 0xE0, 0x24, 0x08, 0xFF, 0x90, 0x93, 0xCF, 0xE0, 0x34, 0x00, 0xFE, 0xE4,
-0xFD, 0x71, 0x53, 0x90, 0x93, 0xD2, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAC, 0xF0, 0x90, 0x93, 0xD2,
-0xE0, 0xFF, 0x90, 0x93, 0xAC, 0xE0, 0xC3, 0x9F, 0x50, 0x43, 0x90, 0x93, 0xD0, 0xE0, 0x24, 0x0D,
-0xFF, 0x90, 0x93, 0xCF, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x53, 0x90, 0x93, 0xD1, 0xEF,
-0xF0, 0xBF, 0x02, 0x09, 0x90, 0x93, 0xCE, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x0E, 0x90, 0x93, 0xD1,
-0xE0, 0xB4, 0x04, 0x07, 0x90, 0x93, 0xCE, 0xE0, 0x24, 0x40, 0xF0, 0x90, 0x93, 0xCF, 0xE4, 0x75,
-0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAC, 0xE0, 0x04, 0xF0, 0x80, 0xB0, 0x90, 0x93, 0xA9,
-0xE0, 0x24, 0x24, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0x34, 0x00, 0xFE, 0xC0, 0x06, 0x90, 0x93, 0xAB,
-0xE0, 0x24, 0xDC, 0xFE, 0x90, 0x93, 0xAA, 0xE0, 0x34, 0xFF, 0x90, 0x93, 0xD8, 0xF0, 0xA3, 0xCE,
-0xF0, 0xD0, 0x06, 0x7B, 0xDD, 0x7A, 0x00, 0x7D, 0x01, 0xD1, 0x57, 0x90, 0x93, 0xCF, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x4E, 0x60, 0x6E, 0xE0, 0x24, 0x0C, 0xFF, 0x90, 0x93, 0xCF, 0xE0, 0x34, 0x00,
-0xFE, 0xE4, 0xFD, 0x71, 0x53, 0x90, 0x93, 0xD2, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAC, 0xF0, 0x90,
-0x93, 0xD2, 0xE0, 0xFF, 0x90, 0x93, 0xAC, 0xE0, 0xC3, 0x9F, 0x50, 0x48, 0x90, 0x93, 0xD0, 0xE0,
-0x24, 0x11, 0xFF, 0x90, 0x93, 0xCF, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x53, 0x90, 0x93,
-0xD1, 0xEF, 0xF0, 0xBF, 0x02, 0x09, 0x90, 0x93, 0xCE, 0xE0, 0x24, 0x02, 0xF0, 0x80, 0x0E, 0x90,
-0x93, 0xD1, 0xE0, 0xB4, 0x04, 0x07, 0x90, 0x93, 0xCE, 0xE0, 0x24, 0x04, 0xF0, 0x90, 0x93, 0xCF,
-0xE4, 0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAC, 0xE0, 0x04, 0xF0, 0x80, 0xB0, 0xE4,
-0x90, 0x93, 0xCE, 0xF0, 0x90, 0x91, 0x32, 0xE0, 0x90, 0x04, 0xFD, 0xF0, 0xE4, 0x90, 0x93, 0xAC,
-0xF0, 0x90, 0x91, 0x32, 0xE0, 0xFF, 0x90, 0x93, 0xAC, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x73, 0x74,
-0x42, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0xAD, 0xE0, 0xFE,
-0x6F, 0x70, 0x57, 0x90, 0x04, 0xFC, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0xAC, 0xE0, 0x24, 0x52, 0xF5,
-0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0xCE, 0xE0, 0xFD, 0x4F, 0x60, 0x04,
-0xED, 0x5F, 0x60, 0x36, 0xEE, 0xFF, 0x7E, 0x00, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAC, 0xE0,
-0x75, 0xF0, 0x20, 0xA4, 0x24, 0x72, 0xF9, 0x74, 0x91, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x78, 0xAE,
-0x7C, 0x93, 0x7D, 0x01, 0xD0, 0x07, 0xD0, 0x06, 0x12, 0x47, 0xA2, 0xEF, 0x70, 0x0C, 0x90, 0x01,
-0xC7, 0x74, 0x55, 0xF0, 0x7F, 0x01, 0x31, 0x6A, 0xF1, 0xC3, 0x90, 0x93, 0xAC, 0xE0, 0x04, 0xF0,
-0xA1, 0xD1, 0x22, 0x7A, 0x00, 0xE4, 0xFD, 0x90, 0x93, 0xD3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3,
-0xED, 0xF0, 0xA3, 0xEA, 0xF0, 0xA3, 0xEB, 0xF0, 0xC3, 0x90, 0x93, 0xD9, 0xE0, 0x94, 0x01, 0x90,
-0x93, 0xD8, 0xE0, 0x94, 0x00, 0x50, 0x02, 0xE1, 0x04, 0xE4, 0x90, 0x93, 0xDC, 0xF0, 0xA3, 0xF0,
-0x90, 0x93, 0xD3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFD, 0x71, 0x53, 0x90, 0x93, 0xD6, 0xE0,
-0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x70, 0x23, 0x90, 0x93, 0xD4, 0xE0, 0x24, 0x02, 0xFF, 0x90, 0x93,
-0xD3, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xD5, 0xE0, 0xFD, 0xF1, 0xEA, 0xBF, 0x01, 0x09, 0x90,
-0x93, 0xD3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x80, 0x00, 0x90, 0x93, 0xD4, 0xE0, 0x24, 0x01,
-0xFF, 0x90, 0x93, 0xD3, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x71, 0x53, 0x7E, 0x00, 0x90, 0x93,
-0xDA, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x02, 0xFF, 0xEE, 0x33, 0xFE, 0x90, 0x93, 0xD3, 0x8F,
-0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xDC, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xD8,
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x93, 0xDD, 0xE0, 0x9F, 0x90, 0x93, 0xDC, 0xE0, 0x9E,
-0x50, 0x02, 0xC1, 0x80, 0xE4, 0xFE, 0xFF, 0x22, 0x90, 0x93, 0xA8, 0xED, 0xF0, 0xA3, 0xEB, 0xF0,
-0x90, 0x93, 0xA6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAB, 0xF0, 0xFD, 0x71, 0x53,
-0xEF, 0x54, 0x0C, 0x64, 0x08, 0x60, 0x02, 0xE1, 0xBD, 0x90, 0x93, 0xA6, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0xA3, 0xE0, 0x24, 0x06, 0xFD, 0x71, 0x53, 0xEF, 0x64, 0x88, 0x60, 0x02, 0xE1, 0xBD, 0x90,
-0x93, 0xA6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x24, 0x07, 0xFD, 0x71, 0x53, 0xEF, 0x64,
-0x8E, 0x70, 0x6A, 0x90, 0x93, 0xAB, 0x04, 0xF0, 0x90, 0x93, 0xA6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-0x90, 0x93, 0xA9, 0xE0, 0xFD, 0x90, 0x93, 0xA8, 0xE0, 0x2D, 0x04, 0xFD, 0x71, 0x53, 0xEF, 0x64,
-0x03, 0x70, 0x4A, 0x90, 0x93, 0xA6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xA9, 0xE0, 0xFD,
-0x90, 0x93, 0xA8, 0xE0, 0x2D, 0x24, 0x06, 0xFD, 0x71, 0x53, 0xEF, 0x30, 0xE3, 0x07, 0x90, 0x01,
-0xC7, 0x74, 0x01, 0x80, 0x20, 0x90, 0x8F, 0x2D, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0,
-0x0F, 0x90, 0x93, 0xA6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x31, 0xA6, 0x80, 0x0D,
-0x90, 0x01, 0xC7, 0x74, 0x02, 0xF0, 0x90, 0x8F, 0x35, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0xAB,
-0xE0, 0xFF, 0x22, 0x90, 0x8F, 0x2D, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x06, 0x12, 0x86,
-0x70, 0x12, 0x67, 0x6E, 0x22, 0xF1, 0xD9, 0x80, 0xEA, 0x90, 0x8F, 0x2D, 0xE0, 0xFF, 0xC4, 0x13,
-0x13, 0x54, 0x03, 0x30, 0xE0, 0x03, 0x12, 0xA7, 0x84, 0x22, 0xED, 0x14, 0x60, 0x06, 0x04, 0x70,
-0x03, 0x7F, 0x01, 0x22, 0x7F, 0x01, 0x22, 0x7F, 0xF4, 0x12, 0x4A, 0x19, 0xEF, 0x20, 0xE5, 0x0E,
-0x7F, 0xF4, 0x12, 0x4A, 0x19, 0xEF, 0x7F, 0x01, 0x20, 0xE4, 0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03,
-0x22, 0x75, 0xE8, 0x03, 0x75, 0xA8, 0x85, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x44,
-0xDE, 0x90, 0x93, 0xA5, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x60, 0xE9, 0xC2,
-0xAF, 0x30, 0xE1, 0x05, 0x54, 0xFD, 0xF0, 0x11, 0xCA, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01,
-0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54, 0xFB, 0xF0, 0x11, 0x78, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D,
-0x01, 0xE0, 0xFF, 0x30, 0xE4, 0x0C, 0x54, 0xEF, 0xF0, 0x12, 0x8D, 0x91, 0xBF, 0x01, 0x03, 0x12,
-0x92, 0x0E, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x30, 0xE7, 0x06, 0x54, 0x7F,
-0xF0, 0x12, 0x89, 0xB5, 0xD2, 0xAF, 0x80, 0xB0, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4,
-0xFF, 0x90, 0x8D, 0xF6, 0xE0, 0xFE, 0x90, 0x8D, 0xF5, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01,
-0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x2C, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5F,
-0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x31, 0x2E, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90,
-0x8D, 0xF5, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05,
-0xE4, 0x90, 0x8D, 0xF5, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x90, 0x8D, 0x5E, 0xE0, 0xFF, 0x90, 0x8D, 0x5D, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80,
-0x02, 0x7F, 0x00, 0xEF, 0x70, 0x43, 0x90, 0x8D, 0x5D, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x8D,
-0x0D, 0x12, 0x45, 0xD8, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x0E, 0xF9, 0x74, 0x8D,
-0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x31, 0xA4, 0x90, 0x8D, 0x5D, 0xE0, 0x04, 0xF0, 0xE0,
-0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0x5D, 0xF0, 0x12,
-0x7A, 0x35, 0x90, 0x8D, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x61, 0x12, 0x45, 0xED, 0x7F, 0x96, 0x7E, 0x02, 0x12,
-0x7B, 0xFF, 0xEF, 0x60, 0x5A, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00,
-0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x95, 0x64,
-0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x95, 0x64, 0xE0, 0xFD, 0x90, 0x02, 0x94,
-0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x61, 0x12, 0x45, 0xE4, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2,
-0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x7C, 0x55, 0x90, 0x95, 0x64, 0xE0, 0x24, 0x18, 0xFF,
-0x90, 0x95, 0x61, 0x12, 0x45, 0xE4, 0x12, 0x7C, 0xB0, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xED, 0x90, 0x93, 0xA6, 0xEF, 0xF0, 0x12,
-0x45, 0xF6, 0x61, 0xEF, 0x00, 0x61, 0xF8, 0x01, 0x62, 0x01, 0x02, 0x62, 0x0A, 0x03, 0x62, 0x13,
-0x04, 0x62, 0x1B, 0x12, 0x62, 0x23, 0x14, 0x62, 0x2C, 0x20, 0x62, 0x35, 0x21, 0x62, 0x3E, 0x23,
-0x62, 0x46, 0x25, 0x62, 0x4E, 0x27, 0x62, 0x5F, 0x80, 0x62, 0x56, 0x81, 0x62, 0x68, 0x82, 0x62,
-0x71, 0x83, 0x62, 0x7A, 0x84, 0x62, 0x8C, 0x86, 0x62, 0x83, 0x88, 0x00, 0x00, 0x62, 0x94, 0x90,
-0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x78, 0x01, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x73,
-0x7B, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x78, 0x4D, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4,
-0x02, 0x8B, 0xD8, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0xA1, 0x3B, 0x90, 0x93, 0xA7, 0x12, 0x45,
-0xE4, 0x41, 0xA4, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x78, 0x90, 0x90, 0x93, 0xA7, 0x12,
-0x45, 0xE4, 0x02, 0x78, 0x9F, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x79, 0xF1, 0x90, 0x93,
-0xA7, 0x12, 0x45, 0xE4, 0xE1, 0xD6, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0xE1, 0xDE, 0x90, 0x93,
-0xA7, 0x12, 0x45, 0xE4, 0x80, 0x62, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x9B, 0xBC, 0x90,
-0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x8E, 0x2E, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x9D,
-0x15, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x9D, 0x2F, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4,
-0x02, 0x9D, 0x91, 0x90, 0x93, 0xA7, 0x12, 0x45, 0xE4, 0x02, 0x9D, 0xF3, 0x90, 0x93, 0xA7, 0x12,
-0x45, 0xE4, 0x61, 0x7C, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0xA6, 0xE0, 0x90,
-0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8D, 0xF9, 0xF0, 0xBF, 0x01, 0x08, 0x12,
-0x7D, 0x29, 0xE4, 0x90, 0x8D, 0xF9, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0x8F,
-0x29, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x2A, 0xF0,
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x2B, 0xF0, 0x90, 0x8F, 0x2A, 0xE0, 0x90, 0x8F,
-0x2C, 0xF0, 0x90, 0x8F, 0x29, 0xE0, 0x54, 0x01, 0xFF, 0xAC, 0x07, 0xEF, 0x54, 0x01, 0xFE, 0x90,
-0x8F, 0x29, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01, 0x11, 0xE4, 0xF0,
-0x7D, 0x10, 0x7F, 0x03, 0xF1, 0xF5, 0x90, 0x8F, 0x2B, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x74,
-0x03, 0xF0, 0x7D, 0x10, 0xFF, 0xF1, 0xBD, 0x02, 0x57, 0xC9, 0x90, 0x8F, 0x29, 0xE0, 0x30, 0xE0,
-0x41, 0x90, 0x8F, 0x2B, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x8F, 0x2C, 0xE0, 0x60, 0x05, 0x14,
-0xF0, 0x02, 0x57, 0xB0, 0x90, 0x8F, 0x2A, 0xE0, 0x14, 0x90, 0x8F, 0x2C, 0xF0, 0x90, 0x05, 0x73,
-0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x51, 0xE9, 0x71, 0x63, 0x7D, 0x01, 0x7F, 0x02, 0x71, 0x67, 0x90,
-0x8D, 0xFA, 0xE0, 0x30, 0xE0, 0x0C, 0x90, 0x95, 0x45, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01,
-0x91, 0x3A, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74,
-0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90,
-0x8D, 0xFA, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F,
-0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFC, 0xEF, 0x54, 0xFB, 0x4C, 0xFF, 0x90, 0x8D,
-0xFA, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06,
-0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x8D, 0xFB, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xAE,
-0x05, 0xED, 0x2F, 0x90, 0x8D, 0xFC, 0xF0, 0x90, 0x8D, 0xFA, 0xE0, 0xFF, 0x20, 0xE0, 0x08, 0x13,
-0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0A, 0x90, 0x06, 0x31, 0xE0, 0x44, 0x40, 0xF0, 0x12, 0xA4,
-0x58, 0x90, 0x8D, 0xFA, 0xE0, 0xFF, 0x30, 0xE0, 0x3C, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x01, 0xF0,
-0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F, 0xF0, 0xEF, 0x13,
-0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0D, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0xCE,
-0x74, 0x01, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x71, 0x67, 0x90, 0x95, 0x45, 0x12, 0x08, 0x79, 0x00,
-0x00, 0x27, 0x10, 0x91, 0x3A, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x95, 0x49, 0xF0, 0x7F,
-0x03, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x44, 0xEF, 0xF0, 0x12, 0x86, 0x70,
-0x90, 0x95, 0x45, 0x12, 0x45, 0xC0, 0x78, 0x10, 0x12, 0x08, 0x47, 0xAB, 0x07, 0x90, 0x95, 0x45,
-0x12, 0x45, 0xC0, 0x78, 0x08, 0x12, 0x08, 0x47, 0x90, 0x95, 0x42, 0xEF, 0xF0, 0x90, 0x95, 0x45,
-0x12, 0x45, 0xC0, 0x90, 0x95, 0x43, 0xEF, 0xF0, 0x7D, 0x01, 0x7F, 0x50, 0x7E, 0x01, 0x12, 0x50,
-0x11, 0x90, 0x95, 0x44, 0xE0, 0xFF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, 0xE4, 0x34,
-0x94, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0x95, 0x49, 0xE0, 0xFE, 0xEF, 0x75, 0xF0, 0x0A, 0xA4,
-0x24, 0x69, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0x95, 0x44, 0xE0, 0x75,
-0xF0, 0x0A, 0xA4, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x08, 0x79, 0x00,
-0x00, 0x00, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x50, 0x43, 0x90, 0x8E, 0x89, 0xE0, 0x14,
-0x90, 0x05, 0x73, 0xF0, 0x71, 0x63, 0x61, 0x1A, 0x7D, 0x2D, 0x12, 0x80, 0xCB, 0x90, 0x01, 0x37,
-0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x71, 0x67, 0x12, 0x4B, 0x50, 0xE4, 0xFD, 0x7F, 0x01, 0x02,
-0x4F, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78, 0xFF, 0x71,
-0x67, 0x7D, 0x02, 0x7F, 0x03, 0x71, 0x67, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0, 0x90, 0x8E,
-0x8E, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x8D, 0xFE, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x8E,
-0x80, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x8E, 0x86, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01, 0x7F, 0x04,
-0x02, 0x50, 0x77, 0x90, 0x8E, 0x80, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x93, 0xAA, 0x12, 0x45,
-0xED, 0x12, 0x7B, 0xE5, 0x90, 0x93, 0xAA, 0x12, 0x45, 0xE4, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01,
-0xFE, 0x90, 0x93, 0x8C, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x2C, 0x90,
-0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x93, 0x8D, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90,
-0x93, 0x8E, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x04, 0xFF, 0x90, 0x93, 0x8C, 0xE0, 0x54, 0xFB, 0x4F,
-0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x93, 0x8F, 0xF0, 0x22, 0xEF, 0x70, 0x4E, 0x7D,
-0x78, 0x7F, 0x02, 0xB1, 0xE9, 0x7D, 0x02, 0x7F, 0x03, 0xB1, 0xE9, 0x7D, 0xC8, 0x7F, 0x02, 0xF1,
-0xBD, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8D, 0xFE, 0xE0,
-0x70, 0x15, 0x12, 0x57, 0xF3, 0x12, 0x57, 0xD7, 0x90, 0x8E, 0x7F, 0xE0, 0x54, 0xF7, 0xF0, 0x54,
-0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x50, 0x77, 0x90, 0x8E,
-0x7F, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x22, 0x81, 0xF2, 0x7D,
-0x02, 0x7F, 0x02, 0xB1, 0xE9, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE, 0xED,
-0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0,
-0x22, 0x90, 0x93, 0x92, 0xE0, 0x04, 0xF0, 0x90, 0x8E, 0x86, 0xE0, 0x64, 0x02, 0x60, 0x23, 0x12,
-0x72, 0x9B, 0x90, 0x8E, 0x80, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x14, 0x90, 0x8E,
-0x89, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0A, 0xF1, 0xE6, 0xB1, 0xDF, 0x90, 0x8E, 0x8A, 0xE0,
-0x14, 0xF0, 0x22, 0xEF, 0x60, 0x55, 0x90, 0x93, 0x78, 0xE0, 0xFF, 0x60, 0x03, 0x12, 0x90, 0x09,
-0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00,
-0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0,
-0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x12, 0x4B, 0x4B, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x12,
-0x8C, 0xFD, 0xF1, 0xA3, 0x12, 0x57, 0xF3, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0x4D, 0x12, 0x9E, 0x03,
-0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x61, 0x67, 0x7D, 0x08, 0xE4, 0xFF, 0xB1,
-0xE9, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x12,
-0x8D, 0xE1, 0x12, 0x5F, 0xD5, 0x7E, 0x00, 0x7F, 0x1F, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79,
-0x2D, 0x12, 0x08, 0xAA, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0x12, 0x8D, 0xCE, 0x12, 0xA7,
-0x84, 0x90, 0x8D, 0x06, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x3A, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00,
-0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4B, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00,
-0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x49, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00,
-0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x8F, 0x4A, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02,
-0xFB, 0xF0, 0x80, 0x6A, 0xEF, 0x64, 0x01, 0x70, 0x2D, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30,
-0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4B, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30,
-0xE1, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x49, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30,
-0xE2, 0x02, 0x7F, 0x01, 0x80, 0x33, 0x90, 0x8D, 0x06, 0xE0, 0x64, 0x03, 0x70, 0x30, 0x90, 0xFD,
-0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4B, 0xEF, 0xF0, 0x90, 0xFD,
-0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x49, 0xEF, 0xF0, 0x90, 0xFD,
-0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90, 0x8F, 0x4A, 0xEF, 0xF0, 0x90, 0x8F,
-0x2D, 0xE0, 0x54, 0xEF, 0xF0, 0xE4, 0x90, 0x91, 0x32, 0xF0, 0x90, 0x91, 0x3A, 0x12, 0x08, 0x79,
-0x00, 0x00, 0x00, 0x00, 0x90, 0x91, 0x3E, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x91,
-0x36, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x93, 0x72, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x00, 0x00, 0x22, 0xF1, 0xD5, 0x90, 0x8F, 0x2D, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C,
-0x90, 0x95, 0x45, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x14, 0x91, 0x3A, 0x22, 0x74, 0x1D, 0x2F,
-0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01,
-0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x22, 0x12, 0x06, 0x89, 0x90, 0x8E, 0x8D, 0xF0, 0x22, 0x12, 0x06,
-0x89, 0x90, 0x8F, 0x28, 0xF0, 0x22, 0xEF, 0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74,
-0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82,
-0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x0A, 0x90, 0x01, 0xC4, 0xED, 0xF0,
-0x74, 0x68, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07,
-0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 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, 0x90, 0x01, 0xC4, 0x74, 0x3B, 0xF0, 0x74, 0x68,
-0xA3, 0xF0, 0x12, 0x4B, 0x8D, 0xE5, 0x14, 0x30, 0xE7, 0x02, 0x11, 0x92, 0x74, 0x3B, 0x04, 0x90,
-0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 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, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x4A, 0x19, 0xEF, 0x20,
-0xE6, 0x0E, 0x7F, 0x05, 0x12, 0x4A, 0x19, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x05, 0x12, 0x48, 0x81,
-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, 0x90, 0x01,
-0xC4, 0x74, 0xB1, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 0x12, 0x7E, 0xC9, 0xE5, 0x19, 0x30, 0xE3, 0x02,
-0x51, 0x12, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x31, 0xFE, 0xE5, 0x19, 0x30, 0xE5, 0x03, 0x12, 0x7E,
-0xF6, 0xE5, 0x1B, 0x30, 0xE0, 0x02, 0x31, 0x55, 0xE5, 0x1B, 0x30, 0xE1, 0x03, 0x12, 0x7F, 0x32,
-0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12, 0x66, 0x01, 0xE5, 0x1B, 0x30, 0xE3, 0x03, 0x12, 0x80, 0x15,
-0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12, 0x80, 0x31, 0xE5, 0x1B, 0x30, 0xE5, 0x02, 0x51, 0x1E, 0xE5,
-0x1B, 0x30, 0xE6, 0x03, 0x12, 0x80, 0x60, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0x57, 0xEA, 0x74,
-0xB1, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x68, 0xA3, 0xF0, 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, 0xE4, 0xF5, 0x58, 0x90, 0x8E, 0x83, 0xE0, 0x70, 0x02, 0x21, 0xFD,
-0x90, 0x8D, 0xFE, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x21, 0xFD, 0x90, 0x8E, 0x7F, 0xE0, 0x30, 0xE0,
-0x1D, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3,
-0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xB8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x8E,
-0x81, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x8E,
-0x8A, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x8E, 0x8C, 0xE0, 0x60, 0x0E, 0xEF, 0x70,
-0x08, 0x90, 0x8E, 0x89, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x58, 0x01, 0xE5, 0x58, 0x60, 0x3D,
-0x90, 0x8E, 0x87, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x8E, 0x8C, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x0B,
-0xE4, 0x90, 0x95, 0x42, 0xF0, 0x90, 0x8E, 0x8C, 0xE0, 0x80, 0x0F, 0xE4, 0x90, 0x95, 0x42, 0xF0,
-0x90, 0x8E, 0x8C, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x8E, 0x8B, 0xE0, 0x2F,
-0x12, 0x50, 0x06, 0x90, 0x8E, 0x86, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x50, 0x73, 0x22, 0x12, 0x7A,
-0x35, 0x7F, 0x02, 0x8F, 0x59, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x8D, 0x01, 0xE0, 0x45, 0x59,
-0xF0, 0x22, 0x90, 0x8F, 0x2D, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x51, 0x03, 0x22, 0x90, 0x8D,
-0xFE, 0xE0, 0xB4, 0x01, 0x15, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x0F, 0x90, 0x8E, 0x81, 0xE0, 0x54,
-0x0F, 0x64, 0x02, 0x60, 0x02, 0x80, 0x04, 0x12, 0x52, 0xF5, 0x22, 0x90, 0x04, 0x1D, 0xE0, 0x70,
-0x19, 0x90, 0x8D, 0x08, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x51, 0x64, 0x90, 0x95, 0x8A, 0xEE,
-0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93, 0x7B, 0xE0, 0xFF,
-0x7B, 0x18, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x79, 0xED, 0xF0,
-0xA3, 0xEB, 0xF0, 0x90, 0x95, 0x78, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x71, 0x30, 0x7C, 0x00, 0xAD,
-0x07, 0x90, 0x95, 0x78, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x95, 0x79, 0xE0, 0x60, 0x0E, 0x74,
-0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74,
-0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x74, 0x21, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3,
-0x94, 0x03, 0x74, 0x10, 0x40, 0x0D, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x04,
-0xF0, 0x80, 0x0A, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0x74,
-0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x95, 0x7A,
-0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12, 0x2F, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54,
-0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8D, 0xFC, 0xE0, 0xFF,
-0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED,
-0xF0, 0xAF, 0x06, 0x22, 0x90, 0x93, 0x83, 0xE0, 0xFF, 0x71, 0x30, 0x90, 0x93, 0xAA, 0xEF, 0xF0,
-0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFD, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x2C, 0x91,
-0x6C, 0x90, 0x93, 0xAA, 0xE0, 0x2F, 0x24, 0x30, 0xA3, 0xF0, 0xE0, 0xFD, 0x24, 0x04, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x05, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0xE6, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x93, 0xAB, 0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89,
-0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xE8, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAB,
-0xE0, 0x24, 0x14, 0xF0, 0xE0, 0xFD, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x7C, 0x00, 0x24, 0x00,
-0xFF, 0xEC, 0x3E, 0x90, 0x90, 0xEC, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x84, 0xE0, 0xFF, 0x71,
-0x30, 0x90, 0x93, 0xAA, 0xEF, 0xF0, 0x90, 0x90, 0xE2, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x4E, 0x60,
-0x1C, 0x90, 0x93, 0xAA, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41,
-0x89, 0x42, 0x8F, 0x43, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xF0, 0x12, 0x35, 0x26, 0x90, 0x93, 0x85,
-0xE0, 0xFF, 0x71, 0x30, 0x90, 0x93, 0xAA, 0xEF, 0xF0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75,
-0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x90, 0x90, 0xE4, 0xA3, 0xE0, 0xF5, 0x43, 0x7B, 0x01, 0x7A,
-0x91, 0x79, 0x10, 0x02, 0x35, 0x26, 0xEF, 0x60, 0x05, 0x12, 0xA7, 0xB9, 0x71, 0x44, 0x22, 0xA3,
-0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFD, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
-0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFE, 0xEF, 0x30, 0xE7, 0x04, 0x7C, 0x02, 0x80, 0x02, 0xE4,
-0xFC, 0xED, 0x30, 0xE6, 0x08, 0xAF, 0x03, 0xF1, 0x59, 0xAE, 0x07, 0x80, 0x02, 0xE4, 0xFE, 0xEC,
-0x24, 0x18, 0x2E, 0xFF, 0x22, 0xE4, 0x90, 0x94, 0x5B, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x32, 0xE0,
-0x44, 0x20, 0xF0, 0xF1, 0xAD, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x31, 0x90, 0x93, 0x83, 0xE0,
-0xFF, 0x7B, 0x08, 0x7D, 0x01, 0x51, 0x64, 0x90, 0x94, 0x58, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
-0x94, 0x58, 0x91, 0x4F, 0x90, 0x94, 0x5A, 0xEF, 0xF0, 0x90, 0x94, 0x58, 0xA3, 0xE0, 0x24, 0x28,
-0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xE4, 0xFD, 0xB1, 0x32, 0x90, 0x94, 0x5A, 0xE0, 0xFF,
-0x90, 0x94, 0x59, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0x58, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF,
-0x34, 0x00, 0xFE, 0x90, 0x94, 0x5B, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0xA8, 0x7C, 0x90, 0x94, 0x5B,
-0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x93, 0x83, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x99, 0x00, 0x90,
-0x94, 0x5B, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x93, 0x7F, 0xE0, 0xFB, 0x7F, 0x11, 0x12, 0x99,
-0x00, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x90, 0x90, 0xEE, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08,
-0xD6, 0x22, 0x90, 0x95, 0x4D, 0xED, 0xF0, 0x90, 0x95, 0x4A, 0x12, 0x45, 0xED, 0xE4, 0x90, 0x95,
-0x4E, 0xF0, 0xA3, 0xF0, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFD, 0x90,
-0x00, 0x04, 0x12, 0x06, 0xA2, 0xFB, 0x91, 0x75, 0x90, 0x95, 0x4E, 0xEF, 0xF0, 0x90, 0x95, 0x4A,
-0x12, 0x45, 0xE4, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xF1, 0x59, 0x90, 0x95, 0x4F, 0xEF,
-0xF0, 0x90, 0x90, 0x01, 0xE0, 0x24, 0xFE, 0x60, 0x1E, 0x24, 0xFE, 0x60, 0x1A, 0x14, 0x60, 0x07,
-0x14, 0x60, 0x04, 0x24, 0x05, 0x70, 0x54, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xF8, 0x90, 0x95, 0x4D,
-0xE0, 0xFD, 0x12, 0xA3, 0xDE, 0x80, 0x16, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xF8, 0x90, 0x95, 0x4D,
-0xE0, 0xFD, 0x90, 0x90, 0x01, 0xE0, 0x90, 0x95, 0x1F, 0xF0, 0x12, 0xA2, 0xBC, 0x90, 0x95, 0x4F,
-0xE0, 0xFF, 0x90, 0x95, 0x4A, 0x12, 0x45, 0xE4, 0x90, 0x95, 0x4E, 0xE0, 0x7C, 0x00, 0x29, 0xF9,
-0xEC, 0x3A, 0xFA, 0xC3, 0xE9, 0x9F, 0xF9, 0xEA, 0x94, 0x00, 0xFA, 0x75, 0x40, 0x01, 0x75, 0x41,
-0x8F, 0x75, 0x42, 0xF8, 0xA3, 0xE0, 0xF5, 0x43, 0x12, 0x35, 0x26, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x09, 0x12, 0x45, 0xED, 0x78, 0x15, 0x7C, 0x95, 0x7D, 0x01, 0x7B,
-0xFF, 0x7A, 0x40, 0x79, 0x64, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x90, 0x05, 0x22, 0xE0,
-0x90, 0x95, 0x14, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x0A, 0x7D, 0x33, 0x12, 0x80, 0xCB, 0xBF,
-0x01, 0x0F, 0x80, 0x00, 0x90, 0x93, 0x79, 0x51, 0x5E, 0x90, 0x95, 0x11, 0xEE, 0xF0, 0xA3, 0xEF,
-0xF0, 0x90, 0x95, 0x11, 0x91, 0x4F, 0x90, 0x95, 0x13, 0xEF, 0xF0, 0x90, 0x95, 0x11, 0xA3, 0xE0,
-0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x95, 0x0F, 0xE0, 0xFD, 0xB1, 0x32,
-0x90, 0x95, 0x10, 0xE0, 0x60, 0x02, 0xC1, 0xCF, 0xA3, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34,
-0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x0C, 0x12, 0x45, 0xE4,
-0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12,
-0x35, 0x26, 0x90, 0x95, 0x11, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4, 0x34,
-0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x0C, 0x12, 0x45, 0xE4,
-0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12,
-0x35, 0x26, 0x90, 0x95, 0x11, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34,
-0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x09, 0x12, 0x45, 0xE4,
-0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0xD0, 0x01, 0xD0, 0x02, 0x80, 0x69, 0x90,
-0x95, 0x10, 0xE0, 0x64, 0x01, 0x70, 0x66, 0xA3, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC,
-0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0x4C, 0x75, 0x43, 0x06,
-0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x11, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42,
-0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42,
-0x56, 0x75, 0x43, 0x06, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x95, 0x11, 0xA3, 0xE0, 0xFF, 0xA3,
-0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75,
-0x41, 0x8F, 0x75, 0x42, 0x5C, 0x75, 0x43, 0x04, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x30,
-0xE0, 0x44, 0x10, 0xF0, 0x90, 0x95, 0x14, 0xE0, 0xFF, 0x7D, 0x34, 0x12, 0x52, 0x4D, 0x90, 0x04,
-0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0xEF, 0x20, 0xE0, 0x05, 0x90, 0x93, 0x76, 0x80, 0x03, 0x90, 0x93, 0x77, 0xE0, 0x90, 0x90, 0x01,
-0xF0, 0x90, 0x90, 0x01, 0xE0, 0x14, 0x60, 0x13, 0x14, 0x60, 0x14, 0x24, 0xFE, 0x60, 0x10, 0x14,
-0x60, 0x09, 0x14, 0x60, 0x06, 0x24, 0x06, 0xE4, 0xFE, 0x80, 0x06, 0x7E, 0x04, 0x80, 0x02, 0x7E,
-0x08, 0xAF, 0x06, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x80, 0x41, 0x03, 0xF1, 0xAD, 0xBF, 0x01,
-0x0B, 0x90, 0x02, 0x09, 0x51, 0x5E, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90,
-0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4,
-0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x71, 0x30, 0x90, 0x93, 0xAA,
-0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAA, 0x91, 0x4F, 0x90, 0x93, 0xAC, 0xEF, 0xF0, 0x90,
-0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89,
-0x42, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x4C, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAA,
-0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x3E, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5,
-0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x52, 0x12, 0x35, 0x26, 0x90,
-0x93, 0xAA, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x42, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40,
-0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x56, 0x12, 0x35,
-0x26, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x48, 0xF9, 0xE4, 0x34, 0xFC,
-0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x5C,
-0x02, 0x35, 0x26, 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,
-0x90, 0x01, 0xC4, 0x74, 0x73, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 0x91, 0x1E, 0xE5, 0x21, 0x30, 0xE0,
-0x03, 0x12, 0x6F, 0x98, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x31, 0x01, 0xE5, 0x21, 0x30, 0xE2, 0x02,
-0x71, 0x3F, 0xE5, 0x22, 0x30, 0xE0, 0x02, 0x31, 0x0A, 0xE5, 0x24, 0x30, 0xE1, 0x05, 0x7F, 0x04,
-0x12, 0x6A, 0x03, 0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x64, 0xC8, 0xE5, 0x24, 0x30, 0xE5, 0x03,
-0x12, 0x58, 0xB8, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0x59, 0x30, 0x74, 0x73, 0x04, 0x90, 0x01,
-0xC4, 0xF0, 0x74, 0x70, 0xA3, 0xF0, 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, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x02, 0x91, 0x4E, 0x22, 0x91, 0x98, 0x90, 0x94, 0x5D, 0xEF,
-0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x4F, 0x22, 0x90,
-0x94, 0x5D, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80,
-0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x90, 0x8E, 0x94, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90,
-0x8E, 0x99, 0xE0, 0xFB, 0xAC, 0x07, 0x90, 0x8E, 0x7F, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0x8E, 0x95,
-0xE0, 0xD3, 0x94, 0x03, 0x50, 0x07, 0x90, 0x8E, 0x8B, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD,
-0x2B, 0x90, 0x8E, 0x8B, 0xF0, 0x7D, 0x03, 0x90, 0x8E, 0xBA, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C,
-0xFF, 0x90, 0x8E, 0x98, 0xF0, 0x90, 0x8E, 0x8E, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90,
-0x8E, 0x8E, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x8B, 0xEB, 0xF0, 0x90, 0x8E, 0x8E,
-0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0xE4, 0x90, 0x94, 0x58, 0xF0, 0xFD, 0xA3, 0xF0, 0x90,
-0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE,
-0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xB6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3,
-0xE0, 0xFF, 0x90, 0x8E, 0xB6, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x28,
-0xEB, 0x9F, 0xFF, 0x90, 0x8E, 0x98, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFD, 0xC3, 0x94,
-0x19, 0x50, 0x13, 0x74, 0x9B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0x04, 0xF0,
-0x90, 0x8E, 0x96, 0xE0, 0x04, 0xF0, 0x51, 0x69, 0x90, 0x8E, 0x96, 0xE0, 0xC3, 0x94, 0x64, 0x40,
-0x67, 0xE4, 0x90, 0x94, 0x59, 0xF0, 0x90, 0x94, 0x58, 0xF0, 0x90, 0x94, 0x58, 0xE0, 0xFF, 0xC3,
-0x94, 0x19, 0x50, 0x47, 0x74, 0x9B, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE0, 0xFF,
-0x90, 0x94, 0x59, 0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05, 0x40, 0x27, 0x90, 0x94, 0x58, 0xE0,
-0xFF, 0x94, 0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x8E, 0x95, 0xF0, 0xE4, 0x80, 0x0E, 0xE4,
-0x90, 0x8E, 0x95, 0xF0, 0x90, 0x94, 0x58, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90, 0x8E, 0x94,
-0xF0, 0x80, 0x08, 0x90, 0x94, 0x58, 0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x90, 0x8E, 0x95, 0xE0, 0xFD,
-0x7B, 0x08, 0xE4, 0xFF, 0x31, 0x44, 0x71, 0x5A, 0x22, 0x90, 0x8F, 0x22, 0xE0, 0xFF, 0x90, 0x8E,
-0x8C, 0xE0, 0xD3, 0x9F, 0x40, 0x24, 0x90, 0x8E, 0x9A, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04,
-0x50, 0x18, 0x90, 0x8E, 0x94, 0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0x8E, 0x99, 0xF0, 0xFB,
-0x90, 0x8E, 0x94, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x31, 0x44, 0x22, 0x90, 0x8D, 0xFE, 0xE0, 0x64,
-0x01, 0x60, 0x02, 0x61, 0x3E, 0x90, 0x8E, 0x83, 0xE0, 0x70, 0x02, 0x61, 0x3E, 0x90, 0x8E, 0x81,
-0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x8E, 0x8A,
-0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0x8E, 0x89, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90,
-0x8E, 0x89, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0x8E, 0x8A, 0xEF, 0xF0, 0x90,
-0x8E, 0x7F, 0xE0, 0x30, 0xE0, 0x02, 0x31, 0x97, 0x90, 0x8E, 0x80, 0xE0, 0x44, 0x04, 0xF0, 0xE4,
-0x90, 0x8E, 0x8C, 0xF0, 0x90, 0x8E, 0x8E, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01, 0x57,
-0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x87, 0xE0, 0x54, 0xFD, 0xF0, 0x54,
-0xEF, 0xF0, 0x90, 0x8E, 0x81, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x02,
-0x91, 0xE3, 0x90, 0x8E, 0x80, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x10, 0x90, 0x8E,
-0x89, 0xE0, 0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x06, 0x12, 0x67, 0xE6, 0x12, 0x65, 0xE5, 0x22, 0x90,
-0x8E, 0x83, 0xE0, 0x60, 0x14, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x57, 0x71, 0x90,
-0x8E, 0x7F, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x58, 0xAE, 0x22, 0xE4, 0xFF, 0x74, 0x9B, 0x2F, 0xF5,
-0x82, 0xE4, 0x34, 0x8E, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x19, 0xEF, 0xE4, 0x90, 0x8E,
-0x96, 0xF0, 0x90, 0x8E, 0x9A, 0xF0, 0x90, 0x8E, 0x94, 0xF0, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89,
-0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13,
-0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85,
-0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12,
-0x06, 0x89, 0x54, 0x01, 0xFF, 0x74, 0xFE, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83,
-0xEF, 0xF0, 0x74, 0xFE, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0x8D, 0xF5, 0x83, 0xE0, 0xAF, 0x54,
-0x70, 0x04, 0x91, 0x0D, 0x80, 0x02, 0x71, 0xFC, 0x05, 0x54, 0x80, 0xC6, 0x71, 0x5A, 0xE5, 0x55,
-0x70, 0x19, 0x90, 0x8D, 0xFE, 0xE0, 0x70, 0x13, 0x12, 0x57, 0xF3, 0x12, 0x57, 0xD7, 0x90, 0x8E,
-0x7F, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0,
-0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xD8, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75,
-0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0xD8, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x01,
-0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F,
-0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5,
-0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0x8E,
-0x7F, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x8E,
-0x87, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80, 0x29, 0x90, 0x8E, 0x8C, 0xE0, 0x04,
-0xF0, 0x90, 0x8E, 0x87, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x8F, 0x22, 0xE0, 0xFF, 0x90, 0x8E, 0x8C,
-0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0x8D, 0xFE, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0x8E, 0x80, 0xE0,
-0x54, 0xFB, 0xF0, 0x22, 0x12, 0x58, 0xAE, 0x22, 0xE4, 0x90, 0x94, 0x5E, 0xF0, 0xA3, 0xF0, 0xA3,
-0xF0, 0x7F, 0x83, 0x12, 0x4A, 0x19, 0x90, 0x94, 0x5E, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x4A, 0x19,
-0xAE, 0x07, 0x90, 0x94, 0x5E, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x94, 0x60, 0xE0,
-0x94, 0x64, 0x90, 0x94, 0x5F, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40,
-0xF0, 0x90, 0x94, 0x5E, 0xE0, 0xFF, 0x22, 0x90, 0x94, 0x5F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08,
-0xD6, 0x80, 0xBE, 0xE4, 0xF5, 0x58, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x58, 0x54, 0xC0, 0x70, 0x0D,
-0x90, 0x8E, 0x87, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x58, 0xAE, 0xE5, 0x58, 0x30,
-0xE6, 0x23, 0x90, 0x8E, 0x83, 0xE0, 0x64, 0x01, 0x70, 0x22, 0x90, 0x8E, 0x87, 0xE0, 0x44, 0x01,
-0xF0, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x05, 0x12, 0x6A, 0x3B, 0x80, 0x0C,
-0x12, 0x52, 0xF5, 0x80, 0x07, 0x90, 0x8E, 0x87, 0xE0, 0x54, 0xFE, 0xF0, 0xE5, 0x58, 0x90, 0x8E,
-0x87, 0x30, 0xE7, 0x0E, 0xE0, 0x44, 0x02, 0x12, 0x4F, 0xFC, 0x90, 0x8E, 0x7F, 0xE0, 0x44, 0x04,
-0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0,
-0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x48, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0x75,
-0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0, 0x07, 0xD0, 0x05,
-0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0x90, 0x95, 0x8F, 0xEF, 0xF0, 0x7F, 0x02,
-0x12, 0x44, 0xB7, 0x90, 0x8D, 0x01, 0xE0, 0xFF, 0x90, 0x95, 0x8F, 0xE0, 0xFE, 0xEF, 0x4E, 0x90,
-0x8D, 0x01, 0xF0, 0x22, 0x90, 0x93, 0xB5, 0x74, 0x12, 0xF0, 0x90, 0x93, 0xC3, 0x74, 0x05, 0xF0,
-0x90, 0x93, 0xB7, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0xB3, 0xE0, 0x90,
-0x93, 0xBA, 0xF0, 0x90, 0x93, 0xB4, 0xE0, 0x90, 0x93, 0xBB, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79,
-0xB5, 0xF1, 0x7C, 0x7F, 0x04, 0x80, 0xB2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94,
-0xC6, 0xE0, 0xFF, 0x12, 0xA5, 0xAC, 0xEF, 0x60, 0x72, 0x90, 0x94, 0xC7, 0xE0, 0xFB, 0xD3, 0x94,
-0x00, 0x40, 0x1C, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0F, 0xAF, 0x03, 0xE4,
-0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xFD, 0x12, 0x08, 0x6D, 0x7F, 0x08, 0x7E, 0x0E, 0xD1, 0x94, 0x90,
-0x94, 0xC6, 0xE0, 0xFF, 0x90, 0x06, 0x33, 0xF0, 0x90, 0x94, 0xBE, 0xE0, 0x90, 0x95, 0x68, 0xF0,
-0xE4, 0xFB, 0xFD, 0xF1, 0x02, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x12, 0xA5, 0xD7, 0x90, 0x94, 0xC8,
-0xE0, 0x90, 0x93, 0xA7, 0xF0, 0x90, 0x94, 0xB3, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x12, 0xA4, 0xE3,
-0x90, 0x93, 0xA7, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x95, 0x45, 0x12, 0x08, 0x6D, 0xE4,
-0x90, 0x95, 0x49, 0xF0, 0x7F, 0x04, 0x12, 0x64, 0x41, 0x80, 0x40, 0xE4, 0x90, 0x94, 0xB3, 0xF0,
-0x90, 0x94, 0xCF, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0xA5, 0x1E, 0x90, 0x8D,
-0xFE, 0xE0, 0xB4, 0x01, 0x0D, 0x90, 0x94, 0xCB, 0xE0, 0xFD, 0x7F, 0x02, 0x12, 0x4F, 0x22, 0x12,
-0x9F, 0x4C, 0x90, 0x93, 0xA8, 0x74, 0x07, 0xF0, 0x90, 0x93, 0xB6, 0xF0, 0x7B, 0x01, 0x7A, 0x93,
-0x79, 0xA8, 0xF1, 0x7C, 0x7F, 0x04, 0xB1, 0x79, 0x12, 0xA6, 0xD2, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0x7F, 0x58, 0x7E, 0x0C, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xF7, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0x95, 0x01, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xF9, 0x12,
-0x45, 0xC0, 0x12, 0x08, 0x3A, 0x90, 0x95, 0x01, 0x12, 0x45, 0xCC, 0x12, 0x45, 0x95, 0xC0, 0x04,
-0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x94, 0xF9, 0x12, 0x45, 0xC0, 0x90, 0x94, 0xFD, 0x12,
-0x45, 0xCC, 0x12, 0x45, 0x95, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0xA2,
-0x90, 0x95, 0x05, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x05, 0x12, 0x45, 0xC0, 0x90, 0xAA, 0xB9, 0x12,
-0x08, 0x6D, 0x90, 0x94, 0xF7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92,
-0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x65, 0xEF, 0xF0, 0xED, 0x64,
-0x01, 0x70, 0x30, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x5A, 0x80, 0x08, 0x90, 0x95,
-0x65, 0xE0, 0x24, 0xFE, 0xF5, 0x5A, 0x90, 0x94, 0xE7, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF,
-0xAF, 0x5A, 0x12, 0x89, 0x27, 0x90, 0x94, 0xE7, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF,
-0x5A, 0x80, 0x21, 0x90, 0x94, 0xE7, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x95, 0x65,
-0xE0, 0xFF, 0x12, 0x89, 0x27, 0x90, 0x94, 0xE7, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90,
-0x95, 0x65, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xEB, 0x12, 0x08, 0x6D, 0x7D, 0x18,
-0x7C, 0x00, 0x7F, 0x01, 0x12, 0x89, 0x37, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x90, 0x8D, 0xF5, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A,
-0xEF, 0x14, 0xFF, 0x90, 0x8D, 0xF6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00,
-0xEF, 0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0x8D,
-0xF6, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x5F, 0xF9, 0x74, 0x8D, 0x35, 0xF0, 0xA8, 0x01, 0xFC,
-0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0x8D, 0xF6, 0xE0, 0x04,
-0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x8D, 0xF6,
-0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x95, 0x90, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7,
-0x90, 0x8D, 0x02, 0xE0, 0xFF, 0x90, 0x95, 0x90, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x8D, 0x02, 0xF0,
-0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x8D, 0x07, 0xF0,
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x08, 0xF0, 0x90, 0x00, 0x02, 0x12,
-0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x09, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x25, 0x51,
-0x90, 0x8D, 0x0A, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x0B, 0xF0,
-0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x8D, 0x0C, 0xF0, 0x22, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0x8E,
-0x7E, 0xF0, 0xBF, 0x01, 0x10, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x1C, 0x7D,
-0x13, 0x7F, 0x6F, 0x80, 0x13, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06,
-0xA2, 0x64, 0x01, 0x60, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0x4D, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x9A, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x90,
-0x93, 0xAA, 0x12, 0x45, 0xED, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90, 0x8E, 0x83, 0xF0, 0xEF,
-0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54,
-0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03,
-0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x8E, 0x7F, 0xE0, 0x54, 0xFD, 0x4E, 0xF0,
-0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x8E, 0x81, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90,
-0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x8E, 0x82, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x30,
-0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8E, 0x95, 0x50, 0x04, 0xEF,
-0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0x93, 0xAA, 0x12, 0x45, 0xE4, 0xE9, 0x24, 0x06, 0xF9,
-0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F,
-0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06,
-0xCF, 0x90, 0x93, 0xAA, 0x12, 0x45, 0xE4, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xC4, 0x54, 0x0F,
-0xFF, 0xC3, 0x94, 0x04, 0x90, 0x8E, 0x8B, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0,
-0x90, 0x93, 0xAA, 0x12, 0x45, 0xE4, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12,
-0x4F, 0x22, 0x90, 0x94, 0xCF, 0xE0, 0x60, 0x03, 0x12, 0x4F, 0x16, 0x90, 0x93, 0xAA, 0x12, 0x45,
-0xE4, 0x90, 0x93, 0xAD, 0x12, 0x45, 0xED, 0x31, 0xB0, 0x90, 0x8E, 0x83, 0xE0, 0xFF, 0x12, 0x65,
-0x8C, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x18, 0x90, 0x93, 0xAD, 0x12, 0x45, 0xE4, 0x90, 0x00, 0x01,
-0x12, 0x06, 0xA2, 0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0x31, 0xC1, 0x22,
-0x90, 0x8E, 0x7F, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x8E, 0x8C, 0xF0, 0x90, 0x8E, 0x87, 0xF0,
-0x22, 0xEF, 0x24, 0xFE, 0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0x8E, 0x89, 0x74, 0x02, 0xF0, 0x80,
-0x16, 0xED, 0x70, 0x0A, 0x90, 0x8F, 0x25, 0xE0, 0x90, 0x8E, 0x89, 0xF0, 0x80, 0x05, 0x90, 0x8E,
-0x89, 0xED, 0xF0, 0x90, 0x8E, 0x89, 0xE0, 0xA3, 0xF0, 0x90, 0x8E, 0x80, 0xE0, 0x44, 0x08, 0xF0,
-0x22, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0x8F,
-0x22, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x23, 0xF0, 0xEF, 0x54, 0xFE, 0xFF,
-0xA3, 0xE0, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x25, 0xF0,
-0x22, 0x90, 0x8F, 0x22, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0,
-0xA3, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x95, 0x80, 0xF0, 0x90,
-0x95, 0x80, 0xE0, 0xFD, 0x70, 0x02, 0x61, 0x84, 0x90, 0x8D, 0x5D, 0xE0, 0xFF, 0x70, 0x06, 0xA3,
-0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x8D, 0x5E, 0xE0, 0xB5, 0x07, 0x04, 0x7F,
-0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22,
-0x90, 0x95, 0x7E, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33,
-0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x61, 0x61, 0xE4, 0x90, 0x95, 0x81,
-0xF0, 0x90, 0x95, 0x81, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0x95, 0x7E, 0xE0, 0x75,
-0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0,
-0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, 0x5E, 0xE0, 0x75, 0xF0,
-0x08, 0x90, 0x8D, 0x0D, 0x12, 0x45, 0xD8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5,
-0x83, 0xEF, 0xF0, 0x90, 0x95, 0x7E, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0,
-0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x8D, 0x5E,
-0xE0, 0x75, 0xF0, 0x08, 0x90, 0x8D, 0x11, 0x12, 0x45, 0xD8, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4,
-0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x95, 0x81, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90, 0x95,
-0x80, 0xE0, 0xFF, 0x90, 0x95, 0x7E, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3,
-0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x95, 0x80, 0xF0, 0x90, 0x95, 0x7E, 0xE0, 0xFF, 0x74, 0x01,
-0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x95, 0x7E,
-0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x8D, 0x5E, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00,
-0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x41, 0x3F, 0xE4, 0x90, 0x8D, 0x5E, 0xF0, 0x41,
-0x3F, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x95, 0x7E, 0xE0, 0x44, 0x80, 0x90, 0x00,
-0x8A, 0xF0, 0x90, 0x95, 0x7E, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x45, 0xD8, 0xE0,
-0x90, 0x01, 0xC3, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xF5, 0xF0, 0xA3, 0xF0, 0x90, 0x8D, 0x5D, 0xF0,
-0xA3, 0xF0, 0x22, 0x71, 0xB9, 0x71, 0x85, 0x12, 0x4E, 0x49, 0x71, 0xBF, 0x12, 0x66, 0xA5, 0x71,
-0xCE, 0x71, 0xE5, 0x90, 0x93, 0x95, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0,
-0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x93, 0x97, 0xF0, 0x22, 0xE4, 0x90, 0x8D, 0xFE, 0xF0, 0x22, 0x7E,
-0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x29, 0x02, 0x08, 0xAA, 0x90, 0x93,
-0x88, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0xE4,
-0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79,
-0x8C, 0x12, 0x08, 0xAA, 0x90, 0x93, 0x8D, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0xD3,
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x59, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3,
-0xF0, 0xA3, 0xF0, 0x90, 0x95, 0x59, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60,
-0x2D, 0xC3, 0x90, 0x95, 0x5C, 0xE0, 0x94, 0xE8, 0x90, 0x95, 0x5B, 0xE0, 0x94, 0x03, 0x40, 0x0B,
-0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0x95, 0x5B, 0xE4, 0x75,
-0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB,
-0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
-0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
-0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0,
-0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80,
-0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22,
-0x90, 0x95, 0x5D, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0xED, 0x90, 0x95, 0x7F, 0xE0, 0xFE, 0x04, 0xF0,
-0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B,
-0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x95, 0x5E, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A,
-0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90,
-0x95, 0x5D, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02,
-0xC0, 0x01, 0xA3, 0x12, 0x45, 0xE4, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41,
-0x89, 0x42, 0x90, 0x95, 0x5E, 0x12, 0x45, 0xE4, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2, 0xF5, 0x43,
-0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAA, 0x7F,
-0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0x93, 0xAA, 0xE0, 0xA3, 0xF0, 0x7B,
-0x01, 0x7A, 0x93, 0x79, 0xAA, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90,
-0x93, 0xAA, 0xE0, 0x90, 0x93, 0xAC, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAA, 0x7F, 0xF4, 0x7E,
-0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAA, 0xE0, 0x90, 0x93, 0xAD, 0xF0, 0x7B,
-0x01, 0x7A, 0x93, 0x79, 0xAA, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90,
-0x93, 0xAA, 0xE0, 0x90, 0x93, 0xAE, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAA, 0x7F, 0xF2, 0x7E,
-0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0x93, 0xAA, 0xE0, 0x90, 0x93, 0xAF, 0xF0, 0x90,
-0x93, 0xAB, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0xB3, 0xF0,
-0x90, 0x93, 0xAF, 0xE0, 0x90, 0x93, 0xB4, 0xF0, 0x02, 0x75, 0x94, 0xEF, 0x70, 0x04, 0x74, 0xF0,
-0x80, 0x16, 0xEF, 0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8,
-0x80, 0x06, 0xEF, 0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83,
-0xEB, 0xF0, 0x22, 0x90, 0x95, 0x75, 0x12, 0x45, 0xED, 0xE4, 0xFF, 0x90, 0x95, 0x75, 0x12, 0x45,
-0xE4, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4,
-0x34, 0x02, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x00, 0xF1, 0xE0,
-0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x22, 0x75, 0x15, 0x10, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07,
-0x75, 0x18, 0x02, 0x90, 0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17,
-0xF0, 0xA3, 0xE5, 0x18, 0xF0, 0x22, 0x75, 0x1D, 0x07, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75,
-0x20, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5, 0x1F, 0xF0,
-0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4,
-0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12,
-0x3E, 0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22,
-0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x87, 0xF0, 0x74,
-0x7E, 0xA3, 0xF0, 0x90, 0x93, 0x87, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0,
-0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, 0x01, 0x22,
-0xE4, 0x90, 0x8D, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01,
-0xE4, 0x74, 0x17, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5,
-0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55,
-0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B,
-0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x94, 0x58, 0xF0, 0xE0, 0xFF,
-0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x23, 0x90, 0x01,
-0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8, 0xF5, 0xE8,
-0x12, 0x4D, 0xB2, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x48, 0x81, 0x80,
-0xFE, 0x22, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x70, 0x90, 0x8E, 0x7F, 0xE0, 0x30, 0xE0, 0x23, 0x90,
-0x8E, 0x97, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED,
-0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x8E, 0xB4, 0xEE, 0xF0, 0xA3,
-0xEF, 0xF0, 0x90, 0x8E, 0x80, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x13, 0x90,
-0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0C, 0x12, 0x65, 0xDF, 0x90, 0x8E, 0x89, 0xE0, 0x14, 0x90, 0x05,
-0x73, 0xF0, 0x90, 0x95, 0x82, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0xC3, 0x90, 0x95, 0x83,
-0xE0, 0x94, 0x80, 0x90, 0x95, 0x82, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98,
-0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x9E, 0x3B, 0x12, 0x8B, 0x99, 0xE4, 0x90,
-0x93, 0x8B, 0xF0, 0x12, 0x9F, 0x6B, 0x90, 0x8F, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30,
-0xE0, 0x52, 0x90, 0x90, 0xDC, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x7D, 0x64, 0x12, 0x07,
-0x15, 0x90, 0x91, 0x30, 0xE0, 0x6E, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x60, 0x0A, 0x90, 0x91, 0x30,
-0xE4, 0x75, 0xF0, 0x01, 0x02, 0x08, 0xD6, 0x90, 0x90, 0xE0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90,
-0x90, 0xEE, 0xE0, 0xB5, 0x06, 0x14, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0xEF, 0x4E, 0x60, 0x0B, 0x90,
-0x01, 0xC7, 0x74, 0x31, 0xF0, 0x7F, 0x01, 0x02, 0x59, 0x6A, 0x12, 0x6C, 0x95, 0xE4, 0x90, 0x91,
-0x30, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x8D, 0xFE, 0xE0, 0x64, 0x01, 0x70, 0x13, 0x90, 0x8E, 0x83,
-0xE0, 0x60, 0x0D, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x12, 0x4F, 0xFC,
-0x22, 0x90, 0x8D, 0xFE, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x20, 0x90,
-0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0x8E, 0x7F, 0xE0, 0x54, 0xFB,
-0xF0, 0x90, 0x8E, 0x87, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0xAE, 0x22,
-0x90, 0x8D, 0xFE, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0x8E, 0x83, 0xE0, 0x60, 0x0E, 0x90, 0x8E, 0x87,
-0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0xAE, 0x22, 0x90, 0x93, 0xD1, 0xE0,
-0x2F, 0xFF, 0x90, 0x93, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x94, 0x54, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x93, 0x7B, 0xE0, 0xFD, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD,
-0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x1E, 0x90, 0xFD, 0x11, 0xE0,
-0xB5, 0x05, 0x14, 0x90, 0x01, 0x17, 0xE0, 0xB5, 0x05, 0x07, 0x90, 0xFD, 0x11, 0xE4, 0xF0, 0x80,
-0x06, 0xED, 0x04, 0x90, 0xFD, 0x11, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0x7F, 0xFF, 0x12, 0x52, 0x4D,
-0xE4, 0x90, 0x95, 0x84, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70,
-0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x95, 0x85,
-0xE0, 0x94, 0xE8, 0x90, 0x95, 0x84, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44,
-0x20, 0xF0, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x95, 0x84, 0xE4,
-0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBF, 0x90, 0x93, 0xD3, 0x12, 0x45, 0xED, 0x90, 0x05,
-0x22, 0xE0, 0x90, 0x93, 0xE4, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x09, 0x7D, 0x39, 0x11, 0xCB,
-0xBF, 0x01, 0x10, 0x80, 0x00, 0x90, 0x93, 0x7A, 0x12, 0x6A, 0x5E, 0x90, 0x93, 0xE1, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xE1, 0x12, 0x6C, 0x4F, 0x90, 0x93, 0xE3, 0xEF, 0xF0, 0x90, 0x93,
-0xE1, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x93, 0xDF, 0xE0,
-0xFD, 0x12, 0x6D, 0x32, 0x90, 0x93, 0xE0, 0xE0, 0x60, 0x02, 0x41, 0x56, 0xA3, 0xA3, 0xE0, 0x24,
-0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93,
-0xD6, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0,
-0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE1, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24,
-0x48, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93,
-0xD3, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0,
-0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE1, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24,
-0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93,
-0xD9, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0,
-0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE1, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24,
-0x60, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93,
-0xD9, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0xD0, 0x01, 0xD0,
-0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE1, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24,
-0x72, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93,
-0xDC, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x06, 0xD0, 0x01, 0xD0,
-0x02, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xD9, 0x12, 0x45, 0xE4, 0x90, 0x94, 0x10, 0x12,
-0x45, 0xED, 0x90, 0x94, 0x13, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x20, 0x90, 0x94, 0x17, 0x74,
-0x3A, 0xF0, 0x90, 0x93, 0xD3, 0x12, 0x45, 0xE4, 0xB1, 0xB2, 0x90, 0x93, 0xE1, 0xA3, 0xE0, 0xFF,
-0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42,
-0x75, 0x43, 0x28, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xE5, 0x12, 0x35, 0x26, 0x90, 0x93, 0xE1, 0xA3,
-0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03,
-0x8B, 0x40, 0x75, 0x41, 0x8F, 0x75, 0x42, 0xD0, 0x75, 0x43, 0x28, 0xD0, 0x03, 0x12, 0x35, 0x26,
-0x90, 0x93, 0xE3, 0xE0, 0xFF, 0x90, 0x93, 0xE2, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xE1, 0xE0, 0x34,
-0x00, 0xCF, 0x24, 0x30, 0xFD, 0xE4, 0x3F, 0xFC, 0x90, 0x93, 0x7A, 0xE0, 0xFB, 0x7F, 0x3A, 0x12,
-0x99, 0x00, 0x90, 0x93, 0xE1, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0x2F, 0x24, 0x30, 0xF9, 0xE4, 0x34,
-0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0x8B, 0x40, 0x75, 0x41, 0x93, 0x75, 0x42, 0xE5, 0x75, 0x43,
-0x28, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x93, 0xE4,
-0xE0, 0xFF, 0x7D, 0x3A, 0x12, 0x52, 0x4D, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0x93,
-0xA6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x78, 0xA9, 0x7C, 0x93, 0x7D, 0x01, 0x7B,
-0xFF, 0x7A, 0x40, 0x79, 0x6A, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x78, 0xAF, 0x7C, 0x93,
-0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x70, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x06, 0x63, 0x78,
-0xBF, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x80, 0x7E, 0x00, 0x7F, 0x10, 0x12,
-0x06, 0x63, 0xE4, 0x90, 0x93, 0xD2, 0xF0, 0x90, 0x93, 0xA6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3,
-0xE0, 0xFD, 0xB1, 0x6E, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x68, 0x90, 0x93, 0xA8, 0xE0, 0xFF,
-0x90, 0x93, 0xA7, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA6, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x0E, 0xCF,
-0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x53, 0xEF, 0x64, 0x3A, 0x60, 0x02, 0xA1, 0x68, 0x90,
-0x93, 0xA8, 0xE0, 0xFF, 0x90, 0x93, 0xA7, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA6, 0xE0, 0x34, 0x00,
-0xCF, 0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x53, 0xEF, 0x64, 0x87, 0x60,
-0x02, 0xA1, 0x68, 0x90, 0x93, 0xD2, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0xCF, 0xF0, 0x90, 0x93, 0xCF,
-0xE0, 0xFF, 0xC3, 0x94, 0x10, 0x50, 0x2E, 0x90, 0x93, 0xA8, 0xE0, 0xFD, 0x90, 0x93, 0xA7, 0xE0,
-0x2D, 0xFD, 0x90, 0x93, 0xA6, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x38, 0x12, 0x5B, 0x45, 0x90, 0x93,
-0xCF, 0xE0, 0x24, 0xBF, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xCF,
-0xE0, 0x04, 0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x93, 0xD0, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0xFF, 0xC3,
-0x94, 0x02, 0x40, 0x02, 0xA1, 0x68, 0x75, 0xF0, 0x38, 0xEF, 0x90, 0x8F, 0x60, 0x12, 0x45, 0xD8,
-0xE0, 0x20, 0xE0, 0x02, 0xA1, 0x68, 0xE4, 0x90, 0x93, 0xD1, 0xF0, 0x90, 0x93, 0xD0, 0xE0, 0xFF,
-0x75, 0xF0, 0x38, 0x90, 0x8F, 0x61, 0x12, 0x45, 0xD8, 0xE0, 0xFE, 0x90, 0x93, 0xD1, 0xE0, 0xC3,
-0x9E, 0x40, 0x02, 0xA1, 0x60, 0xEF, 0x75, 0xF0, 0x38, 0xA4, 0x24, 0x78, 0xF9, 0x74, 0x8F, 0x35,
-0xF0, 0xFA, 0x7B, 0x01, 0xE0, 0x75, 0xF0, 0x10, 0xA4, 0x29, 0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x78,
-0xBF, 0x7C, 0x93, 0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x47, 0xA2, 0xEF, 0x60, 0x02, 0xA1,
-0x51, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x01, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x93, 0xCF, 0xF0, 0x90,
-0x93, 0xCF, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x2E, 0x90, 0x93, 0xA8, 0xE0, 0xFD, 0x90, 0x93,
-0xA7, 0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA6, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x4A, 0x12, 0x5B, 0x45,
-0x90, 0x93, 0xCF, 0xE0, 0x24, 0xA9, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90,
-0x93, 0xCF, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0xE4, 0x90, 0x93, 0xCF, 0xF0, 0x90, 0x93, 0xCF, 0xE0,
-0xFF, 0xC3, 0x94, 0x10, 0x50, 0x1A, 0x12, 0x5B, 0x31, 0x90, 0x93, 0xCF, 0xE0, 0x24, 0xAF, 0xF5,
-0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xCF, 0xE0, 0x04, 0xF0, 0x80, 0xDC,
-0x90, 0x93, 0xD0, 0xE0, 0xFF, 0x75, 0xF0, 0x38, 0x90, 0x8F, 0x60, 0x12, 0x45, 0xD8, 0xE0, 0xFE,
-0xC3, 0x13, 0x30, 0xE0, 0x21, 0xEF, 0x75, 0xF0, 0x38, 0xA4, 0x24, 0x68, 0xF9, 0x74, 0x8F, 0x35,
-0xF0, 0xFA, 0x7B, 0x01, 0x78, 0xAF, 0x7C, 0x93, 0x7D, 0x01, 0x7E, 0x00, 0x7F, 0x10, 0x12, 0x47,
-0xA2, 0xEF, 0x70, 0x44, 0x80, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xA9, 0x90, 0x93, 0xD6, 0x12,
-0x45, 0xED, 0x7A, 0x93, 0x79, 0xBF, 0x90, 0x93, 0xD9, 0x12, 0x45, 0xED, 0x90, 0x93, 0xD0, 0xE0,
-0x75, 0xF0, 0x38, 0xA4, 0x24, 0x62, 0xF9, 0x74, 0x8F, 0x35, 0xF0, 0xFA, 0x90, 0x93, 0xDC, 0x12,
-0x45, 0xED, 0xE4, 0x90, 0x93, 0xDF, 0xF0, 0xA3, 0xF0, 0x7A, 0x93, 0x79, 0xAF, 0x31, 0x18, 0x80,
-0x07, 0x90, 0x06, 0x33, 0xE0, 0x44, 0x05, 0xF0, 0x90, 0x93, 0xD1, 0xE0, 0x04, 0xF0, 0x81, 0x2B,
-0x90, 0x93, 0xD0, 0xE0, 0x04, 0xF0, 0x81, 0x0A, 0x90, 0x93, 0xD2, 0xE0, 0xFF, 0x22, 0x90, 0x93,
-0xD3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x2F, 0xFF, 0xE4, 0x3E, 0xCF, 0x24, 0x06,
-0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x53, 0xBF, 0x86, 0x23, 0x90, 0x93, 0xD5, 0xE0,
-0xFF, 0x90, 0x93, 0xD4, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xD3, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x07,
-0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x53, 0xBF, 0xDD, 0x03, 0x7F, 0x01, 0x22, 0x7F,
-0x00, 0x22, 0x90, 0x94, 0x0D, 0x12, 0x45, 0xED, 0x90, 0x94, 0x10, 0x12, 0x45, 0xE4, 0x8B, 0x40,
-0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0xD0, 0x12, 0x35, 0x26,
-0x90, 0x94, 0x0D, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x10, 0x7B,
-0x01, 0x7A, 0x8F, 0x79, 0xE0, 0x12, 0x35, 0x26, 0x90, 0x94, 0x13, 0x12, 0x45, 0xC0, 0x90, 0x8F,
-0xF0, 0x12, 0x08, 0x6D, 0x90, 0x94, 0x17, 0xE0, 0x90, 0x8F, 0xF7, 0xF0, 0x22, 0x90, 0x01, 0xC4,
-0x74, 0xFD, 0xF0, 0x74, 0x85, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x4A, 0x19, 0xEF, 0x20, 0xE0, 0xF7,
-0x74, 0xFD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x85, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, 0xE4, 0x34,
-0x94, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xEB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3,
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, 0xE4,
-0x34, 0x94, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x61, 0xF5, 0x82, 0xE4,
-0x34, 0x94, 0xF5, 0x83, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0x90, 0x01, 0x53, 0xE4, 0xF0, 0xFF, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, 0xE4,
-0x34, 0x94, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x08, 0xEB, 0x22, 0xEF, 0x24, 0xFC, 0x60,
-0x05, 0x04, 0x70, 0x05, 0x80, 0x04, 0x12, 0x75, 0xC7, 0x22, 0xE4, 0x90, 0x93, 0xA7, 0xF0, 0x90,
-0x94, 0xCF, 0x04, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0x72, 0x12, 0x45,
-0xC0, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0x3D, 0xFD, 0xE4, 0x3C, 0xFC, 0x90, 0x93,
-0x72, 0x12, 0x08, 0x6D, 0xF1, 0x21, 0xE4, 0x90, 0x94, 0xB3, 0xF0, 0xFF, 0x12, 0xA4, 0xE3, 0x90,
-0x8D, 0xFE, 0xE0, 0x64, 0x01, 0x70, 0x36, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x50, 0x77, 0x7F, 0x05,
-0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x12, 0x4F, 0x16, 0x90, 0x8E, 0x86, 0xE0, 0x64, 0x02, 0x60, 0x1D,
-0x90, 0x93, 0xA7, 0xE0, 0x04, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7D, 0x01, 0x7F,
-0x02, 0x12, 0x50, 0x77, 0x90, 0x93, 0xA7, 0xE0, 0xD3, 0x94, 0x0A, 0x40, 0xDB, 0x90, 0x95, 0x45,
-0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x0A, 0xE4, 0x90, 0x95, 0x49, 0xF0, 0x7F, 0x04, 0x02, 0x64,
-0x41, 0x7F, 0x50, 0x7E, 0x0C, 0x12, 0x37, 0x4E, 0x90, 0x94, 0xB4, 0xEF, 0xF0, 0x7F, 0x58, 0x7E,
-0x0C, 0x12, 0x37, 0x4E, 0x90, 0x94, 0xB5, 0xEF, 0xF0, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00,
-0x00, 0x00, 0x7F, 0x90, 0x94, 0xFD, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x7F, 0x50, 0x7E,
-0x0C, 0x12, 0x76, 0x94, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F, 0x90, 0x94,
-0xFD, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x17, 0x12, 0x76, 0x90, 0x90, 0x06, 0x08, 0xE0, 0x90,
-0x94, 0xCA, 0xF0, 0x90, 0x06, 0xA1, 0xE0, 0xFE, 0x90, 0x06, 0xA0, 0xE0, 0x7C, 0x00, 0x24, 0x00,
-0xFF, 0xEC, 0x3E, 0x90, 0x94, 0xCC, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x08, 0xE0, 0x54, 0x7F,
-0xF0, 0x90, 0x06, 0xA0, 0x74, 0x20, 0xF0, 0xA3, 0x74, 0x01, 0xF0, 0xE4, 0xFD, 0xFF, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x91, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x03, 0x02, 0x88,
-0xB4, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x95, 0x91, 0xE0, 0xC4, 0x33, 0x54, 0xE0,
-0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79,
-0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xFD, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00,
-0x7E, 0x08, 0x12, 0x76, 0x94, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90,
-0x94, 0xFD, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x76, 0x94,
-0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0x95, 0x91, 0xE0, 0xFF, 0xE4,
-0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0x12,
-0x08, 0x5A, 0x90, 0x94, 0xFD, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0A, 0x12, 0x76, 0x94, 0x90,
-0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x95, 0x91, 0xE0, 0xFF, 0xE4, 0xFC,
-0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0x12, 0x08, 0x5A, 0x90, 0x94, 0xFD, 0x12,
-0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0D, 0x12, 0x76, 0x94, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x0C,
-0x00, 0x00, 0x00, 0x90, 0x95, 0x91, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF,
-0xE4, 0x78, 0x1A, 0x12, 0x08, 0x5A, 0x90, 0x94, 0xFD, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08,
-0x12, 0x76, 0x94, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xFD,
-0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x84, 0x7E, 0x08, 0x12, 0x76, 0x94, 0x90, 0x94,
-0xE7, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xEB, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x04, 0x00, 0x80, 0x6C, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x94, 0xF9, 0x12, 0x08,
-0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0x94, 0xFD, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F,
-0x00, 0x7E, 0x08, 0x12, 0x76, 0x94, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01,
-0x90, 0x94, 0xFD, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x76,
-0x94, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xFD, 0x12, 0x08,
-0x79, 0x00, 0x00, 0x0C, 0x00, 0x7F, 0x84, 0x7E, 0x08, 0x12, 0x76, 0x94, 0x90, 0x94, 0xE7, 0x12,
-0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x94, 0xEB, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00,
-0x31, 0x31, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xEB, 0x12, 0x08,
-0x6D, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94,
-0xE5, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x94, 0xE4, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12,
-0x3E, 0x02, 0x90, 0x94, 0xEF, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xE7, 0x12, 0x45, 0xC0, 0x12, 0x08,
-0x3A, 0x90, 0x94, 0xEF, 0x12, 0x45, 0xCC, 0x12, 0x45, 0x95, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06,
-0xC0, 0x07, 0x90, 0x94, 0xE7, 0x12, 0x45, 0xC0, 0x90, 0x94, 0xEB, 0x12, 0x45, 0xCC, 0x12, 0x45,
-0x95, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0xA2, 0x90, 0x94, 0xF3, 0x12,
-0x08, 0x6D, 0x90, 0x94, 0xE5, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x94, 0xF3, 0x12, 0x45, 0xC0,
-0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90, 0x94, 0xE4, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x93, 0xA6, 0xF0, 0x90, 0x93, 0xA6, 0xE0, 0xFF, 0xC3,
-0x94, 0x08, 0x40, 0x02, 0x41, 0xBB, 0xEF, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x6A, 0xF5, 0x82, 0xE4,
-0x34, 0x94, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0xB3, 0x90, 0x93, 0xA6, 0xE0, 0x75,
-0xF0, 0x0A, 0xA4, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12, 0x45, 0xC0, 0xE4,
-0x7B, 0x01, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x45, 0xAF, 0x70, 0x63, 0x90, 0x93, 0xA6, 0xE0, 0xFB,
-0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x69, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0x60, 0x2E,
-0x14, 0x60, 0x02, 0x41, 0xB3, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x65, 0xF5, 0x82, 0xE4, 0x34,
-0x94, 0xF5, 0x83, 0x12, 0x45, 0xC0, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x61, 0xF5, 0x82, 0xE4,
-0x34, 0x94, 0xF5, 0x83, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xA6, 0xE0, 0xFF, 0x80, 0x1B, 0x90, 0x93,
-0xA6, 0xE0, 0xFB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83,
-0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x03, 0x12, 0x86, 0x8C, 0x80, 0x55, 0x90, 0x93,
-0xA6, 0xE0, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12,
-0x45, 0xC0, 0xE4, 0xFB, 0xFA, 0xF9, 0xF8, 0xC3, 0x12, 0x45, 0xAF, 0x50, 0x36, 0x90, 0x93, 0xA6,
-0xE0, 0xFB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0x12,
-0x45, 0xC0, 0xEF, 0x24, 0xFF, 0xFF, 0xEE, 0x34, 0xFF, 0xFE, 0xED, 0x34, 0xFF, 0xFD, 0xEC, 0x34,
-0xFF, 0xFC, 0xEB, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x61, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83,
-0x12, 0x08, 0x6D, 0x90, 0x93, 0xA6, 0xE0, 0x04, 0xF0, 0x21, 0xBA, 0x22, 0x7B, 0x01, 0x7A, 0x93,
-0x79, 0x9B, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0x93, 0x9B, 0xE0,
-0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0x93, 0x94, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0x93,
-0x94, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37,
-0x4E, 0x90, 0x93, 0x9D, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0x93,
-0xA1, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x9D, 0x12, 0x45, 0xC0, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE,
-0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0x93, 0x9D, 0x12, 0x45, 0xC0, 0xEF, 0x54, 0xFE, 0xFF, 0xEC,
-0x90, 0x93, 0x9D, 0x12, 0x08, 0x6D, 0x90, 0x93, 0x9D, 0x12, 0x45, 0xC0, 0x90, 0xAA, 0xB9, 0x12,
-0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0x93, 0xA1, 0x12, 0x45, 0xC0, 0xEF,
-0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0x93, 0xA1, 0x12, 0x45, 0xC0,
-0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0x93, 0xA1, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xA1, 0x12, 0x45,
-0xC0, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0x90, 0x93, 0x88, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x17, 0x7B,
-0x00, 0x7A, 0x00, 0x79, 0x00, 0x90, 0x95, 0x0C, 0x12, 0x45, 0xED, 0xE4, 0x90, 0x95, 0x0F, 0xF0,
-0xA3, 0x04, 0xF0, 0x02, 0x6D, 0xDC, 0x02, 0x52, 0xA2, 0x90, 0x93, 0x88, 0xE0, 0x30, 0xE0, 0x37,
-0x90, 0x8D, 0xFE, 0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0x95, 0x93, 0xE0, 0x04, 0xF0, 0xE0, 0xB4,
-0x0A, 0x0B, 0x90, 0x93, 0x8A, 0xE0, 0x04, 0xF0, 0xE4, 0x90, 0x95, 0x93, 0xF0, 0x90, 0x93, 0x8A,
-0xE0, 0xFF, 0x90, 0x93, 0x89, 0xE0, 0xD3, 0x9F, 0x50, 0x0D, 0x90, 0x93, 0x8B, 0xE0, 0x70, 0x07,
-0xE4, 0x90, 0x93, 0x8A, 0xF0, 0x71, 0x73, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90,
-0x93, 0x88, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F,
-0xF0, 0x12, 0x06, 0x89, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90,
-0x93, 0x89, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x02, 0x84, 0xEF, 0xF0, 0xEE, 0xA3,
-0xF0, 0xA3, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0,
-0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x93, 0xAA, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02,
-0x87, 0xE0, 0xF9, 0x90, 0x8F, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xFC, 0xEC, 0xC3, 0x99, 0x40,
-0x02, 0x81, 0xFC, 0x90, 0x93, 0xAA, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xEA, 0x90, 0xFD, 0x11, 0xF0,
-0xAF, 0x03, 0xAD, 0x07, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE,
-0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF,
-0xEA, 0x3E, 0x54, 0x3F, 0x90, 0x93, 0xAC, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82,
-0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x74, 0x03,
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xFB, 0xEF, 0x24, 0x18, 0xFF,
-0xE4, 0x33, 0xCF, 0x2B, 0xCF, 0x3A, 0x90, 0x93, 0xAC, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x93,
-0xAC, 0xB1, 0x63, 0x90, 0x93, 0xAC, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0xAA, 0xEE, 0x8F,
-0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0xAB,
-0xE0, 0x9F, 0x90, 0x93, 0xAA, 0xE0, 0x9E, 0x40, 0x1B, 0x90, 0x8D, 0xF8, 0xE0, 0x24, 0x01, 0xFF,
-0x90, 0x8D, 0xF7, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0x90, 0x93, 0xAB, 0xE0, 0x9F, 0xF0, 0x90, 0x93,
-0xAA, 0xE0, 0x9E, 0xF0, 0x90, 0x93, 0xAA, 0x91, 0x04, 0x0C, 0x81, 0x3C, 0x22, 0xB1, 0x4D, 0xAD,
-0x07, 0x90, 0x01, 0xC4, 0x74, 0xFD, 0xF0, 0x74, 0x8C, 0xA3, 0xF0, 0xED, 0x64, 0x01, 0x60, 0x22,
-0x90, 0x8F, 0x35, 0xE0, 0x44, 0x01, 0xF0, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x40,
-0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x41, 0xF0, 0x7F, 0x01, 0x02,
-0x59, 0x6A, 0x91, 0x17, 0x90, 0x02, 0x87, 0xE0, 0x70, 0xF8, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x02,
-0xF0, 0x74, 0xFD, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x8C, 0xA3, 0xF0, 0x22, 0x90, 0x02, 0x86,
-0xE0, 0x20, 0xE2, 0x03, 0x7F, 0x04, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x7F, 0x01, 0x20, 0xE1, 0x02,
-0x7F, 0x02, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x07, 0xEF, 0x5D, 0xC3, 0x60, 0x14, 0x74,
-0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0x24, 0x08, 0xFF, 0xE4, 0x3E,
-0xFE, 0x80, 0x0D, 0x74, 0xFF, 0x9D, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0x5E, 0xFE, 0xED, 0x5F, 0xFF,
-0x22, 0xE4, 0x90, 0x95, 0x88, 0xF0, 0xA3, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x2C, 0xC3,
-0x90, 0x95, 0x89, 0xE0, 0x94, 0xD0, 0x90, 0x95, 0x88, 0xE0, 0x94, 0x07, 0x40, 0x0A, 0x90, 0x01,
-0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x95, 0x88, 0xE4, 0x75, 0xF0, 0x01, 0x12,
-0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xCD, 0x7F, 0x01, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x48, 0x81, 0xD0, 0xD0, 0x92, 0xAF,
-0x22, 0xB1, 0xCE, 0xD1, 0x06, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0xFF,
-0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE,
-0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0xF8, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
-0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x84, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xEE, 0xF0,
-0x0F, 0xEF, 0xB4, 0x08, 0xE3, 0x90, 0x90, 0x00, 0xE0, 0x90, 0x04, 0x8C, 0xF0, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xAA, 0x12, 0x45, 0xED, 0x12, 0x06, 0x89, 0x20, 0xE0,
-0x04, 0xB1, 0xE1, 0xE1, 0x65, 0x90, 0x90, 0x00, 0x74, 0x05, 0xF0, 0x90, 0x93, 0xAA, 0x12, 0x45,
-0xE4, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x30, 0xE0, 0x54, 0xFE, 0x4E, 0xFE,
-0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54,
-0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x8F, 0x30, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF,
-0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D,
-0xFF, 0x90, 0x8F, 0x30, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12,
-0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x8F, 0x30, 0xF0, 0xEE,
-0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x80,
-0xFF, 0x90, 0x8F, 0x31, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x12, 0x06, 0x89, 0x13, 0x13, 0x54, 0x3F,
-0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0xAA, 0x12, 0x45, 0xE4,
-0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44,
-0x08, 0xF0, 0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x02, 0x0D, 0x90, 0x8F, 0x31, 0xE0, 0xC4, 0x13, 0x13,
-0x13, 0x54, 0x01, 0x20, 0xE0, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54, 0x7F, 0xFF, 0x90,
-0x8F, 0x31, 0xE0, 0x54, 0x80, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x8F, 0x32,
-0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x33, 0xE0, 0x54,
-0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x8F, 0x31,
-0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x8F, 0x30, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20,
-0xE0, 0x02, 0x7D, 0x01, 0x12, 0x4A, 0x4C, 0x90, 0x8D, 0x06, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE,
-0x10, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0x35, 0xE0, 0xFF, 0x20,
-0xE0, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x14, 0xEF, 0x44, 0x01, 0x90, 0x8F, 0x35, 0xF0,
-0x90, 0x8F, 0x30, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22,
-0xEF, 0x90, 0x01, 0xC7, 0xB4, 0xA0, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x03, 0x74, 0x08, 0xF0, 0x90,
-0x8F, 0x35, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x94, 0xD4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90,
-0x93, 0xA6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x93, 0xAE, 0xF0, 0x90, 0x93, 0xAE, 0xE0,
-0xFD, 0xC3, 0x94, 0x06, 0x50, 0x28, 0x90, 0x93, 0xA7, 0xE0, 0x24, 0x04, 0xFF, 0x90, 0x93, 0xA6,
-0xE0, 0x34, 0x00, 0xFE, 0x12, 0x5B, 0x53, 0x90, 0x93, 0xAE, 0xE0, 0x24, 0xA8, 0xF5, 0x82, 0xE4,
-0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAE, 0xE0, 0x04, 0xF0, 0x80, 0xCE, 0x78, 0x36,
-0x7C, 0x8F, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xA8, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x47,
-0xA2, 0xEF, 0x7F, 0x00, 0x70, 0x02, 0x7F, 0x01, 0x22, 0x12, 0x6B, 0x30, 0x7E, 0x00, 0x74, 0x00,
-0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x08, 0x7B,
-0x01, 0x7A, 0x8F, 0x79, 0xF8, 0x02, 0x35, 0x26, 0x90, 0x93, 0xA6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-0xA3, 0xED, 0xF0, 0x78, 0xAF, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x56, 0x7E,
-0x00, 0x7F, 0x06, 0x12, 0x06, 0x63, 0x78, 0xB5, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40,
-0x79, 0x5C, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0x78, 0xB9, 0x7C, 0x93, 0x7D, 0x01, 0x7B,
-0xFF, 0x7A, 0x40, 0x79, 0x60, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0xE4, 0x90, 0x93, 0xBE,
-0xF0, 0x90, 0x93, 0xA8, 0xE0, 0xFF, 0x90, 0x93, 0xA7, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA6, 0xE0,
-0x34, 0x00, 0xCF, 0x24, 0x06, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x53, 0xEF, 0x64,
-0x08, 0x60, 0x02, 0x41, 0x08, 0x90, 0x93, 0xA8, 0xE0, 0xFF, 0x90, 0x93, 0xA7, 0xE0, 0x2F, 0xFF,
-0x90, 0x93, 0xA6, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x07, 0xCF, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12,
-0x5B, 0x53, 0xEF, 0x64, 0x06, 0x60, 0x02, 0x41, 0x08, 0x90, 0x93, 0xBE, 0x04, 0xF0, 0xE4, 0x90,
-0x93, 0xBD, 0xF0, 0x90, 0x93, 0xBD, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x25, 0x90, 0x93, 0xA7,
-0xE0, 0x24, 0x0A, 0xFD, 0x90, 0x93, 0xA6, 0xE0, 0x12, 0x5B, 0x46, 0x90, 0x93, 0xBD, 0xE0, 0x24,
-0xA9, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xBD, 0xE0, 0x04, 0xF0,
-0x80, 0xD1, 0x78, 0xA9, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x3C, 0x7E, 0x00,
-0x7F, 0x06, 0x12, 0x47, 0xA2, 0xEF, 0x60, 0x02, 0x41, 0x08, 0x90, 0x93, 0xBD, 0xF0, 0x90, 0x93,
-0xBD, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x2E, 0x90, 0x93, 0xA8, 0xE0, 0xFD, 0x90, 0x93, 0xA7,
-0xE0, 0x2D, 0xFD, 0x90, 0x93, 0xA6, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x20, 0x12, 0x5B, 0x45, 0x90,
-0x93, 0xBD, 0xE0, 0x24, 0xB9, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93,
-0xBD, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x78, 0xB9, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F,
-0x79, 0x52, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x47, 0xA2, 0xEF, 0x60, 0x02, 0x21, 0xFF, 0x90, 0x06,
-0x30, 0xE0, 0x44, 0x01, 0x54, 0xDF, 0xF0, 0x90, 0x8F, 0x2F, 0xE0, 0x30, 0xE0, 0x0F, 0x90, 0x01,
-0xC7, 0x74, 0x09, 0xF0, 0x90, 0x8F, 0x35, 0xE0, 0x44, 0x01, 0xF0, 0x41, 0x08, 0xE4, 0x90, 0x93,
-0xBD, 0xF0, 0x90, 0x93, 0xBD, 0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x1A, 0x12, 0x5B, 0x31, 0x90,
-0x93, 0xBD, 0xE0, 0x24, 0xAF, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93,
-0xBD, 0xE0, 0x04, 0xF0, 0x80, 0xDC, 0xE4, 0x90, 0x93, 0xBD, 0xF0, 0x90, 0x93, 0xBD, 0xE0, 0xFF,
-0xC3, 0x94, 0x04, 0x50, 0x2E, 0x90, 0x93, 0xA8, 0xE0, 0xFD, 0x90, 0x93, 0xA7, 0xE0, 0x2D, 0xFD,
-0x90, 0x93, 0xA6, 0xE0, 0x34, 0x00, 0xCD, 0x24, 0x16, 0x12, 0x5B, 0x45, 0x90, 0x93, 0xBD, 0xE0,
-0x24, 0xB5, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xBD, 0xE0, 0x04,
-0xF0, 0x80, 0xC8, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xAF, 0x90, 0x95, 0x0C, 0x12, 0x45, 0xED, 0xE4,
-0x90, 0x95, 0x0F, 0xF0, 0xA3, 0xF0, 0x7A, 0x93, 0x79, 0xB5, 0x12, 0x6D, 0xDC, 0x80, 0x09, 0x90,
-0x06, 0x30, 0xE0, 0x44, 0x21, 0x54, 0xEF, 0xF0, 0x90, 0x93, 0xBE, 0xE0, 0xFF, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x94, 0xD9, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0,
-0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0xE1, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90,
-0x01, 0xC4, 0x74, 0x0E, 0xF0, 0x74, 0x92, 0xA3, 0xF0, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01,
-0x1E, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x94, 0xD0, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x02, 0x82, 0xE0, 0x90, 0x94, 0xD8, 0xF0, 0x90, 0x8F, 0x2D, 0xE0, 0x20, 0xE0, 0x02, 0xA1,
-0xC7, 0xE4, 0x90, 0x94, 0xD7, 0xF0, 0x90, 0x94, 0xD8, 0xE0, 0xFF, 0x90, 0x94, 0xD7, 0xE0, 0xC3,
-0x9F, 0x40, 0x02, 0xA1, 0xC7, 0x90, 0x94, 0xD0, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90,
-0xFD, 0x11, 0xF0, 0x90, 0x94, 0xE1, 0xEF, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB,
-0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x7A,
-0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0xFE, 0x90, 0x94, 0xD2, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x94, 0xDD, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB,
-0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x74, 0x03, 0x2D, 0xF5, 0x82,
-0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x94,
-0xE2, 0xF0, 0x90, 0x94, 0xD1, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0xD0, 0xE0, 0x34, 0x00, 0xFE, 0x90,
-0x94, 0xD4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x12, 0x5B, 0x53, 0xC0, 0x07, 0x90, 0x94, 0xD4,
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x5B, 0x53, 0xC0, 0x07, 0x90, 0x94, 0xD4, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x04, 0x12, 0x5B, 0x53, 0xAB, 0x07, 0xD0, 0x05, 0xD0, 0x07, 0x12,
-0x6C, 0x75, 0x90, 0x94, 0xD9, 0xEF, 0xF0, 0x90, 0x94, 0xD4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4,
-0xFD, 0x12, 0x5B, 0x53, 0xEF, 0x54, 0xFC, 0x90, 0x94, 0xD6, 0xF0, 0x90, 0x94, 0xE2, 0xE0, 0xFF,
-0x90, 0x94, 0xD2, 0xE4, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x94, 0xD2, 0x12, 0x8D, 0x63, 0x90,
-0x94, 0xD2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xD0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D,
-0x0F, 0x12, 0x5B, 0x53, 0x90, 0x94, 0xD2, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x94, 0xD0, 0xEC,
-0x8D, 0xF0, 0x12, 0x08, 0xD6, 0x90, 0x8D, 0xF7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x94,
-0xD1, 0xE0, 0x9D, 0x90, 0x94, 0xD0, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x8D, 0xF8, 0xE0, 0x24, 0x01,
-0xFD, 0x90, 0x8D, 0xF7, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x94, 0xD1, 0xE0, 0x9D, 0xF0, 0x90,
-0x94, 0xD0, 0xE0, 0x9C, 0xF0, 0xEF, 0x30, 0xE6, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0xEF,
-0x30, 0xE7, 0x06, 0x90, 0x01, 0xC7, 0x74, 0x21, 0xF0, 0xEF, 0x30, 0xE5, 0x06, 0x90, 0x01, 0xC7,
-0x74, 0x23, 0xF0, 0x90, 0x94, 0xCF, 0xE0, 0x60, 0x4E, 0x90, 0x94, 0xD6, 0xE0, 0x24, 0xB0, 0x60,
-0x1D, 0x24, 0xD0, 0x60, 0x02, 0xA1, 0x5F, 0x90, 0x8D, 0xFA, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0,
-0x22, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x02, 0xA1, 0x5F, 0x80, 0x15, 0x90, 0x8D,
-0xFA, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0,
-0x02, 0xA1, 0x5F, 0x90, 0x94, 0xD4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x94, 0xDD, 0xE0, 0xFC,
-0xA3, 0xE0, 0xFD, 0xB1, 0xFB, 0xA1, 0x5F, 0x90, 0x94, 0xD6, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24,
-0x20, 0x70, 0x2E, 0x90, 0x8F, 0x30, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x20, 0xE0,
-0x02, 0xA1, 0x5F, 0x90, 0x8F, 0x42, 0xE0, 0x04, 0xF0, 0x12, 0x8F, 0xA7, 0xEF, 0x70, 0x02, 0xA1,
-0x5F, 0x90, 0x94, 0xD6, 0xE0, 0xFF, 0x12, 0x8F, 0x90, 0x90, 0x8F, 0x43, 0xE0, 0x04, 0xF0, 0xA1,
-0x5F, 0x90, 0x8F, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x77, 0x90, 0x94, 0xD9,
-0xE0, 0xFF, 0x90, 0x94, 0xD5, 0xE0, 0x2F, 0xFF, 0x90, 0x94, 0xD4, 0xE0, 0x34, 0x00, 0xCF, 0x24,
-0x08, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x94, 0xDF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x12, 0x5B,
-0x53, 0xEF, 0x64, 0x45, 0x70, 0x4E, 0x90, 0x94, 0xDF, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD1, 0x60,
-0xEF, 0x64, 0x01, 0x70, 0x3F, 0x90, 0x94, 0xDF, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD1, 0x20, 0xEF,
-0x64, 0x01, 0x70, 0x30, 0x90, 0x94, 0xE3, 0x04, 0xF0, 0x90, 0x94, 0xDF, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0xA3, 0xE0, 0xFD, 0xD1, 0xFD, 0xEF, 0x70, 0x13, 0x90, 0x94, 0xE1, 0xE0, 0xFD, 0x90, 0xFD,
-0x11, 0xF0, 0x90, 0x94, 0xDF, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD1, 0xA5, 0x90, 0x94, 0xE1, 0xE0,
-0x90, 0xFD, 0x11, 0xF0, 0x12, 0x8F, 0xA7, 0xEF, 0x60, 0x26, 0x90, 0x94, 0xD4, 0xE0, 0xFE, 0xA3,
-0xE0, 0xFF, 0x90, 0x94, 0xD9, 0xE0, 0xFD, 0x90, 0x94, 0xDC, 0xE0, 0xFB, 0x90, 0x94, 0xE1, 0xE0,
-0x90, 0x93, 0xAA, 0xF0, 0x12, 0x5F, 0x08, 0xEF, 0x60, 0x06, 0x90, 0x94, 0xE3, 0x74, 0x01, 0xF0,
-0x90, 0x8F, 0x2D, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x18, 0x90, 0x94, 0xD4, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0x90, 0x94, 0xD9, 0xE0, 0xFD, 0x11, 0x28, 0xEF, 0x60, 0x06, 0x90, 0x94, 0xE3, 0x74, 0x01,
-0xF0, 0x90, 0x8F, 0x2D, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x10, 0x90, 0x94, 0xD4, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x94, 0xD9, 0xE0, 0xFD, 0x12, 0x83, 0x1E, 0x90, 0x8F, 0x2D, 0xE0,
-0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x15, 0x90, 0x94, 0xE3, 0xE0, 0x70, 0x0F,
-0x90, 0x94, 0xD4, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x94, 0xD9, 0xE0, 0xFD, 0xF1, 0xD5, 0xB1,
-0xD7, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x05, 0x7F, 0x01, 0x12,
-0x59, 0x6A, 0x12, 0x8F, 0x6A, 0xEF, 0x64, 0x01, 0x70, 0x3C, 0x90, 0x8F, 0x44, 0xE0, 0x04, 0xF0,
-0x12, 0x8D, 0x4D, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60, 0x24, 0x90, 0x8F, 0x35, 0xE0, 0x44, 0x01,
-0xF0, 0xED, 0xB4, 0x02, 0x08, 0x90, 0x01, 0xC7, 0x74, 0x42, 0xF0, 0x80, 0x0A, 0xED, 0xB4, 0x04,
-0x06, 0x90, 0x01, 0xC7, 0x74, 0x43, 0xF0, 0x7F, 0x01, 0x12, 0x59, 0x6A, 0x80, 0x19, 0x90, 0x94,
-0xD0, 0x12, 0x8C, 0x04, 0x80, 0x09, 0x90, 0x8F, 0x2D, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90,
-0x94, 0xD7, 0xE0, 0x04, 0xF0, 0x41, 0x66, 0x74, 0x0E, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x92,
-0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0x35, 0xE0, 0x30, 0xE0, 0x03, 0x7F, 0x01,
-0x22, 0x90, 0x06, 0x90, 0xE0, 0x20, 0xE5, 0x10, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x09, 0x90,
-0x01, 0xC7, 0x74, 0x25, 0xF0, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA6, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x90, 0x94, 0xB1, 0xE0, 0x64, 0x01, 0xF0, 0xE0, 0x24, 0xFB, 0x90, 0x01, 0xC4,
-0xF0, 0x74, 0x95, 0xA3, 0xF0, 0x90, 0x93, 0xA6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x5B, 0x91,
-0x90, 0x93, 0xA6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x16, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0xFD,
-0x12, 0x5B, 0x53, 0x90, 0x90, 0xEC, 0xA3, 0xE0, 0xB5, 0x07, 0x1F, 0x90, 0x93, 0xA7, 0xE0, 0x24,
-0x16, 0xFF, 0x90, 0x93, 0xA6, 0xE0, 0x34, 0x00, 0xFE, 0x7D, 0x01, 0x12, 0x5B, 0x53, 0xEF, 0xFD,
-0x90, 0x90, 0xEC, 0xE0, 0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22,
-0x90, 0x93, 0xA6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xA8, 0xE0, 0xFD,
-0xC3, 0x94, 0x04, 0x50, 0x2D, 0x90, 0x93, 0xA7, 0xE0, 0x24, 0x10, 0xFF, 0x90, 0x93, 0xA6, 0xE0,
-0x34, 0x00, 0xFE, 0x12, 0x5B, 0x53, 0x90, 0x93, 0xA8, 0xE0, 0x24, 0xE8, 0xF5, 0x82, 0xE4, 0x34,
-0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA8, 0xE0, 0x04, 0xF0,
-0x80, 0xC9, 0x7F, 0x01, 0x22, 0x90, 0x93, 0xA6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0,
-0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xA9, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x50, 0x28, 0x90, 0x93, 0xA6,
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x5B, 0x53, 0x90, 0x93, 0xA9, 0xE0,
-0x24, 0x10, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xE0, 0xB5, 0x07, 0x1D, 0x90, 0x93, 0xA9,
-0xE0, 0x04, 0xF0, 0x80, 0xCE, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x01, 0xC7, 0x74,
-0x30, 0xF0, 0x7F, 0x01, 0x12, 0x59, 0x6A, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA6,
-0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x90, 0xE2, 0xE0, 0x70, 0x02, 0xA3, 0xE0,
-0x60, 0x3A, 0xE4, 0x90, 0x93, 0xA9, 0xF0, 0x90, 0x93, 0xA9, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x50,
-0x2B, 0x90, 0x93, 0xA6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x5B, 0x53,
-0x90, 0x93, 0xA9, 0xE0, 0x24, 0xF0, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x6F, 0x60,
-0x03, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA9, 0xE0, 0x04, 0xF0, 0x80, 0xCB, 0x90, 0x06, 0x32, 0xE0,
-0x44, 0x40, 0xF0, 0xE4, 0x90, 0x90, 0xEE, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x12, 0x6B, 0x30,
-0x7E, 0x00, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42,
-0x75, 0x43, 0x70, 0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x60, 0x02, 0x35, 0x26, 0xEF, 0x60, 0x07, 0x90,
-0x93, 0x7E, 0xE0, 0xFF, 0xF1, 0x5D, 0x22, 0x90, 0x93, 0xB6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7D,
-0x09, 0x12, 0x5B, 0x53, 0xEF, 0x64, 0x06, 0x70, 0x39, 0x90, 0x93, 0xB6, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0x7D, 0x14, 0x12, 0x5B, 0x53, 0xEF, 0x70, 0x29, 0x90, 0x93, 0xB6, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0x7D, 0x15, 0x12, 0x5B, 0x53, 0xEF, 0x64, 0x50, 0x70, 0x17, 0x90, 0x93, 0xB6, 0xE0, 0xFE,
-0xA3, 0xE0, 0xFF, 0x7D, 0x21, 0x12, 0x5B, 0x53, 0xEF, 0x20, 0xE0, 0x03, 0x30, 0xE2, 0x03, 0x7F,
-0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x93, 0xA6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0,
-0x78, 0xA9, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x90, 0x7E, 0x00, 0x7F, 0x06,
-0x12, 0x06, 0x63, 0x78, 0xB0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0xFF, 0x7A, 0x40, 0x79, 0x96, 0x7E,
-0x00, 0x7F, 0x04, 0x12, 0x06, 0x63, 0xE4, 0x90, 0x93, 0xAF, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0xFF,
-0xC3, 0x94, 0x06, 0x50, 0x25, 0x90, 0x93, 0xA7, 0xE0, 0x24, 0x04, 0xFD, 0x90, 0x93, 0xA6, 0xE0,
-0x12, 0x5B, 0x46, 0x90, 0x93, 0xAF, 0xE0, 0x24, 0xA9, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83,
-0xEF, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, 0xA9, 0x7C, 0x93, 0x7D, 0x01,
-0x7B, 0x01, 0x7A, 0x8F, 0x79, 0x36, 0x7E, 0x00, 0x7F, 0x06, 0x12, 0x47, 0xA2, 0xEF, 0x60, 0x02,
-0x01, 0xFF, 0x90, 0x93, 0xA8, 0xE0, 0xFF, 0x90, 0x93, 0xA7, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xA6,
-0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xB4, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x06, 0xFF, 0xE4, 0x3E,
-0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x53, 0xEF, 0x64, 0x08, 0x60, 0x02, 0x01, 0xFF, 0x90, 0x93, 0xB5,
-0xE0, 0x24, 0x07, 0xFF, 0x90, 0x93, 0xB4, 0xE0, 0x34, 0x00, 0xFE, 0xE4, 0xFD, 0x12, 0x5B, 0x53,
-0xEF, 0x70, 0x6C, 0x90, 0x93, 0xAF, 0xF0, 0x90, 0x93, 0xAF, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50,
-0x25, 0x90, 0x93, 0xB5, 0xE0, 0x24, 0x18, 0xFD, 0x90, 0x93, 0xB4, 0xE0, 0x12, 0x5B, 0x46, 0x90,
-0x93, 0xAF, 0xE0, 0x24, 0xB0, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93,
-0xAF, 0xE0, 0x04, 0xF0, 0x80, 0xD1, 0x78, 0xB0, 0x7C, 0x93, 0x7D, 0x01, 0x7B, 0x01, 0x7A, 0x8F,
-0x79, 0x52, 0x7E, 0x00, 0x7F, 0x04, 0x12, 0x47, 0xA2, 0xEF, 0x70, 0x23, 0x90, 0x93, 0xB5, 0xE0,
-0x24, 0x08, 0xFF, 0x90, 0x93, 0xB4, 0xE0, 0x34, 0x00, 0xFE, 0x12, 0x97, 0x87, 0xEF, 0x64, 0x01,
-0x60, 0x0D, 0x90, 0x01, 0xC7, 0x74, 0x22, 0xF0, 0x90, 0x8F, 0x35, 0xE0, 0x44, 0x01, 0xF0, 0x22,
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x95, 0x29, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0xA3,
-0xEB, 0xF0, 0xAA, 0x07, 0x90, 0x95, 0x30, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x90, 0x95,
-0x2B, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xEA, 0x24, 0xEF, 0x60, 0x6E, 0x24, 0xD7, 0x70,
-0x02, 0x61, 0x07, 0x24, 0x3A, 0x60, 0x02, 0x61, 0x90, 0x90, 0x95, 0x29, 0xA3, 0xE0, 0xFF, 0x24,
-0x0A, 0xFD, 0xE4, 0x33, 0x90, 0x95, 0x34, 0xF0, 0xA3, 0xED, 0xF0, 0xFE, 0x24, 0x00, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0xE4, 0xF0, 0xFE, 0x74, 0x00, 0x2F, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x7D, 0x14,
-0x7C, 0x00, 0x12, 0x26, 0x4E, 0x90, 0x95, 0x30, 0x12, 0x08, 0x6D, 0x7B, 0x00, 0x7A, 0x00, 0x79,
-0x00, 0x90, 0xAC, 0x67, 0x12, 0x45, 0xED, 0x90, 0x95, 0x30, 0x12, 0x45, 0xC0, 0x90, 0xAC, 0x6A,
-0x12, 0x08, 0x6D, 0x7D, 0x14, 0x7C, 0x00, 0xE4, 0xFF, 0x61, 0x02, 0x90, 0x95, 0x29, 0xE4, 0x75,
-0xF0, 0x14, 0x12, 0x08, 0xD6, 0x90, 0x95, 0x29, 0xA3, 0xE0, 0xFB, 0xFF, 0x24, 0x06, 0xFC, 0xE4,
-0x33, 0x90, 0x95, 0x34, 0xF0, 0xA3, 0xCC, 0xF0, 0x90, 0x95, 0x34, 0xA3, 0xE0, 0xFE, 0x24, 0x00,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
-0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0xFE, 0xA9, 0x03, 0x74, 0x05, 0x29, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x7C, 0x00,
-0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0x90, 0x95, 0x2E, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x29,
-0xE0, 0xFC, 0xA3, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xD3, 0xEF, 0x94, 0x00, 0xEE, 0x94, 0x01,
-0x90, 0x95, 0x29, 0x50, 0x02, 0x41, 0x9C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE9, 0x7C, 0x00, 0x24,
-0x00, 0xF9, 0xEC, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC3, 0xE4, 0x9F, 0xFD, 0x74, 0x01, 0x9E, 0xFC,
-0x12, 0x26, 0x4E, 0x90, 0x95, 0x30, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x2B, 0xE0, 0x24, 0x01, 0xFF,
-0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0x95, 0x30, 0x12, 0x45,
-0xCC, 0xC0, 0x00, 0xC0, 0x01, 0xC0, 0x02, 0xC0, 0x03, 0x7B, 0x01, 0x7A, 0xFC, 0x79, 0x00, 0x90,
-0x95, 0x29, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0xE4, 0x9F, 0xFF, 0x74, 0x01, 0x9E, 0xFE, 0x90,
-0x95, 0x2E, 0xE0, 0xFC, 0xA3, 0xE0, 0xC3, 0x9F, 0xFD, 0xEC, 0x9E, 0xFC, 0x12, 0x26, 0x4E, 0xD0,
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x39, 0x90, 0x95, 0x30, 0x12, 0x08, 0x6D,
-0x90, 0x95, 0x2B, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x80, 0x1E, 0xA3, 0xE0, 0x7E, 0x00,
-0x24, 0x00, 0xF9, 0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x90, 0x95, 0x2E, 0xE0, 0xFC, 0xA3, 0xE0,
-0xFD, 0x12, 0x26, 0x4E, 0x90, 0x95, 0x30, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x29, 0x74, 0xFF, 0x75,
-0xF0, 0xEC, 0x12, 0x08, 0xD6, 0x90, 0x95, 0x29, 0xA3, 0xE0, 0xFF, 0x7E, 0x00, 0x24, 0x0C, 0xF9,
-0xEE, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0x74, 0x10, 0x2F, 0xF9, 0xEE, 0x34,
-0xFC, 0xFA, 0x90, 0xAC, 0x67, 0x12, 0x45, 0xED, 0x90, 0x95, 0x30, 0x12, 0x45, 0xC0, 0x90, 0xAC,
-0x6A, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x2E, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD0, 0x01, 0xD0, 0x02,
-0x7F, 0x11, 0x12, 0x1B, 0xAC, 0x61, 0x88, 0x90, 0x95, 0x29, 0xA3, 0xE0, 0xFF, 0x24, 0x2A, 0xFD,
-0xE4, 0x33, 0x90, 0x95, 0x34, 0xF0, 0xA3, 0xED, 0xF0, 0xFE, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
-0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE4,
-0xF0, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0x7D, 0x48, 0x7C, 0x00, 0x12,
-0x26, 0x4E, 0x90, 0x95, 0x30, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x30, 0x12, 0x45, 0xC0, 0x78, 0x10,
-0x12, 0x08, 0x47, 0x90, 0x95, 0x30, 0x12, 0x45, 0xCC, 0x12, 0x45, 0x39, 0xE4, 0xFD, 0xFC, 0x90,
-0x95, 0x30, 0x12, 0x08, 0x6D, 0x90, 0x95, 0x30, 0x12, 0x45, 0xC0, 0x78, 0x10, 0x12, 0x08, 0x47,
-0x90, 0x95, 0x30, 0x12, 0x45, 0xCC, 0x12, 0x45, 0x39, 0x90, 0x95, 0x30, 0x12, 0x08, 0x6D, 0x90,
-0x95, 0x30, 0x12, 0x45, 0xC0, 0x12, 0x08, 0x3A, 0x90, 0x95, 0x2C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x95, 0x2C, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90, 0x95, 0x34, 0xA3, 0xE0, 0xFE,
-0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x01, 0x2E, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x8F, 0x2D, 0xE0, 0x54, 0xFE,
-0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89,
-0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0x8F, 0x2D, 0xF0, 0xEE, 0x54, 0x08,
-0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54,
-0xEF, 0x4D, 0xFF, 0x90, 0x8F, 0x2D, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF,
-0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0xFF, 0x90, 0x8F, 0x2D,
-0xF0, 0xEE, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2,
-0x54, 0x01, 0xFF, 0x90, 0x8F, 0x2F, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x01, 0x17, 0xE0, 0xFE,
-0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x8D, 0xF7, 0xF0, 0xA3,
-0xEF, 0xF0, 0x90, 0x8F, 0x2D, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0x91, 0xA9, 0x90, 0x8F, 0x2D,
-0xE0, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x97, 0x7C, 0x90, 0x8F, 0x2D, 0xE0, 0x13, 0x13, 0x13,
-0x54, 0x01, 0xFF, 0x91, 0xB5, 0x90, 0x8F, 0x2D, 0xE0, 0xC4, 0x54, 0x01, 0xFF, 0x91, 0x9B, 0x90,
-0x8F, 0x2D, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x6C, 0x46, 0x90, 0x8F, 0x2D, 0xE0,
-0x54, 0x01, 0xFF, 0x12, 0x66, 0x33, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x0A, 0x90, 0x06,
-0x31, 0xE0, 0x44, 0x80, 0xF0, 0x12, 0xA8, 0xAE, 0x22, 0xEF, 0x60, 0x08, 0x90, 0x93, 0x79, 0xE0,
-0xFF, 0x12, 0x6F, 0xDB, 0x22, 0xE4, 0xFD, 0xFC, 0xEF, 0x60, 0x59, 0x90, 0x93, 0x7C, 0xE0, 0xFF,
-0x12, 0x6B, 0x30, 0x7C, 0x00, 0xAD, 0x07, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B,
-0x01, 0x90, 0x93, 0xAA, 0x12, 0x45, 0xED, 0x90, 0x93, 0xAA, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A,
-0x41, 0x89, 0x42, 0x75, 0x43, 0x40, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0x02, 0x12, 0x35, 0x26, 0xE4,
-0xFD, 0x7F, 0x03, 0x12, 0x30, 0xCE, 0x90, 0x93, 0x7D, 0xE0, 0x75, 0xF0, 0x80, 0xA4, 0xAE, 0xF0,
-0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x39, 0xD6, 0x7D, 0x01, 0x7F,
-0x03, 0x12, 0x30, 0xCE, 0x22, 0x90, 0x02, 0x09, 0xE0, 0x90, 0x93, 0xAA, 0xF0, 0x12, 0x06, 0x89,
-0x90, 0x93, 0x76, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x93, 0x77, 0xF0, 0x22, 0x90,
-0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93, 0x78, 0xF0,
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x79, 0xF0, 0x90, 0x00, 0x02,
-0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7A, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2,
-0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7B, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F,
-0x90, 0x93, 0x7C, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x7D,
-0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93, 0x7E, 0xF0,
-0x22, 0x90, 0x02, 0x09, 0xE0, 0xFD, 0x12, 0x06, 0x89, 0xFE, 0xAF, 0x05, 0xED, 0x2E, 0x90, 0x93,
-0x7F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x80, 0xF0, 0x90,
-0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x81, 0xF0, 0x90, 0x00, 0x03, 0x12,
-0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90, 0x93, 0x82, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF,
-0xED, 0x2F, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0xED, 0x2F, 0x90,
-0x93, 0x84, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xFF, 0xAE, 0x05, 0xED, 0x2F, 0x90, 0x93,
-0x85, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0xEF, 0x2E, 0x90, 0x93,
-0x86, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0x18, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0,
-0xFE, 0x74, 0x3C, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x10, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0x06, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x36, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-0x8F, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x06, 0xCB, 0x22, 0x90, 0x93, 0x8C, 0xE0, 0x30,
-0xE0, 0x72, 0x90, 0x93, 0x90, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x93, 0xE0, 0x64, 0x01, 0x70, 0x27,
-0x90, 0x93, 0x8C, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1C, 0x90, 0x93, 0x92, 0xE0, 0x70,
-0x16, 0x90, 0x93, 0x8F, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x40, 0x0B, 0x12, 0x59, 0x62, 0x90,
-0x93, 0x8C, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x93, 0x90, 0xE0, 0xFF, 0x90, 0x93, 0x8D, 0xE0,
-0xD3, 0x9F, 0x50, 0x30, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2, 0x1A, 0x90, 0x93, 0x92, 0xE0, 0x70,
-0x14, 0x7D, 0x08, 0xFF, 0x12, 0x52, 0xA6, 0x90, 0x93, 0x91, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x8B,
-0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0x93, 0x90, 0xF0,
-0x90, 0x93, 0x92, 0xF0, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90,
-0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xD1, 0xB5,
-0xEF, 0x64, 0x01, 0x70, 0x47, 0x90, 0x8E, 0x87, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0x8E,
-0x85, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0x8E, 0x87, 0xE0,
-0x20, 0xE4, 0x29, 0x90, 0x8E, 0x80, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x8F,
-0x28, 0xE0, 0x70, 0x18, 0x90, 0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30,
-0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90,
-0x02, 0x87, 0xE0, 0x70, 0x24, 0x90, 0x8F, 0x2D, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x02, 0x82, 0xE0,
-0x70, 0x17, 0x90, 0x8F, 0x35, 0xE0, 0x20, 0xE0, 0x10, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE1, 0x09,
-0x90, 0x04, 0x1D, 0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xE4, 0xFD, 0xFF, 0x12,
-0x52, 0x4D, 0x7D, 0x04, 0x7F, 0x01, 0x02, 0x4F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x12, 0x4C, 0x7B, 0x12, 0x4F, 0x8F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0x29, 0xE0, 0x30,
-0xE0, 0x12, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x12, 0x65, 0xDF, 0x90, 0x8F, 0x2B, 0xE0,
-0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x8D, 0x09, 0xE0, 0xFF, 0x90, 0x95, 0x51, 0xE0, 0xFB, 0x7D,
-0x01, 0x12, 0x6A, 0x64, 0x90, 0x95, 0x52, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x95,
-0x50, 0xE0, 0xFF, 0x12, 0xA0, 0x32, 0x90, 0x95, 0x52, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81,
-0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F,
-0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E,
-0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0,
-0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED,
-0xF0, 0x22, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0,
-0xEF, 0x60, 0x1D, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10,
-0xF0, 0x74, 0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x22,
-0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x09,
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0x93, 0xB3,
-0xED, 0xF0, 0x90, 0x93, 0xB1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x11, 0x9A, 0x90, 0x93, 0xB1, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x02, 0x53, 0x76, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x90, 0x93, 0x77, 0xE0, 0xFD, 0xB4, 0x02, 0x0C, 0x90, 0x94, 0x04, 0x74, 0x80, 0xF0, 0xA3,
-0x74, 0x08, 0xF0, 0x80, 0x0E, 0xED, 0xB4, 0x04, 0x0A, 0x90, 0x94, 0x04, 0x74, 0x80, 0xF0, 0xA3,
-0x74, 0x10, 0xF0, 0xEF, 0x64, 0x02, 0x4E, 0x60, 0x02, 0x21, 0x91, 0x90, 0x90, 0x43, 0xE0, 0xFF,
-0x64, 0xFE, 0x70, 0x02, 0x21, 0x91, 0xEF, 0x64, 0x02, 0x60, 0x07, 0xEF, 0x64, 0x03, 0x60, 0x02,
-0x21, 0x91, 0x90, 0x90, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFD, 0xED, 0xFF, 0x90, 0x94, 0x06, 0xEE,
-0xF0, 0xA3, 0xEF, 0xF0, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xC4,
-0x12, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x20, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xE4, 0x12,
-0x08, 0xAA, 0x90, 0xAC, 0x7A, 0x74, 0x10, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x20, 0xFD,
-0xFC, 0xFF, 0xFE, 0x12, 0x39, 0x9C, 0x7B, 0x01, 0x7A, 0x90, 0x79, 0xA5, 0x90, 0xAC, 0x89, 0x12,
-0x45, 0xED, 0x7A, 0x93, 0x79, 0xE4, 0x90, 0xAC, 0x8C, 0x12, 0x45, 0xED, 0x90, 0xAC, 0x8F, 0x74,
-0x20, 0xF0, 0x7A, 0x90, 0x79, 0x12, 0x12, 0x34, 0x5B, 0x75, 0x40, 0x01, 0x75, 0x41, 0x93, 0x75,
-0x42, 0xEC, 0x75, 0x43, 0x18, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xC4, 0x12, 0x35, 0x26, 0x75, 0x40,
-0x01, 0x75, 0x41, 0x93, 0x75, 0x42, 0xCC, 0x75, 0x43, 0x10, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB4,
-0x12, 0x35, 0x26, 0x90, 0x93, 0xCA, 0xE0, 0x54, 0x03, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x90, 0x00,
-0x50, 0x04, 0xEF, 0xF0, 0x80, 0x03, 0x74, 0x05, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0xB4, 0x31,
-0x96, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x94, 0x08, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0xED, 0x90,
-0x94, 0x09, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01,
-0x7A, 0x94, 0x79, 0x0C, 0x12, 0x35, 0x26, 0x90, 0x94, 0x08, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24,
-0x02, 0x51, 0x7A, 0x90, 0x94, 0x09, 0x12, 0x45, 0xE4, 0xE9, 0x24, 0x04, 0xF9, 0xE4, 0x3A, 0x8B,
-0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0C, 0x12, 0x35,
-0x26, 0x90, 0x94, 0x08, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0x51, 0x7A, 0x90, 0x94, 0x09,
-0x12, 0x45, 0xE4, 0xE9, 0x24, 0x08, 0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75,
-0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94, 0x79, 0x0C, 0x12, 0x35, 0x26, 0x90, 0x94, 0x08, 0xE0, 0x75,
-0xF0, 0x08, 0xA4, 0x24, 0x04, 0x51, 0x7A, 0x90, 0x94, 0x09, 0x12, 0x45, 0xE4, 0xE9, 0x24, 0x0C,
-0xF9, 0xE4, 0x3A, 0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04, 0x7B, 0x01, 0x7A, 0x94,
-0x79, 0x0C, 0x12, 0x35, 0x26, 0x90, 0x94, 0x08, 0xE0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0x51,
-0x7A, 0x90, 0x94, 0x08, 0xE0, 0xFE, 0x44, 0x10, 0x90, 0x94, 0x0C, 0xF0, 0xA3, 0x74, 0x80, 0xF0,
-0xA3, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x51, 0x7A, 0x90, 0x94, 0x0C,
-0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x94, 0x08, 0xE0, 0x75, 0xF0, 0x08,
-0xA4, 0x04, 0x51, 0x7A, 0x90, 0x06, 0x72, 0xE4, 0xF0, 0x22, 0xFF, 0x7B, 0x01, 0x7A, 0x94, 0x79,
-0x0C, 0x12, 0x06, 0x89, 0x90, 0x06, 0x74, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0x06,
-0x75, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x06, 0x76, 0xF0, 0x90, 0x00, 0x03, 0x12,
-0x06, 0xA2, 0x90, 0x06, 0x77, 0xF0, 0x90, 0x06, 0x70, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x04,
-0xF0, 0xA3, 0x74, 0x80, 0xF0, 0x7F, 0x01, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x90, 0x95, 0x1B, 0x12,
-0x45, 0xED, 0x12, 0x06, 0x89, 0x90, 0x95, 0x20, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90,
-0x95, 0x21, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x22, 0xF0, 0x90, 0x00, 0x05,
-0x12, 0x06, 0xA2, 0x90, 0x95, 0x23, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x24,
-0xF0, 0x90, 0x00, 0x07, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x25, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06,
-0xA2, 0x90, 0x95, 0x28, 0xF0, 0xED, 0x70, 0x31, 0xFF, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-0x95, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5,
-0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0,
-0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4, 0x06, 0xD0, 0x90, 0x95, 0x1F, 0xE0, 0xFF, 0xB4, 0x04,
-0x25, 0xA3, 0xE0, 0xFE, 0x90, 0x95, 0x1B, 0x12, 0x45, 0xE4, 0xEE, 0x12, 0x06, 0xCF, 0x90, 0x95,
-0x21, 0xE0, 0xFE, 0x90, 0x95, 0x1B, 0x12, 0x45, 0xE4, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1,
-0x90, 0x00, 0x02, 0xE4, 0x80, 0x30, 0xEF, 0xB4, 0x02, 0x2F, 0x90, 0x95, 0x21, 0xE0, 0xFF, 0x90,
-0x95, 0x1B, 0x12, 0x45, 0xE4, 0xEF, 0x12, 0x06, 0xCF, 0x90, 0x95, 0x21, 0xE0, 0x44, 0x20, 0x54,
-0x7F, 0xFF, 0x90, 0x95, 0x1B, 0x12, 0x45, 0xE4, 0x90, 0x00, 0x01, 0xEF, 0x12, 0x06, 0xE1, 0x90,
-0x95, 0x20, 0xE0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x1B, 0x12, 0x45, 0xE4, 0xE9,
-0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0x44, 0x20, 0x12, 0x06, 0xCF, 0x90, 0x95,
-0x22, 0xE0, 0xFF, 0x90, 0x95, 0x1B, 0x12, 0x45, 0xE4, 0x90, 0x00, 0x04, 0xEF, 0x12, 0x06, 0xE1,
-0x90, 0x95, 0x23, 0xE0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x24, 0xE0, 0x90, 0x00,
-0x06, 0x12, 0x06, 0xE1, 0x90, 0x95, 0x25, 0xE0, 0x90, 0x00, 0x07, 0x02, 0x06, 0xE1, 0x90, 0x95,
-0x39, 0xED, 0xF0, 0x90, 0x95, 0x36, 0x12, 0x45, 0xED, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90,
-0x95, 0x3D, 0xF0, 0x90, 0x95, 0x36, 0x12, 0x45, 0xE4, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75,
-0x43, 0x03, 0x7B, 0x01, 0x7A, 0x95, 0x79, 0x3A, 0x12, 0x35, 0x26, 0x90, 0x95, 0x39, 0xE0, 0x70,
-0x46, 0xFF, 0x74, 0x3A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xB4, 0xFF, 0x0E,
-0x74, 0x3A, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x0F, 0x74, 0x3A,
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x05, 0x0F, 0xEF, 0xB4,
-0x03, 0xD0, 0x75, 0x40, 0x01, 0x75, 0x41, 0x95, 0x75, 0x42, 0x3A, 0x75, 0x43, 0x03, 0x90, 0x95,
-0x36, 0x12, 0x45, 0xE4, 0x12, 0x35, 0x26, 0x22, 0x12, 0x6B, 0x2B, 0x74, 0x00, 0x2F, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xB6, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xB7, 0xF0, 0x74, 0x02, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94, 0xB8, 0xF0, 0x74, 0x03, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
-0xF5, 0x83, 0xE0, 0x90, 0x94, 0xB9, 0xF0, 0x74, 0x04, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0x90, 0x94, 0xBA, 0xF0, 0x74, 0x05, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0x90, 0x94, 0xBB, 0xF0, 0x74, 0x06, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0x90, 0x94, 0xBC, 0xF0, 0x74, 0x07, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90,
-0x94, 0xBD, 0xF0, 0x74, 0x08, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x94,
-0xBE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xB7, 0xEF, 0xF0, 0x12,
-0x6B, 0x2B, 0x74, 0x10, 0x2F, 0xFF, 0x90, 0x93, 0xB7, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0x2F, 0xFF,
-0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x40, 0x01, 0xF5, 0x41, 0x89, 0x42, 0x75, 0x43, 0x04,
-0x7B, 0x01, 0x7A, 0x94, 0x79, 0xC6, 0x12, 0x35, 0x26, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8D,
-0xFA, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB,
-0xF0, 0xE4, 0x90, 0x94, 0xCE, 0xF0, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F,
-0x90, 0x94, 0xB4, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xFD, 0x12, 0x08, 0x6D, 0x7F,
-0x50, 0x7E, 0x0C, 0x12, 0x76, 0x94, 0x90, 0x94, 0xF9, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x7F,
-0x90, 0x94, 0xB5, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x94, 0xFD, 0x12, 0x08, 0x6D, 0x12,
-0x76, 0x90, 0x90, 0x94, 0xCA, 0xE0, 0x90, 0x06, 0x08, 0xF0, 0x90, 0x94, 0xCC, 0xA3, 0xE0, 0x90,
-0x06, 0xA0, 0xF0, 0xA3, 0xE4, 0xF0, 0x90, 0x94, 0xB8, 0xE0, 0xFF, 0x60, 0x06, 0xA3, 0xE0, 0xFD,
-0x12, 0x87, 0x9E, 0x90, 0x94, 0xB7, 0xE0, 0xFF, 0x60, 0x11, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB,
-0x90, 0x94, 0xBE, 0xE0, 0x90, 0x95, 0x68, 0xF0, 0x12, 0x77, 0x02, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x90, 0x94, 0xB6, 0xE0, 0xFE, 0x90, 0x94, 0xB3, 0xE0, 0xC3, 0x9E, 0x40, 0x04,
-0x7F, 0x00, 0x80, 0x0E, 0xEF, 0x60, 0x05, 0xD3, 0x94, 0x0E, 0x40, 0x04, 0x7F, 0x00, 0x80, 0x02,
-0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93,
-0xB7, 0xEF, 0xF0, 0x7D, 0x38, 0x7F, 0xFF, 0x12, 0x52, 0x4D, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x1B,
-0x90, 0x06, 0x32, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x93, 0xB7, 0x12, 0x6A, 0x5E, 0x90, 0x93, 0xB8,
-0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7D, 0x38, 0xE4, 0xFF, 0x12,
-0x52, 0x4D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x01, 0x1D, 0xE0, 0xFE, 0x90,
-0x01, 0x1C, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x95, 0x6D, 0xF0, 0xA3, 0xEF,
-0xF0, 0x90, 0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xE0, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90,
-0x95, 0x6F, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x95, 0x6F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x95,
-0x6D, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xB5, 0x07, 0x06, 0xEA, 0xB5, 0x06, 0x02, 0x80, 0x4C, 0x90,
-0x95, 0x6F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xD3, 0xEB, 0x9F, 0xEA, 0x9E, 0x40, 0x0E, 0x90, 0x95,
-0x6E, 0xE0, 0x9F, 0xFD, 0x90, 0x95, 0x6D, 0xE0, 0x9E, 0xFC, 0x80, 0x2F, 0x90, 0x95, 0x6F, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x95, 0x6E, 0xE0, 0x9F, 0x90, 0x95, 0x6D, 0xE0, 0x9E, 0x50,
-0x1A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x90, 0x95, 0x70, 0xE0, 0x9F, 0xFF, 0x90, 0x95, 0x6F,
-0xE0, 0x9E, 0xFE, 0xC3, 0xE4, 0x9F, 0xFD, 0x74, 0x40, 0x9E, 0xFC, 0xD3, 0xED, 0x94, 0x00, 0xEC,
-0x94, 0x38, 0x40, 0x08, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0xC3, 0xEC, 0x94, 0x08,
-0x50, 0x0F, 0xED, 0x94, 0x00, 0xEC, 0x94, 0x00, 0x40, 0x07, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04,
-0xF0, 0x22, 0x90, 0x8D, 0xFA, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3D, 0x90,
-0x91, 0x3A, 0x12, 0x45, 0xC0, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x18, 0x90, 0x93, 0x72, 0x12, 0x45,
-0xCC, 0xD3, 0x12, 0x45, 0xAF, 0x40, 0x0C, 0xE4, 0x7F, 0xE8, 0x7E, 0x03, 0xFD, 0xFC, 0x90, 0x91,
-0x3E, 0x80, 0x0A, 0xE4, 0x7F, 0xE8, 0x7E, 0x03, 0xFD, 0xFC, 0x90, 0x91, 0x36, 0x12, 0x45, 0xCC,
-0x12, 0x45, 0x46, 0x90, 0x95, 0x45, 0x12, 0x08, 0x6D, 0x12, 0x64, 0x3A, 0x22, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x95, 0x8D, 0xF0, 0x7D, 0x1B, 0x7F, 0xFF,
-0x12, 0x52, 0x4D, 0x90, 0x8D, 0xFB, 0xE0, 0xFF, 0x12, 0x6B, 0x30, 0x90, 0x95, 0x8C, 0xEF, 0xF0,
-0xE0, 0x24, 0x10, 0xF0, 0xE0, 0xFF, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0x54, 0x80, 0x44, 0x04, 0xFE, 0x74, 0x00, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE,
-0xF0, 0x90, 0x95, 0x8D, 0xE0, 0xFF, 0x7D, 0x1C, 0x12, 0x52, 0x4D, 0x90, 0x95, 0x8C, 0xE0, 0x24,
-0xF0, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x95, 0x8D, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x1E, 0xF6, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x8F, 0x2D, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x93, 0x82, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xDC, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x90, 0xEE, 0xF0,
-0xA3, 0xF0, 0x90, 0x91, 0x30, 0xF0, 0xA3, 0xF0, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x93, 0x82, 0xE0,
-0xFF, 0x12, 0x6B, 0x30, 0x7C, 0x00, 0xAD, 0x07, 0xAB, 0x05, 0x74, 0x01, 0x2B, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xDC, 0xF0, 0xA3, 0xEF, 0xF0, 0x74,
-0x03, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x02, 0x2B, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90, 0xDE, 0xF0, 0xA3,
-0xEF, 0xF0, 0x74, 0x05, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x04,
-0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x90, 0x90,
-0xE0, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x07, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0xFE, 0x74, 0x06, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEA,
-0x3E, 0x90, 0x90, 0xE2, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x09, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
-0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x08, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x24,
-0x00, 0xFF, 0xEC, 0x3E, 0x90, 0x90, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xAD, 0x07, 0x90, 0x90,
-0xE6, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x90, 0x90, 0xE6, 0xE0, 0xFF, 0xAE, 0x05, 0x74,
-0x04, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x90, 0xE6, 0xA3, 0xE0,
-0xFF, 0x74, 0x05, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x93, 0xAA, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x86, 0xE0,
-0xFF, 0x12, 0x6B, 0x30, 0x7E, 0x00, 0x90, 0x93, 0xAA, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x00,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0x91, 0x32, 0xF0, 0x90, 0x93, 0xAA, 0xE4,
-0x75, 0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04,
-0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0,
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x39, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06,
-0xC0, 0x07, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0,
-0x01, 0xD0, 0x00, 0x12, 0x45, 0x39, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93,
-0xAA, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC,
-0xFD, 0xFE, 0x12, 0x45, 0x39, 0x90, 0x91, 0x36, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xAA, 0xE4, 0x75,
-0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04,
-0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0,
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x39, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06,
-0xC0, 0x07, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0,
-0x01, 0xD0, 0x00, 0x12, 0x45, 0x39, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93,
-0xAA, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC,
-0xFD, 0xFE, 0x12, 0x45, 0x39, 0x90, 0x91, 0x3A, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xAA, 0xE4, 0x75,
-0xF0, 0x04, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, 0x08, 0x5A, 0xC0, 0x04,
-0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x03, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x08, 0x5A, 0xD0,
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x39, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06,
-0xC0, 0x07, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0,
-0x01, 0xD0, 0x00, 0x12, 0x45, 0x39, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x93,
-0xAA, 0xA3, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0xE4, 0xFC,
-0xFD, 0xFE, 0x12, 0x45, 0x39, 0x90, 0x91, 0x3E, 0x12, 0x08, 0x6D, 0x90, 0x93, 0xAA, 0xE4, 0x75,
-0xF0, 0x04, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, 0xAC, 0xF0, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0xFF,
-0xA3, 0xE0, 0xFE, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74,
-0x42, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAC, 0xE0, 0x04,
-0xF0, 0xE0, 0xB4, 0x10, 0xD5, 0x90, 0x93, 0xAA, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0xE4,
-0x90, 0x93, 0xAC, 0xF0, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x24, 0x00,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
-0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x93, 0xAC, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x10, 0xD5, 0x90,
-0x93, 0xAA, 0xE4, 0x75, 0xF0, 0x10, 0x12, 0x08, 0xD6, 0xE4, 0x90, 0x93, 0xAC, 0xF0, 0x90, 0x93,
-0xAA, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFE, 0x2F, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0xFF, 0x74, 0x62, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x91, 0xF5, 0x83, 0xEF, 0xF0, 0x90,
-0x93, 0xAC, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x10, 0xD5, 0x90, 0x93, 0xAA, 0xE4, 0x75, 0xF0, 0x10,
-0x12, 0x08, 0xD6, 0x90, 0x93, 0x86, 0xE0, 0x04, 0x90, 0x93, 0xAE, 0xF0, 0xE4, 0x90, 0x93, 0xAD,
-0xF0, 0x90, 0x91, 0x32, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xFE, 0x90,
-0x93, 0xAD, 0xE0, 0xFD, 0xC3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x78, 0xA3,
-0xE0, 0x2D, 0xF0, 0xE0, 0xFF, 0x12, 0x6B, 0x30, 0x90, 0x93, 0xAA, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0,
-0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xAC, 0xE0, 0xFD, 0xC3, 0x94, 0x04, 0x50, 0x52, 0xA3, 0xE0, 0x75,
-0xF0, 0x04, 0xA4, 0x7C, 0x00, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0xEF, 0x78, 0x05, 0xC3, 0x33,
-0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0x24, 0x72, 0xF9, 0x74, 0x91, 0x3E, 0xFA, 0x7B, 0x01, 0xC0, 0x03,
-0xC0, 0x01, 0x90, 0x93, 0xAA, 0xA3, 0xE0, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x8B, 0x40, 0xF5,
-0x41, 0x89, 0x42, 0x75, 0x43, 0x20, 0xD0, 0x01, 0xD0, 0x03, 0x12, 0x35, 0x26, 0x90, 0x93, 0xAA,
-0xE4, 0x75, 0xF0, 0x20, 0x12, 0x08, 0xD6, 0x90, 0x93, 0xAC, 0xE0, 0x04, 0xF0, 0x80, 0xA4, 0x90,
-0x93, 0xAD, 0xE0, 0x04, 0xF0, 0x61, 0x81, 0xE4, 0x90, 0x93, 0xAC, 0xF0, 0xE4, 0xFF, 0x0F, 0xEF,
-0xB4, 0x20, 0xFB, 0x90, 0x93, 0xAC, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x10, 0xEF, 0xD0, 0xD0, 0x92,
-0xAF, 0x22, 0xAE, 0x33
-};
-u4Byte ArrayLength_MP_8723B_FW_WoWLAN = 27732;
-
-
-void
-ODM_ReadFirmware_MP_8723B_FW_WoWLAN(
- IN PDM_ODM_T pDM_Odm,
- OUT u1Byte *pFirmware,
- OUT u4Byte *pFirmwareSize
-)
-{
-#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
- *((SIZE_PTR *)pFirmware) = (SIZE_PTR)Array_MP_8723B_FW_WoWLAN;
- *pFirmwareSize = ArrayLength_MP_8723B_FW_WoWLAN;
-#else
- ODM_MoveMemory(pDM_Odm, pFirmware, Array_MP_8723B_FW_WoWLAN, ArrayLength_MP_8723B_FW_WoWLAN);
- *pFirmwareSize = ArrayLength_MP_8723B_FW_WoWLAN;
-#endif
-}
-
-
-// v15.34 20131011 by Gimmy <gimmy@realtek.com>
-u1Byte Array_MP_8723B_FW_MP[] = {
-0x01, 0x53, 0x10, 0x00, 0x12, 0x00, 0x02, 0x00, 0x11, 0x21, 0x22, 0x48, 0x22, 0x7B, 0x00, 0x00,
-0x4E, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x02, 0x45, 0x8D, 0x02, 0x60, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x60, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x70, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x60, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x67, 0xF0, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0x6F, 0xE8, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F,
-0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00,
-0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00,
-0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, 0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00,
-0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, 0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07,
-0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, 0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B,
-0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, 0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00,
-0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, 0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18,
-0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, 0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24,
-0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, 0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00,
-0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, 0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20,
-0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, 0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31,
-0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, 0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00,
-0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07,
-0x07, 0x08, 0x0A, 0x04, 0x07, 0x0A, 0x0E, 0x11, 0x13, 0x14, 0x15, 0x04, 0x04, 0x04, 0x05, 0x07,
-0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x05, 0x06, 0x07, 0x0D, 0x10, 0x11, 0x12, 0x12, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21,
-0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00,
-0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x30, 0x00,
-0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xC0, 0x00,
-0x00, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x78, 0x00,
-0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x90, 0x00,
-0x00, 0x01, 0xE0, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00,
-0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x14, 0x00, 0x32, 0x00,
-0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x02, 0x04, 0x06, 0x08, 0x0A,
-0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, 0x50, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, 0x04,
-0x04, 0x05, 0x05, 0x02, 0x04, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01,
-0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x19,
-0x06, 0x04, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0xC2, 0xAF, 0x80, 0xFE, 0x32, 0x12, 0x42, 0x34, 0x85, 0xD0, 0x0B, 0x75, 0xD0, 0x08, 0xAA, 0xE0,
-0xC2, 0x8C, 0xE5, 0x8A, 0x24, 0x67, 0xF5, 0x8A, 0xE5, 0x8C, 0x34, 0x79, 0xF5, 0x8C, 0xD2, 0x8C,
-0xEC, 0x24, 0x87, 0xF8, 0xE6, 0xBC, 0x02, 0x02, 0x74, 0xFF, 0xC3, 0x95, 0x81, 0xB4, 0x40, 0x00,
-0x40, 0xCE, 0x79, 0x03, 0x78, 0x80, 0x16, 0xE6, 0x08, 0x70, 0x0B, 0xC2, 0xAF, 0xE6, 0x30, 0xE1,
-0x03, 0x44, 0x18, 0xF6, 0xD2, 0xAF, 0x08, 0xD9, 0xED, 0xEA, 0x8B, 0xD0, 0x22, 0xE5, 0x0C, 0xFF,
-0x23, 0x24, 0x81, 0xF8, 0x0F, 0x08, 0x08, 0xBF, 0x03, 0x04, 0x7F, 0x00, 0x78, 0x81, 0xE6, 0x30,
-0xE4, 0xF2, 0x00, 0xE5, 0x0C, 0xC3, 0x9F, 0x50, 0x20, 0x05, 0x0C, 0x74, 0x86, 0x25, 0x0C, 0xF8,
-0xE6, 0xFD, 0xA6, 0x81, 0x08, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xCD, 0xF8, 0xE8,
-0x6D, 0x60, 0xE0, 0x08, 0xE6, 0xC0, 0xE0, 0x80, 0xF6, 0xE5, 0x0C, 0xD3, 0x9F, 0x40, 0x27, 0xE5,
-0x0C, 0x24, 0x87, 0xF8, 0xE6, 0xAE, 0x0C, 0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xCD,
-0xF8, 0xE5, 0x81, 0x6D, 0x60, 0x06, 0xD0, 0xE0, 0xF6, 0x18, 0x80, 0xF5, 0xE5, 0x0C, 0x24, 0x86,
-0xC8, 0xF6, 0x15, 0x0C, 0x80, 0xD3, 0xE5, 0x0C, 0x23, 0x24, 0x81, 0xF8, 0x7F, 0x04, 0xC2, 0xAF,
-0xE6, 0x30, 0xE0, 0x03, 0x10, 0xE2, 0x0C, 0x7F, 0x00, 0x30, 0xE1, 0x07, 0x30, 0xE3, 0x04, 0x7F,
-0x08, 0x54, 0xF4, 0x54, 0x7C, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x42, 0x07, 0x22, 0x78, 0x86, 0xA6,
-0x81, 0x74, 0x02, 0x60, 0x06, 0xFF, 0x08, 0x76, 0xFF, 0xDF, 0xFB, 0x7F, 0x03, 0xE4, 0x78, 0x80,
-0xF6, 0x08, 0xF6, 0x08, 0xDF, 0xFA, 0x78, 0x81, 0x76, 0x30, 0x90, 0x46, 0x31, 0x74, 0x01, 0x93,
-0xC0, 0xE0, 0xE4, 0x93, 0xC0, 0xE0, 0x43, 0x89, 0x01, 0x75, 0x8A, 0x60, 0x75, 0x8C, 0x79, 0xD2,
-0x8C, 0xD2, 0xAF, 0x22, 0x02, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0x74, 0x81,
-0x2F, 0x2F, 0xF8, 0xE6, 0x20, 0xE5, 0xF4, 0xC2, 0xAF, 0xE6, 0x44, 0x30, 0xF6, 0xD2, 0xAF, 0xAE,
-0x0C, 0xEE, 0xC3, 0x9F, 0x50, 0x21, 0x0E, 0x74, 0x86, 0x2E, 0xF8, 0xE6, 0xF9, 0x08, 0xE6, 0x18,
-0xBE, 0x02, 0x02, 0x74, 0xFF, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x09, 0xE7, 0x19, 0x19, 0xF7, 0x09,
-0x09, 0x80, 0xF3, 0x16, 0x16, 0x80, 0xDA, 0xEE, 0xD3, 0x9F, 0x40, 0x04, 0x05, 0x81, 0x05, 0x81,
-0xEE, 0xD3, 0x9F, 0x40, 0x22, 0x74, 0x86, 0x2E, 0xF8, 0x08, 0xE6, 0xF9, 0xEE, 0xB5, 0x0C, 0x02,
-0xA9, 0x81, 0x18, 0x06, 0x06, 0xE6, 0xFD, 0xED, 0x69, 0x60, 0x09, 0x19, 0x19, 0xE7, 0x09, 0x09,
-0xF7, 0x19, 0x80, 0xF3, 0x1E, 0x80, 0xD9, 0xEF, 0x24, 0x86, 0xF8, 0xE6, 0x04, 0xF8, 0xEF, 0x2F,
-0x04, 0x90, 0x46, 0x31, 0x93, 0xF6, 0x08, 0xEF, 0x2F, 0x93, 0xF6, 0x7F, 0x00, 0x22, 0xEF, 0xD3,
-0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22, 0xEF, 0x23, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE5, 0xF4,
-0xC2, 0xAF, 0xE6, 0x54, 0x8C, 0xF6, 0xD2, 0xAF, 0xE5, 0x0C, 0xB5, 0x07, 0x0A, 0x74, 0x86, 0x2F,
-0xF8, 0xE6, 0xF5, 0x81, 0x02, 0x42, 0x7D, 0x50, 0x2E, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xBF, 0x02,
-0x02, 0x74, 0xFF, 0xFD, 0x18, 0xE6, 0xF9, 0x74, 0x86, 0x2F, 0xF8, 0xFB, 0xE6, 0xFC, 0xE9, 0x6C,
-0x60, 0x08, 0xA8, 0x05, 0xE7, 0xF6, 0x1D, 0x19, 0x80, 0xF4, 0xA8, 0x03, 0xA6, 0x05, 0x1F, 0xE5,
-0x0C, 0xB5, 0x07, 0xE3, 0x7F, 0x00, 0x22, 0x74, 0x87, 0x2F, 0xF8, 0xE6, 0xFD, 0x18, 0x86, 0x01,
-0x0F, 0x74, 0x86, 0x2F, 0xF8, 0xA6, 0x01, 0x08, 0x86, 0x04, 0xE5, 0x0C, 0xB5, 0x07, 0x02, 0xAC,
-0x81, 0xED, 0x6C, 0x60, 0x08, 0x0D, 0x09, 0xA8, 0x05, 0xE6, 0xF7, 0x80, 0xF4, 0xE5, 0x0C, 0xB5,
-0x07, 0xDE, 0x89, 0x81, 0x7F, 0x00, 0x22, 0xEF, 0xD3, 0x94, 0x02, 0x40, 0x03, 0x7F, 0xFF, 0x22,
-0xEF, 0x23, 0x24, 0x81, 0xF8, 0xC2, 0xAF, 0xE6, 0x30, 0xE5, 0x05, 0x30, 0xE0, 0x02, 0xD2, 0xE4,
-0xD2, 0xE2, 0xC6, 0xD2, 0xAF, 0x7F, 0x00, 0x30, 0xE2, 0x01, 0x0F, 0x02, 0x42, 0x7C, 0x8F, 0xF0,
-0xE4, 0xFF, 0xFE, 0xE5, 0x0C, 0x23, 0x24, 0x80, 0xF8, 0xC2, 0xA9, 0x30, 0xF7, 0x0D, 0x7F, 0x08,
-0xE6, 0x60, 0x0B, 0x2D, 0xF6, 0x60, 0x30, 0x50, 0x2E, 0x80, 0x07, 0x30, 0xF1, 0x06, 0xED, 0xF6,
-0x60, 0x25, 0x7E, 0x02, 0x08, 0x30, 0xF0, 0x10, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x23, 0x0E, 0x30,
-0xE2, 0x0C, 0xD2, 0xAF, 0x7F, 0x04, 0x80, 0x12, 0xC2, 0xAF, 0xE6, 0x10, 0xE7, 0x13, 0x54, 0xEC,
-0x4E, 0xF6, 0xD2, 0xAF, 0x02, 0x42, 0x7D, 0x7F, 0x08, 0x08, 0xEF, 0x44, 0x83, 0xF4, 0xC2, 0xAF,
-0x56, 0xC6, 0xD2, 0xAF, 0x54, 0x80, 0x4F, 0xFF, 0x22, 0xEF, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xED,
-0x39, 0xFD, 0xEC, 0x38, 0xFC, 0x22, 0xEF, 0x5B, 0xFF, 0xEE, 0x5A, 0xFE, 0xED, 0x59, 0xFD, 0xEC,
-0x58, 0xFC, 0x22, 0xEF, 0x4B, 0xFF, 0xEE, 0x4A, 0xFE, 0xED, 0x49, 0xFD, 0xEC, 0x48, 0xFC, 0x22,
-0xEB, 0x9F, 0xF5, 0xF0, 0xEA, 0x9E, 0x42, 0xF0, 0xE9, 0x9D, 0x42, 0xF0, 0xE8, 0x9C, 0x45, 0xF0,
-0x22, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xE4, 0x93, 0xFC,
-0x74, 0x01, 0x93, 0xFD, 0x74, 0x02, 0x93, 0xFE, 0x74, 0x03, 0x93, 0xFF, 0x22, 0xE0, 0xF8, 0xA3,
-0xE0, 0xF9, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0x22, 0xE4, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF9,
-0x74, 0x02, 0x93, 0xFA, 0x74, 0x03, 0x93, 0xFB, 0x22, 0xA4, 0x25, 0x82, 0xF5, 0x82, 0xE5, 0xF0,
-0x35, 0x83, 0xF5, 0x83, 0x22, 0xE0, 0xFB, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xF9, 0x22, 0xEB, 0xF0,
-0xA3, 0xEA, 0xF0, 0xA3, 0xE9, 0xF0, 0x22, 0xD0, 0x83, 0xD0, 0x82, 0xF8, 0xE4, 0x93, 0x70, 0x12,
-0x74, 0x01, 0x93, 0x70, 0x0D, 0xA3, 0xA3, 0x93, 0xF8, 0x74, 0x01, 0x93, 0xF5, 0x82, 0x88, 0x83,
-0xE4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x02, 0x45, 0xCB,
-0x02, 0x43, 0x0D, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0x40, 0x03, 0xF6, 0x80, 0x01, 0xF2,
-0x08, 0xDF, 0xF4, 0x80, 0x29, 0xE4, 0x93, 0xA3, 0xF8, 0x54, 0x07, 0x24, 0x0C, 0xC8, 0xC3, 0x33,
-0xC4, 0x54, 0x0F, 0x44, 0x20, 0xC8, 0x83, 0x40, 0x04, 0xF4, 0x56, 0x80, 0x01, 0x46, 0xF6, 0xDF,
-0xE4, 0x80, 0x0B, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x46, 0x10, 0xE4, 0x7E,
-0x01, 0x93, 0x60, 0xBC, 0xA3, 0xFF, 0x54, 0x3F, 0x30, 0xE5, 0x09, 0x54, 0x1F, 0xFE, 0xE4, 0x93,
-0xA3, 0x60, 0x01, 0x0E, 0xCF, 0x54, 0xC0, 0x25, 0xE0, 0x60, 0xA8, 0x40, 0xB8, 0xE4, 0x93, 0xA3,
-0xFA, 0xE4, 0x93, 0xA3, 0xF8, 0xE4, 0x93, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA,
-0xF0, 0xA3, 0xC8, 0xC5, 0x82, 0xC8, 0xCA, 0xC5, 0x83, 0xCA, 0xDF, 0xE9, 0xDE, 0xE7, 0x80, 0xBE,
-0x00, 0x41, 0xA3, 0xB9, 0x00, 0x41, 0xA3, 0xBA, 0x00, 0x41, 0xA3, 0xBB, 0x00, 0x41, 0xA3, 0xBF,
-0x00, 0x41, 0xA3, 0xC0, 0x00, 0x41, 0xA3, 0xC1, 0x00, 0x41, 0xA3, 0xDD, 0x00, 0x41, 0xA3, 0xE3,
-0x00, 0x4D, 0xD7, 0x58, 0x34, 0x49, 0xBB, 0x7F, 0x02, 0x12, 0x4C, 0x74, 0xEF, 0x44, 0x01, 0xFD,
-0x7F, 0x02, 0xD1, 0x4F, 0x7F, 0x02, 0x12, 0x4C, 0x74, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0xD3,
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00, 0xED, 0xF0, 0x7F, 0x10, 0x7E,
-0x00, 0x12, 0x3E, 0x50, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x7F, 0x8F, 0x12, 0x4C, 0x74, 0xEF, 0x20, 0xE6, 0x02, 0xE1, 0x9E, 0x90, 0x00, 0x8C, 0xE0, 0xF5,
-0x6E, 0x7F, 0x8D, 0x12, 0x4C, 0x74, 0x90, 0x00, 0x8E, 0xE0, 0xF5, 0x6F, 0xEF, 0x24, 0xFC, 0x60,
-0x0D, 0x24, 0x03, 0x60, 0x02, 0xE1, 0x8F, 0xAF, 0x6E, 0x12, 0xB3, 0xFF, 0xE1, 0x8F, 0x74, 0x96,
-0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0xF1, 0xA8,
-0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x19, 0xB1, 0x49, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB,
-0x0D, 0xE4, 0xFF, 0xF1, 0xA8, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x19, 0xB1, 0x49, 0xE0,
-0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0xE4, 0xFF, 0xF1, 0xA8, 0x75, 0xF0, 0x04, 0xE5,
-0x6E, 0x90, 0x96, 0x19, 0xB1, 0x49, 0xE0, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xF1, 0xA8,
-0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x16, 0xB1, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xF1,
-0xA8, 0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x17, 0xF1, 0xA3, 0x75, 0xF0, 0x04, 0xE5, 0x6E,
-0x90, 0x96, 0x18, 0xB1, 0x49, 0xE0, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xF1, 0xA8,
-0x75, 0xF0, 0x04, 0xE5, 0x6E, 0x90, 0x96, 0x18, 0xB1, 0x49, 0xE0, 0x54, 0x1F, 0xFB, 0x0D, 0xF1,
-0xA8, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x00, 0xB1, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F,
-0xF1, 0xA8, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x01, 0xF1, 0xA3, 0x75, 0xF0, 0x08, 0xE5,
-0x6E, 0x90, 0x89, 0x02, 0xF1, 0xA3, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x03, 0xF1, 0xA3,
-0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x04, 0xB1, 0x49, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0xF1,
-0xA8, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x05, 0xF1, 0xA3, 0x75, 0xF0, 0x08, 0xE5, 0x6E,
-0x90, 0x89, 0x06, 0xF1, 0xA3, 0x75, 0xF0, 0x08, 0xE5, 0x6E, 0x90, 0x89, 0x07, 0xF1, 0xA3, 0x7F,
-0x8F, 0x12, 0x4C, 0x74, 0xEF, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0x7F, 0x8D, 0xD1, 0x4F, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0xB1, 0x49, 0xE0, 0xFB, 0x0D, 0xEF, 0x70, 0x04, 0x74, 0xF0, 0x80, 0x16, 0xEF,
-0xB4, 0x01, 0x04, 0x74, 0xF4, 0x80, 0x0E, 0xEF, 0xB4, 0x02, 0x04, 0x74, 0xF8, 0x80, 0x06, 0xEF,
-0xB4, 0x03, 0x0C, 0x74, 0xFC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEB, 0xF0, 0x22,
-0xE4, 0xF5, 0x0D, 0xF5, 0x0E, 0xF5, 0x0F, 0x75, 0x10, 0x80, 0xAD, 0x0D, 0x7F, 0x50, 0xD1, 0x4F,
-0xAD, 0x0E, 0x7F, 0x51, 0xD1, 0x4F, 0xAD, 0x0F, 0x7F, 0x52, 0xD1, 0x4F, 0xAD, 0x10, 0x7F, 0x53,
-0xC1, 0x4F, 0xD1, 0x69, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFF, 0x90, 0xA3, 0x65,
-0xF0, 0x90, 0x01, 0xC7, 0xE0, 0x64, 0xAD, 0x70, 0x36, 0xF0, 0x90, 0xA3, 0x72, 0x74, 0x0F, 0xF0,
-0x90, 0xA3, 0x64, 0x74, 0x0A, 0xF0, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA3, 0x65, 0xE0, 0x2F, 0xFE,
-0x74, 0x66, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA3, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x0F,
-0xE9, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x64, 0x11, 0x44, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xA5, 0x12, 0x45,
-0x5E, 0x7F, 0x96, 0x7E, 0x02, 0x31, 0x0A, 0xEF, 0x60, 0x59, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90,
-0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4,
-0x3E, 0xFE, 0x90, 0xA3, 0xA8, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0xA3, 0xA8,
-0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0xA5, 0x12, 0x45, 0x55, 0x90,
-0x00, 0x0E, 0x12, 0x06, 0xA2, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x31, 0x60, 0x90, 0xA3, 0xA8,
-0xE0, 0x24, 0x18, 0xFF, 0x90, 0xA3, 0xA5, 0x12, 0x45, 0x55, 0x12, 0x97, 0x54, 0x90, 0x02, 0x96,
-0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4,
-0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xFE, 0x90, 0xA0, 0x8B, 0xE0, 0xFD, 0xB5, 0x06, 0x04, 0x7E, 0x01,
-0x80, 0x02, 0x7E, 0x00, 0xEE, 0x64, 0x01, 0x60, 0x2C, 0xED, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5,
-0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x11, 0x44, 0x7F, 0x01, 0xEF, 0x60, 0x16, 0x90,
-0xA0, 0x8B, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x02, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x05,
-0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x90, 0xA3, 0x9D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA3,
-0x9D, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA3, 0xA0,
-0xE0, 0x94, 0xE8, 0x90, 0xA3, 0x9F, 0xE0, 0x94, 0x03, 0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44,
-0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0xA3, 0x9F, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6,
-0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C,
-0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0,
-0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0,
-0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03,
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5,
-0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F,
-0x01, 0x12, 0x44, 0x7E, 0x90, 0xA2, 0xB0, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x9F, 0x97, 0xE0, 0x60,
-0xEA, 0xC2, 0xAF, 0x30, 0xE0, 0x0B, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x62, 0xFC, 0x12, 0xA7,
-0xCE, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0,
-0x12, 0x94, 0x36, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE2, 0x05, 0x54,
-0xFB, 0xF0, 0x11, 0xB8, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x30, 0xE6, 0x05,
-0x54, 0xBF, 0xF0, 0x51, 0x19, 0xD2, 0xAF, 0x80, 0xB2, 0xE4, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xD7,
-0x51, 0x40, 0xEF, 0xB4, 0x02, 0x19, 0x90, 0xA3, 0xB9, 0xE0, 0x64, 0x04, 0x60, 0x0C, 0x7F, 0x40,
-0x12, 0x7D, 0x46, 0x90, 0xA3, 0xB9, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA3, 0xB9, 0xF0, 0x22,
-0x7D, 0x03, 0x7F, 0x11, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x8F, 0xEF, 0xF0,
-0xA3, 0xED, 0xF0, 0xA3, 0x12, 0x45, 0x5E, 0x7F, 0xA3, 0x91, 0x74, 0xEF, 0x54, 0xF8, 0x44, 0x05,
-0xFD, 0x7F, 0xA3, 0x12, 0x46, 0x4F, 0x7F, 0xA0, 0x91, 0x74, 0xEF, 0x54, 0x0F, 0x64, 0x04, 0x70,
-0x22, 0x90, 0xFD, 0x58, 0xE0, 0x20, 0xE0, 0x13, 0x90, 0xA3, 0x8F, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD,
-0xA3, 0x12, 0x45, 0x55, 0x12, 0x8F, 0xC5, 0x7F, 0x01, 0x80, 0x0E, 0x7F, 0x01, 0x91, 0x96, 0x7F,
-0x02, 0x80, 0x06, 0x7F, 0x02, 0x91, 0x96, 0x7F, 0x03, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xFD,
-0x68, 0xE0, 0xFF, 0x90, 0xFD, 0x60, 0xE0, 0x90, 0xA2, 0xEE, 0xF0, 0xEF, 0x20, 0xE0, 0x02, 0x81,
-0x64, 0x90, 0xA3, 0xBB, 0xE0, 0x70, 0x18, 0x7F, 0x2E, 0x91, 0x74, 0x90, 0xA1, 0xC9, 0xEF, 0xF0,
-0x7F, 0x2D, 0x91, 0x74, 0x90, 0xA1, 0xCA, 0xEF, 0xF0, 0x90, 0xA3, 0xBB, 0x74, 0x01, 0xF0, 0x90,
-0xA2, 0xEE, 0xE0, 0x64, 0x15, 0x70, 0x6E, 0x90, 0xFD, 0x62, 0xE0, 0xFF, 0x30, 0xE6, 0x1C, 0xF4,
-0x54, 0x3F, 0x04, 0xFE, 0x90, 0xA1, 0xC9, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0xC3, 0x9E, 0x90, 0xA2,
-0xED, 0xF0, 0xD3, 0x94, 0x3F, 0x40, 0x1D, 0xE4, 0xF0, 0x80, 0x19, 0x90, 0xA1, 0xC9, 0xE0, 0x13,
-0x13, 0x54, 0x3F, 0xFE, 0xEF, 0x54, 0x3F, 0x2E, 0x90, 0xA2, 0xED, 0xF0, 0xD3, 0x94, 0x3F, 0x40,
-0x03, 0x74, 0x3F, 0xF0, 0x90, 0xA2, 0xED, 0xE0, 0xFF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xFE, 0xEF,
-0x25, 0xE0, 0x25, 0xE0, 0x4E, 0x90, 0xA2, 0xEB, 0xF0, 0xE0, 0xFD, 0x7F, 0x2E, 0x12, 0x46, 0x4F,
-0x90, 0xA2, 0xED, 0xE0, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0xCA, 0xE0, 0x54, 0x0F, 0x4F, 0xFD,
-0x7F, 0x2D, 0x12, 0x46, 0x4F, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x21, 0x0C, 0x90, 0xFD, 0x62, 0xE0,
-0xFF, 0x12, 0x7C, 0x94, 0x7F, 0x04, 0x91, 0x9A, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x23, 0x09, 0x7F,
-0x01, 0x12, 0x7F, 0x30, 0x7F, 0x04, 0x91, 0x9A, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x27, 0x09, 0x7F,
-0x02, 0x12, 0x7F, 0x30, 0x7F, 0x04, 0x91, 0x9A, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x30, 0x0C, 0xE4,
-0xFB, 0xFD, 0x7F, 0x01, 0x12, 0x7D, 0xD3, 0x7F, 0x04, 0x91, 0x9A, 0x90, 0xA2, 0xEE, 0xE0, 0x64,
-0x34, 0x70, 0x70, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x3C, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x09,
-0x90, 0x07, 0x65, 0xE0, 0x44, 0x18, 0xF0, 0x80, 0x0B, 0x91, 0x65, 0xEF, 0x44, 0x01, 0xFD, 0x7F,
-0x64, 0x12, 0x46, 0x4F, 0x90, 0xA2, 0xEB, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0xA2, 0x79, 0xEB, 0xFD,
-0x7F, 0x34, 0x51, 0x44, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x04, 0x9D, 0xE4, 0xF0,
-0xE0, 0x44, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x09, 0x90, 0x07, 0x65, 0xE0,
-0x54, 0xE7, 0xF0, 0x80, 0x0D, 0x7F, 0x4E, 0x91, 0x74, 0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12,
-0x46, 0x4F, 0x90, 0xA1, 0xD4, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x04, 0x9D, 0xE0,
-0x54, 0xFE, 0xF0, 0x90, 0xA2, 0xEE, 0xE0, 0xFD, 0xB4, 0x35, 0x07, 0x90, 0xA1, 0x95, 0xE0, 0x44,
-0x01, 0xF0, 0xED, 0xB4, 0x36, 0x22, 0x90, 0xFD, 0x61, 0xE0, 0x90, 0xA2, 0xEB, 0xF0, 0x90, 0xFD,
-0x62, 0xE0, 0x90, 0xA2, 0xEC, 0xF0, 0x90, 0xA2, 0xEE, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0xE0, 0xFD,
-0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEC, 0x51, 0x44, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x37, 0x03, 0x12,
-0x89, 0x2A, 0x90, 0xA2, 0xEE, 0xE0, 0xB4, 0x40, 0x14, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x08,
-0x90, 0xA1, 0xB1, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xB1, 0xF0, 0x90, 0xFD, 0x68,
-0xE0, 0x44, 0x01, 0xF0, 0x22, 0x7F, 0x4E, 0x91, 0x74, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x4E, 0x12,
-0x46, 0x4F, 0x7F, 0x64, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x82, 0x75, 0x83, 0x00,
-0xE0, 0x90, 0xA3, 0xD9, 0xF0, 0x7F, 0x10, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA3, 0xD9, 0xE0,
-0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0x45, 0x7F, 0x04, 0x8F, 0x70, 0x7F, 0x02, 0x12, 0x44,
-0x57, 0x90, 0x9F, 0x97, 0xE0, 0x45, 0x70, 0xF0, 0x22, 0x7F, 0xFF, 0xD1, 0xD8, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0xFA, 0x12, 0x46, 0x44, 0x12, 0x46, 0x37, 0x12, 0x46, 0x37, 0x90,
-0x01, 0x00, 0x74, 0x3F, 0xF0, 0xA3, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20,
-0xF0, 0x90, 0xA1, 0x7F, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07,
-0x78, 0x74, 0x01, 0xF0, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x37, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x08,
-0x90, 0xA3, 0xD1, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0xD1, 0xF0, 0x90, 0xA1, 0x7F,
-0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0xD2, 0xF0, 0x80, 0x06, 0x90,
-0xA3, 0xD2, 0x74, 0x02, 0xF0, 0x90, 0xA3, 0xD1, 0x12, 0x69, 0x4E, 0x90, 0x07, 0x78, 0x74, 0x01,
-0xF0, 0x90, 0xA1, 0x7E, 0xE0, 0x60, 0x02, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0xAF,
-0x90, 0x9F, 0x9C, 0xEF, 0xF0, 0x12, 0x98, 0xB8, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04,
-0x23, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x79, 0x91, 0x74, 0xEF, 0x54, 0x0E, 0x70, 0x17, 0x7F, 0x28,
-0x91, 0x74, 0xEF, 0x20, 0xE2, 0x0F, 0x7F, 0x17, 0x91, 0x74, 0xEF, 0x54, 0xFC, 0x44, 0x04, 0xFD,
-0x7F, 0x17, 0x12, 0x46, 0x4F, 0x7F, 0x38, 0x91, 0x74, 0xEF, 0x44, 0x40, 0xFD, 0x7F, 0x38, 0x12,
-0x46, 0x4F, 0x02, 0x37, 0x99, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x09, 0x90, 0x07, 0x65, 0xE0, 0x44,
-0x18, 0xF0, 0x80, 0x0B, 0x91, 0x65, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x64, 0x12, 0x46, 0x4F, 0x90,
-0xA1, 0x24, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x46, 0x4F, 0x90, 0xA1, 0x1B, 0xE0, 0x60, 0x12, 0x90,
-0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90,
-0xF0, 0x7F, 0x08, 0x91, 0x74, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0x4F, 0x7F, 0x01,
-0x12, 0x59, 0xC4, 0x7F, 0x90, 0x91, 0x74, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x46, 0x4F,
-0x7F, 0x14, 0x7E, 0x00, 0x02, 0x3E, 0x50, 0x7F, 0x81, 0x91, 0x74, 0xEF, 0x54, 0xFE, 0xFD, 0x7F,
-0x81, 0x12, 0x46, 0x4F, 0x7F, 0x80, 0x91, 0x74, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x46,
-0x4F, 0x12, 0x99, 0x73, 0x12, 0x3E, 0x11, 0x12, 0x99, 0x80, 0x12, 0x9A, 0x1B, 0x7F, 0x01, 0x12,
-0x43, 0x45, 0x90, 0xA1, 0xEC, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x43, 0x45, 0x90, 0xA1, 0xEC, 0xE0,
-0x04, 0xF0, 0xB1, 0x2E, 0x12, 0x94, 0xA8, 0x7F, 0x80, 0x91, 0x74, 0xEF, 0x44, 0x40, 0xFD, 0x7F,
-0x80, 0x12, 0x46, 0x4F, 0x75, 0x28, 0xFF, 0x12, 0x58, 0x2D, 0x12, 0x99, 0xC1, 0x7F, 0x81, 0x91,
-0x74, 0xEF, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x46, 0x4F, 0x12, 0x9A, 0x29, 0x12, 0xB7, 0x01,
-0xE4, 0xFF, 0x02, 0x43, 0xCE, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x55, 0x74,
-0x15, 0xF0, 0x90, 0xA3, 0x63, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x57, 0xEF, 0xF0, 0x7B, 0x01, 0x7A,
-0xA3, 0x79, 0x55, 0x12, 0x7C, 0xAB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x54, 0x91, 0x74, 0xE5,
-0x0D, 0x5F, 0xF5, 0x11, 0x7F, 0x55, 0x91, 0x74, 0xE5, 0x0E, 0x5F, 0xF5, 0x12, 0x7F, 0x56, 0x91,
-0x74, 0xE5, 0x0F, 0x5F, 0xF5, 0x13, 0x7F, 0x57, 0x91, 0x74, 0xE5, 0x10, 0x5F, 0xF5, 0x14, 0xAD,
-0x11, 0x7F, 0x54, 0x12, 0x46, 0x4F, 0xAD, 0x12, 0x7F, 0x55, 0x12, 0x46, 0x4F, 0xAD, 0x13, 0x7F,
-0x56, 0x12, 0x46, 0x4F, 0xAD, 0x14, 0x7F, 0x57, 0x12, 0x46, 0x4F, 0x53, 0x91, 0xEF, 0x22, 0x7F,
-0xF4, 0x91, 0x74, 0xEF, 0x20, 0xE5, 0x0D, 0x7F, 0xF4, 0x91, 0x74, 0xEF, 0x7F, 0x01, 0x20, 0xE4,
-0x05, 0x7F, 0x02, 0x22, 0x7F, 0x03, 0x22, 0x90, 0xA2, 0x06, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x7E,
-0x00, 0xE4, 0xFD, 0xD1, 0xEF, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x9F, 0x9B,
-0xED, 0xF0, 0x22, 0x90, 0xA2, 0x06, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x7E, 0x00, 0x7D, 0x01, 0xD3,
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x89, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED,
-0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x2F, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0x8E, 0xF0, 0x7D,
-0x14, 0xF1, 0xF6, 0xBF, 0x01, 0x15, 0x12, 0x65, 0xFE, 0x90, 0xA3, 0x8C, 0xEE, 0xF0, 0xFC, 0xA3,
-0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0x8B, 0xE0, 0xFF, 0x12, 0x65, 0x7E, 0x90, 0xA3, 0x8E, 0xE0, 0xFF,
-0x7D, 0x15, 0xD1, 0xD8, 0x80, 0x15, 0x12, 0x65, 0xFE, 0x90, 0xA3, 0x8C, 0xEE, 0xF0, 0xFC, 0xA3,
-0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0x8B, 0xE0, 0xFF, 0x12, 0x65, 0x7E, 0x90, 0x04, 0x1F, 0x74, 0x20,
-0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xF7, 0xE0, 0x30, 0xE0, 0x7C, 0x90,
-0xA1, 0xF9, 0xE0, 0x70, 0x3C, 0x7D, 0x16, 0x7F, 0x6F, 0xD1, 0xD8, 0xF1, 0xFA, 0x90, 0xA1, 0xF7,
-0xE0, 0xC3, 0x13, 0x54, 0x07, 0x75, 0xF0, 0x0D, 0xD1, 0xE3, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13,
-0x54, 0x07, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x02, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x01, 0xF0, 0xE4,
-0x90, 0xA3, 0x87, 0xF0, 0xA3, 0x74, 0x03, 0x12, 0x50, 0x8A, 0x90, 0xA1, 0xF9, 0x74, 0x01, 0xF0,
-0x22, 0x90, 0xA1, 0xF9, 0xE0, 0x64, 0x01, 0x70, 0x2F, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, 0x54,
-0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x02, 0x12, 0x45, 0x49, 0xE0, 0x30, 0xE0, 0x19, 0x75,
-0xF0, 0x0D, 0xEF, 0xD1, 0xE3, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xFB,
-0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02, 0x50, 0x92, 0x12, 0xB6, 0x61, 0x22, 0x7D, 0x20, 0x91, 0xA9,
-0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x6E, 0x89, 0xE4, 0xFD, 0xFF, 0xD1, 0xD8, 0x90,
-0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0x7F, 0xFF, 0xD1, 0xD8, 0xE4, 0x90, 0xA3, 0xD3, 0xF0, 0xA3,
-0xF0, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xA3,
-0xE0, 0x70, 0x03, 0x7F, 0x01, 0x22, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30,
-0xE0, 0x15, 0xD3, 0x90, 0xA3, 0xD4, 0xE0, 0x94, 0x03, 0x90, 0xA3, 0xD3, 0xE0, 0x94, 0x00, 0x40,
-0x02, 0x80, 0x13, 0x7F, 0x01, 0x80, 0x1B, 0xD3, 0x90, 0xA3, 0xD4, 0xE0, 0x94, 0xE8, 0x90, 0xA3,
-0xD3, 0xE0, 0x94, 0x03, 0x40, 0x0A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x7F, 0x00, 0x22,
-0x7F, 0x32, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0xA3, 0xD3, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08,
-0xD6, 0x80, 0x9E, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90,
-0xA2, 0x04, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x03, 0x12, 0x45,
-0x49, 0xE0, 0x90, 0xA3, 0x88, 0xF0, 0x90, 0xA3, 0x87, 0xEE, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54,
-0x7E, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x83, 0xEE, 0xF0, 0xA3, 0xEF,
-0xF0, 0x90, 0xA3, 0x87, 0xE0, 0xF5, 0x3B, 0xA3, 0xE0, 0xF5, 0x3C, 0x12, 0x36, 0x3E, 0x90, 0xA3,
-0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83, 0xA3, 0xA3, 0xA3, 0x74, 0x05, 0xF0, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xF7, 0xE0, 0x30, 0xE0, 0x0A, 0x12, 0x77, 0x7E, 0xE4, 0x90,
-0xA1, 0xF9, 0xF0, 0x11, 0x63, 0x22, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0xA3,
-0xEF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x80, 0xA7, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
-0xC0, 0xD0, 0x90, 0xA3, 0x99, 0xEF, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xFF, 0x12, 0x84, 0xB1,
-0x90, 0xA1, 0x92, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x6E, 0x89, 0x90,
-0xA1, 0x92, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x80, 0x42, 0x90,
-0xA1, 0x8E, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x78, 0x74,
-0x0D, 0xF0, 0x80, 0x2D, 0x90, 0xA1, 0x91, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0D, 0xEE,
-0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x0F, 0x80, 0x12, 0x90, 0xA1, 0x91, 0xE0,
-0xFE, 0xC3, 0x13, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x09,
-0xF0, 0x90, 0xA3, 0x99, 0xE0, 0x64, 0x03, 0x60, 0x02, 0x21, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x54,
-0x03, 0x30, 0xE0, 0x6F, 0x90, 0xA1, 0x98, 0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0, 0xFE, 0xD3, 0x9F,
-0x40, 0x42, 0xEE, 0x75, 0xF0, 0x03, 0xA4, 0xFF, 0x90, 0xA1, 0x9A, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E,
-0xFF, 0x24, 0x03, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0xA1, 0x90, 0xE0, 0xFE, 0xD3, 0x9D, 0xEC, 0x64,
-0x80, 0xF8, 0x74, 0x80, 0x98, 0x40, 0x08, 0xEE, 0x9F, 0x90, 0xA3, 0x9C, 0xF0, 0x80, 0x06, 0x90,
-0xA3, 0x9C, 0x74, 0x03, 0xF0, 0x90, 0xA3, 0x9C, 0xE0, 0xFF, 0x11, 0xDA, 0x90, 0xA1, 0xA1, 0xE0,
-0x04, 0xF0, 0x80, 0x18, 0x90, 0xA1, 0x9B, 0xE0, 0xFF, 0x11, 0xDA, 0x90, 0xA1, 0x96, 0x74, 0x04,
-0xF0, 0xE4, 0x90, 0xA1, 0xA1, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xA3,
-0xF0, 0x80, 0x0D, 0x90, 0xA1, 0x90, 0xE0, 0xFF, 0x11, 0xDA, 0x90, 0xA1, 0xA1, 0xE0, 0x04, 0xF0,
-0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3,
-0x9B, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x9B, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13,
-0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x07, 0xE4, 0x90, 0xA3, 0x9A, 0xF0,
-0x80, 0x06, 0x90, 0xA3, 0x9A, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x9A, 0x12, 0x69, 0x4E, 0x90, 0xA1,
-0xA0, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0D, 0x90,
-0xA3, 0x99, 0xE0, 0x70, 0x41, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x80, 0x3A, 0x90, 0xA1, 0x8E, 0xE0,
-0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1D, 0x90, 0xA1, 0x94, 0xE0, 0x44, 0x20, 0xF0, 0x90, 0xA1, 0x80,
-0xE0, 0x60, 0x04, 0x7D, 0x01, 0x80, 0x1B, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x7D, 0x01, 0x7F,
-0x0C, 0x80, 0x11, 0x90, 0xA3, 0x99, 0xE0, 0xB4, 0x03, 0x0C, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x06,
-0xE4, 0xFD, 0x7F, 0x04, 0x71, 0x11, 0x90, 0xA1, 0x80, 0xE0, 0x60, 0x18, 0x90, 0xA3, 0x99, 0xE0,
-0x70, 0x04, 0x7D, 0x04, 0x80, 0x0A, 0x90, 0xA3, 0x99, 0xE0, 0x64, 0x03, 0x70, 0x34, 0x7D, 0x0B,
-0x7F, 0x6F, 0x80, 0x2B, 0x90, 0xA3, 0x99, 0xE0, 0x70, 0x04, 0xFD, 0xFF, 0x80, 0x21, 0x90, 0xA3,
-0x99, 0xE0, 0xB4, 0x03, 0x1D, 0x90, 0xA1, 0x8E, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0,
-0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x67, 0xA4, 0xE4, 0xFD, 0xFF, 0x12,
-0x4E, 0xD8, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0x7F,
-0x01, 0x12, 0x77, 0xBB, 0x90, 0xA1, 0x92, 0xE0, 0xC3, 0x13, 0x90, 0x06, 0xCD, 0x30, 0xE0, 0x0D,
-0xE0, 0x44, 0x10, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x44, 0x10, 0xF0, 0x80, 0x0B, 0xE0, 0x54, 0xEF,
-0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x01, 0x7F,
-0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xE1, 0xED, 0xF0, 0x90, 0xA1, 0x16,
-0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x81, 0x5A, 0xEE, 0xC4, 0x13, 0x13,
-0x13, 0x54, 0x01, 0x30, 0xE0, 0x02, 0x81, 0x5A, 0x90, 0xA1, 0x1D, 0xE0, 0xFE, 0x6F, 0x70, 0x02,
-0x81, 0x5A, 0xEF, 0x70, 0x02, 0x61, 0xD1, 0x24, 0xFE, 0x70, 0x02, 0x81, 0x0A, 0x24, 0xFE, 0x60,
-0x48, 0x24, 0xFC, 0x70, 0x02, 0x81, 0x45, 0x24, 0xFC, 0x60, 0x02, 0x81, 0x5A, 0xEE, 0xB4, 0x0E,
-0x02, 0x91, 0xBF, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0xF0, 0x90, 0xA1, 0x1D,
-0xE0, 0xB4, 0x06, 0x02, 0x91, 0x94, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x04, 0x0E, 0x90, 0xA3, 0xE1,
-0xE0, 0xFF, 0x60, 0x05, 0x12, 0xB8, 0xBE, 0x80, 0x02, 0xF1, 0x9F, 0x90, 0xA1, 0x1D, 0xE0, 0x64,
-0x08, 0x60, 0x02, 0x81, 0x5A, 0xD1, 0xCA, 0x81, 0x5A, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x04, 0x7F,
-0x01, 0x91, 0xF0, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x94, 0x90, 0xA1, 0x1D, 0xE0,
-0xB4, 0x0E, 0x07, 0x91, 0x5F, 0xBF, 0x01, 0x02, 0x91, 0xBF, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0C,
-0x60, 0x02, 0x81, 0x5A, 0x91, 0x5F, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x81, 0x5A, 0xB1, 0x88, 0x81,
-0x5A, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E, 0x07, 0x91, 0x5F, 0xBF, 0x01, 0x02, 0x91, 0xBF, 0x90,
-0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0x91, 0x94, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x07, 0x91,
-0x5F, 0xBF, 0x01, 0x02, 0xB1, 0x88, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x04, 0x70, 0x5C, 0x12, 0x9D,
-0x7B, 0xEF, 0x64, 0x01, 0x70, 0x54, 0xD1, 0xDC, 0x80, 0x50, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0E,
-0x07, 0x91, 0x5F, 0xBF, 0x01, 0x02, 0x91, 0xBF, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x06, 0x02, 0x91,
-0x94, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x07, 0x91, 0x5F, 0xBF, 0x01, 0x02, 0xB1, 0x88, 0x90,
-0xA1, 0x1D, 0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0xF0, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x04, 0x1A,
-0x12, 0xB8, 0xFD, 0x80, 0x15, 0x90, 0xA1, 0x1D, 0xE0, 0xB4, 0x0C, 0x0E, 0x90, 0xA1, 0x17, 0xE0,
-0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x02, 0xF1, 0x8D, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90,
-0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x0D, 0x90, 0xA1, 0x94, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0,
-0x08, 0x80, 0x1E, 0x12, 0x9C, 0xEB, 0xBF, 0x01, 0x18, 0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13,
-0x54, 0x1F, 0x20, 0xE0, 0x0C, 0x90, 0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x04, 0x50, 0x03, 0x7F, 0x01,
-0x22, 0x7F, 0x00, 0x22, 0x90, 0xA1, 0x17, 0xE0, 0x90, 0x06, 0x04, 0x20, 0xE0, 0x0C, 0xE0, 0x44,
-0x40, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0xB1, 0x19, 0x80, 0x0F, 0xB1, 0x11, 0x90, 0x05, 0x27, 0xE0,
-0x54, 0x7F, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x0C, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x4E, 0xD8, 0x90,
-0xA1, 0x17, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x04, 0xB1, 0x15, 0x80, 0x1E, 0x90, 0x06, 0x04, 0xE0,
-0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x04, 0x7F, 0x01, 0xB1, 0x19, 0x90, 0x05, 0x27,
-0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x02, 0x4E, 0xD8,
-0x90, 0xA3, 0xE0, 0xEF, 0xF0, 0x12, 0x6E, 0x89, 0x90, 0xA3, 0xE0, 0xE0, 0x60, 0x06, 0xE4, 0xFD,
-0xFF, 0x12, 0x4E, 0xD8, 0x7D, 0x04, 0x7F, 0x01, 0xB1, 0x19, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0,
-0x22, 0xE0, 0x54, 0x7F, 0xF0, 0x7D, 0x0C, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x90, 0xA3, 0xDF, 0xEF, 0xF0, 0x14, 0x60, 0x15, 0x14, 0x60, 0x19, 0x24, 0x02, 0x70, 0x1A, 0xED,
-0x54, 0x01, 0xFF, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x80, 0x0C, 0x90, 0xA1, 0x1D,
-0xED, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x1C, 0xED, 0xF0, 0x7F, 0x8F, 0x12, 0x4C, 0x74, 0xEF, 0x30,
-0xE4, 0x31, 0x90, 0xA3, 0xDF, 0xE0, 0x14, 0x60, 0x07, 0x14, 0x60, 0x1D, 0x24, 0x02, 0x70, 0x23,
-0x90, 0xA1, 0x16, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x90, 0xA1, 0x1D,
-0xE0, 0x54, 0x7F, 0x4F, 0xFD, 0x7F, 0x88, 0x80, 0x07, 0x90, 0xA1, 0x1C, 0xE0, 0xFD, 0x7F, 0x89,
-0x12, 0x46, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x27,
-0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x12, 0x64,
-0xBE, 0xBF, 0x01, 0x13, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0xB1,
-0x19, 0x90, 0xA1, 0x15, 0x74, 0x0E, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0x1A, 0xF0, 0xA3, 0xF0, 0x90,
-0xA1, 0x18, 0xE0, 0x54, 0x0F, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0xF0,
-0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1,
-0x20, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFB, 0xF0, 0xA3, 0xE0, 0x54,
-0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x22, 0x74, 0x08, 0xF0, 0x90, 0xA1, 0x25,
-0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0x1E, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54,
-0xDF, 0xF0, 0xE4, 0xFD, 0xFF, 0xB1, 0x19, 0x7D, 0x0C, 0x7F, 0x02, 0xB1, 0x19, 0xB1, 0x15, 0x90,
-0xA1, 0x16, 0xE0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD,
-0xF0, 0x54, 0xF7, 0xF0, 0x90, 0xA1, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x90,
-0xA1, 0x2B, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0x2F, 0x74, 0x04, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xE4,
-0xA3, 0xF0, 0x90, 0xA1, 0x85, 0xE0, 0x54, 0xFE, 0xF0, 0x12, 0x77, 0x9A, 0xE4, 0x90, 0xA1, 0x2D,
-0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0x9C, 0xE0, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0x24, 0x74, 0xDD, 0xF0,
-0x80, 0x12, 0x90, 0x9F, 0x9C, 0xE0, 0x90, 0xA1, 0x24, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80,
-0x03, 0x74, 0x40, 0xF0, 0x90, 0xA1, 0x7A, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0,
-0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xE0, 0x54, 0xFD,
-0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0,
-0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD,
-0xFF, 0x12, 0x4E, 0xD8, 0xE4, 0x90, 0xA1, 0x80, 0xF0, 0x22, 0x12, 0x6E, 0x89, 0xE4, 0xFD, 0xFF,
-0x12, 0x4E, 0xD8, 0xB1, 0x15, 0x90, 0xA1, 0x15, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x2D, 0x12, 0x4F,
-0xF6, 0x90, 0x01, 0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x5D, 0x52, 0x12, 0x4C, 0xAD,
-0xE4, 0xFD, 0x7F, 0x01, 0xB1, 0x19, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x22, 0x90, 0xA1, 0x8E, 0xE0,
-0x20, 0xE0, 0x29, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x01, 0x70, 0x21, 0xF1, 0xF3, 0x90, 0xA1, 0x18,
-0xE0, 0x54, 0x0F, 0x60, 0x0F, 0xE4, 0xFD, 0x7F, 0x0C, 0x71, 0x11, 0xE4, 0xFD, 0xFF, 0x12, 0x4E,
-0xD8, 0x02, 0xB8, 0x7E, 0x90, 0xA1, 0x1D, 0xE0, 0x70, 0x02, 0x71, 0x0D, 0x22, 0xE4, 0x90, 0xA2,
-0xDF, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x54, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x4C,
-0x90, 0xA2, 0xDF, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0x21, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0,
-0x15, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0xA2, 0xDF, 0xF0, 0xF1, 0xE5, 0xEF,
-0x70, 0x04, 0x90, 0xA2, 0xDF, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0x60, 0x20, 0x90, 0xA1, 0x1E, 0xE0,
-0x44, 0x10, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x22, 0xE0, 0x90, 0xA3, 0x88, 0x11,
-0x8A, 0x90, 0xA1, 0x1D, 0xE0, 0x20, 0xE2, 0x02, 0x71, 0x0D, 0xF1, 0xF3, 0x22, 0x7D, 0x2F, 0x12,
-0x4C, 0xA9, 0x7D, 0x08, 0x7F, 0x01, 0xB1, 0x19, 0x90, 0xA1, 0x15, 0x74, 0x08, 0xF0, 0x22, 0x90,
-0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x7D, 0x0C, 0x7F, 0x01,
-0xA1, 0x19, 0x90, 0xA1, 0x11, 0xE0, 0x90, 0xA1, 0x1C, 0x30, 0xE0, 0x04, 0xE0, 0xFF, 0x80, 0x06,
-0xE0, 0xFF, 0x7D, 0x01, 0x61, 0x11, 0xAE, 0x07, 0xF1, 0xE5, 0xBF, 0x01, 0x15, 0x90, 0xA1, 0x11,
-0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x09, 0xAF, 0x06, 0x7D, 0x01, 0x71, 0x11, 0x7F,
-0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01,
-0x22, 0x01, 0xC4, 0x90, 0xA1, 0x7F, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0xEF, 0x13, 0x13,
-0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07,
-0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x22, 0x90, 0xA1, 0x7F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90,
-0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0x75, 0xE8, 0x07,
-0x75, 0xA8, 0x85, 0x22, 0xE4, 0x90, 0xA2, 0xA7, 0xF0, 0x90, 0xA2, 0xA7, 0xE0, 0x64, 0x01, 0xF0,
-0x24, 0x34, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x58, 0xA3, 0xF0, 0x12, 0x3E, 0x44, 0xBF, 0x01, 0x03,
-0x12, 0x31, 0xFC, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0F, 0x90, 0xA1, 0x1D, 0xE0, 0xFF, 0x90, 0xA1,
-0x1C, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x57, 0xB2, 0xC2, 0xAF, 0x31, 0x53, 0xBF, 0x01, 0x02, 0x11,
-0x85, 0xD2, 0xAF, 0x90, 0xA2, 0x21, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0xB7, 0x28, 0x12, 0x47, 0xF2,
-0x12, 0x42, 0x7D, 0x80, 0xB4, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0xA1, 0x11, 0xE0,
-0xFF, 0x30, 0xE0, 0x0E, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x31, 0x07, 0xBF, 0x01, 0x06, 0x80, 0x02,
-0x80, 0x00, 0x11, 0xA5, 0x22, 0x90, 0xA1, 0x1D, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x07, 0x31,
-0x33, 0xBF, 0x01, 0x02, 0x11, 0xB7, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x4D,
-0x75, 0x11, 0xC8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x31, 0x14, 0x7F, 0x08, 0x12, 0x4C, 0x74, 0xEF,
-0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x46, 0x4F, 0xE4, 0xFF, 0x31, 0xC4, 0x90, 0xA1, 0xCE, 0xE0,
-0x70, 0x09, 0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x80, 0x0E, 0x7F, 0x4E, 0x12, 0x4C, 0x74,
-0xEF, 0x54, 0x7F, 0xFD, 0x7F, 0x4E, 0x12, 0x46, 0x4F, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x54,
-0x0F, 0x30, 0xE0, 0x02, 0x31, 0x7C, 0x22, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60,
-0x02, 0x7F, 0x00, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x14, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x7F, 0x90,
-0x12, 0x4C, 0x74, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x14, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x59,
-0xA3, 0xF0, 0x22, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x17, 0x90, 0x02, 0x96, 0xE0, 0x70, 0x11, 0x90,
-0x02, 0x86, 0xE0, 0x30, 0xE1, 0x0A, 0x90, 0xA1, 0xD4, 0xE0, 0x20, 0xE0, 0x03, 0x7F, 0x01, 0x22,
-0x7F, 0x00, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x53, 0xF0, 0x74, 0x59, 0xA3, 0xF0, 0x90,
-0xA1, 0xEC, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6,
-0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F, 0x01, 0x22, 0x90, 0xA1, 0x86, 0xE0,
-0x90, 0x01, 0x38, 0xF0, 0x90, 0xA1, 0x87, 0xE0, 0x90, 0x01, 0x39, 0xF0, 0x90, 0xA1, 0x88, 0xE0,
-0x90, 0x01, 0x3A, 0xF0, 0x90, 0xA1, 0x89, 0xE0, 0x90, 0x01, 0x3B, 0xF0, 0x90, 0xA1, 0x8A, 0xE0,
-0x90, 0x01, 0x30, 0xF0, 0x90, 0xA1, 0x8B, 0xE0, 0x90, 0x01, 0x31, 0xF0, 0x90, 0xA1, 0x8C, 0xE0,
-0x90, 0x01, 0x32, 0xF0, 0x90, 0xA1, 0x8D, 0xE0, 0x90, 0x01, 0x33, 0xF0, 0x7F, 0x01, 0x12, 0x54,
-0xF0, 0x02, 0x55, 0xB8, 0x90, 0xA3, 0xC8, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01,
-0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0xA3, 0xC8, 0xE0, 0x6F, 0x60, 0x3E,
-0xC3, 0x90, 0xA3, 0xCA, 0xE0, 0x94, 0x88, 0x90, 0xA3, 0xC9, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90,
-0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0xA3, 0xC9, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08,
-0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA3, 0xCA, 0xE0, 0x94, 0x32, 0x90,
-0xA3, 0xC9, 0xE0, 0x94, 0x00, 0x40, 0xB7, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB0, 0x22, 0xEF,
-0x64, 0x01, 0x70, 0x6B, 0x12, 0x56, 0xDC, 0x90, 0x01, 0x38, 0xE0, 0x90, 0xA1, 0x86, 0xF0, 0x90,
-0x01, 0x39, 0xE0, 0x90, 0xA1, 0x87, 0xF0, 0x90, 0x01, 0x3A, 0xE0, 0x90, 0xA1, 0x88, 0xF0, 0x90,
-0x01, 0x3B, 0xE0, 0x90, 0xA1, 0x89, 0xF0, 0x90, 0x01, 0x30, 0xE0, 0x90, 0xA1, 0x8A, 0xF0, 0x90,
-0x01, 0x31, 0xE0, 0x90, 0xA1, 0x8B, 0xF0, 0x90, 0x01, 0x32, 0xE0, 0x90, 0xA1, 0x8C, 0xF0, 0x90,
-0x01, 0x33, 0xE0, 0x90, 0xA1, 0x8D, 0xF0, 0x90, 0x01, 0x38, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-0xA3, 0xF0, 0x90, 0x01, 0x30, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x30, 0x74,
-0x10, 0xF0, 0x90, 0x01, 0x39, 0x74, 0x01, 0xF0, 0x90, 0x00, 0x53, 0x74, 0x80, 0xF0, 0x22, 0x21,
-0x7C, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0x85, 0xE0, 0x54, 0xFE, 0x4E, 0xF0,
-0xEF, 0x54, 0x02, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xEF, 0x4F,
-0xF0, 0x90, 0xA1, 0x85, 0xE0, 0x54, 0x01, 0xFF, 0x41, 0x1F, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x5E,
-0x90, 0xA2, 0xB1, 0xEF, 0xF0, 0x12, 0x45, 0x67, 0x5B, 0x29, 0x00, 0x5B, 0x32, 0x01, 0x5B, 0x3B,
-0x02, 0x5B, 0x44, 0x03, 0x5B, 0x4D, 0x04, 0x5B, 0x55, 0x10, 0x5B, 0x5E, 0x11, 0x5B, 0x67, 0x12,
-0x5B, 0x6F, 0x14, 0x5B, 0x78, 0x20, 0x5B, 0x81, 0x21, 0x5B, 0x8A, 0x23, 0x5B, 0x93, 0x24, 0x5B,
-0x9B, 0x25, 0x5B, 0xA4, 0x27, 0x5B, 0xAC, 0x28, 0x5B, 0xB4, 0x40, 0x5B, 0xBD, 0x42, 0x5B, 0xC6,
-0x60, 0x5B, 0xCF, 0x61, 0x5B, 0xD7, 0x62, 0x5B, 0xE0, 0x63, 0x5B, 0xE9, 0x64, 0x5B, 0xF2, 0x65,
-0x5B, 0xFB, 0x66, 0x5C, 0x04, 0x67, 0x5C, 0x0D, 0x68, 0x5C, 0x16, 0x69, 0x5C, 0x1F, 0x6A, 0x5C,
-0x28, 0x6B, 0x5C, 0x31, 0x6C, 0x00, 0x00, 0x5C, 0x3A, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02,
-0x8A, 0x11, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8A, 0x5D, 0x90, 0xA2, 0xB2, 0x12, 0x45,
-0x55, 0x02, 0x8A, 0xFD, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0xB7, 0xB8, 0x90, 0xA2, 0xB2,
-0x12, 0x45, 0x55, 0x81, 0x7E, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8D, 0x1F, 0x90, 0xA2,
-0xB2, 0x12, 0x45, 0x55, 0x02, 0x73, 0x12, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x81, 0x4A, 0x90,
-0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8D, 0x47, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8D,
-0x56, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x8F, 0x2E, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55,
-0x02, 0x8F, 0x74, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0xA1, 0x7E, 0x90, 0xA2, 0xB2, 0x12, 0x45,
-0x55, 0x02, 0x8F, 0x7C, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x81, 0xAB, 0x90, 0xA2, 0xB2, 0x12,
-0x45, 0x55, 0x41, 0x91, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0xB2, 0x94, 0x90, 0xA2, 0xB2,
-0x12, 0x45, 0x55, 0x02, 0xA3, 0xA2, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x6A, 0xF7, 0x90,
-0xA2, 0xB2, 0x12, 0x45, 0x55, 0x81, 0x5E, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x90, 0x3C,
-0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x90, 0x43, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02,
-0x90, 0x57, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x90, 0xB9, 0x90, 0xA2, 0xB2, 0x12, 0x45,
-0x55, 0x02, 0x7E, 0xA3, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x7D, 0x61, 0x90, 0xA2, 0xB2,
-0x12, 0x45, 0x55, 0x02, 0x90, 0xCB, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x90, 0xEA, 0x90,
-0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x7A, 0xB3, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x91,
-0x98, 0x90, 0xA2, 0xB2, 0x12, 0x45, 0x55, 0x02, 0x92, 0xBC, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01,
-0xF0, 0x90, 0xA2, 0xB1, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x90, 0xA0,
-0x8F, 0xF0, 0xBF, 0x01, 0x08, 0x12, 0x97, 0xCD, 0xE4, 0x90, 0xA0, 0x8F, 0xF0, 0x22, 0x90, 0xA1,
-0xB4, 0xE0, 0x44, 0x04, 0xF0, 0x7D, 0x01, 0x7F, 0x23, 0x12, 0x4A, 0x44, 0x8F, 0x51, 0xE5, 0x51,
-0xB4, 0x03, 0x0A, 0xE4, 0xFF, 0x12, 0x7F, 0x30, 0x7F, 0x04, 0x12, 0x7D, 0x46, 0x22, 0x12, 0x94,
-0xEA, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xF1, 0xE0, 0x54, 0xFE, 0x4E, 0xF0,
-0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x14, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xF2, 0xF0,
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xF3, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01,
-0xFF, 0x90, 0xA1, 0x81, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90,
-0xA1, 0x82, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x83, 0xF0, 0x90, 0xA1, 0x82,
-0xE0, 0x90, 0xA1, 0x84, 0xF0, 0x90, 0xA1, 0x81, 0xE0, 0x54, 0x01, 0xFF, 0xAC, 0x07, 0xEF, 0x54,
-0x01, 0xFE, 0x90, 0xA1, 0x81, 0xE0, 0x54, 0xFE, 0x4E, 0xF0, 0xEF, 0x90, 0x01, 0x53, 0xB4, 0x01,
-0x12, 0xE4, 0xF0, 0x7D, 0x10, 0x7F, 0x03, 0x12, 0x70, 0x7B, 0x90, 0xA1, 0x83, 0xE0, 0x90, 0x05,
-0x73, 0xF0, 0x22, 0x74, 0x03, 0xF0, 0x7D, 0x10, 0xFF, 0x12, 0x77, 0x82, 0x02, 0x56, 0xCA, 0x90,
-0xA1, 0x81, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0xA1, 0x83, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA1,
-0x84, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x57, 0x8D, 0x90, 0xA1, 0x82, 0xE0, 0x14, 0x90, 0xA1,
-0x84, 0xF0, 0x90, 0x05, 0x73, 0x74, 0x01, 0xF0, 0xE4, 0xFF, 0x91, 0xDC, 0x7D, 0x02, 0x7F, 0x02,
-0xB1, 0x52, 0x7D, 0x01, 0x7F, 0x02, 0xB1, 0x52, 0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD,
-0xE4, 0xFF, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0x4D, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4,
-0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0x12, 0x57, 0x2D, 0x90, 0xA1, 0x20, 0xE0, 0x14, 0x90,
-0x05, 0x73, 0xF0, 0x7D, 0x02, 0x7F, 0x02, 0xB1, 0x52, 0x12, 0x64, 0x76, 0x80, 0x91, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x05, 0x27, 0xE0, 0xF5,
-0x54, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0x11, 0xE0, 0x54, 0xFE, 0x4E, 0xFE,
-0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54,
-0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF,
-0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D,
-0xFF, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0xFF, 0xF0, 0x12,
-0x06, 0x89, 0xFE, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x4D, 0x90, 0xA1, 0x11, 0xF0, 0xEE, 0xC3,
-0x13, 0x20, 0xE0, 0x02, 0xC1, 0x99, 0xE0, 0x20, 0xE0, 0x02, 0xC1, 0x80, 0x75, 0x54, 0x21, 0x13,
-0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xB1, 0x49, 0x43, 0x54, 0x08, 0x80, 0x0C, 0xE4, 0x90, 0xA1,
-0x12, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0xF1, 0x6A, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x13, 0x13,
-0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03,
-0x43, 0x54, 0x14, 0x90, 0xA1, 0x11, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x54,
-0x80, 0x90, 0xA1, 0x11, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x03, 0x43, 0x54, 0x40,
-0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x8B,
-0x46, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x04, 0x7F, 0x04,
-0x80, 0x22, 0x12, 0x57, 0xE5, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x18, 0x7F, 0x02, 0x80, 0x14,
-0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x14, 0xE0, 0x64, 0x04, 0x60,
-0x02, 0xE1, 0x5B, 0xFF, 0x12, 0x8B, 0x46, 0xE1, 0x5B, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x20, 0xE0,
-0x02, 0xE1, 0x27, 0x43, 0x54, 0x31, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xB1, 0x49, 0x43,
-0x54, 0x08, 0x80, 0x06, 0x7D, 0x40, 0xE4, 0xFF, 0xF1, 0x6A, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x13,
-0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x54, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0,
-0x03, 0x43, 0x54, 0x04, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC4,
-0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60, 0x6C, 0xE4,
-0xFD, 0x7F, 0x02, 0x80, 0x23, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15, 0xE0,
-0xB4, 0x02, 0x1A, 0x12, 0xB9, 0x19, 0x12, 0x57, 0xE5, 0xBF, 0x01, 0x09, 0x90, 0xA1, 0x1C, 0xE0,
-0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x12, 0x53, 0x11, 0x80, 0x3E, 0x90, 0xA1, 0x1D,
-0xE0, 0x90, 0xA1, 0x15, 0xF0, 0x80, 0x34, 0x75, 0x54, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x54, 0xF0,
-0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0xA1, 0x15,
-0xE0, 0xB4, 0x08, 0x07, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x53, 0x11, 0x12, 0x9D, 0x04, 0x90, 0xA1,
-0x1C, 0xE0, 0xFF, 0x7D, 0x01, 0x12, 0x53, 0x11, 0x12, 0x95, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0x7D, 0x02, 0x7F, 0x02, 0xF1, 0x6A, 0x7D, 0x01, 0x7F, 0x02, 0x74, 0x15, 0x2F, 0xF8, 0xE6, 0xFE,
-0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x30, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE,
-0xF0, 0x22, 0xEF, 0x70, 0x4F, 0x7D, 0x78, 0x7F, 0x02, 0xF1, 0x6A, 0x7D, 0x02, 0x7F, 0x03, 0xF1,
-0x6A, 0x7D, 0xC8, 0x7F, 0x02, 0x12, 0x77, 0x82, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C,
-0x74, 0x02, 0xF0, 0x90, 0xA0, 0x90, 0xE0, 0x70, 0x15, 0x12, 0x6E, 0x89, 0x12, 0x57, 0x9F, 0x90,
-0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x80, 0x07, 0x7D, 0x01,
-0x7F, 0x0C, 0x12, 0x53, 0x11, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x90, 0x06, 0x0A, 0xE0,
-0x54, 0xF8, 0xF0, 0x22, 0x90, 0x01, 0x36, 0x74, 0x78, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x7D, 0x78,
-0xFF, 0xB1, 0x52, 0x7D, 0x02, 0x7F, 0x03, 0xB1, 0x52, 0x90, 0x06, 0x0A, 0xE0, 0x44, 0x07, 0xF0,
-0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x15,
-0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1D, 0xE0, 0x20, 0xE2, 0x0E, 0x7D, 0x01,
-0x7F, 0x04, 0x02, 0x53, 0x11, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xC0, 0xE0, 0xC0,
-0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x1D, 0x90, 0x01,
-0xC4, 0xED, 0xF0, 0x74, 0x60, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF,
-0xF0, 0xD0, 0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 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, 0x90, 0x01, 0xC4, 0x74, 0x4E,
-0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x4E, 0x6B, 0xE5, 0x14, 0x30, 0xE7, 0x02, 0x11, 0xA5, 0x74,
-0x4E, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 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, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x7F, 0xF2, 0x12, 0x4C,
-0x74, 0xEF, 0x20, 0xE6, 0x0E, 0x7F, 0x05, 0x12, 0x4C, 0x74, 0xEF, 0x44, 0x80, 0xFD, 0x7F, 0x05,
-0x12, 0x46, 0x4F, 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, 0x90, 0x01, 0xC4, 0x74, 0xC4, 0xF0, 0x74, 0x60, 0xA3, 0xF0, 0x12, 0x9A, 0x34, 0xE5, 0x19,
-0x30, 0xE1, 0x02, 0x51, 0x74, 0xE5, 0x19, 0x30, 0xE4, 0x02, 0x91, 0x54, 0xE5, 0x19, 0x30, 0xE5,
-0x03, 0x12, 0x99, 0x38, 0xE5, 0x19, 0x30, 0xE6, 0x02, 0xF1, 0xD4, 0xE5, 0x1B, 0x30, 0xE0, 0x02,
-0x91, 0x5C, 0xE5, 0x1B, 0x30, 0xE1, 0x03, 0x12, 0x9A, 0x91, 0xE5, 0x1B, 0x30, 0xE2, 0x03, 0x12,
-0x70, 0x90, 0xE5, 0x1B, 0x30, 0xE3, 0x03, 0x12, 0x9C, 0x3B, 0xE5, 0x1B, 0x30, 0xE4, 0x03, 0x12,
-0x9C, 0x64, 0xE5, 0x1B, 0x30, 0xE5, 0x02, 0x91, 0x83, 0xE5, 0x1B, 0x30, 0xE6, 0x03, 0x12, 0x9C,
-0x93, 0xE5, 0x1C, 0x30, 0xE1, 0x03, 0x12, 0x9C, 0xAF, 0xE5, 0x1C, 0x30, 0xE4, 0x02, 0x51, 0xFA,
-0xE5, 0x1C, 0x30, 0xE5, 0x02, 0x31, 0x7D, 0x74, 0xC4, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x60,
-0xA3, 0xF0, 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, 0xE4, 0xF5, 0x63,
-0x74, 0x90, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x41, 0x68,
-0xE5, 0x63, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x63, 0x54, 0x07, 0xFE, 0x74, 0x81, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x74, 0x01, 0x7E, 0x00, 0xA8,
-0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02,
-0x41, 0x68, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x20, 0xE7,
-0x02, 0x80, 0x10, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x02, 0x12, 0x45, 0x49, 0xE0, 0xFF,
-0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x7C, 0xEF, 0x30, 0xE6, 0x21,
-0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10,
-0xE5, 0x63, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x6A, 0xE4, 0xFB, 0x80,
-0x52, 0x74, 0x96, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x74,
-0x96, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x14,
-0xAF, 0x63, 0x12, 0xA2, 0x9E, 0x74, 0x96, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83,
-0xE4, 0xF0, 0x80, 0x24, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0,
-0xFD, 0x75, 0xF0, 0x10, 0xE5, 0x63, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5,
-0x6A, 0x7B, 0x01, 0xAF, 0x63, 0x12, 0xA0, 0x99, 0x05, 0x63, 0xE5, 0x63, 0xC3, 0x94, 0x80, 0x50,
-0x02, 0x21, 0x80, 0x22, 0xE4, 0xFF, 0x90, 0xA2, 0xCF, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xF5,
-0x64, 0xA3, 0xE0, 0xF5, 0x65, 0x65, 0x64, 0x60, 0x70, 0x90, 0xA2, 0xD0, 0x74, 0x03, 0xF0, 0x90,
-0xA2, 0xDE, 0x74, 0x08, 0xF0, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x66, 0xE4, 0xF5, 0x63, 0xE5,
-0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82,
-0x25, 0x63, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0xD2, 0x25, 0x63, 0xF5,
-0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x63, 0xE5, 0x63, 0xB4, 0x08, 0xD0, 0x7B,
-0x01, 0x7A, 0xA2, 0x79, 0xD0, 0x12, 0x7C, 0xAB, 0xE5, 0x65, 0x04, 0x54, 0x0F, 0xF5, 0x65, 0xB4,
-0x0F, 0x03, 0xE4, 0xF5, 0x65, 0x90, 0x04, 0x7F, 0xE5, 0x65, 0xF0, 0x90, 0xA2, 0xCF, 0xE0, 0x7F,
-0x04, 0x70, 0x03, 0x02, 0x4C, 0x9A, 0x12, 0x7D, 0x46, 0x22, 0xE4, 0xFF, 0x90, 0xA2, 0x23, 0xEF,
-0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA2, 0x24, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x50, 0x47, 0x74, 0x25,
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81,
-0x03, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA2, 0x24, 0x30, 0xE7, 0x0E, 0xE0, 0x24, 0x81, 0xF5, 0x82,
-0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x14, 0xE0, 0xFF, 0xF1, 0xE1, 0x90, 0xA2, 0x24,
-0xE0, 0x24, 0x25, 0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x24,
-0xE0, 0x04, 0xF0, 0x80, 0xAF, 0x7F, 0x0C, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xE4, 0x90, 0xA2, 0x24,
-0xF0, 0x90, 0xA2, 0x24, 0xE0, 0xFF, 0xC3, 0x94, 0x80, 0x40, 0x02, 0x81, 0x53, 0x74, 0x25, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0xA2, 0xF5, 0x83, 0xE0, 0x70, 0x02, 0x81, 0x4B, 0x90, 0xA2, 0x24, 0xE0,
-0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x06, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEF,
-0x90, 0x81, 0x07, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x24, 0xE0, 0xFC, 0x25,
-0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x75,
-0xF0, 0x10, 0xEC, 0x90, 0x81, 0x0A, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x75, 0xF0, 0x10, 0xEC, 0x90,
-0x81, 0x0B, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0xED, 0xFF, 0x90, 0xA2, 0x24, 0xE0, 0x75, 0xF0, 0x0A,
-0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7F, 0x01, 0x90, 0xA2, 0x24,
-0xE0, 0xFE, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x0B, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82,
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFD, 0x75, 0xF0, 0x0A, 0xEE, 0x90, 0x8D, 0x01, 0x12, 0x45,
-0x49, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xED, 0xF0, 0x0F, 0xEF, 0xB4,
-0x05, 0xCB, 0x90, 0xA2, 0x24, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x09, 0x12, 0x45, 0x49,
-0xE0, 0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEE, 0xF0, 0x90, 0xA2,
-0x24, 0xE0, 0xFF, 0x90, 0xA2, 0x23, 0xE0, 0xFD, 0x12, 0xA3, 0x15, 0x90, 0xA2, 0x24, 0xE0, 0x24,
-0x81, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0x24, 0xE0, 0x04,
-0xF0, 0x61, 0x61, 0x22, 0x12, 0x92, 0xE6, 0x7F, 0x02, 0x02, 0x4C, 0x9A, 0x90, 0xA1, 0x11, 0xE0,
-0x30, 0xE0, 0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0,
-0x02, 0xF1, 0x7E, 0x12, 0xB9, 0xA5, 0x90, 0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12,
-0x50, 0xEB, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0E,
-0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x02, 0xE1, 0xA4, 0x91, 0x9F, 0x22, 0x12,
-0xB8, 0x7E, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0C, 0x60, 0x13, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x53,
-0x11, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x7D, 0x08, 0xE4, 0xFF, 0x91, 0xC9, 0x22, 0x90, 0xA1,
-0x95, 0xE0, 0x44, 0x02, 0xF0, 0x7D, 0x08, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x90, 0xA3, 0x94, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x9F, 0x99, 0xE0, 0x04, 0xF0, 0x90, 0x04,
-0x1D, 0xE0, 0x60, 0x43, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0x98, 0xF0, 0x7D, 0x26, 0x12, 0x4F,
-0xF6, 0xEF, 0x64, 0x01, 0x70, 0x0B, 0xB1, 0x61, 0x90, 0xA1, 0xF7, 0xE0, 0x20, 0xE0, 0x1A, 0x80,
-0x15, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0C, 0xB1, 0x61, 0x90,
-0xA1, 0xF7, 0xE0, 0x20, 0xE0, 0x03, 0x12, 0xBA, 0x94, 0x90, 0xA3, 0x98, 0xE0, 0xFF, 0x7D, 0x27,
-0x12, 0x4E, 0xD8, 0xF1, 0x13, 0x80, 0x0E, 0xF1, 0x13, 0xB1, 0x61, 0x90, 0xA1, 0xF7, 0xE0, 0x20,
-0xE0, 0x03, 0x12, 0xBA, 0x94, 0x90, 0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0xA1, 0x92, 0xE0,
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0C, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D,
-0x28, 0x12, 0x4E, 0xD8, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF,
-0x22, 0x90, 0x9F, 0x9F, 0xE0, 0xFF, 0x90, 0xA3, 0x95, 0xE0, 0xFB, 0x7D, 0x01, 0xD1, 0x08, 0x90,
-0xA3, 0x96, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA3, 0x94, 0xE0, 0xFF, 0x74, 0x09,
-0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x3F, 0xF0, 0xEF, 0x60, 0x52, 0x74,
-0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x10, 0xF0, 0x74, 0x09, 0x2D,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x92, 0xE0, 0xC4,
-0x13, 0x54, 0x07, 0x30, 0xE0, 0x47, 0x90, 0xA1, 0xA5, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x13,
-0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x74, 0x2B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xEF, 0xF0, 0x22, 0x74, 0x2B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x7F, 0xF0,
-0x22, 0x74, 0x29, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xEF, 0xF0, 0x74,
-0x09, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA3,
-0x89, 0xA3, 0xE0, 0xFF, 0x7B, 0x08, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
-0xA3, 0xC6, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA3, 0xC5, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12,
-0x7C, 0x80, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0xA3, 0xC5, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0xA3,
-0xC6, 0xE0, 0x60, 0x0E, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44,
-0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54,
-0xC0, 0xF0, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0,
-0xAF, 0x05, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE,
-0x90, 0xA3, 0xC7, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x74, 0x12,
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xB5, 0xEF, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x32,
-0x90, 0x05, 0x22, 0xE0, 0x90, 0xA3, 0xB8, 0xF0, 0x7D, 0x29, 0x12, 0x4F, 0xF6, 0xBF, 0x01, 0x16,
-0x90, 0x9F, 0xA0, 0xD1, 0x02, 0x90, 0xA3, 0xB6, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90,
-0xA3, 0xB5, 0xE0, 0xFF, 0xB1, 0x7E, 0x90, 0xA3, 0xB8, 0xE0, 0xFF, 0x7D, 0x2A, 0x12, 0x4E, 0xD8,
-0x80, 0x16, 0x90, 0x9F, 0xA0, 0xD1, 0x02, 0x90, 0xA3, 0xB6, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0,
-0xFD, 0x90, 0xA3, 0xB5, 0xE0, 0xFF, 0xB1, 0x7E, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0x90, 0xA3, 0x94, 0xE0, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
-0xA3, 0xE2, 0xEF, 0xF0, 0x90, 0x9F, 0x9F, 0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x49,
-0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0E, 0x70, 0x15, 0x90, 0xA3, 0xE2, 0xE0, 0x70, 0x3B, 0x90, 0xA1,
-0x16, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x04, 0x12, 0x55, 0x11, 0x80, 0x26, 0x90, 0xA1, 0x1D,
-0xE0, 0x64, 0x06, 0x70, 0x24, 0x90, 0xA3, 0xE2, 0xE0, 0x60, 0x1E, 0x90, 0xA1, 0x16, 0xE0, 0x54,
-0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44, 0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x1D,
-0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x10, 0xE0, 0xB4, 0x01, 0x04, 0x7F, 0x04, 0x80, 0x0C,
-0x12, 0x57, 0xE5, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x8B, 0x46, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x7F, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x1F, 0x90, 0x04,
-0x1D, 0xE0, 0x70, 0x19, 0x90, 0x9F, 0x9E, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0xD1, 0x08, 0x90,
-0xA3, 0xD7, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x7D, 0x08,
-0xE4, 0xFF, 0x81, 0xC9, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0,
-0x22, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x40, 0xF0, 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, 0x90, 0x01, 0xC4,
-0x74, 0xF0, 0xF0, 0x74, 0x67, 0xA3, 0xF0, 0x12, 0x9A, 0x61, 0xE5, 0x21, 0x30, 0xE1, 0x02, 0x11,
-0xAC, 0xE5, 0x21, 0x30, 0xE2, 0x02, 0x11, 0xE6, 0xE5, 0x21, 0x30, 0xE5, 0x03, 0x12, 0x57, 0xF1,
-0xE5, 0x22, 0x30, 0xE0, 0x03, 0x12, 0x72, 0xD5, 0xE5, 0x23, 0x30, 0xE1, 0x03, 0x12, 0x9D, 0xEA,
-0xE5, 0x23, 0x30, 0xE0, 0x03, 0x12, 0x9D, 0x34, 0xE5, 0x23, 0x30, 0xE3, 0x02, 0xF1, 0xDE, 0xE5,
-0x23, 0x30, 0xE2, 0x09, 0xF1, 0x0A, 0x90, 0x07, 0x8F, 0xE0, 0x44, 0x10, 0xF0, 0xE5, 0x24, 0x30,
-0xE1, 0x05, 0x7F, 0x04, 0x12, 0x4C, 0x9A, 0xE5, 0x24, 0x30, 0xE4, 0x03, 0x12, 0x5D, 0x67, 0xE5,
-0x24, 0x30, 0xE5, 0x03, 0x12, 0x9E, 0x81, 0xE5, 0x24, 0x30, 0xE6, 0x03, 0x12, 0x9F, 0x14, 0xE5,
-0x24, 0x30, 0xE7, 0x02, 0x11, 0xB8, 0x74, 0xF0, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x67, 0xA3,
-0xF0, 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, 0x90, 0xA1, 0x1A, 0xE0,
-0x60, 0x03, 0x12, 0xBA, 0x4A, 0x02, 0x4F, 0x58, 0x90, 0xA1, 0xA9, 0xE0, 0x30, 0xE0, 0x04, 0x11,
-0xD0, 0x80, 0x03, 0x12, 0x81, 0xF3, 0x90, 0xA1, 0xDA, 0xE0, 0x30, 0xE0, 0x02, 0xF1, 0x3C, 0x22,
-0x7D, 0x12, 0x7F, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0x07, 0x78, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xCD,
-0xE0, 0xFF, 0xE4, 0xFD, 0x80, 0x6D, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x14, 0x90, 0x06, 0x92, 0xE0,
-0x30, 0xE1, 0x03, 0x02, 0xB8, 0x7E, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x12, 0x57, 0xB2,
-0x22, 0x11, 0xD0, 0x90, 0xA1, 0xA9, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, 0xEF, 0xC3, 0x13,
-0x54, 0x0F, 0xC3, 0x9E, 0x40, 0x02, 0x80, 0x17, 0x90, 0xA1, 0xA9, 0xE0, 0xFF, 0xC3, 0x13, 0x54,
-0x0F, 0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0x90,
-0xA1, 0xA9, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0xA1, 0xAE, 0xE0, 0x90, 0x07, 0x78,
-0xF0, 0x90, 0xA1, 0xAF, 0x31, 0x4E, 0xD1, 0x89, 0xE4, 0xFD, 0xFF, 0x02, 0x4E, 0xD8, 0xE0, 0xFF,
-0xA3, 0xE0, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8F, 0x26, 0x8D, 0x27, 0x90, 0xA1,
-0x91, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x41, 0xF2, 0x90, 0xA1, 0xCE, 0xE0,
-0x60, 0x02, 0x41, 0x12, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x46, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37,
-0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0xE5, 0x26,
-0x90, 0xA3, 0x73, 0xB4, 0x01, 0x05, 0x12, 0x45, 0x11, 0x80, 0x0C, 0x12, 0x45, 0x11, 0xEF, 0x44,
-0x80, 0xFF, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x73,
-0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x38, 0x45,
-0xE5, 0x27, 0x64, 0x02, 0x70, 0x02, 0x41, 0xF2, 0xE5, 0x27, 0x70, 0x02, 0x41, 0xF2, 0x7F, 0x48,
-0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEE, 0x54, 0xF0, 0xFE, 0xEC, 0x90, 0xA3, 0x73, 0x12,
-0x08, 0x6D, 0x90, 0xA1, 0xCD, 0xE0, 0x90, 0xA3, 0x73, 0x60, 0x09, 0x12, 0x45, 0x11, 0xEF, 0x44,
-0x80, 0xFF, 0x80, 0x07, 0x12, 0x45, 0x11, 0xEE, 0x44, 0x02, 0xFE, 0xEC, 0x90, 0xA3, 0x73, 0x12,
-0x08, 0x6D, 0x90, 0xA3, 0x73, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x48,
-0x41, 0xED, 0xE5, 0x26, 0x64, 0x02, 0x60, 0x43, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF,
-0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0xE5, 0x26, 0x90, 0xA3, 0x73, 0xB4,
-0x01, 0x08, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x01, 0x80, 0x06, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x02,
-0xFF, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x73, 0x12, 0x45, 0x11, 0x90, 0xAA,
-0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xE5, 0x27, 0x64, 0x02, 0x70,
-0x02, 0x41, 0xF2, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xE4, 0xFF, 0xEC, 0x90, 0xA3, 0x73,
-0x12, 0x08, 0x6D, 0xE5, 0x27, 0x70, 0x13, 0x90, 0xA3, 0x73, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x77,
-0xFF, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0x80, 0x55, 0x90, 0xA3, 0x73, 0x12, 0x45, 0x11,
-0xEF, 0x44, 0x66, 0xFF, 0xEC, 0x90, 0xA3, 0x73, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12,
-0x37, 0x4E, 0xEF, 0x54, 0xFC, 0xFF, 0xEC, 0x90, 0xA3, 0x77, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xCD,
-0xE0, 0x90, 0xA3, 0x77, 0x60, 0x08, 0x12, 0x45, 0x11, 0xEF, 0x44, 0x02, 0x80, 0x06, 0x12, 0x45,
-0x11, 0xEF, 0x44, 0x01, 0xFF, 0xEC, 0x90, 0xA3, 0x77, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x77, 0x12,
-0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x2C, 0x7E, 0x09, 0x12, 0x38, 0x45, 0x90,
-0xA3, 0x73, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x30, 0x7E, 0x09, 0x12,
-0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2,
-0xB5, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0x8E, 0xE0, 0x54,
-0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06,
-0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0x8E, 0xF0, 0xEE, 0x54,
-0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF,
-0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x8E, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E,
-0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, 0x8E, 0xF0,
-0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0x91, 0xE0, 0x54, 0xFE,
-0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03,
-0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0x91, 0xF0,
-0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2,
-0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x91, 0xF0, 0xEE, 0x54, 0x40,
-0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFE,
-0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, 0x91, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x54,
-0x20, 0xFE, 0x90, 0xA1, 0x92, 0xE0, 0x54, 0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE,
-0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x80, 0xFD, 0xEF,
-0x54, 0x7F, 0x4D, 0xFF, 0x90, 0xA1, 0x92, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E,
-0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D,
-0xFF, 0x90, 0xA1, 0x92, 0xF0, 0xEE, 0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, 0xFF, 0xF0, 0x90,
-0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1,
-0x92, 0xF0, 0xEE, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0xE0, 0xFF, 0x13, 0x13, 0x54,
-0x3F, 0x20, 0xE0, 0x08, 0xD1, 0x89, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x92, 0xE0,
-0xC3, 0x13, 0x20, 0xE0, 0x0E, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0,
-0x54, 0xEF, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x02, 0xA1,
-0xD6, 0x90, 0x05, 0x54, 0xE0, 0x90, 0xA1, 0x9F, 0xF0, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0x9E, 0xF0,
-0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2,
-0x90, 0xA1, 0x8F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x90, 0xF0, 0x80, 0x48,
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03,
-0x90, 0xA1, 0x8F, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1,
-0x8F, 0x74, 0x2A, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12,
-0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA1, 0x90, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0,
-0x80, 0x06, 0x90, 0xA1, 0x90, 0x74, 0x2A, 0xF0, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54,
-0x03, 0x30, 0xE0, 0x3D, 0x90, 0xA1, 0x8F, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0x97, 0xF0,
-0xE0, 0xC3, 0x13, 0xA3, 0xF0, 0x90, 0xA1, 0x90, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0x99,
-0xF0, 0x90, 0xA1, 0x8F, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0x9A, 0xF0, 0x90, 0xA1, 0x90, 0xE0, 0xC3,
-0x13, 0x90, 0xA1, 0x9B, 0xF0, 0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x12, 0x70,
-0x7B, 0xE4, 0x90, 0xA1, 0xCB, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12,
-0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x27, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13,
-0x54, 0x1F, 0x30, 0xE0, 0x08, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA1, 0xCD,
-0xE0, 0x60, 0x05, 0x75, 0x51, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x31,
-0x53, 0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA1, 0x92, 0xE0, 0xC4,
-0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x02, 0x12, 0x55, 0x19, 0x90, 0x05, 0x00,
-0x74, 0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x96,
-0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0xA1, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04,
-0x08, 0x90, 0xA1, 0xA1, 0x74, 0x04, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA1, 0xA1,
-0x74, 0x02, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x07, 0x06, 0x90, 0xA1, 0xA1, 0x74, 0x05, 0xF0, 0xE4,
-0x90, 0xA1, 0x96, 0xF0, 0x80, 0x6D, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12,
-0x06, 0xA2, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x14,
-0x12, 0x06, 0x89, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80,
-0x03, 0xE4, 0xF5, 0x52, 0x12, 0x78, 0xC0, 0x7D, 0x2C, 0x7F, 0x40, 0x12, 0x46, 0x4F, 0x90, 0xA2,
-0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90,
-0x07, 0x78, 0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xAD, 0x52, 0x7F,
-0x02, 0x31, 0x53, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3,
-0x74, 0x43, 0xF0, 0x90, 0xA1, 0x94, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0xA0, 0xF0, 0x90,
-0xA1, 0x91, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA1, 0xBE, 0xE0,
-0x44, 0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x77, 0xBB, 0x90, 0xA1, 0xBE, 0xE0, 0x54, 0xFD,
-0xF0, 0x7F, 0x03, 0x12, 0x84, 0xB1, 0x90, 0xA1, 0x8E, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0xA1, 0x92,
-0xE0, 0x54, 0xBF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x90, 0x01, 0x01, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7,
-0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0x90, 0xA1, 0x7F, 0xE0, 0xFF, 0x13, 0x13,
-0x13, 0x54, 0x1F, 0x30, 0xE0, 0x06, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0xA9, 0xE0,
-0x20, 0xE0, 0x34, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x2E, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x07, 0xE4,
-0x90, 0xA3, 0xCF, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0xCF, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x7F, 0xE0,
-0xC4, 0x13, 0x54, 0x07, 0x90, 0xA3, 0xD0, 0x30, 0xE0, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74,
-0x02, 0xF0, 0x90, 0xA3, 0xCF, 0x31, 0x4E, 0x7F, 0x02, 0x12, 0x4C, 0x74, 0xEF, 0x44, 0x01, 0xFD,
-0x7F, 0x02, 0x12, 0x46, 0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x90, 0xA1, 0xDA, 0xE0, 0x30, 0xE0, 0x1F, 0x90, 0xA1, 0xDF, 0xE0, 0xB4, 0x01, 0x0C, 0xA3,
-0xE0, 0xB4, 0x01, 0x13, 0x74, 0x02, 0xF0, 0xF1, 0xB7, 0x80, 0x0C, 0x90, 0xA1, 0xDF, 0xE0, 0xB4,
-0x02, 0x05, 0x74, 0x03, 0xF0, 0xF1, 0x3C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xE1, 0xE0, 0xB4, 0x01, 0x02, 0x80, 0x4C, 0x90, 0xA1, 0xE1, 0xE0,
-0xB4, 0x02, 0x12, 0xF1, 0xB7, 0x7F, 0x01, 0x12, 0x84, 0xB1, 0x12, 0x89, 0x55, 0x90, 0xA1, 0xE1,
-0x74, 0x03, 0xF0, 0x80, 0x4D, 0x90, 0xA1, 0xE1, 0xE0, 0x64, 0x03, 0x70, 0x24, 0x90, 0xA1, 0xE4,
-0xF1, 0xBA, 0xE4, 0xFF, 0x12, 0x84, 0xB1, 0x12, 0x89, 0x55, 0x90, 0xA1, 0xDA, 0xE0, 0xC3, 0x13,
-0x54, 0x03, 0xFF, 0xE4, 0xFB, 0xFD, 0x12, 0x82, 0xBE, 0x90, 0xA1, 0xE1, 0x74, 0x04, 0xF0, 0x80,
-0x21, 0x90, 0xA1, 0xE1, 0xE0, 0xB4, 0x04, 0x1A, 0x90, 0xA1, 0xDA, 0xE0, 0xC3, 0x13, 0x54, 0x03,
-0xFF, 0x7B, 0x01, 0x7D, 0x01, 0x12, 0x82, 0xBE, 0x90, 0xA1, 0xE1, 0x74, 0x02, 0xF0, 0x90, 0xA1,
-0xDF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xE6, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD,
-0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0, 0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, 0xFB, 0xFD,
-0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90, 0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0x22, 0xD1,
-0x89, 0x90, 0xA1, 0x14, 0x74, 0x03, 0xF0, 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, 0x90, 0x01, 0xC4, 0x74, 0xE8, 0xF0, 0x74, 0x6F, 0xA3, 0xF0, 0x12,
-0x4A, 0x9E, 0x53, 0x91, 0xBF, 0x74, 0xE8, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0x6F, 0xA3, 0xF0,
-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, 0xC0, 0xE0, 0xC0, 0x83, 0xC0,
-0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x3B, 0x90, 0x01, 0xC4, 0xED,
-0xF0, 0x74, 0x70, 0xFF, 0xA3, 0xF0, 0xED, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0xA3, 0xEF, 0xF0, 0xD0,
-0x07, 0xD0, 0x05, 0xD0, 0xD0, 0xD0, 0x82, 0xD0, 0x83, 0xD0, 0xE0, 0x32, 0xEF, 0x14, 0x90, 0x05,
-0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x74, 0x1D, 0x2F, 0xF8, 0xE6,
-0x4D, 0xFE, 0xF6, 0x74, 0x38, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22,
-0x90, 0xA1, 0xF6, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0xA1,
-0x15, 0xE0, 0x64, 0x02, 0x60, 0x35, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0A,
-0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x02, 0x60, 0x23, 0x11, 0xDC, 0x90, 0xA1, 0x17, 0xE0, 0x13, 0x13,
-0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90, 0xA1, 0x20, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x0B,
-0x11, 0x6C, 0x12, 0x5F, 0x60, 0x90, 0xA1, 0x21, 0xE0, 0x14, 0xF0, 0x22, 0x90, 0xA0, 0x90, 0xE0,
-0x64, 0x01, 0x60, 0x02, 0x21, 0x8B, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02, 0x21, 0x8B, 0x90, 0xA1,
-0x18, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0xA1,
-0x21, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x04, 0x90, 0xA1, 0x20, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08,
-0x90, 0xA1, 0x20, 0xE0, 0xFE, 0xFF, 0x80, 0x03, 0xEF, 0x04, 0xFF, 0x90, 0xA1, 0x21, 0xEF, 0xF0,
-0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x02, 0x31, 0x9C, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0,
-0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x90, 0x01,
-0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0,
-0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80,
-0x0F, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0xB7, 0xE4, 0x80, 0x03, 0x12, 0xB9, 0x34,
-0x90, 0xA1, 0x17, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x20, 0xE0,
-0xFF, 0xA3, 0xE0, 0xB5, 0x07, 0x05, 0x11, 0x6C, 0x12, 0x5F, 0x66, 0x90, 0xA1, 0x11, 0xE0, 0xC3,
-0x13, 0x20, 0xE0, 0x07, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0xCF,
-0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB, 0x78,
-0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x43, 0xEE, 0xF0, 0xA3, 0xEF,
-0xF0, 0x90, 0xA1, 0x41, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xA3, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB, 0xC3,
-0x9F, 0xEA, 0x9E, 0x40, 0x21, 0x90, 0xA1, 0x41, 0xA3, 0xEB, 0x9F, 0xFD, 0xC3, 0x94, 0x0F, 0x50,
-0x13, 0x74, 0x32, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0xA1,
-0x2D, 0xE0, 0x04, 0xF0, 0x51, 0x4A, 0x90, 0xA1, 0x2D, 0xE0, 0xD3, 0x94, 0x32, 0x40, 0x4A, 0xE4,
-0x90, 0xA2, 0xD0, 0xF0, 0x90, 0xA2, 0xCF, 0xF0, 0x90, 0xA2, 0xCF, 0xE0, 0xFF, 0xC3, 0x94, 0x0F,
-0x50, 0x2A, 0x74, 0x32, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA2,
-0xD0, 0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x0A, 0x40, 0x0A, 0x90, 0xA2, 0xCF, 0xE0, 0x90, 0xA1,
-0x2C, 0xF0, 0x80, 0x08, 0x90, 0xA2, 0xCF, 0xE0, 0x04, 0xF0, 0x80, 0xCC, 0x90, 0xA1, 0x2C, 0xE0,
-0xFD, 0x7B, 0x08, 0xE4, 0xFF, 0x51, 0x86, 0xF1, 0x9A, 0x22, 0x90, 0xA1, 0x31, 0xE0, 0xFD, 0x7F,
-0xFD, 0x12, 0x46, 0x4F, 0x90, 0xA1, 0x7A, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40,
-0x24, 0x90, 0xA1, 0x31, 0xE0, 0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, 0xA1, 0x2B,
-0xEF, 0xF0, 0x25, 0xE0, 0x24, 0x08, 0x90, 0xA1, 0x30, 0xF0, 0xFB, 0x90, 0xA1, 0x2B, 0xE0, 0xFF,
-0xA3, 0xE0, 0xFD, 0x51, 0x86, 0x22, 0xAC, 0x07, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x2E, 0x90,
-0xA1, 0x2C, 0xE0, 0xD3, 0x94, 0x03, 0x50, 0x07, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x80, 0x0A, 0xED,
-0x24, 0xFD, 0x2B, 0x90, 0xA1, 0x22, 0xF0, 0x7D, 0x03, 0xC3, 0x74, 0x04, 0x9D, 0x2C, 0xFF, 0x90,
-0xA1, 0x2F, 0xF0, 0x90, 0xA1, 0x25, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0xA1, 0x25,
-0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0,
-0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0xA0, 0x0A, 0x90, 0xA2, 0xDF, 0xEF, 0xF0, 0x30, 0xE0, 0x05,
-0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x55, 0x19, 0x90, 0xA2, 0xDF, 0xE0, 0x30,
-0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F,
-0x74, 0x80, 0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA1, 0x30, 0xE0, 0xFB,
-0x41, 0x86, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xC4, 0x54, 0x0F, 0xFF, 0xBF,
-0x0F, 0x1A, 0x90, 0xA1, 0xF7, 0xE0, 0x54, 0xFE, 0xF0, 0xF1, 0x7E, 0xAB, 0x51, 0xAA, 0x52, 0xA9,
-0x53, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFF, 0xB1, 0x42, 0x02, 0x95, 0x26, 0xAB, 0x51, 0xAA, 0x52,
-0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD,
-0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFA, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06,
-0xA2, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA1, 0xFB, 0x12, 0x45, 0x49, 0xE0, 0x54,
-0xFC, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE,
-0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFB, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xE3, 0x4F, 0xF0, 0x90, 0x00,
-0x02, 0x12, 0x06, 0xA2, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90, 0xA1, 0xFB, 0x12, 0x45,
-0x49, 0xE0, 0x54, 0x1F, 0x4F, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89,
-0x54, 0x0F, 0xFD, 0xE4, 0xFB, 0x91, 0x38, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x05,
-0x12, 0x06, 0xA2, 0xFF, 0x12, 0x06, 0x89, 0x54, 0x0F, 0xFD, 0x7B, 0x01, 0x91, 0x38, 0xAB, 0x51,
-0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF,
-0x12, 0x06, 0x89, 0xFE, 0x54, 0x0F, 0xFD, 0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x03, 0x12, 0x45, 0x49,
-0xEF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D,
-0xED, 0x90, 0xA2, 0x04, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D,
-0x70, 0x25, 0x90, 0xA1, 0xF8, 0xEF, 0xF0, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x54, 0x0F, 0xC4,
-0x54, 0xF0, 0xFF, 0x90, 0xA1, 0xF7, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0, 0x44, 0x01,
-0xF0, 0x7D, 0x20, 0xE4, 0xFF, 0x11, 0x7B, 0x22, 0x8F, 0x54, 0x8D, 0x55, 0xAE, 0x03, 0x74, 0x1F,
-0xC3, 0x95, 0x54, 0x40, 0x14, 0x90, 0xA2, 0xB9, 0xEE, 0xF0, 0xAB, 0x55, 0xE4, 0xFD, 0x91, 0xCB,
-0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0x24, 0xD4, 0x80, 0x55, 0x74, 0x3F, 0xC3, 0x95, 0x54, 0x40, 0x16,
-0x90, 0xA2, 0xB9, 0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x20, 0xAF, 0x54, 0x91, 0xCB, 0x90, 0xA2, 0xB5,
-0xEF, 0xF0, 0x24, 0x88, 0x80, 0x38, 0x74, 0x5F, 0xC3, 0x95, 0x54, 0x40, 0x16, 0x90, 0xA2, 0xB9,
-0xEE, 0xF0, 0xAB, 0x55, 0x7D, 0x40, 0xAF, 0x54, 0x91, 0xCB, 0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0x24,
-0xD0, 0x80, 0x1B, 0x74, 0x7F, 0xC3, 0x95, 0x54, 0x40, 0x30, 0x90, 0xA2, 0xB9, 0xEE, 0xF0, 0xAB,
-0x55, 0x7D, 0x60, 0xAF, 0x54, 0x91, 0xCB, 0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0x24, 0x84, 0xFD, 0xE4,
-0x34, 0x04, 0xFC, 0x75, 0xF0, 0x0D, 0xE5, 0x55, 0x90, 0xA1, 0xFC, 0x12, 0x45, 0x49, 0x75, 0xF0,
-0x03, 0xEE, 0x12, 0x45, 0x49, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0xC3, 0xEF, 0x9D, 0xF5, 0x56,
-0xC3, 0x94, 0x08, 0x50, 0x24, 0xE4, 0xF5, 0x57, 0x75, 0xF0, 0x0D, 0xEB, 0x90, 0xA1, 0xFE, 0x12,
-0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA2, 0xB9, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0,
-0x03, 0x12, 0x45, 0x49, 0xE5, 0x56, 0xF0, 0x80, 0x46, 0xE5, 0x56, 0xC3, 0x94, 0x10, 0x50, 0x09,
-0x75, 0x57, 0x01, 0xE5, 0x56, 0x24, 0xF8, 0x80, 0x17, 0xE5, 0x56, 0xC3, 0x94, 0x18, 0x50, 0x09,
-0x75, 0x57, 0x02, 0xE5, 0x56, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x57, 0x03, 0xE5, 0x56, 0x24, 0xE8,
-0xFF, 0x75, 0xF0, 0x0D, 0xEB, 0x90, 0xA1, 0xFE, 0x12, 0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90,
-0xA2, 0xB9, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0xAF,
-0x57, 0x22, 0x8F, 0x54, 0x7D, 0x17, 0x12, 0x4F, 0xF6, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x90, 0xA1,
-0xFA, 0x12, 0x45, 0x49, 0xE0, 0xFC, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x90, 0xA1, 0xFB, 0x12, 0x45,
-0x49, 0xE0, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFB, 0x90, 0xA1, 0xF7, 0xE0,
-0xFE, 0xC4, 0x54, 0x0F, 0x90, 0xA3, 0xB0, 0xF0, 0xAF, 0x04, 0xD1, 0x79, 0x75, 0xF0, 0x0D, 0xE5,
-0x54, 0x12, 0xB4, 0xD8, 0x75, 0xF0, 0x0D, 0xE5, 0x54, 0x12, 0x4E, 0xC7, 0xAD, 0x54, 0xE4, 0xFF,
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xB1, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4,
-0xA3, 0xF0, 0x90, 0xA3, 0xB3, 0xE0, 0xFF, 0xC3, 0x94, 0x02, 0x40, 0x02, 0xC1, 0x74, 0x90, 0xA3,
-0xB2, 0xE0, 0xFE, 0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFC, 0x12, 0x45, 0x49, 0x75, 0xF0, 0x03, 0xEF,
-0x12, 0x45, 0x49, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, 0x83, 0xE0, 0x90, 0xA3, 0xB4, 0xF0,
-0x90, 0xA3, 0xB1, 0xE0, 0x60, 0x31, 0x90, 0xA3, 0xB4, 0xE0, 0xFF, 0x75, 0xF0, 0x0D, 0xEE, 0x90,
-0xA1, 0xFE, 0x12, 0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xB3, 0xE0, 0xD0, 0x82, 0xD0,
-0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02,
-0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0x80, 0x33, 0x90, 0xA3, 0xB4, 0xE0, 0xFF, 0x90, 0xA3, 0xB2, 0xE0,
-0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFE, 0x12, 0x45, 0x49, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xB3,
-0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x74, 0x01, 0xA8,
-0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0xB4, 0xF0, 0x90, 0xA3,
-0xB4, 0xE0, 0xFF, 0x90, 0xA3, 0xB2, 0xE0, 0x75, 0xF0, 0x0D, 0x90, 0xA1, 0xFC, 0x12, 0x45, 0x49,
-0xC0, 0x83, 0xC0, 0x82, 0x90, 0xA3, 0xB3, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12,
-0x45, 0x49, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xB3, 0xE0,
-0x04, 0xF0, 0xA1, 0xA2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x90, 0xA3, 0xAD, 0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x2F, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24,
-0x02, 0xF5, 0x71, 0x80, 0x08, 0x90, 0xA3, 0xAD, 0xE0, 0x24, 0xFE, 0xF5, 0x71, 0x90, 0xA3, 0x15,
-0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x71, 0xD1, 0xF0, 0x90, 0xA3, 0x15, 0x12, 0x08,
-0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x71, 0x80, 0x20, 0x90, 0xA3, 0x15, 0x12, 0x08, 0x79, 0x00,
-0x00, 0x00, 0xFF, 0x90, 0xA3, 0xAD, 0xE0, 0xFF, 0xD1, 0xF0, 0x90, 0xA3, 0x15, 0x12, 0x08, 0x79,
-0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0xAD, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x19,
-0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F, 0x01, 0xF1, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0xE4, 0xFF,
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x13, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90,
-0xA3, 0x12, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA3, 0x1D, 0x12, 0x08,
-0x6D, 0x90, 0xA3, 0x15, 0x12, 0x45, 0x11, 0x12, 0x08, 0x3A, 0x90, 0xA3, 0x1D, 0x12, 0x45, 0x2D,
-0x12, 0x44, 0xE6, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x15, 0x12, 0x45,
-0x11, 0x90, 0xA3, 0x19, 0x12, 0x45, 0x2D, 0x12, 0x44, 0xE6, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01,
-0xD0, 0x00, 0x12, 0x44, 0xF3, 0x90, 0xA3, 0x21, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x13, 0xA3, 0xE0,
-0xFD, 0xC0, 0x05, 0x90, 0xA3, 0x21, 0x12, 0x45, 0x11, 0x90, 0xAA, 0x96, 0x12, 0x08, 0x6D, 0x90,
-0xA3, 0x12, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x20,
-0xE4, 0xFF, 0x74, 0x1D, 0x2F, 0xF8, 0xE6, 0xFE, 0xED, 0xF4, 0x5E, 0xFE, 0xF6, 0x74, 0x38, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0x01, 0xF5, 0x83, 0xEE, 0xF0, 0x22, 0xE4, 0xFF, 0x74, 0x32, 0x2F, 0xF5,
-0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x0A, 0xEF, 0xE4, 0x90, 0xA1,
-0x2D, 0xF0, 0x90, 0xA1, 0x31, 0xF0, 0x90, 0xA1, 0x2B, 0xF0, 0x22, 0x90, 0xA1, 0xBE, 0xE0, 0xFE,
-0xC3, 0x13, 0x30, 0xE0, 0x1C, 0xEF, 0xB4, 0x01, 0x05, 0x90, 0xA1, 0xC5, 0x80, 0x03, 0x90, 0xA1,
-0xC1, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x38,
-0x45, 0x22, 0x90, 0xA1, 0xBE, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xFD, 0xF0, 0x54,
-0xF7, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA1,
-0xC5, 0x12, 0x08, 0x6D, 0x90, 0xA1, 0xC5, 0x12, 0x45, 0x11, 0x90, 0xA1, 0xC1, 0x12, 0x08, 0x6D,
-0xE4, 0x90, 0xA1, 0xCB, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3,
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x68, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x07,
-0x78, 0x74, 0x01, 0xF0, 0x11, 0x66, 0x11, 0xC0, 0x90, 0xA1, 0xA7, 0x74, 0x01, 0xF0, 0xE4, 0xA3,
-0xF0, 0x90, 0xA1, 0xB1, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x01, 0x12, 0x69, 0x53, 0xE4, 0x90, 0xA1,
-0xCE, 0xF0, 0x90, 0xA1, 0xD4, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1,
-0xDA, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0xA1, 0x8E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0,
-0x54, 0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3,
-0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54,
-0xFB, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0,
-0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0, 0x54, 0xEF, 0xF0, 0x54,
-0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x54, 0xFE, 0xF0, 0x22,
-0x90, 0xA1, 0x94, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0x93, 0xF0, 0x90, 0xA1, 0x95, 0xE0,
-0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x9C, 0xF0, 0xA3, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x02, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3,
-0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0xE4, 0x90, 0xA1, 0xA6, 0xF0,
-0x90, 0xA1, 0xB4, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7, 0xF0,
-0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x22, 0x8F, 0x55, 0xE4,
-0x90, 0xA2, 0xBB, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x2A, 0xD3,
-0x90, 0xA2, 0xBC, 0xE0, 0x94, 0x14, 0x90, 0xA2, 0xBB, 0xE0, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2,
-0xBD, 0x74, 0x01, 0xF0, 0x80, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x90, 0xA2, 0xBB,
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xCF, 0x90, 0xA2, 0xBD, 0xE0, 0xB4, 0x01, 0x0C,
-0x7F, 0x05, 0x12, 0x4C, 0x96, 0x90, 0xFD, 0x58, 0xE0, 0x44, 0x80, 0xF0, 0xE5, 0x55, 0x75, 0xF0,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x12, 0x06,
+0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xCD, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54,
+0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x04, 0xFD, 0xEF,
+0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xCD, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E,
+0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1,
+0xCD, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54,
+0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1, 0xCD, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2,
+0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xD0, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02,
+0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x04,
+0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xD0, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54,
+0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54,
+0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0xD0, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xFF,
+0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x90, 0xA1,
+0xD0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x20, 0xFE, 0x90, 0xA1, 0xD1, 0xE0,
+0x54, 0xDF, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F, 0xFF, 0xF0, 0x90,
+0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x80, 0xFD, 0xEF, 0x54, 0x7F, 0x4D, 0xFF, 0x90, 0xA1,
+0xD1, 0xF0, 0xEE, 0x54, 0x01, 0xFE, 0xEF, 0x54, 0xFE, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12,
+0x06, 0xA2, 0xFE, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xD1, 0xF0, 0xEE,
+0x54, 0x02, 0xFE, 0xEF, 0x54, 0xFD, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xFE,
+0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0xD1, 0xF0, 0xEE, 0x54, 0x08, 0xFE,
+0xEF, 0x54, 0xF7, 0x4E, 0xF0, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x09, 0x12, 0x60,
+0x4D, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0xA1, 0xD1, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x0E,
+0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA2,
+0xEB, 0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0x20, 0xE0, 0x02, 0xA1, 0x45, 0x90, 0x05, 0x54, 0xE0,
+0x90, 0xA1, 0xDE, 0xF0, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0xDD, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xC4,
+0x54, 0x0F, 0x30, 0xE0, 0x16, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xCE, 0xF0, 0x90,
+0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xCF, 0xF0, 0x80, 0x48, 0x90, 0x00, 0x01, 0x12, 0x06,
+0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90, 0xA1, 0xCE, 0x50, 0x05,
+0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xCE, 0x74, 0x2A, 0xF0, 0x90,
+0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0xC3, 0x94, 0x2A, 0x50, 0x12, 0xEF, 0xC3, 0x94, 0x03, 0x90,
+0xA1, 0xCF, 0x50, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x0A, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xCF,
+0x74, 0x2A, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3C, 0x90,
+0xA1, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0xD6, 0xF0, 0xE0, 0xC3, 0x13, 0xA3, 0xF0,
+0x90, 0xA1, 0xCF, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0x90, 0xA1, 0xD8, 0xF0, 0x90, 0xA1, 0xCE, 0xE0,
+0xC3, 0x13, 0x90, 0xA1, 0xD9, 0xF0, 0x90, 0xA1, 0xCF, 0xE0, 0xC3, 0x13, 0x90, 0xA1, 0xDA, 0xF0,
+0x90, 0x01, 0x3E, 0x74, 0x08, 0xF0, 0xFD, 0x7F, 0x02, 0x11, 0x0B, 0xE4, 0x90, 0xA2, 0x0A, 0xF0,
+0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xC4, 0x13, 0x13, 0x54,
+0x03, 0x20, 0xE0, 0x3C, 0x90, 0xA1, 0xCD, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x0A, 0xEF, 0xC4,
+0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x28, 0x12, 0x06, 0x89, 0x13, 0x13, 0x13, 0x54, 0x1F,
+0x30, 0xE0, 0x08, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x08, 0x80, 0x0B, 0x90, 0xA2, 0x0C, 0xE0, 0x60,
+0x05, 0x75, 0x51, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x51, 0x7D, 0x02, 0xAF, 0x51, 0x12, 0x63, 0x7F,
+0x90, 0xA1, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x1C, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13,
+0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x02, 0x12, 0x55, 0x87, 0x90, 0x05, 0x00, 0x74,
+0x1C, 0xF0, 0xA3, 0x74, 0x11, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0xD5, 0xE0,
+0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0xE0, 0x74, 0x01, 0xF0, 0x80, 0x22, 0xEF, 0xB4, 0x04, 0x08,
+0x90, 0xA1, 0xE0, 0x74, 0x04, 0xF0, 0x80, 0x16, 0xEF, 0xB4, 0x06, 0x08, 0x90, 0xA1, 0xE0, 0x74,
+0x02, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x07, 0x06, 0x90, 0xA1, 0xE0, 0x74, 0x05, 0xF0, 0xE4, 0x90,
+0xA1, 0xD5, 0xF0, 0x80, 0x6D, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06,
+0xA2, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x02, 0x80, 0x14, 0x12,
+0x06, 0x89, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03,
+0xE4, 0xF5, 0x52, 0xD1, 0x07, 0x7D, 0x2C, 0x7F, 0x40, 0x12, 0x46, 0xAC, 0x90, 0xA2, 0xEB, 0x12,
+0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x07, 0x78,
+0x30, 0xE0, 0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0xAD, 0x52, 0x7F, 0x02, 0x12,
+0x63, 0x7F, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0x05, 0x00, 0x74, 0x1C, 0xF0, 0xA3, 0x74,
+0x43, 0xF0, 0x90, 0xA1, 0xD3, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0x90, 0xA1, 0xDF, 0xF0, 0x90, 0xA1,
+0xD0, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x09, 0x90, 0xA1, 0xFD, 0xE0, 0x44,
+0x02, 0xF0, 0x80, 0x0C, 0x7F, 0x01, 0x12, 0x67, 0xE7, 0x90, 0xA1, 0xFD, 0xE0, 0x54, 0xFD, 0xF0,
+0x7F, 0x03, 0x12, 0x66, 0xDF, 0x90, 0xA1, 0xCD, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0xA1, 0xD1, 0xE0,
+0x54, 0xBF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, 0x7F, 0x2A, 0x7D, 0x00, 0x7B, 0x01,
+0x7A, 0xA2, 0x79, 0x2C, 0x02, 0x08, 0xAA, 0x7E, 0x00, 0x7F, 0x0A, 0x7D, 0x00, 0x7B, 0x01, 0x7A,
+0xA1, 0x79, 0xF3, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0xE1, 0x74, 0x02, 0xF0, 0x22, 0x8F, 0x55, 0xE4,
+0x90, 0xA2, 0xF1, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xFD, 0x58, 0xE0, 0x30, 0xE0, 0x2A, 0xD3,
+0x90, 0xA2, 0xF2, 0xE0, 0x94, 0x14, 0x90, 0xA2, 0xF1, 0xE0, 0x94, 0x00, 0x40, 0x08, 0x90, 0xA2,
+0xF3, 0x74, 0x01, 0xF0, 0x80, 0x13, 0x7F, 0x01, 0x7E, 0x00, 0x12, 0x3D, 0xC2, 0x90, 0xA2, 0xF1,
+0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xCF, 0x90, 0xA2, 0xF3, 0xE0, 0xB4, 0x01, 0x0C,
+0x7F, 0x05, 0x12, 0x5E, 0x86, 0x90, 0xFD, 0x58, 0xE0, 0x44, 0x80, 0xF0, 0xE5, 0x55, 0x75, 0xF0,
0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x50, 0xF0,
0xE5, 0x55, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
0x90, 0xFD, 0x51, 0xF0, 0xE5, 0x55, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
@@ -6250,1051 +6448,862 @@ u1Byte Array_MP_8723B_FW_MP[] = {
0x90, 0xFD, 0x55, 0xF0, 0xE5, 0x55, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34,
0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x56, 0xF0, 0xE5, 0x55, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07,
0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xFD, 0x57, 0xF0, 0xA3, 0x74, 0x01, 0xF0,
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xF5, 0x54, 0x90, 0xA2, 0xB8, 0xF0, 0x74,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xF5, 0x54, 0x90, 0xA2, 0xEE, 0xF0, 0x74,
0x28, 0x2F, 0xFF, 0xE4, 0x3E, 0xFE, 0xA3, 0xEF, 0xF0, 0xEE, 0xA3, 0xF0, 0x90, 0x01, 0xBD, 0xE0,
-0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0xA2, 0xBA,
-0xE0, 0xFF, 0x90, 0xA2, 0xB8, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x5C, 0xEE, 0x70, 0x05, 0x75, 0x54,
-0x05, 0x80, 0x03, 0xE4, 0xF5, 0x54, 0xE5, 0x54, 0xC3, 0x94, 0x20, 0x50, 0x08, 0xAF, 0x54, 0x31,
-0x1D, 0x05, 0x54, 0x80, 0xF1, 0x90, 0xA2, 0xB8, 0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x10, 0xE0, 0x04,
-0xF0, 0x90, 0xA2, 0xBA, 0xE0, 0xFF, 0x90, 0xA2, 0xB8, 0xE0, 0xB5, 0x07, 0xC0, 0xE4, 0xF5, 0x54,
-0xE5, 0x54, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0xA2, 0xB9, 0xE0, 0xFD, 0xC3, 0xEF, 0x9D, 0x74,
-0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x08, 0xAF, 0x54, 0x31, 0x1D, 0x05, 0x54, 0x80, 0xE1, 0x90,
-0xA2, 0xB8, 0xE0, 0x04, 0xF0, 0x80, 0x96, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0x3F, 0xF0,
-0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x7D, 0x06, 0x7F, 0x0A, 0x12, 0x4A, 0x44, 0x8F, 0x53, 0xE5,
-0x53, 0x64, 0x01, 0x60, 0x08, 0x90, 0x04, 0x9D, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA2, 0xB5,
-0x12, 0x45, 0x55, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x12, 0x06, 0x89, 0x7C, 0x00, 0x24,
-0x00, 0xF5, 0x52, 0xEC, 0x3E, 0xF5, 0x51, 0xAF, 0x52, 0xFE, 0x71, 0x14, 0xEF, 0x70, 0x07, 0x90,
-0x04, 0x9D, 0xE0, 0x44, 0x10, 0xF0, 0xAF, 0x52, 0xAE, 0x51, 0x51, 0x11, 0x90, 0x04, 0x9D, 0xE0,
-0x44, 0x80, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xB8, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x91, 0x80, 0xAD,
-0x07, 0xED, 0x24, 0x28, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA2, 0xB9, 0xE0, 0x2F, 0xFF, 0x90, 0xA2,
-0xB8, 0xE0, 0x3E, 0xF9, 0xC3, 0x74, 0xD8, 0x9D, 0x90, 0xA2, 0xBE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4,
-0xFC, 0xEC, 0xC3, 0x99, 0x40, 0x02, 0x81, 0x12, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x2C, 0x90,
-0xFD, 0x10, 0xF0, 0xEC, 0x70, 0x67, 0xF5, 0x56, 0x90, 0xA2, 0xBE, 0xE0, 0xC3, 0x13, 0xFF, 0xE5,
-0x56, 0xC3, 0x9F, 0x40, 0x02, 0x81, 0x0F, 0x75, 0xF0, 0x02, 0xE5, 0x56, 0xA4, 0x2D, 0xF5, 0x82,
-0xE4, 0x35, 0xF0, 0xF5, 0x83, 0xE5, 0x82, 0x24, 0x28, 0xF5, 0x82, 0xE5, 0x83, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0x90, 0xA2, 0xBA, 0xF0, 0xFB, 0x75, 0xF0, 0x02, 0xE5, 0x56, 0xA4, 0x2D, 0xF5, 0x82,
-0xE4, 0x35, 0xF0, 0xF5, 0x83, 0xE5, 0x82, 0x24, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0x90, 0xA2, 0xBB, 0xF0, 0xFE, 0x7A, 0x00, 0xE4, 0x2B, 0xFF, 0xEA, 0x3E, 0xFE, 0xA3,
-0xF0, 0xA3, 0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0x80, 0x9B, 0xE4, 0xF5, 0x56,
-0xE5, 0x56, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xA2,
-0xBA, 0xF0, 0xFB, 0xE5, 0x56, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0x90, 0xA2, 0xBB, 0xF0, 0xFE, 0x7A, 0x00, 0xE4, 0x2B, 0xFF, 0xEA, 0x3E, 0xFE, 0xA3, 0xF0,
-0xA3, 0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0xE5, 0x56, 0xB4, 0x80, 0xC1, 0x0C,
-0x61, 0x51, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x29, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0xF5, 0x56,
-0x90, 0xA2, 0xBF, 0xE0, 0xC3, 0x13, 0xFF, 0xE5, 0x56, 0xC3, 0x9F, 0x50, 0x3C, 0xE5, 0x56, 0x25,
-0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xBA, 0xF0, 0xFD,
-0xE5, 0x56, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xA2,
-0xBB, 0xF0, 0xFE, 0x7C, 0x00, 0xE4, 0x2D, 0xFF, 0xEC, 0x3E, 0xFE, 0xA3, 0xF0, 0xA3, 0xEF, 0xF0,
-0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0x80, 0xB7, 0xE5, 0x55, 0x90, 0x04, 0x9E, 0xF0, 0xE5,
-0x54, 0xA3, 0xF0, 0x45, 0x55, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0, 0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED,
-0xF0, 0xAF, 0x06, 0x22, 0x90, 0xA2, 0xEF, 0x74, 0x08, 0xF0, 0x90, 0xA2, 0xFD, 0x74, 0x01, 0xF0,
-0x90, 0xA2, 0xF1, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEF, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
-0xC0, 0xD0, 0x90, 0xA0, 0x8B, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF,
-0x14, 0xFF, 0x90, 0xA0, 0x8C, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF,
-0x60, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x35, 0xC0, 0x01, 0x90, 0xA0, 0x8C,
-0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0xF5, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D,
-0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x06, 0x63, 0x90, 0xA0, 0x8C, 0xE0, 0x04, 0xF0,
-0xE0, 0x7F, 0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0xA0, 0x8C, 0xF0,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0xC0, 0x74, 0x12, 0xF0, 0x90, 0xA2, 0xCE, 0x74, 0x05,
-0xF0, 0x90, 0xA2, 0xC2, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0xBE, 0xE0,
-0x90, 0xA2, 0xC5, 0xF0, 0x90, 0xA2, 0xBF, 0xE0, 0x90, 0xA2, 0xC6, 0xF0, 0x7B, 0x01, 0x7A, 0xA2,
-0x79, 0xC0, 0x91, 0xAB, 0x7F, 0x04, 0x90, 0xA3, 0xDA, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0x57,
-0x90, 0x9F, 0x97, 0xE0, 0xFF, 0x90, 0xA3, 0xDA, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x97, 0xF0,
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x06, 0x89, 0x90, 0xA2, 0xB5, 0xF0, 0x90,
-0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB6, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90,
-0xA2, 0xB7, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB8, 0xF0, 0x90, 0x00, 0x04,
-0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB9, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA1, 0xB4, 0xE0,
-0x44, 0x40, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xB5, 0x7D, 0x07, 0x7F, 0x30, 0x12, 0x4A, 0x44,
-0x8F, 0x51, 0xE5, 0x51, 0xB4, 0x01, 0x05, 0x75, 0x52, 0x01, 0x80, 0x03, 0xE4, 0xF5, 0x52, 0x90,
-0xA2, 0xB5, 0xE0, 0xFB, 0xAD, 0x52, 0xE4, 0xFF, 0xB1, 0xD3, 0x7F, 0x04, 0xB1, 0x46, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0x90, 0xA3, 0x46, 0x74, 0x0B, 0xF0, 0x90, 0xA3, 0x54, 0x74, 0x07, 0xF0, 0x90,
-0xA3, 0x48, 0xEF, 0xF0, 0x60, 0x32, 0x90, 0xFD, 0x63, 0xE0, 0x90, 0xA3, 0x49, 0xF0, 0x90, 0xFD,
-0x61, 0xE0, 0x90, 0xA3, 0x4A, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x4B, 0xF0, 0x90, 0xFD,
-0x65, 0xE0, 0x90, 0xA3, 0x4C, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x4D, 0xF0, 0x90, 0xFD,
-0x67, 0xE0, 0x90, 0xA3, 0x4E, 0xF0, 0x80, 0x11, 0x90, 0xA3, 0x49, 0xED, 0xF0, 0xA3, 0xEB, 0xF0,
-0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x46, 0x81,
-0xAB, 0x90, 0xA3, 0x00, 0xEB, 0xF0, 0x70, 0x6A, 0x90, 0xA3, 0x00, 0xE0, 0xFE, 0x24, 0x96, 0xF5,
-0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFC, 0x90, 0xA3, 0x01, 0xE0, 0xFB, 0xEC, 0x6B, 0x60,
-0x51, 0x90, 0xA3, 0x05, 0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF,
-0x90, 0x9F, 0x96, 0xE0, 0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, 0xA3, 0x07, 0xF0, 0x90, 0xA3,
-0x02, 0xE0, 0x90, 0xA3, 0x09, 0xF0, 0x90, 0xA3, 0x03, 0x74, 0x0C, 0xF0, 0x90, 0xA3, 0x11, 0x74,
-0x04, 0xF0, 0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x03, 0x91, 0xAB, 0x7F, 0x04, 0xB1, 0x46, 0x90, 0xA3,
-0x01, 0xE0, 0xFF, 0x90, 0xA3, 0x00, 0xE0, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83,
-0xEF, 0xF0, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12,
-0x06, 0x89, 0x90, 0xA1, 0xD7, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xD8, 0xF0,
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xD9, 0xF0, 0x90, 0xA1, 0xB4, 0xE0, 0x44, 0x01,
-0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12, 0x4A, 0x40, 0xEF, 0xB4, 0x02, 0x04, 0x7F, 0x40,
-0xB1, 0x46, 0x22, 0x90, 0xA2, 0xB5, 0x74, 0x0A, 0xF0, 0x90, 0xA2, 0xC3, 0x74, 0x06, 0xF0, 0x12,
-0x06, 0x89, 0x90, 0xA2, 0xB7, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB8, 0xF0,
-0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xB9, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2,
-0x90, 0xA2, 0xBA, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xBB, 0xF0, 0x90, 0x00,
-0x05, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xBC, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xB5, 0x81, 0xAB,
-0x90, 0xA3, 0x37, 0x74, 0x09, 0xF0, 0x90, 0xA3, 0x45, 0x74, 0x07, 0xF0, 0x90, 0xA3, 0x39, 0xEF,
-0xF0, 0x70, 0x31, 0x90, 0xA1, 0xA7, 0xE0, 0x60, 0x1A, 0xA3, 0xE0, 0x60, 0x02, 0x80, 0x0C, 0x90,
-0x07, 0x70, 0xE0, 0x70, 0x06, 0x90, 0x07, 0x74, 0xE0, 0x60, 0x08, 0x90, 0xA3, 0x3A, 0x74, 0x01,
-0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA3, 0x3A, 0xF0, 0xE4, 0x90, 0xA3, 0x3B, 0xF0, 0xA3, 0xF0, 0xA3,
-0xF0, 0xA3, 0x80, 0x39, 0x90, 0xFD, 0x62, 0xE0, 0x90, 0xA3, 0x3A, 0xF0, 0x90, 0xFD, 0x63, 0xE0,
-0x90, 0xA3, 0x3B, 0xF0, 0x90, 0xFD, 0x64, 0xE0, 0x90, 0xA3, 0x3C, 0xF0, 0x90, 0xFD, 0x65, 0xE0,
-0x90, 0xA3, 0x3D, 0xF0, 0x90, 0xFD, 0x66, 0xE0, 0x90, 0xA3, 0x3E, 0xF0, 0x90, 0xFD, 0x67, 0xE0,
-0x90, 0xA3, 0x3F, 0xF0, 0x90, 0xA3, 0x3A, 0xE0, 0x54, 0x01, 0x90, 0xA1, 0xA7, 0xF0, 0xA3, 0xF0,
-0x7B, 0x01, 0x7A, 0xA3, 0x79, 0x37, 0x81, 0xAB, 0x90, 0x9F, 0xA1, 0xE0, 0xFF, 0x7B, 0x08, 0x7D,
-0x01, 0x12, 0x66, 0x08, 0x90, 0xA2, 0xE3, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0xA2,
-0xE0, 0xE0, 0xFF, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA2, 0xEA, 0xF0, 0x90, 0xA2, 0xE7, 0xEC,
-0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA2, 0xE7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x12,
-0x65, 0x7E, 0x90, 0xA2, 0xE7, 0xA3, 0xE0, 0xFF, 0xFD, 0x24, 0x0D, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
-0xF5, 0x83, 0xE0, 0x44, 0x80, 0xF0, 0x74, 0x0D, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
-0xE0, 0x54, 0xEF, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44,
-0x02, 0xF0, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x03, 0xF0,
-0x90, 0xA2, 0xE9, 0xE0, 0xFF, 0x90, 0xA2, 0xE7, 0xA3, 0xE0, 0xFE, 0x24, 0x2A, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA2, 0xEA, 0xE0, 0xFF, 0x74, 0x2B, 0x2E, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0x24, 0x02, 0xF0, 0x22, 0x90, 0xA2, 0xE0, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB,
-0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x21, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0xE5, 0xF0, 0x7D,
-0x01, 0x12, 0x4F, 0xF6, 0xEF, 0x64, 0x01, 0x70, 0x03, 0x12, 0x7F, 0xB8, 0x90, 0xA2, 0xE5, 0xE0,
-0xFF, 0x7D, 0x02, 0x12, 0x4E, 0xD8, 0x80, 0x03, 0x12, 0x7F, 0xB8, 0x90, 0x04, 0x1F, 0x74, 0x20,
-0xF0, 0x22, 0x90, 0xA2, 0xDF, 0xEF, 0xF0, 0x7F, 0x03, 0x12, 0x50, 0xDA, 0x90, 0xA1, 0x91, 0xE0,
-0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xA1, 0x30, 0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04,
-0xF0, 0x90, 0xA1, 0x92, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x09, 0xEF, 0x13, 0x13,
-0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3C, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0A,
-0x90, 0xA1, 0x8F, 0xE0, 0xFF, 0x90, 0xA1, 0x9F, 0x80, 0x21, 0x90, 0xA2, 0xDF, 0xE0, 0xFC, 0xB4,
-0x01, 0x0D, 0x90, 0xA1, 0x8F, 0xE0, 0xFE, 0x90, 0xA1, 0x9E, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC,
-0xB4, 0x04, 0x0F, 0x90, 0xA1, 0x90, 0xE0, 0xFF, 0x90, 0xA1, 0x9E, 0xE0, 0xC3, 0x9F, 0x90, 0xA1,
-0xA5, 0xF0, 0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x2B, 0x90, 0xA1, 0x92,
-0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x02, 0x21, 0xBF, 0x90, 0xA1, 0xA5, 0xE0, 0xFF, 0xC3,
-0x94, 0x20, 0x50, 0x0A, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F,
-0x7D, 0xFF, 0xE4, 0xFF, 0x11, 0x66, 0x80, 0x77, 0x90, 0xA1, 0x8E, 0xE0, 0xC4, 0x54, 0x0F, 0x30,
-0xE0, 0x54, 0x90, 0xA1, 0x94, 0xE0, 0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x11,
-0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0x90, 0xA1, 0x95, 0xE0,
-0x44, 0x02, 0xF0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0xA4, 0xF0, 0x90, 0xA1, 0xA1, 0xF0, 0x90,
-0xA2, 0xDF, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0xA1, 0x96, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF,
-0xB4, 0x04, 0x06, 0x90, 0xA1, 0x96, 0x74, 0x07, 0xF0, 0x90, 0xA1, 0x80, 0xE0, 0x60, 0x07, 0x90,
-0xA1, 0x95, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80,
-0x09, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x90,
-0xA1, 0x92, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x1A, 0x90, 0xA1, 0xA5, 0xE0, 0xFF,
-0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, 0x7F, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x80, 0x04, 0x7F,
-0xFF, 0x7E, 0x7F, 0x51, 0x30, 0x90, 0xA1, 0x91, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12,
-0x4E, 0xD8, 0x22, 0x90, 0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x35, 0xB1, 0x08, 0x90, 0xA1, 0xA1, 0xE0,
-0xFF, 0xB4, 0x01, 0x02, 0x80, 0x1D, 0x90, 0xA1, 0xA1, 0xE0, 0xFF, 0xB4, 0x02, 0x02, 0x80, 0x1D,
-0x90, 0xA1, 0xA1, 0xE0, 0xFF, 0xB4, 0x03, 0x03, 0x02, 0x50, 0xEB, 0x90, 0xA1, 0xA1, 0xE0, 0xFF,
-0xB4, 0x04, 0x02, 0x01, 0xA2, 0x90, 0xA1, 0xA1, 0xE0, 0xFF, 0xB4, 0x05, 0x02, 0x71, 0x34, 0x22,
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xE2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
-0x04, 0x1D, 0xE0, 0x60, 0x1E, 0x90, 0x05, 0x22, 0xE0, 0x90, 0xA2, 0xE6, 0xF0, 0x7D, 0x36, 0x12,
-0x4F, 0xF6, 0xBF, 0x01, 0x02, 0x51, 0x7C, 0x90, 0xA2, 0xE6, 0xE0, 0xFF, 0x7D, 0x37, 0x12, 0x4E,
-0xD8, 0x80, 0x02, 0x51, 0x7C, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x6F, 0xFF, 0x7D, 0x38, 0x12, 0x4E,
-0xD8, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x9F, 0xA2, 0xE0,
-0xFF, 0xE4, 0xFB, 0x7D, 0x01, 0x12, 0x66, 0x08, 0x90, 0xA2, 0xE4, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0xA2, 0xE2, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xAB, 0x07, 0x90, 0xA2, 0xE7, 0xED, 0xF0, 0xEC,
-0xF9, 0xE0, 0xFF, 0xAE, 0x03, 0x74, 0x2A, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF,
-0xF0, 0x74, 0x2B, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE9, 0xF0, 0x22, 0x90, 0xA2,
-0xDF, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0x13, 0x13, 0x13,
-0x54, 0x1F, 0x20, 0xE0, 0x0E, 0x90, 0xA2, 0xE0, 0xE0, 0xB4, 0x01, 0x07, 0x7D, 0x36, 0x7F, 0x6F,
-0x12, 0x4E, 0xD8, 0x90, 0xA2, 0xDF, 0xE0, 0x70, 0x0C, 0x90, 0xA2, 0xE1, 0xE0, 0xFF, 0x7D, 0x05,
-0x12, 0x64, 0xC9, 0x80, 0x27, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x01, 0x0A, 0x90, 0xA2, 0xE1, 0xE0,
-0xFF, 0x12, 0x66, 0xAE, 0x80, 0x16, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x0F, 0xA3, 0xE0, 0xB4,
-0x01, 0x0A, 0x90, 0xA1, 0xE8, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x51, 0x30, 0x90, 0xA1, 0xDA, 0xE0,
-0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x0B, 0x90, 0xA2, 0xE0, 0xE0, 0x70, 0x05, 0xFD, 0xFF,
-0x12, 0x4E, 0xD8, 0x22, 0x90, 0xA2, 0xDF, 0xEF, 0xF0, 0x90, 0xA2, 0xE1, 0x74, 0x02, 0xF0, 0x7F,
-0x01, 0x91, 0xB1, 0x90, 0xA1, 0x92, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x22, 0x90,
-0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x07, 0x80, 0x09, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x05,
-0x07, 0x7D, 0x0D, 0x7F, 0xFF, 0x12, 0x4E, 0xD8, 0x12, 0x4F, 0xFA, 0xBF, 0x01, 0x03, 0x12, 0x4C,
-0xAD, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x90, 0x07, 0x78, 0x30, 0xE0,
-0x05, 0x74, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x0D,
-0x90, 0xA1, 0x8F, 0xE0, 0x24, 0x03, 0xFF, 0x90, 0xA1, 0x9E, 0x12, 0x50, 0xD6, 0x90, 0xA1, 0x8E,
-0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0xE0, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0xE0,
-0x74, 0x01, 0xF0, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x90, 0xA1,
-0xCD, 0xE0, 0x60, 0x08, 0x90, 0xA2, 0xE1, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA2, 0xE1,
-0xF0, 0x90, 0xA2, 0xE1, 0xE0, 0xFF, 0x90, 0xA2, 0xE0, 0xE0, 0xFD, 0x12, 0x69, 0x53, 0xE4, 0x90,
-0xA1, 0xA0, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xFF, 0xB4, 0x02, 0x08, 0x90, 0xA1, 0xA1, 0xE0, 0x04,
-0xF0, 0x80, 0x09, 0xEF, 0xB4, 0x05, 0x05, 0xE4, 0x90, 0xA1, 0xA1, 0xF0, 0x90, 0xA1, 0x8E, 0xE0,
-0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x17, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x08,
-0x80, 0x66, 0x90, 0xA2, 0xDF, 0xE0, 0x64, 0x05, 0x70, 0x63, 0x7D, 0x0E, 0x80, 0x5A, 0x90, 0xA1,
-0x8E, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x2C, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x54, 0x07,
-0x20, 0xE0, 0x0A, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x53, 0x11, 0x90, 0xA2, 0xDF,
-0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x09, 0x80, 0x30, 0x90, 0xA2, 0xDF, 0xE0, 0x64, 0x05, 0x70, 0x2D,
-0x7D, 0x0F, 0x80, 0x24, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x23, 0x90, 0xA1, 0x1C, 0xE0, 0xFF, 0xE4,
-0xFD, 0x12, 0x53, 0x11, 0x90, 0xA2, 0xDF, 0xE0, 0xB4, 0x02, 0x04, 0x7D, 0x0A, 0x80, 0x09, 0x90,
-0xA2, 0xDF, 0xE0, 0xB4, 0x05, 0x07, 0x7D, 0x10, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x91,
-0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13,
-0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x05, 0xE4, 0xFF, 0x12, 0x77, 0xBB, 0x90, 0xA1, 0x92, 0xE0,
-0xC3, 0x13, 0x90, 0x06, 0xCD, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x06, 0xCF, 0xE0, 0x54, 0xEF, 0xF0,
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0xB4, 0x03, 0x13, 0x90, 0xA1, 0x91, 0xE0,
-0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x06, 0xCC, 0x30, 0xE0, 0x35, 0xE4, 0xF0, 0x80, 0x34, 0x90,
-0xA1, 0x92, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0C, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0,
-0x80, 0x03, 0x74, 0x03, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0x30, 0xE0, 0x17, 0xC4, 0x54, 0x0F, 0x30,
-0xE0, 0x0B, 0xEF, 0x90, 0x06, 0xCC, 0x70, 0x03, 0xF0, 0x80, 0x08, 0x80, 0x03, 0x90, 0x06, 0xCC,
-0x74, 0x03, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54,
-0x03, 0x20, 0xE0, 0x02, 0xE1, 0x79, 0x90, 0xA1, 0x96, 0xE0, 0x64, 0x01, 0x70, 0x38, 0x90, 0x06,
-0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x20, 0x90, 0x06, 0x92, 0x74, 0x04,
-0xF0, 0x90, 0xA1, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x9A, 0xE0, 0x75, 0xF0, 0x03, 0x84, 0xFF,
-0x90, 0xA1, 0xA3, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xE1, 0x5E, 0xE4, 0x90, 0xA1, 0x96, 0xF0,
-0x90, 0xA1, 0xA1, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x96, 0xE0, 0x64, 0x04, 0x70, 0x35, 0x90, 0x06,
-0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74, 0x04,
-0xF0, 0x90, 0xA1, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x99, 0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0,
-0xB5, 0x07, 0x02, 0x80, 0x02, 0xE1, 0x5E, 0xE4, 0x90, 0xA1, 0x96, 0xF0, 0x90, 0xA1, 0xA1, 0x74,
-0x04, 0xF0, 0x22, 0x90, 0xA1, 0x96, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xC1, 0xBF, 0x90, 0xA1, 0xA4,
-0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12,
-0x07, 0x03, 0x90, 0xA1, 0x9A, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE,
-0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x90, 0xA1, 0xA4, 0xE0, 0x94, 0x03, 0x40, 0x11, 0x90, 0xA1,
-0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xA1, 0x20, 0xE0, 0x02, 0xC1, 0x61, 0xE1, 0x07, 0x90,
-0xA1, 0x95, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x7A, 0xEF, 0x54, 0xFB, 0xF0, 0xE4,
-0xA3, 0xF0, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xB3, 0xE0,
-0x30, 0xE0, 0x02, 0xC1, 0xED, 0x90, 0xA1, 0xA1, 0xE1, 0x07, 0x90, 0xA1, 0xA4, 0xE0, 0xFF, 0x90,
-0xA1, 0xA3, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90,
-0xA1, 0x9A, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94,
-0x80, 0x40, 0x0E, 0x90, 0xA1, 0xB3, 0xE0, 0x30, 0xE0, 0x02, 0xC1, 0xED, 0x90, 0xA1, 0xA1, 0xE1,
-0x07, 0x90, 0xA1, 0xB3, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0xA1, 0x96, 0x74, 0x09, 0xF0, 0x90, 0x06,
-0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xA3, 0xF0, 0x90, 0xA3, 0xBA, 0xE1, 0x13, 0x90, 0xA1,
-0xA1, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x64, 0xBE, 0x90, 0xA1, 0xA4, 0xE0, 0x04, 0xF0, 0x7F, 0x03,
-0x12, 0x50, 0xDA, 0x90, 0xA1, 0xA4, 0xE0, 0xFF, 0x90, 0xA1, 0xA3, 0xE0, 0x2F, 0xFF, 0xE4, 0x33,
-0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA1, 0x9A, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E,
-0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x0A, 0x90, 0xA1, 0xA4, 0xE0,
-0x94, 0x03, 0x50, 0x02, 0xE1, 0x79, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x05, 0x22, 0xE0,
-0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12, 0x4E, 0xD8, 0x90, 0x04, 0x9C, 0xE0, 0x04, 0xF0, 0x22, 0x90,
-0xA1, 0x96, 0xE0, 0x64, 0x07, 0x70, 0x4F, 0x90, 0xA1, 0xA4, 0xE0, 0xB4, 0x04, 0x05, 0x90, 0xA1,
-0xA1, 0x80, 0x34, 0x90, 0xA1, 0x95, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x2C, 0xEF,
-0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xB3, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA1, 0x96,
-0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xA3, 0xF0, 0x90, 0xA3,
-0xBA, 0x04, 0x80, 0x0F, 0x90, 0xA1, 0xA1, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x64, 0xBE, 0x90, 0xA1,
-0xA4, 0xE0, 0x04, 0xF0, 0x80, 0x48, 0x90, 0xA1, 0x96, 0xE0, 0x64, 0x09, 0x70, 0x5B, 0x90, 0xA1,
-0x95, 0xE0, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xA1, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0x95, 0xE0, 0x54,
-0xFE, 0xF0, 0x22, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x29, 0x74, 0x04, 0xF0, 0x90, 0xA1, 0xA3,
-0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x02, 0x17, 0x90, 0xA3, 0xBA, 0xE0, 0x90, 0xA1, 0xA1, 0x60, 0x05,
-0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0x96, 0xF0, 0x22, 0x7F, 0x03,
-0x02, 0x50, 0xDA, 0x90, 0xA3, 0xBA, 0xE0, 0x90, 0xA1, 0xA1, 0x60, 0x05, 0x74, 0x05, 0xF0, 0x80,
-0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0x96, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0xCF, 0xF0, 0x90,
-0xA1, 0x8E, 0xE0, 0x30, 0xE0, 0x6C, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30,
-0xE0, 0x1F, 0x90, 0xA1, 0x9A, 0xE0, 0xFF, 0x12, 0x50, 0xDA, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0,
-0x90, 0xA1, 0x96, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0xA1, 0xA3, 0xF0, 0x90, 0xA1, 0xA1, 0xF0, 0x80,
-0x11, 0x90, 0xA2, 0xCF, 0xE0, 0xFF, 0x90, 0xA1, 0x8F, 0x12, 0x50, 0xD6, 0x90, 0xA1, 0xA1, 0x74,
-0x01, 0xF0, 0x90, 0xA1, 0xA0, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x80, 0xE0, 0x60, 0x07, 0x7D, 0x05,
-0x7F, 0x6F, 0x02, 0x4E, 0xD8, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x8E, 0xE0, 0xFF,
-0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x0B, 0xEF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12,
-0x67, 0xA4, 0x22, 0x90, 0xA2, 0xF0, 0xEF, 0xF0, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x7D, 0x7F, 0x48,
-0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEE, 0x54, 0x0F, 0xFE, 0xE4, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12,
-0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x45, 0x2D, 0xC3,
-0x12, 0x45, 0x00, 0x70, 0x05, 0x90, 0xA1, 0xAF, 0x80, 0x31, 0xE4, 0xFF, 0xFE, 0xFD, 0xFC, 0x90,
-0xA2, 0xF1, 0x12, 0x45, 0x2D, 0xC3, 0x12, 0x45, 0x00, 0x70, 0x0A, 0x90, 0xA1, 0xAF, 0x04, 0xF0,
-0xE4, 0xA3, 0xF0, 0x01, 0xD7, 0xE4, 0xFF, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x45,
-0x2D, 0xC3, 0x12, 0x45, 0x00, 0x70, 0x09, 0x90, 0xA1, 0xAF, 0x04, 0xF0, 0xA3, 0xF0, 0x80, 0x77,
-0xE4, 0x7F, 0x80, 0xFE, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x45, 0x2D, 0xC3, 0x12, 0x45, 0x00,
-0x70, 0x65, 0x90, 0xA1, 0xAF, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x5C, 0x7F, 0x2C, 0x7E, 0x09, 0x12,
-0x37, 0x4E, 0xEF, 0x54, 0x02, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x08, 0x6D,
-0x90, 0xA2, 0xF1, 0x12, 0x45, 0x11, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x08, 0x90, 0xA1, 0xAF, 0x74,
-0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xAF, 0xF0, 0x7F, 0x30, 0x7E, 0x09, 0x12, 0x37, 0x4E,
-0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA2, 0xF1, 0x12, 0x08, 0x6D, 0x90, 0xA2,
-0xF1, 0x12, 0x45, 0x11, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x07, 0xE4, 0x90, 0xA1, 0xB0, 0xF0, 0x80,
-0x06, 0x90, 0xA1, 0xB0, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xA9, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x11,
-0x12, 0x4C, 0xA9, 0x90, 0x07, 0x78, 0xE0, 0x90, 0xA1, 0xAE, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0xFF,
-0xE4, 0xFD, 0x12, 0x69, 0x53, 0x90, 0xA2, 0xF0, 0xE0, 0xFD, 0x70, 0x02, 0x80, 0x24, 0xED, 0xB4,
-0x01, 0x0A, 0x90, 0xA1, 0xA9, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22, 0x90, 0xA2, 0xF0, 0xE0,
-0xFD, 0xB4, 0x02, 0x0A, 0x90, 0xA1, 0xA9, 0xE0, 0x54, 0x1F, 0x44, 0x60, 0xF0, 0x22, 0xED, 0xB4,
-0x03, 0x07, 0x90, 0xA1, 0xA9, 0xE0, 0x54, 0x1F, 0xF0, 0x22, 0x90, 0xA1, 0x91, 0xE0, 0xC4, 0x13,
-0x13, 0x54, 0x03, 0x20, 0xE0, 0x1E, 0x90, 0xFD, 0x62, 0xE0, 0x30, 0xE0, 0x17, 0xE0, 0x90, 0xA2,
-0xEF, 0x30, 0xE1, 0x05, 0x74, 0x01, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0x90, 0xA2, 0xEF, 0xE0,
-0xFF, 0x12, 0x87, 0xF3, 0x22, 0xEF, 0x70, 0x1C, 0x90, 0xA1, 0xDB, 0xE0, 0x54, 0x03, 0xFE, 0x70,
-0x02, 0x80, 0x1B, 0xBE, 0x01, 0x02, 0x80, 0x20, 0xBE, 0x02, 0x02, 0x80, 0x26, 0xEE, 0x64, 0x03,
-0x70, 0x32, 0x80, 0x2A, 0x90, 0xA1, 0xDB, 0xE0, 0xC4, 0x54, 0x03, 0xFE, 0x70, 0x07, 0x90, 0x07,
-0x78, 0x04, 0xF0, 0x80, 0x1F, 0xBE, 0x01, 0x08, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x80, 0x14,
-0xBE, 0x02, 0x08, 0x90, 0x07, 0x78, 0x74, 0x09, 0xF0, 0x80, 0x09, 0xBE, 0x03, 0x06, 0x90, 0x07,
-0x78, 0x74, 0x0D, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x45,
-0xEF, 0x70, 0x1F, 0xA3, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA2, 0xDF,
-0xF0, 0x80, 0x06, 0x90, 0xA2, 0xDF, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xFD, 0xE4, 0xFF,
-0x80, 0x20, 0x90, 0xA1, 0xDB, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0xE4, 0x90,
-0xA2, 0xDF, 0xF0, 0x80, 0x06, 0x90, 0xA2, 0xDF, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xDF, 0xE0, 0xFD,
-0x7F, 0x01, 0x12, 0x69, 0x53, 0x22, 0x90, 0xA3, 0xDB, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0x57,
-0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x90, 0xA3, 0xDB, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x98, 0xF0,
-0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x9F, 0x9D, 0xF0,
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9E, 0xF0, 0x90, 0x00, 0x02, 0x12,
-0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x25, 0x51,
-0x90, 0x9F, 0xA0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA1, 0xF0,
-0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA2, 0xF0, 0x22, 0x8B, 0x51, 0x8A,
-0x52, 0x89, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE,
-0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F,
-0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3, 0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9,
-0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x74, 0x90, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0,
-0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x90, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0,
-0xAF, 0x54, 0x70, 0x04, 0x51, 0xEC, 0x80, 0x02, 0x51, 0xDB, 0x05, 0x54, 0x80, 0xC6, 0x12, 0x77,
-0x9A, 0x90, 0xA0, 0x90, 0xE0, 0x70, 0x13, 0x12, 0x6E, 0x89, 0x12, 0x57, 0x9F, 0x90, 0xA1, 0x16,
-0xE0, 0x54, 0xF7, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10,
-0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0,
-0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x12, 0x06, 0x89, 0xFF, 0x90, 0xA1,
-0x10, 0xF0, 0xBF, 0x01, 0x0C, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60, 0x22, 0x80,
-0x1D, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x64, 0x01, 0x60,
-0x10, 0x90, 0xA1, 0x11, 0xE0, 0x20, 0xE0, 0x06, 0xE4, 0xFF, 0x71, 0x46, 0x80, 0x03, 0x12, 0x67,
-0x7E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0x14,
-0xE0, 0x90, 0xA3, 0xDE, 0xF0, 0x6F, 0x70, 0x02, 0x81, 0x4F, 0xEF, 0x14, 0x60, 0x42, 0x14, 0x60,
-0x6D, 0x14, 0x70, 0x02, 0x61, 0xFA, 0x14, 0x70, 0x02, 0x81, 0x26, 0x24, 0x04, 0x60, 0x02, 0x81,
-0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x04, 0x04, 0x91, 0x87, 0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0,
-0xB4, 0x02, 0x04, 0x91, 0x9A, 0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0x96,
-0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x4F, 0x91, 0x89, 0x81, 0x4F,
-0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x04, 0x04, 0x91, 0xAC, 0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0xB4,
-0x02, 0x05, 0x12, 0x4F, 0xE7, 0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0x9F,
-0x81, 0x4F, 0x90, 0xA3, 0xDE, 0xE0, 0x60, 0x02, 0x81, 0x4F, 0x91, 0x70, 0x81, 0x4F, 0x90, 0xA3,
-0xDE, 0xE0, 0xB4, 0x04, 0x04, 0x91, 0xCA, 0x80, 0x76, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x01, 0x05,
-0x12, 0x4F, 0xDC, 0x80, 0x6A, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0xC0, 0x80, 0x5F,
-0x90, 0xA3, 0xDE, 0xE0, 0x70, 0x59, 0x91, 0x6B, 0x80, 0x55, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x04,
-0x04, 0x91, 0xDD, 0x80, 0x4A, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0x79, 0x80, 0x3F,
-0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0x6F, 0xDF, 0x80, 0x33, 0x90, 0xA3, 0xDE, 0xE0,
-0x70, 0x2D, 0x91, 0x77, 0x80, 0x29, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0xF2, 0x80,
-0x1E, 0x90, 0xA3, 0xDE, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0x56, 0x80, 0x13, 0x90, 0xA3, 0xDE, 0xE0,
-0xB4, 0x02, 0x04, 0xB1, 0x07, 0x80, 0x08, 0x90, 0xA3, 0xDE, 0xE0, 0x70, 0x02, 0x91, 0x54, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x91, 0x70, 0x7D, 0x1F, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x90, 0x05, 0x27,
-0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x91, 0x70, 0x02, 0x4F, 0xDC,
-0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0x91, 0x70, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x4E, 0xD8,
-0x90, 0xA1, 0x14, 0x74, 0x03, 0xF0, 0x22, 0x91, 0xAC, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0,
-0xE4, 0x90, 0xA1, 0x14, 0xF0, 0x22, 0x91, 0x9F, 0x80, 0xEF, 0x12, 0x4F, 0xE7, 0x80, 0xEA, 0xE4,
-0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12,
-0x4E, 0xD8, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x01, 0xF0, 0x22,
-0x12, 0x4C, 0xAD, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40,
-0xF0, 0x7D, 0x23, 0x12, 0x4C, 0xA9, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x7D, 0x22, 0x7F,
-0xFF, 0x12, 0x4E, 0xD8, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x03,
-0xF0, 0x22, 0x7D, 0x25, 0x7F, 0x6F, 0x12, 0x4E, 0xD8, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0,
-0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x6E, 0x89, 0x7D, 0x24, 0x7F, 0x6F, 0x12, 0x4E,
-0xD8, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x90,
-0x04, 0x24, 0xE0, 0xF5, 0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0xA2, 0x06, 0xF0, 0x90, 0x00,
-0x01, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0xA2, 0x13, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2,
-0x25, 0x51, 0x90, 0xA2, 0x20, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA2, 0x22,
-0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, 0xFF,
-0x54, 0x7F, 0x90, 0xA1, 0x1A, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90,
-0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA1, 0x18, 0xE0,
-0x54, 0xF0, 0x4E, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90,
-0xA1, 0x16, 0xE0, 0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1,
-0x18, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x19, 0xF0,
-0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0x30, 0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94,
-0x04, 0x90, 0xA1, 0x2C, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0xA2, 0xB5,
-0x12, 0x45, 0x55, 0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03,
-0x24, 0xFD, 0xFE, 0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F,
-0xFE, 0xC4, 0x54, 0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00,
-0x06, 0x12, 0x06, 0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0xA1, 0x22, 0x50, 0x05,
-0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x04,
-0x12, 0x06, 0xA2, 0xFD, 0x7F, 0x02, 0x12, 0x55, 0x19, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90,
-0x00, 0x05, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x02, 0xFE, 0x90, 0xA1, 0x7F, 0xE0, 0x54, 0xFD, 0x4E,
-0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12,
-0x06, 0xA2, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA1, 0x7F, 0xF0, 0xEE,
-0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE,
-0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0xA1, 0x7F, 0xF0, 0xEE, 0x54, 0x40, 0xFE,
-0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x29, 0xEF,
-0xC3, 0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, 0x01, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x0B, 0x80, 0x0E,
-0xE4, 0xF5, 0x52, 0x90, 0xA1, 0xCD, 0xE0, 0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, 0x75, 0x51,
-0x01, 0xAD, 0x52, 0xAF, 0x51, 0x12, 0x69, 0x53, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0xA2,
-0xB8, 0x12, 0x45, 0x5E, 0xD1, 0xED, 0x90, 0xA1, 0x1A, 0xE0, 0xFF, 0x12, 0x5F, 0x82, 0x90, 0xA1,
-0x1A, 0xE0, 0x60, 0x18, 0x90, 0xA2, 0xB8, 0x12, 0x45, 0x55, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2,
-0x54, 0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0xD1, 0xFE, 0x22, 0x90, 0xA1, 0x16,
-0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x1E, 0xF0, 0x22, 0xEF, 0x24,
-0xFE, 0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0xA1, 0x20, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70,
-0x0A, 0x90, 0xA1, 0x7D, 0xE0, 0x90, 0xA1, 0x20, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x20, 0xED, 0xF0,
-0x90, 0xA1, 0x20, 0xE0, 0xA3, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00,
-0x02, 0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x7A, 0xF0, 0x90,
-0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x7B, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54,
-0x01, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x7D, 0xF0, 0x22, 0x90, 0xA1,
-0x7A, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3,
-0x74, 0x05, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0x24, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90,
-0xA1, 0x80, 0xF0, 0x60, 0x37, 0x90, 0xA1, 0x8E, 0xE0, 0x20, 0xE0, 0x30, 0xE4, 0xFD, 0x7F, 0x04,
-0x12, 0x53, 0x11, 0x90, 0xA1, 0x7F, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x1F, 0xEF, 0x13, 0x13,
-0x13, 0x54, 0x1F, 0x20, 0xE0, 0x16, 0x90, 0xA1, 0x7F, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07,
-0x78, 0x30, 0xE0, 0x05, 0x74, 0x0D, 0xF0, 0x80, 0x03, 0x74, 0x09, 0xF0, 0x90, 0xA1, 0x80, 0xE0,
-0x90, 0x01, 0xE7, 0xF0, 0x22, 0x90, 0xA3, 0xBC, 0x12, 0x45, 0x5E, 0xE4, 0xFE, 0x90, 0xFD, 0x50,
-0xEF, 0xF0, 0x64, 0x30, 0x60, 0x3B, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E, 0x90, 0xA3,
-0xBC, 0x12, 0x45, 0x55, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x52, 0x2E,
-0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3, 0x94, 0x06,
-0x50, 0x33, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0x80,
-0xEB, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0xA3, 0xBC, 0x12, 0x45, 0x55, 0x8E, 0x82, 0x75,
-0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83,
-0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x17,
-0x02, 0x4A, 0x44, 0x90, 0xA1, 0xB4, 0xE0, 0x44, 0x10, 0xF0, 0x7D, 0x01, 0x7F, 0x1B, 0x12, 0x4A,
-0x44, 0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x90, 0xA3, 0xBF,
-0xE0, 0x70, 0x13, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA1, 0xC5, 0x12, 0x08, 0x6D,
-0x90, 0xA3, 0xBF, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12, 0x06, 0x89, 0xFF,
-0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51, 0x90, 0xA1, 0xC5, 0x12, 0x45, 0x11, 0xEC,
-0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, 0xAD,
-0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00,
-0x12, 0x44, 0xF3, 0x90, 0xA1, 0xC1, 0x02, 0x08, 0x6D, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xCD, 0xF0,
-0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xCE, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
-0xC0, 0xD0, 0x90, 0xA1, 0xB5, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01, 0x7F, 0x28, 0x12, 0x4A, 0x44,
-0x90, 0xA2, 0xB5, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x90,
-0x00, 0x01, 0x12, 0x06, 0xA2, 0xF5, 0x54, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xF5, 0x55, 0x90,
-0x00, 0x03, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0xF5, 0x57, 0x90,
-0x00, 0x05, 0x12, 0x06, 0xA2, 0xF5, 0x58, 0x90, 0x00, 0x06, 0x12, 0x06, 0xA2, 0xF5, 0x59, 0xE5,
-0x51, 0x12, 0x45, 0x67, 0x91, 0x3D, 0x00, 0x91, 0x45, 0x01, 0x91, 0x4D, 0x02, 0x91, 0x55, 0x03,
-0x91, 0x5D, 0x04, 0x91, 0x65, 0x05, 0x91, 0x6E, 0x06, 0x00, 0x00, 0x91, 0x85, 0x75, 0x52, 0x02,
-0x75, 0x53, 0x29, 0x80, 0x46, 0x75, 0x52, 0x06, 0x75, 0x53, 0x2A, 0x80, 0x3E, 0x75, 0x52, 0x01,
-0x75, 0x53, 0x31, 0x80, 0x36, 0x75, 0x52, 0x01, 0x75, 0x53, 0x32, 0x80, 0x2E, 0x75, 0x52, 0x06,
-0x75, 0x53, 0x33, 0x80, 0x26, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0x02, 0x7E, 0xE3, 0x90, 0xA1,
-0xCF, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xA3, 0xE5, 0x56, 0xF0, 0xA3, 0xE5, 0x57, 0xF0,
-0xA3, 0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF, 0x7B, 0x00, 0x7A, 0x00, 0x79,
-0x54, 0xAD, 0x52, 0xAF, 0x53, 0x02, 0x4A, 0x44, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90,
-0xA1, 0xDA, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F,
-0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE, 0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA1,
-0xDA, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54,
-0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x90, 0xA1, 0xDA, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2,
-0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA1, 0xDB, 0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04,
-0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x30,
-0xFD, 0xEF, 0x54, 0xCF, 0x4D, 0xFF, 0x90, 0xA1, 0xDB, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54,
-0xBF, 0x4E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xDC, 0xF0, 0x90, 0x00, 0x03,
-0x12, 0x06, 0xA2, 0x90, 0xA1, 0xDD, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xDE,
-0xF0, 0x90, 0xA1, 0xDC, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF,
-0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xE4, 0xEE, 0xF0, 0xA3,
-0xEF, 0xF0, 0x90, 0xA1, 0xDD, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03,
-0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0xE6, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xDE, 0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07,
-0x03, 0x90, 0xA1, 0xE8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0xDA, 0xE0, 0x30, 0xE0, 0x17,
-0x90, 0xA1, 0xDF, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90,
-0x07, 0x83, 0xE0, 0x44, 0x20, 0xF0, 0x22, 0xE4, 0x90, 0xA1, 0xDF, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0x90, 0xA2, 0xB5, 0x12,
-0x45, 0x5E, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xEA, 0xF0, 0x90,
-0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xEB, 0xF0, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x7D,
-0x02, 0x7F, 0x38, 0x02, 0x4A, 0x44, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA3, 0xCB, 0xF0,
-0x90, 0xA3, 0xCB, 0xE0, 0xFD, 0x70, 0x02, 0x81, 0x35, 0x90, 0x9F, 0xF3, 0xE0, 0xFF, 0x70, 0x06,
-0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0xB5, 0x07, 0x04,
-0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0,
-0x22, 0x90, 0xA3, 0xC0, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3,
-0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x81, 0x12, 0xE4, 0x90, 0xA3,
-0xCC, 0xF0, 0x90, 0xA3, 0xCC, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0xA3, 0xC0, 0xE0,
-0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74,
-0xD0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75,
-0xF0, 0x08, 0x90, 0x9F, 0xA3, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83,
-0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xC0, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35,
-0xF0, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F,
-0xF4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA7, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x29, 0xF5, 0x82,
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xCC, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90,
-0xA3, 0xCB, 0xE0, 0xFF, 0x90, 0xA3, 0xC0, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02,
-0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0xCB, 0xF0, 0x90, 0xA3, 0xC0, 0xE0, 0xFF, 0x74,
-0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA3,
-0xC0, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xF4, 0xE0, 0x04, 0xF0, 0xE0, 0x7F,
-0x00, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x41, 0xF0, 0xE4, 0x90, 0x9F, 0xF4, 0xF0,
-0x41, 0xF0, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA3, 0xC0, 0xE0, 0x44, 0x80, 0x90,
-0x00, 0x8A, 0xF0, 0x90, 0xA3, 0xC0, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x45, 0x49,
-0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x9F, 0xF4,
-0xE0, 0xFF, 0x90, 0x9F, 0xF3, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF,
-0x70, 0x43, 0x90, 0x9F, 0xF3, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x9F, 0xA3, 0x12, 0x45, 0x49,
-0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xA4, 0xF9, 0x74, 0x9F, 0x35, 0xF0, 0xFA, 0x7B,
-0x01, 0xAF, 0x05, 0x12, 0x5A, 0xBA, 0x90, 0x9F, 0xF3, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4,
-0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x9F, 0xF3, 0xF0, 0x51, 0xE6, 0x90, 0x9F,
-0x97, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xA3,
-0xF0, 0x90, 0x9F, 0xF3, 0xF0, 0xA3, 0xF0, 0x22, 0x91, 0xBE, 0x91, 0x9A, 0xB1, 0xB4, 0xB1, 0x01,
-0x12, 0x55, 0xB8, 0x91, 0xC4, 0x91, 0xD3, 0x91, 0xEA, 0xB1, 0x26, 0x02, 0x77, 0xE2, 0xE4, 0x90,
-0xA0, 0x90, 0xF0, 0x22, 0x90, 0xA1, 0x81, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0,
-0xA3, 0xF0, 0x22, 0x90, 0xA1, 0xED, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x7F, 0xF0, 0x54, 0xFB, 0xF0,
-0xA3, 0x74, 0x0A, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA1, 0xF1, 0xE0, 0x54, 0xFE,
-0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-0x22, 0x90, 0xA1, 0x11, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x54, 0xF7,
-0xF0, 0x54, 0xEF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xBF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
-0xF0, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0x90, 0xA1, 0xF7, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xF1, 0xF0,
-0x54, 0x0F, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xFF, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA1, 0xFB,
-0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA1, 0xFA, 0x12, 0x45,
-0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x03, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75,
-0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x04, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90,
-0xA1, 0xFB, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xE3, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA1, 0xFB,
-0x12, 0x45, 0x49, 0xE0, 0x54, 0x1F, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x06, 0x12, 0x45,
-0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x02, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFE,
-0xF0, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x05, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x0F, 0xEF, 0x64,
-0x03, 0x70, 0x86, 0x22, 0xE4, 0xFF, 0xE4, 0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99,
-0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0xBE, 0x03, 0x12,
-0x12, 0x45, 0x49, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x80, 0xF0,
-0x80, 0x0F, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4,
-0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2E, 0xF5, 0x82,
-0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0xBE, 0x10, 0xAD, 0x0F, 0xBF, 0x80, 0xA7, 0xE4,
-0x90, 0xAD, 0xE2, 0xF0, 0x90, 0x94, 0x91, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFF,
-0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0x75, 0xF0, 0x02, 0xEE,
-0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x0E, 0xBE, 0x05, 0xE7, 0x74, 0x16, 0x2F, 0xF5, 0x82,
-0xE4, 0x34, 0x9E, 0xF5, 0x83, 0x74, 0x13, 0xF0, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A,
-0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0,
-0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3,
-0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0,
-0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0,
-0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04,
-0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0x74, 0x13, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96,
-0x17, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49,
-0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49,
-0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54,
-0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x20, 0xF0,
-0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xCF, 0xF0, 0x75, 0xF0,
-0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF,
-0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x7F, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96,
-0x17, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49,
-0xEE, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF,
-0x64, 0x80, 0x60, 0x02, 0xC1, 0x20, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83,
-0x74, 0xFF, 0xF0, 0x22, 0x90, 0xA3, 0xA1, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0x5E, 0x90, 0xA3, 0xC1,
-0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4,
-0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA3, 0xA2, 0x12, 0x45,
-0x55, 0x8B, 0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03,
-0x12, 0x35, 0x26, 0x90, 0xA3, 0xA1, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01,
-0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0x55, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A,
-0x8B, 0x40, 0xF5, 0x41, 0x89, 0x42, 0x90, 0xA3, 0xA2, 0x12, 0x45, 0x55, 0x90, 0x00, 0x0E, 0x12,
-0x06, 0xA2, 0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A,
-0xA2, 0x79, 0xB5, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA2, 0xB5,
-0xE0, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xB5, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1,
-0xBF, 0x01, 0x08, 0x90, 0xA2, 0xB5, 0xE0, 0x90, 0xA2, 0xB7, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79,
-0xB5, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xB5, 0xE0, 0x90,
-0xA2, 0xB8, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xB5, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1,
-0xBF, 0x01, 0x08, 0x90, 0xA2, 0xB5, 0xE0, 0x90, 0xA2, 0xB9, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79,
-0xB5, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xB5, 0xE0, 0x90,
-0xA2, 0xBA, 0xF0, 0x90, 0xA2, 0xB6, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0,
-0x90, 0xA2, 0xBE, 0xF0, 0x90, 0xA2, 0xBA, 0xE0, 0x90, 0xA2, 0xBF, 0xF0, 0x02, 0x7D, 0x15, 0x90,
-0xA3, 0xC2, 0x12, 0x45, 0x5E, 0xE4, 0xFF, 0x90, 0xA3, 0xC2, 0x12, 0x45, 0x55, 0x8F, 0x82, 0x75,
-0x83, 0x00, 0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83,
-0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x01, 0x30, 0xE4, 0xF0, 0xA3, 0xF0, 0xA3,
-0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x38, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x50,
-0x12, 0x46, 0x4F, 0xE4, 0xFD, 0x7F, 0x51, 0x12, 0x46, 0x4F, 0xE4, 0xFD, 0x7F, 0x52, 0x12, 0x46,
-0x4F, 0xE4, 0xFD, 0x7F, 0x53, 0x02, 0x46, 0x4F, 0x11, 0x88, 0x31, 0x07, 0x11, 0xC3, 0x11, 0xE2,
-0x02, 0x47, 0xD0, 0x75, 0x15, 0x12, 0xE4, 0xF5, 0x16, 0x75, 0x17, 0x07, 0x75, 0x18, 0x32, 0x90,
-0x01, 0x30, 0xE5, 0x15, 0xF0, 0xA3, 0xE5, 0x16, 0xF0, 0xA3, 0xE5, 0x17, 0xF0, 0xA3, 0xE5, 0x18,
-0xF0, 0x22, 0x75, 0x1D, 0x06, 0x75, 0x1E, 0x01, 0x75, 0x1F, 0x03, 0x75, 0x20, 0x62, 0x43, 0x20,
-0x80, 0x43, 0x1F, 0x04, 0x90, 0x01, 0x38, 0xE5, 0x1D, 0xF0, 0xA3, 0xE5, 0x1E, 0xF0, 0xA3, 0xE5,
-0x1F, 0xF0, 0xA3, 0xE5, 0x20, 0xF0, 0x22, 0x90, 0x01, 0x34, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0xA3,
-0xF0, 0xA3, 0xF0, 0x90, 0x01, 0x3C, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xFD, 0x7F, 0x54,
-0x12, 0x46, 0x4F, 0x7D, 0xFF, 0x7F, 0x55, 0x12, 0x46, 0x4F, 0x7D, 0xFF, 0x7F, 0x56, 0x12, 0x46,
-0x4F, 0x7D, 0xFF, 0x7F, 0x57, 0x02, 0x46, 0x4F, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0xA2, 0xCF, 0xF0,
-0xE0, 0xFF, 0x30, 0xE0, 0x07, 0x90, 0x01, 0xCF, 0xE0, 0x54, 0xFE, 0xF0, 0xEF, 0x30, 0xE5, 0x22,
-0x90, 0x01, 0xCF, 0xE0, 0x54, 0xDF, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x20, 0xF0, 0xE4, 0xF5, 0xA8,
-0xF5, 0xE8, 0x11, 0x88, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x46, 0x4F,
-0x80, 0xFE, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22,
-0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A,
-0x7E, 0x00, 0x12, 0x3E, 0x50, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74,
-0x80, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00,
-0x12, 0x3E, 0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01,
-0x22, 0xE4, 0x90, 0xA2, 0xA5, 0xF0, 0xA3, 0xF0, 0x31, 0xA3, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3,
-0x90, 0xA2, 0xA6, 0xE0, 0x94, 0x88, 0x90, 0xA2, 0xA5, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01,
-0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x27, 0x90, 0xA2, 0xA5,
-0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90,
-0xA2, 0xA6, 0xE0, 0x94, 0x32, 0x90, 0xA2, 0xA5, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6,
-0xE0, 0x30, 0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0xE4, 0x90, 0x9F, 0x97, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x12, 0xF0, 0xA3,
-0x74, 0x02, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55, 0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16,
-0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3, 0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01,
-0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3, 0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0,
-0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21, 0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3,
-0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20, 0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21,
-0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0, 0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF,
-0x22, 0x90, 0xA1, 0xA9, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x69, 0x01, 0x80, 0x03, 0x12, 0x87, 0x7A,
-0x90, 0xA1, 0xD4, 0xE0, 0x30, 0xE0, 0x04, 0xA3, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xD5, 0xE0, 0x64,
-0x08, 0x70, 0x35, 0x90, 0xA1, 0xD4, 0xE0, 0x30, 0xE0, 0x29, 0x90, 0xA1, 0xCE, 0xE0, 0x70, 0x09,
-0x90, 0x07, 0x65, 0xE0, 0x54, 0xE7, 0xF0, 0x80, 0x0E, 0x7F, 0x4E, 0x12, 0x4C, 0x74, 0xEF, 0x54,
-0x7F, 0xFD, 0x7F, 0x4E, 0x12, 0x46, 0x4F, 0x90, 0xA1, 0xD4, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xA3,
-0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x90, 0xA1, 0x92, 0xE0, 0xFF, 0xC4, 0x13, 0x13,
-0x54, 0x03, 0x30, 0xE0, 0x13, 0x90, 0xA1, 0xD6, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x14, 0x09, 0x90,
-0x04, 0x9C, 0xE4, 0xF0, 0x90, 0xA1, 0xD6, 0xF0, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x06, 0x90,
-0xA1, 0x13, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x70, 0x90, 0xA1, 0x16, 0xE0, 0x30,
-0xE0, 0x23, 0x90, 0xA1, 0x2E, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61,
-0xE0, 0xFD, 0xED, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x41,
-0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30,
-0xE0, 0x13, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0C, 0x12, 0x5F, 0x60, 0x90, 0xA1, 0x20, 0xE0,
-0x14, 0x90, 0x05, 0x73, 0xF0, 0x90, 0xA3, 0xCD, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0xC3,
-0x90, 0xA3, 0xCE, 0xE0, 0x94, 0x80, 0x90, 0xA3, 0xCD, 0xE0, 0x64, 0x80, 0x94, 0x80, 0x40, 0x0B,
-0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x71, 0xF3, 0x71, 0xB3, 0xE4,
-0x90, 0xA1, 0xF0, 0xF0, 0x7F, 0x01, 0x12, 0x4C, 0x9A, 0x90, 0xA1, 0x81, 0xE0, 0x30, 0xE0, 0x12,
-0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0B, 0x12, 0x5F, 0x60, 0x90, 0xA1, 0x83, 0xE0, 0x90, 0x05,
-0x73, 0xF0, 0x22, 0x90, 0xA1, 0xED, 0xE0, 0x30, 0xE0, 0x38, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01,
-0x70, 0x30, 0x90, 0xA3, 0xDD, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x0A, 0x0B, 0x90, 0xA1, 0xEF, 0xE0,
-0x04, 0xF0, 0xE4, 0x90, 0xA3, 0xDD, 0xF0, 0x90, 0xA1, 0xEF, 0xE0, 0xFF, 0x90, 0xA1, 0xEE, 0xE0,
-0xD3, 0x9F, 0x50, 0x0E, 0x90, 0xA1, 0xF0, 0xE0, 0x70, 0x08, 0xE4, 0x90, 0xA1, 0xEF, 0xF0, 0x12,
-0x67, 0xCE, 0x22, 0x90, 0xA1, 0xF1, 0xE0, 0x30, 0xE0, 0x40, 0x90, 0xA1, 0xF4, 0xE0, 0x04, 0xF0,
-0xE0, 0xFF, 0x90, 0xA1, 0xF2, 0xE0, 0xD3, 0x9F, 0x50, 0x30, 0x90, 0x06, 0x92, 0xE0, 0x20, 0xE2,
-0x1A, 0x90, 0xA1, 0xF6, 0xE0, 0x70, 0x14, 0x7D, 0x08, 0xFF, 0x12, 0x64, 0xC9, 0x90, 0xA1, 0xF5,
-0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xF0, 0xE0, 0x04, 0xF0, 0x80, 0x06, 0x90, 0x06, 0x92, 0x74, 0x04,
-0xF0, 0xE4, 0x90, 0xA1, 0xF4, 0xF0, 0x90, 0xA1, 0xF6, 0xF0, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64,
-0x01, 0x70, 0x20, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x1A, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01,
-0x3C, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x7B, 0xE0, 0x90, 0xA3, 0x88,
-0x12, 0x50, 0x8A, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0xA1, 0x1A, 0xE0,
-0x60, 0x20, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x16,
-0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12,
-0x57, 0xB2, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0E,
-0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x57, 0xB2, 0x22, 0x90,
-0xA1, 0x1A, 0xE0, 0x70, 0x07, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA1, 0x11, 0xE0,
-0x30, 0xE0, 0x08, 0x12, 0x57, 0xE5, 0xBF, 0x01, 0x05, 0x80, 0x04, 0x12, 0x56, 0xFC, 0x22, 0x90,
-0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x60, 0x13, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x60, 0x0B, 0x91,
-0xEB, 0xEF, 0x70, 0x06, 0xFD, 0x7F, 0x0C, 0x12, 0x53, 0x11, 0x22, 0x90, 0x04, 0x1A, 0xE0, 0xF4,
-0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x04, 0x1B, 0xE0, 0x54, 0x07, 0x64, 0x07, 0x7F, 0x01, 0x60,
-0x02, 0x7F, 0x00, 0x22, 0x91, 0xEB, 0xEF, 0x70, 0x03, 0x12, 0x56, 0xFC, 0x22, 0x90, 0xA1, 0x11,
-0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x0F, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02,
-0x60, 0x07, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x53, 0x11, 0x90, 0xA1, 0x15, 0xE0, 0x64, 0x02, 0x60,
-0x02, 0x91, 0xCF, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30, 0xE0, 0x3E, 0x90, 0xA1, 0x15, 0xE0,
-0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x14, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02,
-0x7D, 0x01, 0xED, 0x4E, 0x70, 0x24, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0x67, 0x7E, 0xB1,
-0x0D, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0xA1,
-0x15, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x53, 0x11, 0x22, 0x90, 0xA1, 0x8E, 0xE0, 0x30,
-0xE0, 0x17, 0x90, 0xA1, 0xA0, 0xE0, 0x70, 0x5F, 0x90, 0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x00, 0x50,
-0x56, 0x90, 0xA1, 0x80, 0xE0, 0x60, 0x4D, 0x80, 0x4E, 0x91, 0xEB, 0xEF, 0x64, 0x01, 0x70, 0x47,
-0x90, 0xA1, 0x1E, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0xA1, 0x1C, 0xE0, 0xFE, 0xE4, 0xC3,
-0x9E, 0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0xA1, 0x1E, 0xE0, 0x20, 0xE4, 0x29, 0x90, 0xA1,
-0x17, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0xA1, 0x80, 0xE0, 0x70, 0x18, 0x90,
-0x06, 0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC,
-0x64, 0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0xFF, 0x30,
-0xE0, 0x3F, 0x90, 0xA1, 0x15, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0xA1, 0x14,
-0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30,
-0xE0, 0x03, 0x02, 0x67, 0x7E, 0xD1, 0x32, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD,
-0x7F, 0x08, 0x80, 0x0A, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x53,
-0x11, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0,
-0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C, 0xEF, 0x54, 0xFB, 0xF0,
-0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0x23, 0xE0, 0x04, 0xF0, 0x90, 0xA1,
-0x1E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x7A, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F,
-0x40, 0x0E, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0,
-0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x30, 0xEF, 0x54,
-0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0,
-0x80, 0x04, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0x94, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30,
-0xE0, 0x09, 0x7D, 0x01, 0x7F, 0x0C, 0x12, 0x53, 0x11, 0x80, 0x03, 0x12, 0x57, 0xB2, 0xE4, 0xFF,
-0x90, 0xA1, 0xF1, 0xE0, 0x30, 0xE0, 0x4C, 0x90, 0xA1, 0xF5, 0xE0, 0xFD, 0x60, 0x45, 0x74, 0x01,
-0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90,
-0x04, 0xE0, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x06, 0xE4, 0x90, 0xA1, 0xF5, 0xF0, 0x22, 0x90, 0xA1,
-0xF3, 0xE0, 0xD3, 0x9D, 0x50, 0x10, 0x90, 0x01, 0xC7, 0x74, 0x10, 0xF0, 0xF1, 0x7F, 0x90, 0xA1,
-0xF1, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x64, 0xC9, 0x90, 0xA1, 0xF5,
-0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x30,
-0xE0, 0x21, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30, 0xE1, 0x06,
-0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x03,
-0x12, 0x57, 0xB2, 0x90, 0xA1, 0x92, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x22, 0x90,
-0xA1, 0x95, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xFD, 0xF0, 0x90, 0x04, 0xE0,
-0xE0, 0x90, 0xA1, 0x95, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB,
-0xF0, 0x7F, 0x01, 0xD1, 0xC0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x02, 0xF1, 0x9F, 0x22, 0x90,
-0x9F, 0x9C, 0xE0, 0xFF, 0x64, 0x02, 0x60, 0x16, 0xEF, 0xB4, 0x01, 0x0B, 0x90, 0xFE, 0x10, 0xE0,
-0x44, 0x02, 0xF0, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90,
-0xA1, 0xF7, 0xE0, 0x30, 0xE0, 0x35, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0D, 0x90, 0xA2,
-0x02, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0x30, 0xE0, 0x22, 0x75, 0xF0, 0x0D, 0xEF, 0x90, 0xA2, 0x02,
-0x12, 0x45, 0x49, 0xEE, 0x54, 0xFE, 0xF0, 0x90, 0xA1, 0xF9, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xF7,
-0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x7F, 0x01, 0x12, 0x75, 0x90, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0, 0x54, 0x90, 0x60,
-0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE1, 0xE4, 0x7F,
-0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0xA2, 0xE0, 0xF0, 0xA3,
-0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x4C, 0x74, 0x90, 0xA2, 0xE0, 0xEF, 0xF0, 0x7F, 0x83, 0x12,
-0x4C, 0x74, 0xAE, 0x07, 0x90, 0xA2, 0xE0, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0xA2,
-0xE2, 0xE0, 0x94, 0x64, 0x90, 0xA2, 0xE1, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0,
-0x44, 0x40, 0xF0, 0x90, 0xA2, 0xE0, 0xE0, 0xFF, 0x22, 0x90, 0xA2, 0xE1, 0xE4, 0x75, 0xF0, 0x01,
-0x12, 0x08, 0xD6, 0x80, 0xBE, 0xE4, 0xF5, 0x5E, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95,
-0xF5, 0x83, 0xE0, 0xFE, 0xB4, 0x02, 0x08, 0xED, 0xC3, 0x94, 0x11, 0x40, 0x29, 0x80, 0x1F, 0xEE,
-0xB4, 0x01, 0x08, 0xED, 0xC3, 0x94, 0x0A, 0x40, 0x1D, 0x80, 0x13, 0x74, 0x96, 0x2F, 0xF5, 0x82,
-0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0x70, 0x0B, 0xED, 0xC3, 0x94, 0x03, 0x40, 0x08, 0x75, 0x5E,
-0x01, 0x80, 0x03, 0xE4, 0xF5, 0x5E, 0xAF, 0x5E, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x8F, 0x67, 0x8D, 0x68, 0x8B, 0x69, 0xE4, 0x90, 0xA3, 0x80, 0xF0, 0xE5, 0x67, 0x13, 0x13, 0x13,
-0x54, 0x1F, 0x90, 0xA3, 0x7B, 0xF0, 0xE5, 0x67, 0x54, 0x07, 0x90, 0xA3, 0x7D, 0xF0, 0x75, 0xF0,
-0x10, 0xEF, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA3, 0x7E, 0xF0, 0x75, 0xF0, 0x04,
-0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x7F, 0x90, 0xA3, 0x81, 0xF0, 0x75, 0xF0,
-0x04, 0xE5, 0x67, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA3, 0x82, 0xF0, 0xE5, 0x68,
-0x54, 0x7F, 0x90, 0xA3, 0x7C, 0xF0, 0xE5, 0x69, 0x70, 0x42, 0xE0, 0xFB, 0x25, 0xE0, 0x24, 0xC3,
-0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE4, 0xFC,
-0xFD, 0xEB, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12,
-0x45, 0x39, 0x12, 0x44, 0xD9, 0x78, 0x01, 0x12, 0x08, 0x47, 0xE5, 0x67, 0x25, 0xE0, 0x24, 0x95,
-0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA3, 0x81, 0xE0,
-0xFF, 0x90, 0xA3, 0x7C, 0xE0, 0xFE, 0xD3, 0x9F, 0x40, 0x0B, 0xE5, 0x68, 0x54, 0x80, 0xFD, 0xEF,
-0x4D, 0xF5, 0x68, 0x80, 0x0C, 0x90, 0xA3, 0x82, 0xE0, 0xFF, 0xEE, 0xC3, 0x9F, 0x50, 0x02, 0x8F,
-0x68, 0xE5, 0x68, 0x54, 0x7F, 0x90, 0xA3, 0x7C, 0xF0, 0xE5, 0x68, 0x54, 0x80, 0x90, 0xA3, 0x7F,
-0xF0, 0xE5, 0x69, 0x70, 0x33, 0x90, 0xA3, 0x7B, 0xE0, 0x24, 0x81, 0xF5, 0x82, 0xE4, 0x34, 0x94,
-0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA3, 0x7D, 0xE0, 0xFE, 0x74, 0x01, 0xA8,
-0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90,
-0xA3, 0x7E, 0xE0, 0x54, 0x7F, 0xF0, 0x80, 0x52, 0x90, 0xA3, 0x7B, 0xE0, 0x24, 0x81, 0xF5, 0x82,
-0xE4, 0x34, 0x94, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA3, 0x7D, 0xE0, 0xFE,
-0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4F, 0xD0, 0x82, 0xD0, 0x83,
-0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x07, 0xFF,
-0x90, 0xA3, 0x7E, 0xF0, 0x90, 0xA3, 0x7C, 0xE0, 0x90, 0x41, 0xF7, 0x93, 0xFE, 0x33, 0x33, 0x33,
-0x54, 0xF8, 0x4F, 0x90, 0xA3, 0x7E, 0xF0, 0x44, 0x80, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90,
-0x81, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x68, 0xF0, 0x90, 0xA3, 0x7E, 0xE0, 0xFF, 0x75, 0xF0, 0x10,
-0xE5, 0x67, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x67, 0x90,
-0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0xFF, 0xE5, 0x6A, 0x54, 0x03, 0x4F, 0xFF, 0x75,
-0xF0, 0x10, 0xE5, 0x67, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x7D, 0x01, 0xAF, 0x67,
-0x71, 0x15, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04,
-0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96,
-0x16, 0x12, 0x45, 0x49, 0xE0, 0xFD, 0x2F, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90,
-0xA2, 0xB8, 0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40, 0x02, 0x80, 0x19, 0xE5, 0x53, 0xD3, 0x94,
-0x19, 0x40, 0x05, 0x90, 0xA2, 0xB8, 0x80, 0x0B, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x17,
-0x12, 0x45, 0x49, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4, 0xFB, 0xAF, 0x52, 0x01, 0x99, 0x75, 0xF0,
-0x10, 0xEF, 0x90, 0x81, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03, 0xFE, 0x75, 0xF0, 0x04, 0xEF,
-0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xFC, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F,
-0xF5, 0x83, 0xE0, 0x54, 0x7F, 0xFD, 0x64, 0x2C, 0x70, 0x2F, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96,
-0x19, 0x12, 0x45, 0x49, 0xE0, 0xF9, 0x54, 0x03, 0xFB, 0xEE, 0xD3, 0x9B, 0x50, 0x1B, 0xEE, 0x60,
-0x18, 0x1E, 0xEE, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96,
-0x19, 0x12, 0x45, 0x49, 0xE9, 0x54, 0xF3, 0x4B, 0xF0, 0xED, 0xD3, 0x9C, 0x40, 0x02, 0xAD, 0x04,
-0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE0, 0x54, 0x80, 0x42, 0x05, 0x8E,
-0x6A, 0xE4, 0xFB, 0x01, 0x99, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xED, 0x60, 0x62, 0x75,
-0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x01, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A,
-0xEF, 0x90, 0x8D, 0x03, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90,
-0x8D, 0x05, 0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x07,
-0x12, 0x45, 0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x0A, 0xEF, 0x90, 0x8D, 0x09, 0x12, 0x45,
-0x49, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5,
-0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE4,
-0xF0, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xBF, 0x44, 0x80,
-0xFE, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x03, 0x12, 0x45, 0x49, 0xEE, 0xF0, 0xD0, 0xD0, 0x92,
-0xAF, 0x22, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x5E, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x16, 0xF5,
-0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0x9C, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82,
-0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xB5, 0x12, 0x45,
-0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83,
-0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82,
-0xE0, 0xFF, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02,
-0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34,
-0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90,
-0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74,
-0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF,
-0x90, 0xA2, 0xB5, 0x12, 0x45, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x20, 0xFE, 0xEF,
-0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x16, 0x90, 0x00, 0x02,
-0x12, 0x06, 0xA2, 0xFF, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF,
-0xF0, 0x80, 0x0F, 0xE5, 0x51, 0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95,
-0x95, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE5,
-0x22, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x13, 0x13, 0x54,
-0x03, 0xFB, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFD, 0xAF,
-0x51, 0x51, 0x47, 0x22, 0x7D, 0x01, 0xAF, 0x51, 0xAA, 0x07, 0xAB, 0x05, 0x75, 0xF0, 0x10, 0xEA,
-0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF5, 0x60, 0x75, 0xF0, 0x04,
-0xEA, 0x90, 0x96, 0x17, 0x12, 0x45, 0x49, 0xE0, 0x90, 0xA2, 0xC5, 0xF0, 0x75, 0xF0, 0x04, 0xEA,
-0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x05, 0x12,
-0x45, 0x49, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0xE5, 0x60, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4,
-0x34, 0x41, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA, 0x25, 0xE0, 0x24, 0x95,
-0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEA,
-0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0xC3, 0xF0, 0x74,
-0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60, 0xF0, 0x74, 0x16, 0x2A, 0xF5,
-0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x04, 0x8F,
-0x60, 0x8F, 0x5E, 0xEB, 0x70, 0x02, 0xC1, 0x30, 0xAF, 0x03, 0x8F, 0x61, 0xE5, 0x5E, 0x30, 0xE7,
-0x05, 0x85, 0x60, 0x5E, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x02, 0xC1, 0x30, 0xE5, 0x60, 0x64, 0x2C,
-0x70, 0x2A, 0xE5, 0x5F, 0xD3, 0x94, 0x00, 0x40, 0x23, 0xE5, 0x5F, 0xD3, 0x94, 0x02, 0x50, 0x1C,
-0x15, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x90,
-0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x02,
-0xC1, 0x30, 0x90, 0xA2, 0xC5, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x7D, 0xE4, 0x90, 0xA2,
-0xC4, 0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90, 0xA2, 0xC5, 0xE0, 0xFF,
-0xEC, 0xC3, 0x9F, 0x40, 0x5F, 0xEC, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEA,
-0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83,
-0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xEC, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07,
-0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF,
-0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02, 0x7D, 0x0C, 0x90, 0xA2,
-0xC4, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F, 0x40,
-0x03, 0x1C, 0x80, 0x97, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA2, 0xC5, 0xE0, 0xF5, 0x5E,
-0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x01, 0x99, 0xAB, 0x07, 0x75, 0xF0, 0x10,
-0xEB, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0, 0xF5, 0x5E, 0xE4, 0xF5, 0x62, 0xE5, 0x5E, 0x54,
-0x7F, 0xF9, 0xE5, 0x5E, 0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x16, 0x12, 0x45,
-0x49, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF,
-0xC4, 0x54, 0x03, 0xF5, 0x61, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34,
-0x41, 0xF5, 0x83, 0x12, 0x45, 0x1D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94,
-0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x5E, 0x4A, 0xFF, 0x74, 0x16, 0x2B, 0xF5, 0x82,
-0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x05, 0x12, 0x45,
-0x49, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83,
-0xE5, 0x5F, 0xF0, 0xE9, 0x64, 0x2C, 0x70, 0x33, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12,
-0x45, 0x49, 0xE0, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5F, 0xC3, 0x9E, 0x50, 0x1E, 0x05, 0x5F, 0xE5,
-0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12,
-0x45, 0x49, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0xE1, 0xC3, 0xE9, 0xC3, 0x95, 0x60, 0x50,
-0x6B, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x60, 0x40, 0x02, 0xE1, 0xC3, 0xED, 0x13, 0x13, 0x13,
-0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEB, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F,
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xED, 0x54, 0x07,
-0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
-0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1D, 0xB9, 0x13, 0x14, 0x79,
-0x18, 0x89, 0x5E, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x44, 0x04,
-0xF0, 0x80, 0x60, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x5A, 0x0D, 0x80, 0x98, 0xE9, 0x65, 0x60, 0x70,
-0x43, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x13, 0x54,
-0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44, 0x80, 0xF5, 0x5E, 0x80, 0x33,
-0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45,
-0x1D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3,
-0xEF, 0xF0, 0x80, 0x0F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60,
-0xF0, 0xF5, 0x5E, 0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD, 0x5E, 0x01, 0x99, 0xE4, 0xF5,
-0x51, 0x74, 0x90, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02,
-0xAF, 0xD7, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4,
-0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0xAF, 0xD7, 0xE5, 0x51, 0x25, 0xE0, 0x24,
-0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE,
-0x94, 0x00, 0x50, 0x02, 0xE1, 0xD7, 0xE5, 0x51, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74,
-0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA2, 0xB4, 0x12, 0x45, 0x5E, 0xE5, 0x51, 0x25, 0xE0,
+0x44, 0x02, 0xF0, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0x90, 0xA2, 0xF0,
+0xE0, 0xFF, 0x90, 0xA2, 0xEE, 0xE0, 0xFE, 0xC3, 0x9F, 0x50, 0x5C, 0xEE, 0x70, 0x05, 0x75, 0x54,
+0x05, 0x80, 0x03, 0xE4, 0xF5, 0x54, 0xE5, 0x54, 0xC3, 0x94, 0x20, 0x50, 0x08, 0xAF, 0x54, 0xD1,
+0x1D, 0x05, 0x54, 0x80, 0xF1, 0x90, 0xA2, 0xEE, 0xE0, 0x04, 0xF0, 0x90, 0xFD, 0x10, 0xE0, 0x04,
+0xF0, 0x90, 0xA2, 0xF0, 0xE0, 0xFF, 0x90, 0xA2, 0xEE, 0xE0, 0xB5, 0x07, 0xC0, 0xE4, 0xF5, 0x54,
+0xE5, 0x54, 0x75, 0xF0, 0x08, 0xA4, 0xFF, 0x90, 0xA2, 0xEF, 0xE0, 0xFD, 0xC3, 0xEF, 0x9D, 0x74,
+0x80, 0xF8, 0x65, 0xF0, 0x98, 0x50, 0x08, 0xAF, 0x54, 0xD1, 0x1D, 0x05, 0x54, 0x80, 0xE1, 0x90,
+0xA2, 0xEE, 0xE0, 0x04, 0xF0, 0x80, 0x96, 0x90, 0x01, 0xBD, 0xE0, 0x44, 0x04, 0xF0, 0xD0, 0xD0,
+0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0xEE, 0xEE, 0xF0, 0xA3,
+0xEF, 0xF0, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0x90, 0x02, 0x09, 0xE0, 0xFF, 0x12, 0xBC, 0x47, 0xAD,
+0x07, 0xED, 0x24, 0x28, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0xA2, 0xEF, 0xE0, 0x2F, 0xFF, 0x90, 0xA2,
+0xEE, 0xE0, 0x3E, 0xF9, 0xC3, 0x74, 0xD8, 0x9D, 0x90, 0xA2, 0xF4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4,
+0xFC, 0xEC, 0xC3, 0x99, 0x40, 0x03, 0x02, 0x88, 0xB4, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x2C,
+0x90, 0xFD, 0x10, 0xF0, 0xEC, 0x70, 0x67, 0xF5, 0x56, 0x90, 0xA2, 0xF4, 0xE0, 0xC3, 0x13, 0xFF,
+0xE5, 0x56, 0xC3, 0x9F, 0x40, 0x02, 0x01, 0xB0, 0x75, 0xF0, 0x02, 0xE5, 0x56, 0xA4, 0x2D, 0xF5,
+0x82, 0xE4, 0x35, 0xF0, 0xF5, 0x83, 0xE5, 0x82, 0x24, 0x28, 0xF5, 0x82, 0xE5, 0x83, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xF0, 0xF0, 0xFB, 0x75, 0xF0, 0x02, 0xE5, 0x56, 0xA4, 0x2D, 0xF5,
+0x82, 0xE4, 0x35, 0xF0, 0xF5, 0x83, 0xE5, 0x82, 0x24, 0x29, 0xF5, 0x82, 0xE5, 0x83, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xF1, 0xF0, 0xFE, 0x7A, 0x00, 0xE4, 0x2B, 0xFF, 0xEA, 0x3E, 0xFE,
+0xA3, 0xF0, 0xA3, 0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0x80, 0x9B, 0xE4, 0xF5,
+0x56, 0xE5, 0x56, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90,
+0xA2, 0xF0, 0xF0, 0xFB, 0xE5, 0x56, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE0, 0x90, 0xA2, 0xF1, 0xF0, 0xFE, 0x7A, 0x00, 0xE4, 0x2B, 0xFF, 0xEA, 0x3E, 0xFE, 0xA3,
+0xF0, 0xA3, 0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0xE5, 0x56, 0xB4, 0x80, 0xC1,
+0x0C, 0x02, 0x87, 0xF1, 0x90, 0x02, 0x09, 0xE0, 0xC3, 0x13, 0x29, 0x90, 0xFD, 0x10, 0xF0, 0xE4,
+0xF5, 0x56, 0x90, 0xA2, 0xF5, 0xE0, 0xC3, 0x13, 0xFF, 0xE5, 0x56, 0xC3, 0x9F, 0x50, 0x3C, 0xE5,
+0x56, 0x25, 0xE0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x90, 0xA2, 0xF0,
+0xF0, 0xFD, 0xE5, 0x56, 0x25, 0xE0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
+0x90, 0xA2, 0xF1, 0xF0, 0xFE, 0x7C, 0x00, 0xE4, 0x2D, 0xFF, 0xEC, 0x3E, 0xFE, 0xA3, 0xF0, 0xA3,
+0xEF, 0xF0, 0x62, 0x55, 0xEE, 0x62, 0x54, 0x05, 0x56, 0x80, 0xB7, 0xE5, 0x55, 0x90, 0x04, 0x9E,
+0xF0, 0xE5, 0x54, 0xA3, 0xF0, 0x45, 0x55, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0xD0, 0xD0, 0x92,
+0xAF, 0x22, 0x90, 0xA2, 0xEB, 0x74, 0x0A, 0xF0, 0x90, 0xA2, 0xF9, 0x74, 0x06, 0xF0, 0x12, 0x06,
+0x89, 0x90, 0xA2, 0xED, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEE, 0xF0, 0x90,
+0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xEF, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90,
+0xA2, 0xF0, 0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0xF1, 0xF0, 0x90, 0x00, 0x05,
+0x12, 0x06, 0xA2, 0x90, 0xA2, 0xF2, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x02, 0x6F, 0xEA,
+0x12, 0x06, 0x89, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xF5, 0x54, 0x90, 0x00, 0x02,
+0x12, 0x06, 0xA2, 0xF5, 0x55, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x90, 0x00, 0x04,
+0x12, 0x06, 0xA2, 0xF5, 0x57, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xF5, 0x58, 0x90, 0x00, 0x06,
+0x12, 0x06, 0xA2, 0xF5, 0x59, 0xE5, 0x51, 0x12, 0x45, 0xC7, 0x89, 0xC3, 0x00, 0x89, 0xCB, 0x01,
+0x89, 0xD3, 0x02, 0x89, 0xDB, 0x03, 0x89, 0xE3, 0x04, 0x89, 0xEB, 0x05, 0x89, 0xF3, 0x06, 0x00,
+0x00, 0x8A, 0x0A, 0x75, 0x52, 0x02, 0x75, 0x53, 0x29, 0x80, 0x45, 0x75, 0x52, 0x06, 0x75, 0x53,
+0x2A, 0x80, 0x3D, 0x75, 0x52, 0x01, 0x75, 0x53, 0x31, 0x80, 0x35, 0x75, 0x52, 0x01, 0x75, 0x53,
+0x32, 0x80, 0x2D, 0x75, 0x52, 0x06, 0x75, 0x53, 0x33, 0x80, 0x25, 0x7B, 0x00, 0x7A, 0x00, 0x79,
+0x54, 0x21, 0x22, 0x90, 0xA2, 0x0E, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xA3, 0xE5, 0x56,
+0xF0, 0xA3, 0xE5, 0x57, 0xF0, 0xA3, 0xE5, 0x58, 0xF0, 0x22, 0x75, 0x52, 0x01, 0x75, 0x53, 0xFF,
+0x7B, 0x00, 0x7A, 0x00, 0x79, 0x54, 0xAD, 0x52, 0xAF, 0x53, 0x02, 0x5E, 0x9D, 0x90, 0xA1, 0xBE,
+0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x2F, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x26,
+0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x07, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0,
+0x22, 0x90, 0xA1, 0xBE, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74,
+0x0D, 0xF0, 0x22, 0x74, 0x09, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02,
+0x61, 0x1E, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x61, 0x1E, 0x90, 0xA1, 0x16, 0xE0,
+0x30, 0xE0, 0x1D, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFD, 0xED, 0x78, 0x02,
+0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x4F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70,
+0x1E, 0x90, 0xA1, 0x21, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0xA1, 0x23, 0xE0, 0x60,
+0x0E, 0xEF, 0x70, 0x08, 0x90, 0xA1, 0x20, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90,
+0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63,
+0x12, 0x58, 0x9C, 0xEF, 0x70, 0x02, 0xF5, 0x63, 0xE5, 0x63, 0x60, 0x42, 0x90, 0xA1, 0x1E, 0xE0,
+0x44, 0x10, 0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x60, 0x03, 0xB4, 0x01, 0x0B, 0xE4, 0x90, 0xA3, 0xAE,
+0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x80, 0x0F, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0x23, 0xE0,
+0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0xA1, 0x22, 0xE0, 0x2F, 0x90, 0xA3, 0xAF, 0x12,
+0x48, 0x21, 0x90, 0xA1, 0x1D, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x56, 0x52, 0x51, 0x1D, 0x22, 0x90,
+0xA2, 0x25, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xAD, 0x07, 0xEE, 0xFF, 0x90, 0x01, 0x6F, 0xE4, 0xF0,
+0x8F, 0x35, 0xAF, 0x05, 0x8F, 0x36, 0xFB, 0xFD, 0x7F, 0x6C, 0x7E, 0x01, 0x12, 0x3C, 0xB1, 0x90,
+0x01, 0x6F, 0x74, 0x05, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA2, 0x19,
+0xE0, 0x30, 0xE0, 0x20, 0x90, 0xA2, 0x1E, 0xE0, 0xB4, 0x01, 0x0C, 0xA3, 0xE0, 0xB4, 0x01, 0x14,
+0x74, 0x02, 0xF0, 0x71, 0x1F, 0x80, 0x0D, 0x90, 0xA2, 0x1E, 0xE0, 0xB4, 0x02, 0x06, 0x74, 0x03,
+0xF0, 0x12, 0x67, 0x36, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x13,
+0x54, 0x03, 0x20, 0xE0, 0x02, 0xA1, 0xEA, 0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x01, 0x70, 0x38, 0x90,
+0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x20, 0x90, 0x06, 0x92, 0x74,
+0x04, 0xF0, 0x90, 0xA1, 0xE2, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xD9, 0xE0, 0x75, 0xF0, 0x03, 0x84,
+0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0xCF, 0xE4, 0x90, 0xA1, 0xD5,
+0xF0, 0x90, 0xA1, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x04, 0x70, 0x35, 0x90,
+0x06, 0x92, 0xE0, 0x20, 0xE2, 0x06, 0x90, 0x04, 0xE3, 0xE0, 0x60, 0x1C, 0x90, 0x06, 0x92, 0x74,
+0x04, 0xF0, 0x90, 0xA1, 0xE2, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xD8, 0xE0, 0xFF, 0x90, 0xA1, 0xE2,
+0xE0, 0xB5, 0x07, 0x02, 0x80, 0x02, 0xA1, 0xCF, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x90, 0xA1, 0xE0,
+0x74, 0x04, 0xF0, 0x22, 0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x06, 0x60, 0x02, 0xA1, 0x30, 0x90, 0xA1,
+0xE3, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03,
+0x12, 0x07, 0x03, 0x90, 0xA1, 0xD9, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41,
+0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x08, 0x90, 0xA1, 0xE3, 0xE0, 0x94, 0x03, 0x40, 0x11, 0x90,
+0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xE0, 0x20, 0xE0, 0x02, 0x81, 0xD2, 0xA1, 0x78,
+0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x7A, 0xEF, 0x54, 0xFB, 0xF0,
+0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xF2,
+0xE0, 0x30, 0xE0, 0x02, 0xA1, 0x5E, 0x90, 0xA1, 0xE0, 0xA1, 0x78, 0x90, 0xA1, 0xE3, 0xE0, 0xFF,
+0x90, 0xA1, 0xE2, 0xE0, 0x2F, 0xFF, 0xE4, 0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03,
+0x90, 0xA1, 0xD9, 0xE0, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80,
+0x94, 0x80, 0x40, 0x0E, 0x90, 0xA1, 0xF2, 0xE0, 0x30, 0xE0, 0x02, 0xA1, 0x5E, 0x90, 0xA1, 0xE0,
+0xA1, 0x78, 0x90, 0xA1, 0xF2, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0xA1, 0xD5, 0x74, 0x09, 0xF0, 0x90,
+0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xE2, 0xF0, 0x90, 0xA3, 0xE5, 0xA1, 0x84, 0x90,
+0xA1, 0xE0, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x49, 0x69, 0x90, 0xA1, 0xE3, 0xE0, 0x04, 0xF0, 0x7F,
+0x03, 0x12, 0x62, 0xF1, 0x90, 0xA1, 0xE3, 0xE0, 0xFF, 0x90, 0xA1, 0xE2, 0xE0, 0x2F, 0xFF, 0xE4,
+0x33, 0xFE, 0x7C, 0x00, 0x7D, 0x03, 0x12, 0x07, 0x03, 0x90, 0xA1, 0xD9, 0xE0, 0x2F, 0xFF, 0xEC,
+0x3E, 0xFE, 0xC3, 0xEF, 0x94, 0x41, 0xEE, 0x64, 0x80, 0x94, 0x80, 0x50, 0x0A, 0x90, 0xA1, 0xE3,
+0xE0, 0x94, 0x03, 0x50, 0x02, 0xA1, 0xEA, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x90, 0x05, 0x22,
+0xE0, 0x44, 0x10, 0xFF, 0x7D, 0x03, 0x12, 0x49, 0x5E, 0x90, 0x04, 0x9C, 0xE0, 0x04, 0xF0, 0x22,
+0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x07, 0x70, 0x4F, 0x90, 0xA1, 0xE3, 0xE0, 0xB4, 0x04, 0x05, 0x90,
+0xA1, 0xE0, 0x80, 0x34, 0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x2C,
+0xEF, 0x54, 0xFB, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0xA1, 0xF2, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA1,
+0xD5, 0x74, 0x09, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA1, 0xE2, 0xF0, 0x90,
+0xA3, 0xE5, 0x04, 0x80, 0x0F, 0x90, 0xA1, 0xE0, 0x74, 0x05, 0xF0, 0x22, 0x12, 0x49, 0x69, 0x90,
+0xA1, 0xE3, 0xE0, 0x04, 0xF0, 0x80, 0x48, 0x90, 0xA1, 0xD5, 0xE0, 0x64, 0x09, 0x70, 0x5B, 0x90,
+0xA1, 0xD4, 0xE0, 0x30, 0xE0, 0x0E, 0x90, 0xA1, 0xE0, 0x74, 0x05, 0xF0, 0x90, 0xA1, 0xD4, 0xE0,
+0x54, 0xFE, 0xF0, 0x22, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE2, 0x29, 0x74, 0x04, 0xF0, 0x90, 0xA1,
+0xE2, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x02, 0x17, 0x90, 0xA3, 0xE5, 0xE0, 0x90, 0xA1, 0xE0, 0x60,
+0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x22, 0x7F,
+0x03, 0x02, 0x62, 0xF1, 0x90, 0xA3, 0xE5, 0xE0, 0x90, 0xA1, 0xE0, 0x60, 0x05, 0x74, 0x05, 0xF0,
+0x80, 0x03, 0x74, 0x02, 0xF0, 0xE4, 0x90, 0xA1, 0xD5, 0xF0, 0x22, 0x90, 0xA3, 0x15, 0xEF, 0xF0,
+0x7F, 0x03, 0x12, 0x62, 0xF1, 0x90, 0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x90, 0xA1, 0xE0, 0x30,
+0xE0, 0x05, 0x74, 0x05, 0xF0, 0x80, 0x03, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0xC4,
+0x13, 0x54, 0x07, 0x20, 0xE0, 0x09, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x3C, 0x90,
+0xA1, 0xD0, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x0A, 0x90, 0xA1, 0xCE, 0xE0, 0xFF, 0x90, 0xA1,
+0xDE, 0x80, 0x21, 0x90, 0xA3, 0x15, 0xE0, 0xFC, 0xB4, 0x01, 0x0D, 0x90, 0xA1, 0xCE, 0xE0, 0xFE,
+0x90, 0xA1, 0xDD, 0xE0, 0xC3, 0x9E, 0x80, 0x0F, 0xEC, 0xB4, 0x04, 0x0F, 0x90, 0xA1, 0xCF, 0xE0,
+0xFF, 0x90, 0xA1, 0xDD, 0xE0, 0xC3, 0x9F, 0x90, 0xA1, 0xE4, 0xF0, 0x90, 0xA1, 0xCD, 0xE0, 0xC4,
+0x13, 0x54, 0x07, 0x30, 0xE0, 0x2C, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0,
+0x02, 0xE1, 0x09, 0x90, 0xA1, 0xE4, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF, 0x25, 0xE0,
+0x25, 0xE0, 0xFB, 0xE4, 0xFD, 0x80, 0x05, 0x7B, 0x7F, 0x7D, 0xFF, 0xE4, 0xFF, 0x12, 0x4C, 0x71,
+0x80, 0x77, 0x90, 0xA1, 0xCD, 0xE0, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x54, 0x90, 0xA1, 0xD3, 0xE0,
+0x54, 0xDF, 0xF0, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x56, 0x56, 0x90, 0xA1, 0xD1, 0xE0, 0xC4, 0x13,
+0x13, 0x54, 0x03, 0x30, 0xE0, 0x3A, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x02, 0xF0, 0x54, 0xFB, 0xF0,
+0xE4, 0x90, 0xA1, 0xE3, 0xF0, 0x90, 0xA1, 0xE0, 0xF0, 0x90, 0xA3, 0x15, 0xE0, 0xFF, 0xB4, 0x01,
+0x08, 0x90, 0xA1, 0xD5, 0x74, 0x06, 0xF0, 0x80, 0x0A, 0xEF, 0xB4, 0x04, 0x06, 0x90, 0xA1, 0xD5,
+0x74, 0x07, 0xF0, 0x90, 0xA1, 0xBF, 0xE0, 0x60, 0x07, 0x90, 0xA1, 0xD4, 0xE0, 0x44, 0x04, 0xF0,
+0x90, 0xA3, 0x15, 0xE0, 0xB4, 0x01, 0x04, 0x7D, 0x06, 0x80, 0x09, 0x90, 0xA3, 0x15, 0xE0, 0xB4,
+0x04, 0x07, 0x7D, 0x0C, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x90, 0xA1, 0xD1, 0xE0, 0x13, 0x13, 0x13,
+0x54, 0x1F, 0x30, 0xE0, 0x1B, 0x90, 0xA1, 0xE4, 0xE0, 0xFF, 0xC3, 0x94, 0x20, 0x50, 0x0A, 0xEF,
+0x7F, 0x00, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x80, 0x04, 0x7F, 0xFF, 0x7E, 0x7F, 0x12, 0x4B, 0xBB,
+0x90, 0xA1, 0xD0, 0xE0, 0x30, 0xE0, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x22, 0x7E, 0x00,
+0x7F, 0x30, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xCD, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0xCE,
+0x74, 0x0B, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0x90, 0x9F, 0x9C, 0xE0, 0xFC, 0x64, 0x02, 0x70, 0x1D,
+0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0xEE, 0x54, 0x01, 0xC4, 0x33,
+0x33, 0x54, 0xC0, 0xFE, 0x90, 0xA1, 0xD0, 0xE0, 0x54, 0xBF, 0x4E, 0xF0, 0x22, 0xEC, 0x64, 0x01,
+0x70, 0x0D, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x13, 0x90,
+0x9F, 0x9C, 0xE0, 0x64, 0x03, 0x70, 0x1C, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x30, 0xE2, 0x02,
+0x7F, 0x01, 0xEF, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, 0x90, 0xA1, 0xD0, 0xE0, 0x54,
+0xBF, 0x4F, 0xF0, 0x22, 0x90, 0xA3, 0x26, 0xEF, 0xF0, 0x90, 0xA2, 0x0D, 0xE0, 0x60, 0x03, 0x02,
+0x90, 0x3F, 0x7F, 0x48, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEE, 0x54, 0x0F, 0xFE, 0xE4, 0xFD, 0xFC,
+0x90, 0xA3, 0x27, 0x12, 0x08, 0x6D, 0xE4, 0x7F, 0x80, 0x7E, 0x02, 0xFD, 0xFC, 0x90, 0xA3, 0x27,
+0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x05, 0x90, 0xA1, 0xEE, 0x80, 0x31, 0xE4, 0xFF,
+0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x0A, 0x90,
+0xA1, 0xEE, 0x04, 0xF0, 0xE4, 0xA3, 0xF0, 0x01, 0x9B, 0xE4, 0xFF, 0x7E, 0x02, 0xFD, 0xFC, 0x90,
+0xA3, 0x27, 0x12, 0x45, 0x8D, 0xC3, 0x12, 0x45, 0x60, 0x70, 0x09, 0x90, 0xA1, 0xEE, 0x04, 0xF0,
+0xA3, 0xF0, 0x80, 0x77, 0xE4, 0x7F, 0x80, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x8D,
+0xC3, 0x12, 0x45, 0x60, 0x70, 0x65, 0x90, 0xA1, 0xEE, 0xF0, 0xA3, 0x04, 0xF0, 0x80, 0x5C, 0x7F,
+0x2C, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0x02, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA3,
+0x27, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x08,
+0x90, 0xA1, 0xEE, 0x74, 0x01, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0xA1, 0xEE, 0xF0, 0x7F, 0x30, 0x7E,
+0x09, 0x12, 0x37, 0x4E, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0x90, 0xA3, 0x27, 0x12,
+0x08, 0x6D, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x71, 0xEC, 0x4D, 0x4E, 0x4F, 0x60, 0x07, 0xE4, 0x90,
+0xA1, 0xEF, 0xF0, 0x80, 0x06, 0x90, 0xA1, 0xEF, 0x74, 0x01, 0xF0, 0x90, 0xA1, 0xE8, 0xE0, 0x44,
+0x01, 0xF0, 0x7D, 0x11, 0x12, 0x46, 0xF8, 0x90, 0x07, 0x78, 0xE0, 0x90, 0xA1, 0xED, 0xF0, 0x90,
+0xA2, 0x0C, 0xE0, 0xFF, 0xE4, 0xFD, 0x12, 0x63, 0x7F, 0x90, 0xA3, 0x26, 0xE0, 0xFD, 0x70, 0x02,
+0x80, 0x24, 0xED, 0xB4, 0x01, 0x0A, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0x1F, 0x44, 0x20, 0xF0, 0x22,
+0x90, 0xA3, 0x26, 0xE0, 0xFD, 0xB4, 0x02, 0x0A, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0x1F, 0x44, 0x60,
+0xF0, 0x22, 0xED, 0xB4, 0x03, 0x07, 0x90, 0xA1, 0xE8, 0xE0, 0x54, 0x1F, 0xF0, 0x22, 0x90, 0xA1,
+0xE8, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xE1, 0xF0, 0x90, 0xA1, 0xED, 0xE0, 0x90, 0x07, 0x78, 0xF0,
+0x90, 0xA1, 0xEE, 0x12, 0x63, 0x7A, 0x12, 0x60, 0x4D, 0xE4, 0xFD, 0xFF, 0x02, 0x49, 0x5E, 0x12,
+0x67, 0xC8, 0x90, 0xA1, 0xE8, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0xFE, 0xEF, 0xC3, 0x13, 0x54,
+0x0F, 0xC3, 0x9E, 0x40, 0x02, 0x80, 0xC7, 0x90, 0xA1, 0xE8, 0xE0, 0xFF, 0xC3, 0x13, 0x54, 0x0F,
+0xFE, 0xEF, 0x54, 0xE1, 0xFF, 0xEE, 0x04, 0x54, 0x0F, 0x25, 0xE0, 0x4F, 0xF0, 0x22, 0xEF, 0x70,
+0x1C, 0x90, 0xA2, 0x1A, 0xE0, 0x54, 0x03, 0xFE, 0x70, 0x02, 0x80, 0x1B, 0xBE, 0x01, 0x02, 0x80,
+0x20, 0xBE, 0x02, 0x02, 0x80, 0x26, 0xEE, 0x64, 0x03, 0x70, 0x32, 0x80, 0x2A, 0x90, 0xA2, 0x1A,
+0xE0, 0xC4, 0x54, 0x03, 0xFE, 0x70, 0x07, 0x90, 0x07, 0x78, 0x04, 0xF0, 0x80, 0x1F, 0xBE, 0x01,
+0x08, 0x90, 0x07, 0x78, 0x74, 0x03, 0xF0, 0x80, 0x14, 0xBE, 0x02, 0x08, 0x90, 0x07, 0x78, 0x74,
+0x09, 0xF0, 0x80, 0x09, 0xBE, 0x03, 0x06, 0x90, 0x07, 0x78, 0x74, 0x0D, 0xF0, 0x90, 0xA2, 0x19,
+0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x45, 0xEF, 0x70, 0x1F, 0xA3, 0xE0, 0x13, 0x13,
+0x54, 0x3F, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0x15, 0xF0, 0x80, 0x06, 0x90, 0xA3, 0x15, 0x74,
+0x01, 0xF0, 0x90, 0xA3, 0x15, 0xE0, 0xFD, 0xE4, 0xFF, 0x80, 0x20, 0x90, 0xA2, 0x1A, 0xE0, 0xC4,
+0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0xE4, 0x90, 0xA3, 0x15, 0xF0, 0x80, 0x06, 0x90, 0xA3,
+0x15, 0x74, 0x01, 0xF0, 0x90, 0xA3, 0x15, 0xE0, 0xFD, 0x7F, 0x01, 0x12, 0x63, 0x7F, 0x22, 0x90,
+0xA4, 0x06, 0xEF, 0xF0, 0x7F, 0x02, 0x12, 0x44, 0xB7, 0x90, 0x9F, 0x98, 0xE0, 0xFF, 0x90, 0xA4,
+0x06, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x9F, 0x98, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x51,
+0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0x9F, 0x9D, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x25,
+0x51, 0x90, 0x9F, 0x9E, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0x9F,
+0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA0, 0xF0, 0x90, 0x00, 0x04,
+0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0x9F, 0xA1, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x25,
+0x51, 0x90, 0x9F, 0xA2, 0xF0, 0x22, 0x8B, 0x51, 0x8A, 0x52, 0x89, 0x53, 0x90, 0x00, 0x01, 0x12,
+0x06, 0xA2, 0xFF, 0xF5, 0x55, 0x12, 0x06, 0x89, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00,
+0x02, 0x12, 0x06, 0xA2, 0xF5, 0x56, 0x80, 0x02, 0x8F, 0x56, 0x85, 0x55, 0x54, 0xE5, 0x54, 0xD3,
+0x95, 0x56, 0x50, 0x33, 0xAB, 0x51, 0xAA, 0x52, 0xA9, 0x53, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF,
+0x74, 0x90, 0x25, 0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x90, 0x25,
+0x54, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0xAF, 0x54, 0x70, 0x04, 0x51, 0xD7, 0x80,
+0x02, 0x51, 0xC6, 0x05, 0x54, 0x80, 0xC6, 0x51, 0xFC, 0xE5, 0x55, 0x70, 0x18, 0x90, 0xA0, 0x90,
+0xE0, 0x70, 0x12, 0x12, 0x60, 0x4D, 0x51, 0xE8, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xF7, 0xF0, 0x54,
+0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05, 0x12,
+0x45, 0xA9, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x8F, 0x57, 0x75, 0xF0, 0x10, 0xEF, 0x90, 0x81, 0x05,
+0x12, 0x45, 0xA9, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0xE4,
+0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x55, 0x87, 0xE4, 0xFF, 0x74, 0x32,
+0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xA1, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0xB4, 0x19, 0xEF, 0xE4,
+0x90, 0xA1, 0x2D, 0xF0, 0x90, 0xA1, 0x31, 0xF0, 0x90, 0xA1, 0x2B, 0xF0, 0x22, 0xE4, 0x90, 0xA3,
+0x05, 0xF0, 0xFD, 0xA3, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0xFE, 0x90, 0x05, 0x61, 0xE0, 0xFB, 0xEB,
+0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA1, 0x4D, 0xEE, 0xF0, 0xA3,
+0xEF, 0xF0, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0xA1, 0x4D, 0xE0, 0xFA, 0xA3, 0xE0, 0xFB,
+0xC3, 0x9F, 0xEA, 0x9E, 0x40, 0x28, 0xEB, 0x9F, 0xFF, 0x90, 0xA1, 0x2F, 0xE0, 0xFE, 0xC3, 0x74,
+0x0A, 0x9E, 0x2F, 0xFD, 0xC3, 0x94, 0x19, 0x50, 0x13, 0x74, 0x32, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
+0xA1, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x2D, 0xE0, 0x04, 0xF0, 0x71, 0xEF, 0x90, 0xA1,
+0x2D, 0xE0, 0xC3, 0x94, 0x64, 0x40, 0x67, 0xE4, 0x90, 0xA3, 0x06, 0xF0, 0x90, 0xA3, 0x05, 0xF0,
+0x90, 0xA3, 0x05, 0xE0, 0xFF, 0xC3, 0x94, 0x19, 0x50, 0x47, 0x74, 0x32, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0xA1, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA3, 0x06, 0xE0, 0x2F, 0xF0, 0xE0, 0xD3, 0x94, 0x05,
+0x40, 0x27, 0x90, 0xA3, 0x05, 0xE0, 0xFF, 0x94, 0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0xA1,
+0x2C, 0xF0, 0xE4, 0x80, 0x0E, 0xE4, 0x90, 0xA1, 0x2C, 0xF0, 0x90, 0xA3, 0x05, 0xE0, 0xFF, 0xC3,
+0x74, 0x0A, 0x9F, 0x90, 0xA1, 0x2B, 0xF0, 0x80, 0x08, 0x90, 0xA3, 0x05, 0xE0, 0x04, 0xF0, 0x80,
+0xAF, 0x90, 0xA1, 0x2C, 0xE0, 0xFD, 0x7B, 0x08, 0xE4, 0xFF, 0x91, 0x21, 0x51, 0xFC, 0x22, 0x90,
+0xA1, 0xB9, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x24, 0x90, 0xA1, 0x31, 0xE0,
+0x04, 0xF0, 0xE0, 0xFF, 0x94, 0x04, 0x50, 0x18, 0x90, 0xA1, 0x2B, 0xEF, 0xF0, 0x25, 0xE0, 0x24,
+0x08, 0x90, 0xA1, 0x30, 0xF0, 0xFB, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x91, 0x21,
+0x22, 0xAC, 0x07, 0x90, 0xA1, 0x16, 0xE0, 0x30, 0xE0, 0x32, 0x90, 0xA1, 0x2C, 0xE0, 0xD3, 0x94,
+0x03, 0x50, 0x07, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x80, 0x0A, 0xED, 0x24, 0xFD, 0x2B, 0x90, 0xA1,
+0x22, 0xF0, 0x7D, 0x03, 0x90, 0xA1, 0x51, 0xE0, 0x24, 0x04, 0xC3, 0x9D, 0x2C, 0xFF, 0x90, 0xA1,
+0x2F, 0xF0, 0x90, 0xA1, 0x25, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0E, 0x90, 0xA1, 0x25, 0xE4,
+0xF0, 0xA3, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x22, 0xEB, 0xF0, 0x90, 0xA1, 0x25, 0xA3, 0xE0, 0x90,
+0x05, 0x58, 0xF0, 0x22, 0x91, 0xB0, 0x90, 0xA3, 0x15, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01,
+0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x55, 0x87, 0x90, 0xA3, 0x15, 0xE0, 0x30, 0xE6, 0x11,
+0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80,
+0xF0, 0x90, 0xA1, 0x2B, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0xA1, 0x30, 0xE0, 0xFB, 0x81, 0x21,
+0xE4, 0x90, 0xA3, 0x16, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x46, 0xD6, 0x90, 0xA3,
+0x16, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x46, 0xD6, 0xAE, 0x07, 0x90, 0xA3, 0x16, 0xE0, 0xFF, 0xB5,
+0x06, 0x01, 0x22, 0xC3, 0x90, 0xA3, 0x18, 0xE0, 0x94, 0x64, 0x90, 0xA3, 0x17, 0xE0, 0x94, 0x00,
+0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA3, 0x16, 0xE0, 0xFF, 0x22, 0x90,
+0xA3, 0x17, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x80, 0xBE, 0x90, 0x04, 0x24, 0xE0, 0xF5,
+0x51, 0x12, 0x06, 0x89, 0x25, 0x51, 0x90, 0xA2, 0x3B, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2,
+0x25, 0x51, 0x90, 0xA2, 0x48, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x25, 0x51, 0x90, 0xA2,
+0x55, 0xF0, 0x22, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x7F, 0x90,
+0xA1, 0x1A, 0xF0, 0xEF, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xA3, 0xF0, 0x90, 0x00, 0x01, 0x12,
+0x06, 0xA2, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0xF0, 0x4E,
+0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0xA1, 0x16, 0xE0,
+0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0xA1, 0x18, 0xE0, 0x54,
+0x0F, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0x19, 0xF0, 0x90, 0x00, 0x06,
+0x12, 0x06, 0xA2, 0x30, 0xE0, 0x5E, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0xA1,
+0x2C, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2E, 0x74, 0x03, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5,
+0xE9, 0x24, 0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x06, 0x89, 0xFF, 0x74, 0x03, 0x24, 0xFD, 0xFE,
+0xEF, 0xC4, 0x54, 0x0F, 0xFD, 0xEF, 0x54, 0x0F, 0xFF, 0xED, 0x2E, 0x54, 0x0F, 0xFE, 0xC4, 0x54,
+0xF0, 0x4F, 0x12, 0x06, 0xCF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x06, 0x12, 0x06,
+0xA2, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0xA1, 0x22, 0x50, 0x05, 0x74, 0x04, 0xF0,
+0x80, 0x02, 0xEF, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2,
+0xFD, 0x7F, 0x02, 0x12, 0x55, 0x87, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x05, 0x12,
+0x06, 0xA2, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA1, 0xBE, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF,
+0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE,
+0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x4D, 0xFF, 0x90, 0xA1, 0xBE, 0xF0, 0xEE, 0x54, 0x08, 0xFE,
+0xEF, 0x54, 0xF7, 0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x10, 0xFD,
+0xEF, 0x54, 0xEF, 0x4D, 0xFF, 0x90, 0xA1, 0xBE, 0xF0, 0xEE, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF,
+0x4E, 0xFF, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E,
+0x90, 0xA1, 0xBE, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x29, 0xEF, 0xC3,
+0x13, 0x20, 0xE0, 0x0B, 0x75, 0x52, 0x01, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x0B, 0x80, 0x0E, 0xE4,
+0xF5, 0x52, 0x90, 0xA2, 0x0C, 0xE0, 0x60, 0x05, 0xE4, 0xF5, 0x51, 0x80, 0x03, 0x75, 0x51, 0x01,
+0xAD, 0x52, 0xAF, 0x51, 0x12, 0x63, 0x7F, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0xA2, 0xEE,
+0x12, 0x45, 0xBE, 0xD1, 0xCC, 0x90, 0xA1, 0x1A, 0xE0, 0xFF, 0x12, 0x5B, 0x5E, 0x90, 0xA1, 0x1A,
+0xE0, 0x60, 0x18, 0x90, 0xA2, 0xEE, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x54,
+0x0F, 0xFF, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFD, 0xD1, 0xDD, 0x22, 0x90, 0xA1, 0x16, 0xE0,
+0x54, 0xFB, 0xF0, 0xE4, 0x90, 0xA1, 0x23, 0xF0, 0x90, 0xA1, 0x1E, 0xF0, 0x22, 0xEF, 0x24, 0xFE,
+0x60, 0x0B, 0x04, 0x70, 0x27, 0x90, 0xA1, 0x20, 0x74, 0x02, 0xF0, 0x80, 0x16, 0xED, 0x70, 0x0A,
+0x90, 0xA1, 0xBC, 0xE0, 0x90, 0xA1, 0x20, 0xF0, 0x80, 0x05, 0x90, 0xA1, 0x20, 0xED, 0xF0, 0x90,
+0xA1, 0x20, 0xE0, 0xA3, 0xF0, 0x90, 0xA1, 0x17, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0x00, 0x02,
+0x12, 0x06, 0xA2, 0xFF, 0x30, 0xE0, 0x26, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xB9, 0xF0, 0x90, 0x00,
+0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xBA, 0xF0, 0xEF, 0x54, 0xFE, 0xFF, 0xA3, 0xE0, 0x54, 0x01,
+0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xBC, 0xF0, 0x22, 0x90, 0xA1, 0xB9,
+0x74, 0x03, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74,
+0x05, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x90, 0xA1, 0xBF, 0xF0, 0x60, 0x36, 0x90, 0xA1, 0xCD, 0xE0,
+0x20, 0xE0, 0x2F, 0xE4, 0xFD, 0x7F, 0x04, 0x12, 0x56, 0x56, 0x90, 0xA1, 0xBE, 0xE0, 0xFF, 0xC3,
+0x13, 0x30, 0xE0, 0x1E, 0xEF, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x15, 0x90, 0xA1, 0xBE,
+0xE0, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x07, 0x78, 0x30, 0xE0, 0x04, 0x74, 0x0D, 0xF0, 0x22, 0x74,
+0x09, 0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0xFF, 0x90, 0xA1, 0xC0, 0xE0, 0x54, 0xFE, 0x4F,
+0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90, 0xA1, 0xC1, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x06,
+0xA2, 0x90, 0xA1, 0xC2, 0xF0, 0x90, 0xA1, 0xC1, 0xE0, 0x90, 0xA1, 0xC3, 0xF0, 0x90, 0xA1, 0xC0,
+0xE0, 0x54, 0x01, 0xFF, 0x02, 0x60, 0x0B, 0x90, 0xA3, 0xE7, 0x12, 0x45, 0xBE, 0xE4, 0xFE, 0x90,
+0xFD, 0x50, 0xEF, 0xF0, 0x64, 0x30, 0x60, 0x3B, 0xA3, 0xED, 0xF0, 0xEE, 0xC3, 0x9D, 0x50, 0x1E,
+0x90, 0xA3, 0xE7, 0x12, 0x45, 0xB5, 0x8E, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74,
+0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDD, 0xEE, 0xC3,
+0x94, 0x06, 0x50, 0x33, 0x74, 0x52, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD, 0xF5, 0x83, 0xE4, 0xF0,
+0x0E, 0x80, 0xEB, 0xEE, 0xC3, 0x94, 0x07, 0x50, 0x1E, 0x90, 0xA3, 0xE7, 0x12, 0x45, 0xB5, 0x8E,
+0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFF, 0x74, 0x51, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFD,
+0xF5, 0x83, 0xEF, 0xF0, 0x0E, 0x80, 0xDC, 0x90, 0xFD, 0x58, 0x74, 0x01, 0xF0, 0x22, 0x90, 0xA2,
+0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA3, 0xEA, 0xE0, 0x70, 0x13, 0x7F, 0x80, 0x7E, 0x08, 0x12, 0x37,
+0x4E, 0x90, 0xA2, 0x04, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0xEA, 0x74, 0x01, 0xF0, 0x90, 0xA2, 0xEB,
+0x12, 0x45, 0xB5, 0x12, 0x06, 0x89, 0xFF, 0xE4, 0x8F, 0x54, 0xF5, 0x53, 0xF5, 0x52, 0xF5, 0x51,
+0x90, 0xA2, 0x04, 0x12, 0x45, 0x71, 0xEC, 0x54, 0xC1, 0xFC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06,
+0xC0, 0x07, 0xAF, 0x54, 0xAE, 0x53, 0xAD, 0x52, 0xAC, 0x51, 0x78, 0x19, 0x12, 0x08, 0x5A, 0xD0,
+0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA2, 0x00, 0x02, 0x08, 0x6D,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA1, 0xF4, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x01,
+0x7F, 0x28, 0x12, 0x5E, 0x9D, 0x90, 0xA2, 0xEB, 0xEF, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90,
+0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0x04, 0x9D, 0xE0, 0x54, 0x3F, 0xF0, 0x90, 0xA2, 0xEB, 0x12,
+0x45, 0xB5, 0x7D, 0x06, 0x7F, 0x0A, 0x12, 0x5E, 0x9D, 0x8F, 0x53, 0xE5, 0x53, 0x64, 0x01, 0x60,
+0x08, 0x90, 0x04, 0x9D, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90,
+0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x12, 0x06, 0x89, 0x7C, 0x00, 0x24, 0x00, 0xF5, 0x52, 0xEC,
+0x3E, 0xF5, 0x51, 0xAF, 0x52, 0xFE, 0x12, 0x87, 0xB3, 0xEF, 0x70, 0x07, 0x90, 0x04, 0x9D, 0xE0,
+0x44, 0x10, 0xF0, 0xAF, 0x52, 0xAE, 0x51, 0x12, 0x87, 0x11, 0x90, 0x04, 0x9D, 0xE0, 0x44, 0x80,
+0xF0, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0xA2, 0x19, 0xE0, 0x54, 0xFE, 0x4E,
+0xFE, 0xF0, 0xEF, 0x54, 0x06, 0xFF, 0xEE, 0x54, 0xF9, 0x4F, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0xFE,
+0x54, 0x08, 0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0xA2, 0x19, 0xF0, 0xEE, 0x54, 0x10, 0xFE,
+0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x06, 0x89, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E,
+0x90, 0xA2, 0x19, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x03, 0xFE, 0x90, 0xA2,
+0x1A, 0xE0, 0x54, 0xFC, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xFF,
+0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFE, 0x54, 0x30, 0xFD, 0xEF, 0x54, 0xCF, 0x4D, 0xFF,
+0x90, 0xA2, 0x1A, 0xF0, 0xEE, 0x54, 0x40, 0xFE, 0xEF, 0x54, 0xBF, 0x4E, 0xF0, 0x90, 0x00, 0x02,
+0x12, 0x06, 0xA2, 0x90, 0xA2, 0x1B, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x1C,
+0xF0, 0x90, 0x00, 0x04, 0x12, 0x06, 0xA2, 0x90, 0xA2, 0x1D, 0xF0, 0x90, 0xA2, 0x1B, 0xE0, 0xFF,
+0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13, 0xCE,
+0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x23, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x1C, 0xE0,
+0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0xEF, 0x78, 0x05, 0xCE, 0xC3, 0x13,
+0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0x25, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x1D,
+0xE0, 0xFF, 0x7E, 0x00, 0x7C, 0x01, 0x7D, 0x40, 0x12, 0x07, 0x03, 0x90, 0xA2, 0x27, 0xEE, 0xF0,
+0xA3, 0xEF, 0xF0, 0x90, 0xA2, 0x19, 0xE0, 0x30, 0xE0, 0x17, 0x90, 0xA2, 0x1E, 0x74, 0x01, 0xF0,
+0xA3, 0xF0, 0xA3, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07, 0x83, 0xE0, 0x44, 0x20, 0xF0,
+0x22, 0xE4, 0x90, 0xA2, 0x1E, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x07,
+0x83, 0xE0, 0x54, 0xDF, 0xF0, 0x22, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xBE, 0x90, 0xA2, 0xEB, 0x12,
+0x45, 0xB5, 0x12, 0x06, 0x89, 0x90, 0xA2, 0x29, 0xF0, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90,
+0xA2, 0x2A, 0xF0, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x7D, 0x02, 0x7F, 0x38, 0x02, 0x5E, 0x9D,
+0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0xFF, 0x90, 0xA1, 0xF2, 0xE0, 0x54, 0xFD, 0x4F, 0xF0,
+0xE0, 0xC3, 0x13, 0xFF, 0x54, 0x01, 0x90, 0x01, 0xE6, 0xF0, 0xA3, 0xE0, 0x54, 0xFE, 0xF0, 0xEF,
+0x30, 0xE0, 0x37, 0x12, 0x46, 0xC6, 0xEF, 0x54, 0x0F, 0x64, 0x04, 0x70, 0x25, 0x90, 0xA2, 0x13,
+0xE0, 0x30, 0xE0, 0x02, 0x80, 0x24, 0x90, 0xFD, 0x62, 0xE0, 0xB4, 0xAD, 0x13, 0xA3, 0xE0, 0xB4,
+0x35, 0x0E, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE, 0xF0, 0x90, 0x01, 0xE5, 0x74, 0xDF, 0xF0, 0x22,
+0x80, 0x00, 0x90, 0x01, 0xE7, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x01, 0xE7, 0xE0, 0x54, 0xFE,
+0xF0, 0x22, 0x12, 0x06, 0x89, 0x54, 0x01, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x90, 0xA1, 0xF2, 0xE0,
+0x54, 0xFB, 0x4F, 0xF0, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x08, 0x90, 0x07, 0x65, 0xE0,
+0x44, 0x18, 0xF0, 0x22, 0x90, 0xA2, 0x13, 0xE0, 0x20, 0xE0, 0x07, 0x90, 0x07, 0x65, 0xE0, 0x54,
+0xE7, 0xF0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0xA3, 0xF6, 0xF0, 0x90, 0xA3, 0xF6,
+0xE0, 0xFD, 0x70, 0x02, 0x81, 0x52, 0x90, 0x9F, 0xF3, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64,
+0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80,
+0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0xA3,
+0xEB, 0xE0, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33,
+0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x81, 0x2F, 0xE4, 0x90, 0xA3, 0xF7, 0xF0, 0x90,
+0xA3, 0xF7, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x73, 0x90, 0xA3, 0xEB, 0xE0, 0x75, 0xF0, 0x04,
+0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x2F, 0xF5,
+0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75, 0xF0, 0x08, 0x90,
+0x9F, 0xA3, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF,
+0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74,
+0xF0, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x9F, 0xF4, 0xE0, 0x75,
+0xF0, 0x08, 0x90, 0x9F, 0xA7, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83,
+0xF5, 0x83, 0xEF, 0xF0, 0x90, 0xA3, 0xF7, 0xE0, 0x04, 0xF0, 0x80, 0x83, 0x90, 0xA3, 0xF6, 0xE0,
+0xFF, 0x90, 0xA3, 0xEB, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8,
+0xFC, 0xF4, 0x5F, 0x90, 0xA3, 0xF6, 0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07,
+0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0x04,
+0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x9F, 0xF4, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0xB4, 0x0A,
+0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0x61, 0x0D, 0xE4, 0x90, 0x9F, 0xF4, 0xF0, 0x61, 0x0D, 0x90,
+0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0xA3, 0xEB, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0,
+0x90, 0xA3, 0xEB, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x45, 0xA9, 0xE0, 0x90, 0x01,
+0xC3, 0xF0, 0x22, 0xE4, 0x90, 0xA0, 0x8B, 0xF0, 0xA3, 0xF0, 0x90, 0x9F, 0xF3, 0xF0, 0xA3, 0xF0,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xC8, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0xA3, 0xC8, 0xE0, 0xFE, 0xA3, 0xE0, 0xF5, 0x82, 0x8E, 0x83,
+0xE0, 0x60, 0x2D, 0xC3, 0x90, 0xA3, 0xCB, 0xE0, 0x94, 0xE8, 0x90, 0xA3, 0xCA, 0xE0, 0x94, 0x03,
+0x40, 0x0B, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x00, 0x80, 0x15, 0x90, 0xA3, 0xCA,
+0xE4, 0x75, 0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0x80, 0xC5,
+0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF5, 0x82, 0xE4,
+0x34, 0xFB, 0xF5, 0x83, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xEE, 0x74, 0x00, 0x2D, 0xF5, 0x82,
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5, 0x82,
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5,
+0x83, 0xE0, 0x54, 0xF0, 0xF0, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0,
+0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10,
+0xF0, 0x22, 0x90, 0xA3, 0xCC, 0xEF, 0xF0, 0xA3, 0x12, 0x45, 0xBE, 0x90, 0xA3, 0xEC, 0xE0, 0xFE,
+0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x06, 0xE1, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB,
+0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0xA3, 0xCD, 0x12, 0x45, 0xB5, 0x8B,
+0x40, 0x8A, 0x41, 0x89, 0x42, 0x75, 0x43, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x35,
+0x26, 0x90, 0xA3, 0xCC, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03,
+0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x45, 0xB5, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x40,
+0xF5, 0x41, 0x89, 0x42, 0x90, 0xA3, 0xCD, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x0E, 0x12, 0x06, 0xA2,
+0xF5, 0x43, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x35, 0x26, 0x7B, 0x01, 0x7A, 0xA2, 0x79,
+0xEB, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x06, 0x90, 0xA2, 0xEB, 0xE0, 0xA3,
+0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01,
+0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xED, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F,
+0xF4, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xEE,
+0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01,
+0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xEB, 0x7F,
+0xF2, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x08, 0x90, 0xA2, 0xEB, 0xE0, 0x90, 0xA2, 0xF0,
+0xF0, 0x90, 0xA2, 0xEC, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0xA2,
+0xF4, 0xF0, 0x90, 0xA2, 0xF0, 0xE0, 0x90, 0xA2, 0xF5, 0xF0, 0x02, 0x6F, 0x0E, 0x90, 0xA3, 0xED,
+0x12, 0x45, 0xBE, 0xE4, 0xFF, 0x90, 0xA3, 0xED, 0x12, 0x45, 0xB5, 0x8F, 0x82, 0x75, 0x83, 0x00,
+0x12, 0x06, 0xA2, 0xFE, 0x74, 0xF0, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x02, 0xF5, 0x83, 0xEE, 0xF0,
+0x0F, 0xEF, 0xB4, 0x10, 0xE0, 0x22, 0x90, 0x00, 0xF1, 0xE0, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF,
+0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01,
+0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00,
+0x12, 0x3E, 0x50, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0,
+0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x3E,
+0x50, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0xE4,
+0x90, 0xA2, 0xDB, 0xF0, 0xA3, 0xF0, 0xD1, 0x81, 0xEF, 0x64, 0x01, 0x60, 0x45, 0xC3, 0x90, 0xA2,
+0xDC, 0xE0, 0x94, 0x88, 0x90, 0xA2, 0xDB, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0,
+0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x27, 0x90, 0xA2, 0xDB, 0xE4, 0x75,
+0xF0, 0x01, 0x12, 0x08, 0xD6, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x3E, 0x50, 0xD3, 0x90, 0xA2, 0xDC,
+0xE0, 0x94, 0x32, 0x90, 0xA2, 0xDB, 0xE0, 0x94, 0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30,
+0xE3, 0xB4, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xF9,
+0xF0, 0x74, 0x9E, 0xA3, 0xF0, 0x90, 0xA2, 0x2B, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x10, 0xED,
+0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x03, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xE6, 0x7F,
+0x01, 0x22, 0xE4, 0x90, 0x9F, 0x97, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22,
+0x90, 0x01, 0xE4, 0x74, 0x17, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x01, 0x34, 0xE0, 0x55,
+0x15, 0xF5, 0x19, 0xA3, 0xE0, 0x55, 0x16, 0xF5, 0x1A, 0xA3, 0xE0, 0x55, 0x17, 0xF5, 0x1B, 0xA3,
+0xE0, 0x55, 0x18, 0xF5, 0x1C, 0x90, 0x01, 0x34, 0xE5, 0x19, 0xF0, 0xA3, 0xE5, 0x1A, 0xF0, 0xA3,
+0xE5, 0x1B, 0xF0, 0xA3, 0xE5, 0x1C, 0xF0, 0x22, 0x90, 0x01, 0x3C, 0xE0, 0x55, 0x1D, 0xF5, 0x21,
+0xA3, 0xE0, 0x55, 0x1E, 0xF5, 0x22, 0xA3, 0xE0, 0x55, 0x1F, 0xF5, 0x23, 0xA3, 0xE0, 0x55, 0x20,
+0xF5, 0x24, 0x90, 0x01, 0x3C, 0xE5, 0x21, 0xF0, 0xA3, 0xE5, 0x22, 0xF0, 0xA3, 0xE5, 0x23, 0xF0,
+0xA3, 0xE5, 0x24, 0xF0, 0x53, 0x91, 0xDF, 0x22, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x05, 0xE4,
+0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x20, 0x90, 0xA1, 0x1A,
+0xE0, 0x60, 0x1A, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0xE4, 0x90,
+0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x90, 0xA3, 0xAF, 0x12, 0x48, 0x21, 0x22, 0x90, 0xA0,
+0x90, 0xE0, 0x64, 0x01, 0x70, 0x26, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x20, 0x90, 0x01, 0x57, 0xE4,
+0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA1,
+0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA0, 0x90,
+0xE0, 0xB4, 0x01, 0x14, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x0E, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE,
+0xF0, 0x54, 0x07, 0x70, 0x03, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x02, 0x11,
+0x24, 0x02, 0x48, 0x5B, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11,
+0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80,
+0x29, 0x90, 0xA1, 0x23, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1,
+0xB9, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x0F, 0x90, 0xA0, 0x90, 0xE0, 0xB4,
+0x01, 0x0B, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA1,
+0x16, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x2E, 0xEF, 0x54, 0xBF, 0xF0, 0x90,
+0x04, 0xE0, 0xE0, 0x90, 0xA1, 0x17, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x04, 0xE0,
+0x54, 0xFE, 0xF0, 0x90, 0xA1, 0xD3, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x07, 0x7D,
+0x01, 0x7F, 0x0C, 0x02, 0x56, 0x56, 0x12, 0x58, 0x4D, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC4,
+0x13, 0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x21, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0, 0xE0,
+0x90, 0xA1, 0x17, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFD, 0xF0,
+0x90, 0xA1, 0x1A, 0xE0, 0x60, 0x03, 0x12, 0x58, 0x4D, 0x90, 0xA1, 0xD1, 0xE0, 0xFF, 0xC4, 0x13,
+0x13, 0x54, 0x03, 0x30, 0xE0, 0x22, 0x90, 0xA1, 0xD4, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x18,
+0xEF, 0x54, 0xFD, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0xA1, 0xD4, 0x30, 0xE1, 0x06, 0xE0, 0x44,
+0x04, 0xF0, 0x80, 0x04, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x02, 0x31,
+0x12, 0x22, 0x90, 0xA2, 0x2C, 0xE0, 0x30, 0xE0, 0x35, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0,
+0x0D, 0x90, 0xA2, 0x37, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x30, 0xE0, 0x22, 0x75, 0xF0, 0x0D, 0xEF,
+0x90, 0xA2, 0x37, 0x12, 0x45, 0xA9, 0xEE, 0x54, 0xFE, 0xF0, 0x90, 0xA2, 0x2E, 0x74, 0x05, 0xF0,
+0x90, 0xA2, 0x2C, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x7F, 0x01, 0x12, 0x4D, 0x68, 0x22, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x1A, 0x90, 0x05, 0x22, 0xE0,
+0x54, 0x90, 0x60, 0x07, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x01, 0xC6, 0xE0, 0x30,
+0xE1, 0xE4, 0x7F, 0x00, 0x80, 0x02, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0xE4,
+0xFE, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFE, 0xF0, 0x75,
+0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0xBE, 0x03, 0x12, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5,
+0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x74, 0x80, 0xF0, 0x80, 0x0F, 0x12, 0x45, 0xA9, 0xE5, 0x82,
+0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0, 0x75, 0xF0, 0x08, 0xEF, 0x90, 0x89,
+0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2E, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0xF0,
+0x0E, 0xBE, 0x10, 0xAD, 0x0F, 0xBF, 0x80, 0xA7, 0xE4, 0x90, 0xAD, 0xE2, 0xF0, 0x90, 0x94, 0x91,
+0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xFF, 0xE4, 0xFE, 0x75, 0xF0, 0x0A, 0xEF, 0x90,
+0x8D, 0x01, 0x12, 0x45, 0xA9, 0x75, 0xF0, 0x02, 0xEE, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0xA3, 0xF0,
+0x0E, 0xBE, 0x05, 0xE7, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0x74, 0x13,
+0xF0, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x01, 0x2F,
+0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x01, 0xF5,
+0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82, 0xE4,
+0x34, 0x98, 0xF5, 0x83, 0xE4, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B,
+0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0xEF, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C,
+0xF5, 0x83, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x16, 0x12, 0x45, 0xA9,
+0x74, 0x13, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x75,
+0xF0, 0x04, 0xEF, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xE0, 0x44, 0x09, 0xF0, 0x75,
+0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF3, 0xF0, 0x75, 0xF0, 0x04,
+0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90,
+0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x44, 0x20, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19,
+0x12, 0x45, 0xA9, 0xE0, 0x54, 0xCF, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45,
+0xA9, 0xE0, 0x44, 0x40, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0,
+0x54, 0x7F, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x75,
+0xF0, 0x10, 0xEF, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xEE, 0xF0, 0x74, 0x16, 0x2F, 0xF5, 0x82,
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE4, 0xF0, 0x0F, 0xEF, 0x64, 0x80, 0x60, 0x02, 0x21, 0xE9, 0x74,
+0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x22, 0x90, 0xA3, 0x36,
+0xEB, 0xF0, 0x70, 0x6C, 0x90, 0xA3, 0x36, 0xE0, 0xFE, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98,
+0xF5, 0x83, 0xE0, 0xFC, 0x90, 0xA3, 0x37, 0xE0, 0xFB, 0xEC, 0x6B, 0x60, 0x53, 0x90, 0xA3, 0x3B,
+0xEB, 0xF0, 0xA3, 0xEE, 0xF0, 0xAE, 0x05, 0xEE, 0x25, 0xE0, 0x4F, 0xFF, 0x90, 0x9F, 0x96, 0xE0,
+0xFE, 0x25, 0xE0, 0x25, 0xE0, 0x4F, 0x90, 0xA3, 0x3D, 0xF0, 0x90, 0xA3, 0x38, 0xE0, 0x90, 0xA3,
+0x3F, 0xF0, 0x90, 0xA3, 0x39, 0x74, 0x0C, 0xF0, 0x90, 0xA3, 0x47, 0x74, 0x04, 0xF0, 0x7B, 0x01,
+0x7A, 0xA3, 0x79, 0x39, 0x12, 0x6F, 0xEA, 0x7F, 0x04, 0x12, 0x6C, 0xE0, 0x90, 0xA3, 0x37, 0xE0,
+0xFF, 0x90, 0xA3, 0x36, 0xE0, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xEF, 0xF0,
+0x22, 0xE4, 0xF5, 0x5E, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE0, 0xFE,
+0xB4, 0x02, 0x08, 0xED, 0xC3, 0x94, 0x11, 0x40, 0x29, 0x80, 0x1F, 0xEE, 0xB4, 0x01, 0x08, 0xED,
+0xC3, 0x94, 0x0A, 0x40, 0x1D, 0x80, 0x13, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5,
+0x83, 0xE0, 0x70, 0x0B, 0xED, 0xC3, 0x94, 0x03, 0x40, 0x08, 0x75, 0x5E, 0x01, 0x80, 0x03, 0xE4,
+0xF5, 0x5E, 0xAF, 0x5E, 0x22, 0x8F, 0x52, 0x8D, 0x53, 0x8B, 0x54, 0x75, 0xF0, 0x04, 0xEF, 0x90,
+0x96, 0x17, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x16, 0x12,
+0x45, 0xA9, 0xE0, 0xFD, 0x2F, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0x90, 0xA2, 0xEE,
+0xF0, 0xE5, 0x53, 0xD3, 0x94, 0x2D, 0x40, 0x02, 0x80, 0x19, 0xE5, 0x53, 0xD3, 0x94, 0x19, 0x40,
+0x05, 0x90, 0xA2, 0xEE, 0x80, 0x0B, 0x75, 0xF0, 0x04, 0xE5, 0x52, 0x90, 0x96, 0x17, 0x12, 0x45,
+0xA9, 0xE0, 0xFD, 0x85, 0x54, 0x6A, 0xE4, 0xFB, 0xAF, 0x52, 0x02, 0x77, 0x11, 0x90, 0xA2, 0xEB,
+0x12, 0x45, 0xBE, 0x12, 0x06, 0x89, 0xF5, 0x51, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5,
+0x83, 0xE0, 0x54, 0x9C, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83,
+0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12,
+0x06, 0xA2, 0x54, 0x01, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51,
+0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB,
+0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x02, 0xFE, 0xEF, 0x4E, 0xD0, 0x82,
+0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83,
+0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45, 0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2,
+0x54, 0x40, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82,
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0xA2, 0xEB, 0x12, 0x45,
+0xB5, 0x90, 0x00, 0x03, 0x12, 0x06, 0xA2, 0x54, 0x20, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83,
+0xF0, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x16, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x74,
+0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xEF, 0xF0, 0x80, 0x0F, 0xE5, 0x51,
+0xB4, 0x80, 0x0A, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0x90, 0x95, 0x95, 0xF0, 0x74, 0x16, 0x25,
+0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x30, 0xE5, 0x22, 0x75, 0xF0, 0x04, 0xE5,
+0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x74, 0x96, 0x25,
+0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x51, 0x71, 0xD5, 0x22, 0xAB,
+0x07, 0x75, 0xF0, 0x10, 0xEB, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x5E, 0xE4, 0xF5,
+0x62, 0xE5, 0x5E, 0x54, 0x7F, 0xF9, 0xE5, 0x5E, 0x54, 0x80, 0xFA, 0x75, 0xF0, 0x04, 0xEB, 0x90,
+0x96, 0x16, 0x12, 0x45, 0xA9, 0xE0, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x19, 0x12,
+0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xF5, 0x61, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73,
+0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5,
+0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x5E, 0x4A, 0xFF, 0x74,
+0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xEB, 0x90,
+0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xF5, 0x5F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4,
+0x34, 0x9D, 0xF5, 0x83, 0xE5, 0x5F, 0xF0, 0xE9, 0x64, 0x2C, 0x70, 0x33, 0x75, 0xF0, 0x04, 0xEB,
+0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0x54, 0x03, 0xFE, 0xE5, 0x5F, 0xC3, 0x9E, 0x50,
+0x1E, 0x05, 0x5F, 0xE5, 0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0xEB,
+0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xEF, 0x54, 0xF3, 0x4E, 0xF0, 0x89, 0x5E, 0xC1, 0xC7, 0xE9,
+0xC3, 0x95, 0x60, 0x50, 0x6B, 0xE9, 0x04, 0xFD, 0xED, 0xD3, 0x95, 0x60, 0x40, 0x02, 0xC1, 0xC7,
+0xED, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08, 0xEB, 0x90, 0x89, 0x00, 0x12, 0x45,
+0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83,
+0x00, 0xED, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xC3, 0x33,
+0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1D,
+0xB9, 0x13, 0x14, 0x79, 0x18, 0x89, 0x5E, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5,
+0x83, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x60, 0xA9, 0x05, 0x89, 0x5E, 0x80, 0x5A, 0x0D, 0x80, 0x98,
+0xE9, 0x65, 0x60, 0x70, 0x43, 0x75, 0xF0, 0x04, 0xEB, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0,
+0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x5E, 0x20, 0xE7, 0x07, 0xE9, 0x44, 0x80,
+0xF5, 0x5E, 0x80, 0x33, 0xE9, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41,
+0xF5, 0x83, 0x12, 0x45, 0x7D, 0xEB, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5,
+0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x80, 0x0F, 0x74, 0x16, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0x9F,
+0xF5, 0x83, 0xE5, 0x60, 0xF0, 0xF5, 0x5E, 0xAF, 0x03, 0x85, 0x5F, 0x6A, 0x7B, 0x01, 0xAD, 0x5E,
+0x02, 0x77, 0x11, 0xAA, 0x07, 0xAB, 0x05, 0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x00, 0x12, 0x45,
+0xA9, 0xE0, 0xF5, 0x5E, 0x54, 0x7F, 0xF5, 0x60, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x17, 0x12,
+0x45, 0xA9, 0xE0, 0x90, 0xA2, 0xFB, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x16, 0x12, 0x45,
+0xA9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0xEA, 0x90, 0x81, 0x05, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03,
+0xF5, 0x5F, 0xE5, 0x60, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xE4,
+0x93, 0xFC, 0x74, 0x01, 0x93, 0xFD, 0xEA, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94,
+0xF5, 0x83, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12, 0x45,
+0xA9, 0xE0, 0xFE, 0xC4, 0x54, 0x03, 0x90, 0xA2, 0xF9, 0xF0, 0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4,
+0x34, 0x9F, 0xF5, 0x83, 0xE5, 0x60, 0xF0, 0x74, 0x16, 0x2A, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5,
+0x83, 0xE5, 0x5F, 0xF0, 0xE5, 0x60, 0xD3, 0x9F, 0x40, 0x04, 0x8F, 0x60, 0x8F, 0x5E, 0xEB, 0x70,
+0x03, 0x02, 0xA8, 0x51, 0xAF, 0x03, 0x8F, 0x61, 0xE5, 0x5E, 0x30, 0xE7, 0x05, 0x85, 0x60, 0x5E,
+0x15, 0x61, 0xE5, 0x61, 0x70, 0x03, 0x02, 0xA8, 0x51, 0xE5, 0x60, 0x64, 0x2C, 0x70, 0x2A, 0xE5,
+0x5F, 0xD3, 0x94, 0x00, 0x40, 0x23, 0xE5, 0x5F, 0xD3, 0x94, 0x02, 0x50, 0x1C, 0x15, 0x5F, 0xE5,
+0x5F, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xEA, 0x90, 0x96, 0x19, 0x12,
+0x45, 0xA9, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0x15, 0x61, 0xE5, 0x61, 0x70, 0x03, 0x02, 0xA8, 0x51,
+0x90, 0xA2, 0xFB, 0xE0, 0xFF, 0xE5, 0x60, 0xD3, 0x9F, 0x50, 0x03, 0x02, 0xA8, 0x4B, 0xE4, 0x90,
+0xA2, 0xFA, 0xF0, 0x85, 0x60, 0x5E, 0xAD, 0x5E, 0xE5, 0x60, 0x14, 0xFC, 0x90, 0xA2, 0xFB, 0xE0,
+0xFF, 0xEC, 0xC3, 0x9F, 0x40, 0x5F, 0xEC, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x08,
+0xEA, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5,
+0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xEC, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8,
+0x07, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE,
+0xEF, 0x55, 0x82, 0x4E, 0x60, 0x1C, 0xE5, 0x60, 0xAD, 0x04, 0xB4, 0x14, 0x02, 0x7D, 0x0C, 0x90,
+0xA2, 0xFA, 0xE0, 0x04, 0xF0, 0xE0, 0x65, 0x61, 0x60, 0x0B, 0xA3, 0xE0, 0xFF, 0xED, 0xD3, 0x9F,
+0x40, 0x03, 0x1C, 0x80, 0x97, 0xAF, 0x05, 0x8F, 0x5E, 0x80, 0x06, 0x90, 0xA2, 0xFB, 0xE0, 0xF5,
+0x5E, 0xAF, 0x02, 0x85, 0x5F, 0x6A, 0xE4, 0xFB, 0xAD, 0x5E, 0x02, 0x77, 0x11, 0xE4, 0xF5, 0x51,
+0x74, 0x90, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0xA0, 0xF5, 0x83, 0xE0, 0x70, 0x03, 0x02, 0xB0,
+0x52, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFF, 0xC4, 0x13,
+0x13, 0x13, 0x54, 0x01, 0x30, 0xE0, 0x03, 0x02, 0xB0, 0x52, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x01,
+0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xA3, 0xE0, 0xD3, 0x94, 0x00, 0xEE, 0x94,
+0x00, 0x50, 0x03, 0x02, 0xB0, 0x52, 0xE5, 0x51, 0x75, 0xF0, 0x0A, 0xA4, 0x24, 0x01, 0xF9, 0x74,
+0x8D, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xBE, 0xE5, 0x51, 0x25, 0xE0,
0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xF5, 0x56, 0xA3, 0xE0, 0xF5, 0x57,
-0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA2, 0xB7,
+0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x98, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0xA2, 0xED,
0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x00, 0x02, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x12, 0x07,
0x80, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE,
0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90,
-0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0xA2, 0xB9, 0xF0, 0xA3,
-0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFD, 0xC3, 0xEF, 0x9D, 0xFF, 0xEE, 0x95, 0xF0, 0x90, 0xA2, 0xBB,
-0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49, 0xE0,
+0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0x90, 0xA2, 0xEF, 0xF0, 0xA3,
+0xEF, 0xF0, 0x12, 0x07, 0x80, 0xFD, 0xC3, 0xEF, 0x9D, 0xFF, 0xEE, 0x95, 0xF0, 0x90, 0xA2, 0xF1,
+0xF0, 0xA3, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0,
0xF5, 0x52, 0x54, 0x7F, 0xF5, 0x53, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x16, 0x12, 0x45,
-0x49, 0xE0, 0x90, 0xA2, 0xBD, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45,
-0x49, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0xBE, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5,
-0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x61, 0xD1, 0x90, 0xA2,
-0xBD, 0xE0, 0xFF, 0xE5, 0x53, 0x9F, 0x40, 0x08, 0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52,
+0xA9, 0xE0, 0x90, 0xA2, 0xF3, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45,
+0xA9, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x03, 0x90, 0xA2, 0xF4, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5,
+0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0x81, 0x4B, 0x90, 0xA2,
+0xF3, 0xE0, 0xFF, 0xE5, 0x53, 0x9F, 0x40, 0x08, 0x8F, 0x53, 0x53, 0x52, 0x80, 0xEF, 0x42, 0x52,
0xE5, 0x53, 0x90, 0x41, 0x5F, 0x93, 0xFF, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99,
0xF5, 0x83, 0xE0, 0xC3, 0x9F, 0xE5, 0x53, 0x40, 0x05, 0x90, 0x41, 0x37, 0x80, 0x03, 0x90, 0x41,
-0x4B, 0x93, 0xF5, 0x58, 0x90, 0xA1, 0xCF, 0xE0, 0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05,
-0xE5, 0x53, 0xB4, 0x0B, 0x05, 0x90, 0xA1, 0xD1, 0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05,
-0xE5, 0x53, 0xB4, 0x0A, 0x05, 0x90, 0xA1, 0xD2, 0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05,
-0xE5, 0x53, 0xB4, 0x09, 0x05, 0x90, 0xA1, 0xD3, 0x80, 0x03, 0x90, 0xA1, 0xD0, 0xE0, 0xF5, 0x5C,
+0x4B, 0x93, 0xF5, 0x58, 0x90, 0xA2, 0x0E, 0xE0, 0x60, 0x7D, 0xE5, 0x53, 0x64, 0x13, 0x60, 0x05,
+0xE5, 0x53, 0xB4, 0x0B, 0x05, 0x90, 0xA2, 0x10, 0x80, 0x23, 0xE5, 0x53, 0x64, 0x12, 0x60, 0x05,
+0xE5, 0x53, 0xB4, 0x0A, 0x05, 0x90, 0xA2, 0x11, 0x80, 0x13, 0xE5, 0x53, 0x64, 0x11, 0x60, 0x05,
+0xE5, 0x53, 0xB4, 0x09, 0x05, 0x90, 0xA2, 0x12, 0x80, 0x03, 0x90, 0xA2, 0x0F, 0xE0, 0xF5, 0x5C,
0xE5, 0x5C, 0xC3, 0x94, 0x80, 0x50, 0x28, 0xE5, 0x5C, 0x94, 0x1B, 0x40, 0x02, 0x80, 0x13, 0xE5,
0x58, 0x25, 0x5C, 0xFF, 0xE4, 0x33, 0xFE, 0xD3, 0xEF, 0x94, 0x1B, 0xEE, 0x64, 0x80, 0x94, 0x80,
0x40, 0x05, 0x75, 0x58, 0x1B, 0x80, 0x20, 0xE5, 0x5C, 0x25, 0x58, 0xF5, 0x58, 0x80, 0x18, 0xC3,
0xE4, 0x95, 0x5C, 0xF5, 0x5C, 0xE5, 0x58, 0xD3, 0x95, 0x5C, 0x40, 0x08, 0xE5, 0x58, 0x95, 0x5C,
0xF5, 0x58, 0x80, 0x03, 0xE4, 0xF5, 0x58, 0xE5, 0x58, 0x75, 0xF0, 0x06, 0xA4, 0x24, 0x95, 0xF9,
-0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x90, 0xA2, 0xB1, 0x12, 0x45, 0x5E, 0xE5, 0x52, 0x90,
-0x42, 0x0B, 0x93, 0xFF, 0xD3, 0x90, 0xA2, 0xB8, 0xE0, 0x9F, 0x90, 0xA2, 0xB7, 0xE0, 0x94, 0x00,
-0x40, 0x05, 0x12, 0xA4, 0xB4, 0xC1, 0xDA, 0xC3, 0xE5, 0x57, 0x94, 0x0F, 0xE5, 0x56, 0x94, 0x00,
-0x50, 0x5E, 0x90, 0xA2, 0xB4, 0x12, 0x45, 0x55, 0x90, 0x00, 0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE,
-0xF0, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5, 0xF0, 0x3E, 0xFC, 0xE5, 0x56, 0xC3,
-0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x02, 0x61, 0xA6, 0xE5,
-0x57, 0xAE, 0x56, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0xE5,
-0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2D, 0xFF, 0xEE, 0x3C, 0xFE, 0x90, 0xA2, 0xB4, 0x12,
-0x45, 0x55, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E, 0x50, 0x02, 0x61, 0xA9, 0x61, 0x86,
-0xE5, 0x51, 0x70, 0x50, 0x90, 0xA2, 0xB4, 0x12, 0x45, 0x55, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB,
-0xFD, 0xAC, 0xF0, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xC3, 0xED, 0x9F, 0xEC,
-0x9E, 0x50, 0x08, 0x90, 0x9F, 0x96, 0x74, 0x01, 0xF0, 0x80, 0x29, 0xE5, 0x57, 0xAE, 0x56, 0x78,
-0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE,
-0xE5, 0x57, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x05, 0xE4,
-0x90, 0x9F, 0x96, 0xF0, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x40, 0x05, 0x75,
-0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75,
-0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4,
-0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5, 0x55, 0xE4, 0xF5, 0x5D, 0x90, 0xA2,
-0xB4, 0x12, 0x45, 0x55, 0x75, 0xF0, 0x02, 0xE5, 0x5D, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12,
-0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9,
-0xFF, 0x90, 0xA2, 0xB1, 0x12, 0x45, 0x55, 0x85, 0x5D, 0x82, 0x75, 0x83, 0x00, 0x12, 0x06, 0xA2,
-0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54,
-0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xB7, 0x90, 0xA2, 0xB1, 0x12, 0x45, 0x55, 0x90, 0x00, 0x05,
-0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE,
-0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03, 0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54,
-0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54, 0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4,
-0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5,
-0x83, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xAE, 0x54, 0xFF, 0xE4, 0xFC, 0xFD, 0xE5, 0x53,
-0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0x12, 0x45, 0x39,
-0xC3, 0x12, 0x45, 0x00, 0x50, 0x07, 0xAF, 0x51, 0x12, 0xA6, 0x3B, 0x80, 0x1C, 0xE5, 0x53, 0x25,
-0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83, 0xD3, 0x74, 0x01, 0x93, 0x95, 0x55,
-0xE4, 0x93, 0x95, 0x54, 0x40, 0x03, 0x12, 0xA4, 0xB4, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5,
-0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xA3, 0xE0, 0x90, 0xA3, 0x02, 0xF0, 0x90, 0xA3, 0x01, 0xE5,
-0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD, 0xFF, 0x12, 0x7E, 0x31, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xC1,
-0xAE, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05,
-0x60, 0x02, 0xA1, 0x44, 0xAD, 0x53, 0xAF, 0x51, 0x12, 0xA0, 0x55, 0x74, 0x16, 0x25, 0x51, 0xF5,
-0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01,
-0x12, 0x45, 0x49, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34,
-0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xC3, 0x94, 0x30, 0x50, 0x11, 0xE4, 0xF5, 0x5B, 0x74, 0x96, 0x25,
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0x81, 0xC9, 0x74, 0x16, 0x25, 0x51, 0xF5,
-0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0xF2, 0x74, 0x96, 0x25,
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x4D, 0xEF, 0x24, 0x05,
-0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0,
-0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x2E, 0xED, 0x24, 0x05, 0xFF,
-0xE4, 0x33, 0xFE, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xD3,
-0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x98, 0x50, 0x10, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82,
-0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0, 0x65, 0x53, 0x60, 0x3B, 0xE5, 0x5B, 0x70, 0x05, 0x75, 0x5B,
-0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4, 0x01, 0x05, 0x75, 0x5B, 0x03, 0x80, 0x03, 0x75, 0x5B, 0x05,
-0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x01, 0x25,
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82,
-0xE4, 0x34, 0x9A, 0x80, 0x29, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83,
-0xE4, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x04, 0xF0,
-0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83,
-0xE4, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x53, 0xF0,
-0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0xC4, 0x13, 0x13, 0x54,
-0x03, 0x20, 0xE0, 0x02, 0xC1, 0x8B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5,
-0x83, 0xE4, 0xF0, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83,
-0xE4, 0xF0, 0xC1, 0x8B, 0xEC, 0x64, 0x06, 0x60, 0x02, 0xC1, 0xAE, 0xF5, 0x54, 0xF5, 0x55, 0x75,
-0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xD3,
-0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56, 0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3,
-0xE5, 0x57, 0x94, 0xFA, 0xE5, 0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4,
-0xF5, 0x59, 0xE5, 0x57, 0xAE, 0x56, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13,
-0xD8, 0xF9, 0xFF, 0x90, 0x42, 0x24, 0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA2,
-0xC0, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x5A, 0x90, 0xA2, 0xB4, 0x12, 0x45, 0x55, 0x75,
-0xF0, 0x02, 0xE5, 0x5A, 0xA4, 0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8,
-0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42,
-0x1F, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54,
-0xF5, 0x54, 0xC3, 0x90, 0xA2, 0xC1, 0xE0, 0x95, 0x55, 0x90, 0xA2, 0xC0, 0xE0, 0x95, 0x54, 0x40,
-0x07, 0x05, 0x5A, 0xE5, 0x5A, 0xB4, 0x05, 0xB1, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B,
-0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2, 0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06,
-0xEF, 0x95, 0x5A, 0xFF, 0x80, 0x02, 0xE4, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34,
-0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13, 0xFE, 0xEF, 0xC4, 0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0x74,
-0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x01, 0x25, 0x51,
-0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01, 0x25,
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5,
-0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x25, 0xE0, 0xFF, 0x70,
-0x04, 0xF5, 0x5B, 0x80, 0x04, 0xEF, 0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA2, 0xB8, 0xE0, 0x94, 0x03,
-0x90, 0xA2, 0xB7, 0xE0, 0x94, 0x00, 0x40, 0x03, 0xE4, 0xF5, 0x5B, 0x75, 0xF0, 0x10, 0xE5, 0x51,
-0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xF8, 0x90, 0xA2, 0xC2, 0xF0, 0x45, 0x5B, 0xFF,
-0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x74, 0x96,
-0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x96, 0x50,
-0x0E, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25,
-0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x81, 0x25, 0x51, 0xF5, 0x82,
-0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xE1, 0xD0, 0x90, 0xA2, 0xB7, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25,
-0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D,
-0xEA, 0x9C, 0xE5, 0x51, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5,
-0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4,
-0x34, 0x9B, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xB9, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16,
-0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5,
-0x51, 0x50, 0x13, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F,
-0xF0, 0x12, 0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5,
-0x83, 0x74, 0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xBB, 0xE0, 0xFE, 0xA3, 0xE0, 0xFB, 0xC3, 0x74,
-0xFF, 0x9B, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0x74, 0xFF, 0x94, 0x00, 0xFD, 0x74, 0xFF, 0x94, 0x00,
-0xFC, 0x90, 0x94, 0x91, 0x12, 0x45, 0x2D, 0xD3, 0x12, 0x45, 0x00, 0x90, 0x94, 0x91, 0x50, 0x19,
-0x12, 0x45, 0x2D, 0x90, 0xA2, 0xBB, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x12, 0x44,
-0xD9, 0x90, 0x94, 0x91, 0x12, 0x08, 0x6D, 0x80, 0x07, 0x12, 0x08, 0x79, 0xFF, 0xFF, 0xFF, 0xFF,
-0xE4, 0xFD, 0xAF, 0x51, 0x12, 0xA3, 0x15, 0x05, 0x51, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x03,
-0x02, 0xA7, 0xD1, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xA9, 0xEF, 0xF0,
-0x75, 0xF0, 0x04, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x1F, 0xFB, 0x24, 0xF1, 0x50,
-0x02, 0x01, 0x86, 0xE4, 0xF5, 0x6B, 0x90, 0xA3, 0xA9, 0xE0, 0xFD, 0x75, 0xF0, 0x08, 0x90, 0x89,
-0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0,
-0xFE, 0xEB, 0x75, 0xF0, 0x07, 0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5,
-0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90,
-0xA3, 0xAC, 0xF0, 0x75, 0xF0, 0x04, 0xED, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0x03,
-0xFF, 0xBF, 0x02, 0x0B, 0xE5, 0x6B, 0x70, 0x07, 0x90, 0xA3, 0xAC, 0xE0, 0x54, 0xF0, 0xF0, 0x90,
-0xA3, 0xAC, 0xE0, 0xFF, 0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45,
-0x49, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x6B,
-0xE5, 0x6B, 0x64, 0x07, 0x70, 0x80, 0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x19,
-0x12, 0x45, 0x49, 0xE0, 0xFF, 0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA3, 0xAA, 0xF0, 0x75, 0x6C,
-0x06, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, 0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89,
-0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54,
-0x0F, 0x80, 0x19, 0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49,
-0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0xAB, 0xF0,
-0x90, 0xA3, 0xAB, 0xE0, 0x60, 0x41, 0x75, 0x6B, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08,
-0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xAB, 0xE0, 0xFB, 0xEF,
-0x5B, 0x60, 0x1B, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0x90, 0xA3, 0xAA, 0xF0, 0xED,
-0x60, 0x24, 0xE0, 0xD3, 0x94, 0x0B, 0x40, 0x1E, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x18, 0x15, 0x6B,
-0xE5, 0x6B, 0xC3, 0x94, 0x00, 0x50, 0xC2, 0xE5, 0x6C, 0x60, 0x0B, 0x15, 0x6C, 0xE5, 0x6C, 0xC3,
-0x94, 0x00, 0x40, 0x02, 0x01, 0xA1, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF,
-0x90, 0xA3, 0xA9, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2F,
-0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3, 0xA9, 0xE0,
-0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4,
-0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0xAB, 0xF0, 0x90, 0xA3, 0xAB, 0xE0, 0x60, 0x3C, 0xE4,
-0xF5, 0x6B, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE,
-0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xAB, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x18, 0xE5, 0x6C, 0x75, 0xF0,
-0x08, 0xA4, 0x25, 0x6B, 0xFC, 0xED, 0x60, 0x1D, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x17, 0x74, 0x20,
-0x2C, 0xFC, 0x80, 0x11, 0x05, 0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xC7, 0x05, 0x6C, 0xE5, 0x6C, 0x64,
-0x07, 0x60, 0x02, 0x21, 0x3A, 0x90, 0xA3, 0xAA, 0xE0, 0xFF, 0x90, 0xA3, 0xA9, 0xE0, 0xFE, 0x75,
-0xF0, 0x04, 0x90, 0x96, 0x16, 0x12, 0x45, 0x49, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x96,
-0x17, 0x12, 0x45, 0x49, 0xEC, 0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x45, 0x49,
-0xE0, 0xFE, 0x54, 0x7F, 0xF5, 0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3, 0x9F, 0x40, 0x09,
-0x90, 0xA3, 0xAA, 0xE0, 0x4E, 0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C, 0x50, 0x06, 0xAF,
-0x06, 0xEC, 0x4F, 0xF5, 0x6D, 0x90, 0xA3, 0xA9, 0xE0, 0xFF, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34,
-0x9E, 0xF5, 0x83, 0xE5, 0x6D, 0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49,
-0xE0, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x6A, 0x90, 0xA3, 0xA9, 0xE0, 0xFF, 0xE4, 0xFB, 0xAD, 0x6D,
-0x12, 0xA0, 0x99, 0x90, 0xA3, 0xA9, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x03, 0x12, 0x45,
-0x49, 0xE4, 0xF0, 0x90, 0xA3, 0xAA, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x0F, 0x74, 0x96, 0x2F,
-0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x23, 0xEE, 0xC3, 0x94, 0x04,
-0x90, 0xA3, 0xA9, 0xE0, 0x40, 0x0E, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74,
-0x01, 0xF0, 0x80, 0x0B, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE4, 0xF0, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06,
-0xA2, 0xFF, 0x54, 0x1F, 0xF5, 0x53, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5,
-0x52, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, 0x30, 0xC4,
-0x54, 0x0F, 0xF5, 0x57, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13,
-0x54, 0x03, 0xF5, 0x55, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x56, 0x90,
-0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF,
-0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33,
-0x54, 0x80, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54,
-0x7F, 0x4F, 0xF0, 0xE5, 0x55, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, 0x75, 0xF0, 0x04,
-0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x60,
-0x02, 0x61, 0xFE, 0xE5, 0x53, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x18,
-0x12, 0x45, 0x49, 0xE0, 0x54, 0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x04,
-0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0,
-0x25, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0, 0x54,
-0xF3, 0x4F, 0xF0, 0xE5, 0x52, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5,
-0x51, 0x90, 0x96, 0x18, 0x12, 0x45, 0x49, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03,
-0xC4, 0x54, 0xF0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0x49, 0xE0,
-0x54, 0xCF, 0x4F, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0,
-0x54, 0xFB, 0xF0, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF,
-0xE5, 0x5A, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82,
-0x75, 0x83, 0x00, 0xA3, 0xA3, 0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0x90,
-0x89, 0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x25, 0x58, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83,
-0xEF, 0xF0, 0x05, 0x58, 0xE5, 0x58, 0xB4, 0x04, 0xD4, 0xAF, 0x51, 0x12, 0xAF, 0xE4, 0x22, 0xD3,
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xD5, 0xEF, 0xF0, 0x7F, 0x8F, 0x12, 0x4C, 0x74,
-0xEF, 0x30, 0xE6, 0x4D, 0x7F, 0x8D, 0x12, 0x4C, 0x74, 0xEF, 0x64, 0x01, 0x70, 0x43, 0x90, 0xA3,
-0xD6, 0xF0, 0x90, 0xA3, 0xD6, 0xE0, 0xFD, 0x90, 0xA3, 0xD5, 0xE0, 0x75, 0xF0, 0x10, 0x90, 0x81,
-0x00, 0x12, 0x45, 0x49, 0xE5, 0x82, 0x2D, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFB,
-0xE4, 0xFF, 0x12, 0x47, 0xA8, 0x90, 0xA3, 0xD6, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40,
-0xD1, 0x7F, 0x8F, 0x12, 0x4C, 0x74, 0xEF, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x46,
-0x4F, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x90, 0xA3, 0x25, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90, 0xA3, 0x2F, 0x12,
-0x08, 0x6D, 0x90, 0xA3, 0x27, 0x12, 0x45, 0x11, 0x12, 0x08, 0x3A, 0x90, 0xA3, 0x2F, 0x12, 0x45,
-0x2D, 0x12, 0x44, 0xE6, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3, 0x27, 0x12,
-0x45, 0x11, 0x90, 0xA3, 0x2B, 0x12, 0x45, 0x2D, 0x12, 0x44, 0xE6, 0xD0, 0x03, 0xD0, 0x02, 0xD0,
-0x01, 0xD0, 0x00, 0x12, 0x44, 0xF3, 0x90, 0xA3, 0x33, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x33, 0x12,
-0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x25, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA1, 0xFB, 0x12, 0x45, 0x49, 0xE0, 0xFE,
-0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x90, 0xA3, 0xDC, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x02, 0xA1, 0xF4, 0x90, 0x06, 0x03, 0xE0, 0x54,
-0xFB, 0xF0, 0x90, 0xA3, 0xDC, 0xE0, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04, 0x42, 0xE0, 0x54,
-0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3,
-0x2B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x08, 0x91, 0x6A, 0x90, 0xA3,
-0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x91, 0x6A, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x00, 0x10, 0x90, 0xA3, 0xDC, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4,
-0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x6D,
-0x7F, 0x00, 0x7E, 0x0A, 0x91, 0x6A, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00,
-0x90, 0xA3, 0xDC, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A,
-0x12, 0x08, 0x5A, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0D, 0x91, 0x6A, 0x90,
-0xA3, 0x27, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x90, 0xA3, 0xDC, 0xE0, 0xFF, 0xE4, 0xFC,
-0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x1A, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x2B, 0x12,
-0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08, 0x91, 0x6A, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x0C, 0x00, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x91, 0x66, 0x90, 0xA3,
-0x15, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x19, 0x12, 0x08, 0x79, 0x00, 0x00,
-0x04, 0x00, 0x80, 0x65, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3, 0x27, 0x12, 0x08,
-0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F,
-0x00, 0x7E, 0x08, 0x91, 0x6A, 0x90, 0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90,
-0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0x91, 0x6A, 0x90,
-0xA3, 0x27, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x2B, 0x12, 0x08, 0x79, 0x00,
-0x00, 0x0C, 0x00, 0x91, 0x66, 0x90, 0xA3, 0x15, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90,
-0xA3, 0x19, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x76, 0xFA, 0xD0, 0xD0, 0x92, 0xAF,
-0x22, 0x90, 0xA1, 0xF7, 0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04, 0x54,
-0x07, 0x25, 0xE0, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x90, 0xA1, 0xF7, 0xE0, 0xFE, 0xC3, 0x13, 0x54,
-0x07, 0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x12, 0x50, 0x63, 0xE4, 0x90, 0xA1, 0xF9, 0xF0,
-0x12, 0x4F, 0xFA, 0x90, 0xA1, 0xF7, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0x75, 0xF0, 0x0D,
-0x90, 0xA1, 0xFA, 0x12, 0x45, 0x49, 0xE0, 0xFA, 0x75, 0xF0, 0x0D, 0xED, 0x90, 0xA1, 0xFB, 0x12,
-0x45, 0x49, 0xE0, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE, 0xC4, 0x54,
-0x0F, 0x90, 0xA3, 0xB0, 0xF0, 0xAF, 0x02, 0x12, 0x76, 0x79, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13,
-0x54, 0x07, 0x75, 0xF0, 0x0D, 0x91, 0xD8, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF,
-0x75, 0xF0, 0x0D, 0x90, 0xA2, 0x05, 0x12, 0x45, 0x49, 0xE0, 0x04, 0xF0, 0x75, 0xF0, 0x0D, 0xEF,
-0x12, 0x4E, 0xC7, 0x90, 0xA1, 0xF7, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFD, 0xE4, 0xFF, 0x02, 0x75,
-0x90, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xA5, 0x7F, 0xFB, 0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01,
-0x16, 0x90, 0xA2, 0xA5, 0xE0, 0x54, 0x30, 0xFF, 0xBF, 0x20, 0x07, 0x90, 0xA2, 0x21, 0x74, 0x01,
-0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x21, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F,
-0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA2, 0xA8, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09,
-0x12, 0x37, 0x4E, 0x90, 0xA2, 0xAC, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xA8, 0x12, 0x45, 0x11, 0xEF,
-0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA2, 0xA8, 0x12, 0x45, 0x11,
-0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA2, 0xA8, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xA8, 0x12, 0x45,
-0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0xA2,
-0xAC, 0x12, 0x45, 0x11, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90,
-0xA2, 0xAC, 0x12, 0x45, 0x11, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA2, 0xAC, 0x12, 0x08, 0x6D,
-0x90, 0xA2, 0xAC, 0x12, 0x45, 0x11, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09,
-0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x06, 0x89, 0xFF, 0x54, 0x01, 0xFE, 0x90,
-0xA1, 0xED, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F,
-0xF0, 0x12, 0x06, 0x89, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0x90,
-0xA1, 0xEE, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA2, 0xCF, 0xF0, 0xE0, 0xFD, 0x54, 0xC0,
-0x70, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x7F, 0xED, 0x30, 0xE6, 0x4E, 0x90,
-0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x70, 0x2B, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0,
-0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F,
-0x64, 0x01, 0x70, 0x30, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x66, 0xAE,
-0x80, 0x22, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64,
-0x02, 0x60, 0x05, 0x12, 0x67, 0xA4, 0x80, 0x0C, 0x12, 0x64, 0x9F, 0x80, 0x07, 0x90, 0xA1, 0x1E,
-0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA2, 0xCF, 0xE0, 0x90, 0xA1, 0x1E, 0x30, 0xE7, 0x1B, 0xE0, 0x44,
-0x02, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x7B, 0xE0, 0x90, 0xA3, 0x88, 0x12, 0x50,
-0x8A, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1,
-0x16, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90,
-0x06, 0x92, 0x74, 0x02, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0,
-0x90, 0xA1, 0x7C, 0xE0, 0xC3, 0x13, 0x54, 0x7F, 0x90, 0xA3, 0x88, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F,
-0x58, 0x7E, 0x01, 0x12, 0x50, 0x92, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0xEF, 0x60,
-0x3B, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x33, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFE, 0xF0,
-0x7D, 0x2B, 0x7F, 0x0F, 0x12, 0x4E, 0xD8, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x7D, 0x08,
-0xE4, 0xFF, 0x12, 0x64, 0xC9, 0xBF, 0x01, 0x14, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x40, 0xF0, 0x7D,
-0x06, 0x7F, 0x01, 0x12, 0x55, 0x19, 0x90, 0xA1, 0x15, 0x74, 0x06, 0xF0, 0x22, 0x7D, 0x2E, 0x7F,
-0x6F, 0x12, 0x4E, 0xD8, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x55, 0x19, 0x90, 0x05, 0x27, 0xE0, 0x54,
-0xBF, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x4E, 0xD8, 0x7D,
-0x04, 0x7F, 0x01, 0x12, 0x55, 0x19, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15,
-0x74, 0x04, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x63, 0x54, 0xC0, 0x70,
-0x0D, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x02, 0x57, 0xB2, 0xE5, 0x63,
-0x30, 0xE6, 0x23, 0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x01, 0x70, 0x22, 0x90, 0xA1, 0x1E, 0xE0, 0x44,
-0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F, 0x64, 0x02, 0x60, 0x05, 0x12, 0x67, 0xA4, 0x80,
-0x0C, 0x12, 0x64, 0x9F, 0x80, 0x07, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0xE5, 0x63, 0x90,
-0xA1, 0x1E, 0x30, 0xE7, 0x1B, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1,
-0x7B, 0xE0, 0x90, 0xA3, 0x88, 0x12, 0x50, 0x8A, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22,
-0xE0, 0x54, 0xFD, 0xF0, 0x22, 0xE4, 0xF5, 0x63, 0x90, 0xA1, 0x1A, 0xE0, 0x70, 0x02, 0x41, 0x49,
-0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x60, 0x02, 0x41, 0x49, 0x90, 0xA1, 0x18, 0xE0, 0xFF, 0xC4,
-0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0xA1, 0x21, 0xE0, 0x14,
-0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0xA1, 0x23, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0xA1,
-0x20, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x63, 0x01, 0x90, 0xA1, 0x11, 0xE0, 0x30, 0xE0, 0x12,
-0x90, 0xA1, 0x15, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x63, 0x12, 0x57, 0xE5, 0xEF, 0x70, 0x02,
-0xF5, 0x63, 0xE5, 0x63, 0x60, 0x43, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0xA1, 0x23,
-0xE0, 0x60, 0x03, 0xB4, 0x01, 0x0B, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x80,
-0x0F, 0xE4, 0x90, 0xA3, 0x87, 0xF0, 0x90, 0xA1, 0x23, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE,
-0xFF, 0x90, 0xA1, 0x22, 0xE0, 0x2F, 0x90, 0xA3, 0x88, 0x12, 0x50, 0x8A, 0x90, 0xA1, 0x1D, 0xE0,
-0x20, 0xE2, 0x03, 0x12, 0x53, 0x0D, 0x12, 0x57, 0xF3, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x13,
-0x13, 0x54, 0x3F, 0x30, 0xE0, 0x11, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD,
-0xF0, 0x54, 0x07, 0x70, 0x2E, 0x80, 0x29, 0x90, 0xA1, 0x23, 0xE0, 0x04, 0xF0, 0x90, 0xA1, 0x1E,
-0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0x7A, 0xE0, 0xFF, 0x90, 0xA1, 0x23, 0xE0, 0xD3, 0x9F, 0x40,
-0x0F, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x0B, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFB, 0xF0, 0x22,
-0x12, 0x57, 0xB2, 0x22, 0x90, 0xA3, 0x96, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0,
-0x54, 0x0F, 0xFD, 0xAC, 0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0x44, 0x01, 0xF0, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB,
-0xF0, 0xAC, 0x07, 0x74, 0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA,
-0xF0, 0x74, 0x11, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC,
-0x07, 0x74, 0x06, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90,
-0x04, 0xA7, 0xE4, 0xF0, 0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04,
-0xA4, 0x74, 0xFD, 0xF0, 0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54,
-0xC0, 0x4D, 0xFD, 0x74, 0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22,
-0x91, 0x0D
+0x74, 0x40, 0x35, 0xF0, 0xFA, 0x7B, 0xFF, 0x90, 0xA2, 0xE7, 0x12, 0x45, 0xBE, 0xC3, 0xE5, 0x57,
+0x94, 0x0F, 0xE5, 0x56, 0x94, 0x00, 0x50, 0x5E, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x90, 0x00,
+0x06, 0x12, 0x07, 0xAB, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0x2F, 0xFD, 0xE5,
+0xF0, 0x3E, 0xFC, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC,
+0x9E, 0x40, 0x02, 0x81, 0x1C, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x02, 0xCE, 0xC3, 0x13, 0xCE, 0x13,
+0xD8, 0xF9, 0xFD, 0xAC, 0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2D, 0xFF, 0xEE,
+0x3C, 0xFE, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x12, 0x07, 0x80, 0xD3, 0x9F, 0xE5, 0xF0, 0x9E,
+0x50, 0x02, 0x81, 0x23, 0x61, 0xFC, 0xE5, 0x51, 0x70, 0x50, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5,
+0x90, 0x00, 0x08, 0x12, 0x07, 0xAB, 0xFD, 0xAC, 0xF0, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57,
+0x13, 0xFF, 0xC3, 0xED, 0x9F, 0xEC, 0x9E, 0x50, 0x08, 0x90, 0x9F, 0x96, 0x74, 0x01, 0xF0, 0x80,
+0x29, 0xE5, 0x57, 0xAE, 0x56, 0x78, 0x03, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFB, 0xAA,
+0x06, 0xE5, 0x56, 0xC3, 0x13, 0xFE, 0xE5, 0x57, 0x13, 0x2B, 0xFF, 0xEE, 0x3A, 0xFE, 0xD3, 0xED,
+0x9F, 0xEC, 0x9E, 0x40, 0x05, 0xE4, 0x90, 0x9F, 0x96, 0xF0, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5,
+0x56, 0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xC8, 0xE5,
+0x56, 0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x51, 0x25,
+0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xF5, 0x54, 0xA3, 0xE0, 0xF5,
+0x55, 0xE4, 0xF5, 0x5D, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x75, 0xF0, 0x02, 0xE5, 0x5D, 0xA4,
+0xF5, 0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE,
+0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0xA2, 0xE7, 0x12, 0x45, 0xB5, 0x85, 0x5D, 0x82,
+0x75, 0x83, 0x00, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5,
+0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0x05, 0x5D, 0xE5, 0x5D, 0xB4, 0x05, 0xB7, 0x90, 0xA2, 0xE7,
+0x12, 0x45, 0xB5, 0x90, 0x00, 0x05, 0x12, 0x06, 0xA2, 0xFD, 0x7C, 0x00, 0xE5, 0x57, 0xAE, 0x56,
+0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x07, 0x03,
+0xD3, 0xE5, 0x55, 0x9F, 0xE5, 0x54, 0x9E, 0x40, 0x0C, 0xE5, 0x55, 0x9F, 0xF5, 0x55, 0xE5, 0x54,
+0x9E, 0xF5, 0x54, 0x80, 0x05, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95,
+0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0xAE, 0x54,
+0xFF, 0xE4, 0xFC, 0xFD, 0xE5, 0x53, 0x25, 0xE0, 0x25, 0xE0, 0x24, 0x73, 0xF5, 0x82, 0xE4, 0x34,
+0x41, 0xF5, 0x83, 0x12, 0x45, 0x99, 0xC3, 0x12, 0x45, 0x60, 0x50, 0x07, 0xAF, 0x51, 0x12, 0xA5,
+0x3F, 0x80, 0x20, 0xE5, 0x53, 0x25, 0xE0, 0x24, 0xC3, 0xF5, 0x82, 0xE4, 0x34, 0x41, 0xF5, 0x83,
+0xD3, 0x74, 0x01, 0x93, 0x95, 0x55, 0xE4, 0x93, 0x95, 0x54, 0x40, 0x07, 0x7D, 0x01, 0xAF, 0x51,
+0x12, 0xA6, 0xD3, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x95, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83,
+0xA3, 0xE0, 0x90, 0xA3, 0x38, 0xF0, 0x90, 0xA3, 0x37, 0xE5, 0x52, 0xF0, 0xAB, 0x51, 0xE4, 0xFD,
+0xFF, 0x12, 0xA3, 0x1D, 0xE4, 0xF5, 0x54, 0xF5, 0x55, 0xE1, 0x28, 0x74, 0x96, 0x25, 0x51, 0xF5,
+0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE0, 0xFC, 0x64, 0x05, 0x60, 0x02, 0xA1, 0xBE, 0xAD, 0x53,
+0xAF, 0x51, 0x12, 0xA3, 0x91, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83,
+0xEF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07,
+0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xC3,
+0x94, 0x30, 0x50, 0x11, 0xE4, 0xF5, 0x5B, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D,
+0xF5, 0x83, 0xE4, 0xA1, 0x43, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83,
+0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x6C, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A,
+0xF5, 0x83, 0xE0, 0x64, 0x0A, 0x60, 0x4D, 0xEF, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x01,
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94, 0xF5, 0x83, 0xE0, 0xFD, 0xD3, 0x9F, 0xEE, 0x64, 0x80,
+0xF8, 0x74, 0x80, 0x98, 0x50, 0x2E, 0xED, 0x24, 0x05, 0xFF, 0xE4, 0x33, 0xFE, 0x74, 0x96, 0x25,
+0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xD3, 0x9F, 0xEE, 0x64, 0x80, 0xF8, 0x74,
+0x80, 0x98, 0x50, 0x10, 0x74, 0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE0,
+0x65, 0x53, 0x60, 0x3B, 0xE5, 0x5B, 0x70, 0x05, 0x75, 0x5B, 0x01, 0x80, 0x0D, 0xE5, 0x5B, 0xB4,
+0x01, 0x05, 0x75, 0x5B, 0x03, 0x80, 0x03, 0x75, 0x5B, 0x05, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82,
+0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x94,
+0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0x80, 0x29, 0x74,
+0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x96, 0x25, 0x51,
+0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x10, 0xE4, 0xF5, 0x5B, 0x74,
+0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x16, 0x25, 0x51,
+0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x53, 0xF0, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90,
+0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x02, 0xE1, 0x05,
+0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9A, 0xF5, 0x83, 0xE4, 0xF0, 0xF5, 0x5B, 0x74,
+0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D, 0xF5, 0x83, 0xE4, 0xF0, 0xE1, 0x05, 0xEC, 0x64,
+0x06, 0x60, 0x02, 0xE1, 0x28, 0xF5, 0x54, 0xF5, 0x55, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81,
+0x01, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x07, 0xF5, 0x5B, 0xD3, 0xE5, 0x57, 0x94, 0xE8, 0xE5, 0x56,
+0x94, 0x03, 0x40, 0x05, 0x75, 0x59, 0x05, 0x80, 0x13, 0xD3, 0xE5, 0x57, 0x94, 0xFA, 0xE5, 0x56,
+0x94, 0x00, 0x40, 0x05, 0x75, 0x59, 0x02, 0x80, 0x03, 0xE4, 0xF5, 0x59, 0xE5, 0x57, 0xAE, 0x56,
+0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x90, 0x42, 0x24,
+0xE4, 0x93, 0xFD, 0x7C, 0x00, 0x12, 0x07, 0x03, 0x90, 0xA2, 0xF6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0xE4, 0xF5, 0x5A, 0x90, 0xA2, 0xEA, 0x12, 0x45, 0xB5, 0x75, 0xF0, 0x02, 0xE5, 0x5A, 0xA4, 0xF5,
+0x82, 0x85, 0xF0, 0x83, 0x12, 0x07, 0xAB, 0xAE, 0xF0, 0xA8, 0x59, 0x08, 0x80, 0x05, 0xCE, 0xC3,
+0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0xE5, 0x5A, 0x90, 0x42, 0x1F, 0x93, 0xFD, 0x7C, 0x00, 0x12,
+0x07, 0x03, 0xEF, 0x25, 0x55, 0xF5, 0x55, 0xEE, 0x35, 0x54, 0xF5, 0x54, 0xC3, 0x90, 0xA2, 0xF7,
+0xE0, 0x95, 0x55, 0x90, 0xA2, 0xF6, 0xE0, 0x95, 0x54, 0x40, 0x07, 0x05, 0x5A, 0xE5, 0x5A, 0xB4,
+0x05, 0xB1, 0xE5, 0x5A, 0xC3, 0x13, 0xF5, 0x5A, 0xE5, 0x5B, 0x24, 0x01, 0xFF, 0xE4, 0x33, 0xA2,
+0xE7, 0x13, 0xEF, 0x13, 0xFF, 0xD3, 0x95, 0x5A, 0x40, 0x06, 0xEF, 0x95, 0x5A, 0xFF, 0x80, 0x02,
+0xE4, 0xFF, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xC3, 0x13,
+0xFE, 0xEF, 0xC4, 0x33, 0x54, 0xE0, 0x2E, 0x04, 0xFE, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4,
+0x34, 0x93, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5,
+0x83, 0xE0, 0xC3, 0x94, 0xC0, 0x40, 0x0E, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93,
+0xF5, 0x83, 0x74, 0xC0, 0xF0, 0x74, 0x01, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83,
+0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x25, 0xE0, 0xFF, 0x70, 0x04, 0xF5, 0x5B, 0x80, 0x04, 0xEF,
+0x14, 0xF5, 0x5B, 0xD3, 0x90, 0xA2, 0xEE, 0xE0, 0x94, 0x03, 0x90, 0xA2, 0xED, 0xE0, 0x94, 0x00,
+0x40, 0x03, 0xE4, 0xF5, 0x5B, 0x75, 0xF0, 0x10, 0xE5, 0x51, 0x90, 0x81, 0x01, 0x12, 0x45, 0xA9,
+0xE0, 0x54, 0xF8, 0x90, 0xA2, 0xF8, 0xF0, 0x45, 0x5B, 0xFF, 0xF0, 0x75, 0xF0, 0x10, 0xE5, 0x51,
+0x90, 0x81, 0x01, 0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x74, 0x96, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34,
+0x9D, 0xF5, 0x83, 0xE0, 0xD3, 0x94, 0x05, 0x74, 0x96, 0x50, 0x0E, 0x25, 0x51, 0xF5, 0x82, 0xE4,
+0x34, 0x9D, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x80, 0x0B, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x9D,
+0xF5, 0x83, 0xE4, 0xF0, 0x74, 0x81, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0,
+0x64, 0x01, 0x60, 0x03, 0x02, 0xB0, 0x4B, 0x90, 0xA2, 0xED, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3,
+0x74, 0xFF, 0x9F, 0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82,
+0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x51, 0x50,
+0x13, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12,
+0x08, 0xD6, 0x80, 0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9B, 0xF5, 0x83, 0x74,
+0xFF, 0xF0, 0xA3, 0xF0, 0x90, 0xA2, 0xEF, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F,
+0xFD, 0x74, 0xFF, 0x9E, 0xFC, 0xE5, 0x51, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C,
+0xF5, 0x83, 0xE0, 0xFA, 0xA3, 0xE0, 0xD3, 0x9D, 0xEA, 0x9C, 0xE5, 0x51, 0x50, 0x13, 0x25, 0xE0,
+0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0xEE, 0x8F, 0xF0, 0x12, 0x08, 0xD6, 0x80,
+0x10, 0x25, 0xE0, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9C, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0xA3,
+0xF0, 0x90, 0xA2, 0xF1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFB, 0xC3, 0x74, 0xFF, 0x9B, 0xFF, 0x74, 0xFF,
+0x9E, 0xFE, 0x74, 0xFF, 0x94, 0x00, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0xFC, 0x90, 0x94, 0x91, 0x12,
+0x45, 0x8D, 0xD3, 0x12, 0x45, 0x60, 0x90, 0x94, 0x91, 0x50, 0x19, 0x12, 0x45, 0x8D, 0x90, 0xA2,
+0xF1, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0x12, 0x45, 0x39, 0x90, 0x94, 0x91, 0x12,
+0x08, 0x6D, 0x80, 0x07, 0x12, 0x08, 0x79, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xFD, 0xAF, 0x51, 0x12,
+0x78, 0xC9, 0x05, 0x51, 0xE5, 0x51, 0xC3, 0x94, 0x80, 0x50, 0x03, 0x02, 0xA8, 0x60, 0x22, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xD4, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0x90, 0x96,
+0x18, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x1F, 0xFB, 0x24, 0xF1, 0x50, 0x02, 0x21, 0x01, 0xE4, 0xF5,
+0x6B, 0x90, 0xA3, 0xD4, 0xE0, 0xFD, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5,
+0x82, 0x25, 0x6B, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0xFE, 0xEB, 0x75, 0xF0, 0x07,
+0xA4, 0x24, 0x56, 0xF5, 0x82, 0xE4, 0x34, 0x40, 0xF5, 0x83, 0xE5, 0x82, 0x25, 0x6B, 0xF5, 0x82,
+0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE4, 0x93, 0xFC, 0xEE, 0x5C, 0x90, 0xA3, 0xD7, 0xF0, 0x75, 0xF0,
+0x04, 0xED, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x0B, 0xE5,
+0x6B, 0x70, 0x07, 0x90, 0xA3, 0xD7, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0xA3, 0xD7, 0xE0, 0xFF, 0x90,
+0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6B,
+0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x6B, 0xE5, 0x6B, 0x64, 0x07, 0x70,
+0x80, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0xFF,
+0xC4, 0x54, 0x03, 0xFD, 0xE4, 0x90, 0xA3, 0xD5, 0xF0, 0x75, 0x6C, 0x06, 0xE5, 0x6C, 0xB4, 0x06,
+0x1D, 0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5,
+0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3,
+0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6C, 0xF5,
+0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x90, 0xA3, 0xD6, 0xF0, 0x90, 0xA3, 0xD6, 0xE0, 0x60,
+0x41, 0x75, 0x6B, 0x07, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE,
+0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3, 0xD6, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x1B, 0xE5, 0x6C,
+0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0x90, 0xA3, 0xD5, 0xF0, 0xED, 0x60, 0x24, 0xE0, 0xD3, 0x94,
+0x0B, 0x40, 0x1E, 0xE0, 0x24, 0x20, 0xF0, 0x80, 0x18, 0x15, 0x6B, 0xE5, 0x6B, 0xC3, 0x94, 0x00,
+0x50, 0xC2, 0xE5, 0x6C, 0x60, 0x0B, 0x15, 0x6C, 0xE5, 0x6C, 0xC3, 0x94, 0x00, 0x40, 0x02, 0x21,
+0x1C, 0xE4, 0xFC, 0xF5, 0x6C, 0xE5, 0x6C, 0xB4, 0x06, 0x1D, 0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0x75,
+0xF0, 0x08, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE4, 0x35, 0x83,
+0xF5, 0x83, 0xE0, 0x54, 0x0F, 0x80, 0x19, 0x90, 0xA3, 0xD4, 0xE0, 0x75, 0xF0, 0x08, 0x90, 0x89,
+0x00, 0x12, 0x45, 0xA9, 0xE5, 0x82, 0x25, 0x6C, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0,
+0x90, 0xA3, 0xD6, 0xF0, 0x90, 0xA3, 0xD6, 0xE0, 0x60, 0x3C, 0xE4, 0xF5, 0x6B, 0x74, 0x01, 0x7E,
+0x00, 0xA8, 0x6B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0x90, 0xA3,
+0xD6, 0xE0, 0xFB, 0xEF, 0x5B, 0x60, 0x18, 0xE5, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x25, 0x6B, 0xFC,
+0xED, 0x60, 0x1D, 0xEC, 0xD3, 0x94, 0x0B, 0x40, 0x17, 0x74, 0x20, 0x2C, 0xFC, 0x80, 0x11, 0x05,
+0x6B, 0xE5, 0x6B, 0xB4, 0x08, 0xC7, 0x05, 0x6C, 0xE5, 0x6C, 0x64, 0x07, 0x60, 0x02, 0x21, 0xB5,
+0x90, 0xA3, 0xD5, 0xE0, 0xFF, 0x90, 0xA3, 0xD4, 0xE0, 0xFE, 0x75, 0xF0, 0x04, 0x90, 0x96, 0x16,
+0x12, 0x45, 0xA9, 0xEF, 0xF0, 0x75, 0xF0, 0x04, 0xEE, 0x90, 0x96, 0x17, 0x12, 0x45, 0xA9, 0xEC,
+0xF0, 0x75, 0xF0, 0x10, 0xEE, 0x90, 0x81, 0x00, 0x12, 0x45, 0xA9, 0xE0, 0xFE, 0x54, 0x7F, 0xF5,
+0x6D, 0xEE, 0x54, 0x80, 0xFE, 0xE5, 0x6D, 0xD3, 0x9F, 0x40, 0x09, 0x90, 0xA3, 0xD5, 0xE0, 0x4E,
+0xF5, 0x6D, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x9C, 0x50, 0x06, 0xAF, 0x06, 0xEC, 0x4F, 0xF5, 0x6D,
+0x90, 0xA3, 0xD4, 0xE0, 0xFF, 0x24, 0x16, 0xF5, 0x82, 0xE4, 0x34, 0x9E, 0xF5, 0x83, 0xE5, 0x6D,
+0xF0, 0x75, 0xF0, 0x04, 0xEF, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x13, 0x13, 0x54, 0x03,
+0xF5, 0x6A, 0x90, 0xA3, 0xD4, 0xE0, 0xFF, 0xE4, 0xFB, 0xAD, 0x6D, 0x12, 0x77, 0x11, 0x90, 0xA3,
+0xD4, 0xE0, 0xFF, 0x75, 0xF0, 0x10, 0x90, 0x81, 0x03, 0x12, 0x45, 0xA9, 0xE4, 0xF0, 0x90, 0xA3,
+0xD5, 0xE0, 0xFE, 0xC3, 0x94, 0x0C, 0x40, 0x0F, 0x74, 0x96, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x95,
+0xF5, 0x83, 0x74, 0x02, 0xF0, 0x80, 0x23, 0xEE, 0xC3, 0x94, 0x04, 0x90, 0xA3, 0xD4, 0xE0, 0x40,
+0x0E, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x80, 0x0B, 0x24,
+0x96, 0xF5, 0x82, 0xE4, 0x34, 0x95, 0xF5, 0x83, 0xE4, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12,
+0x06, 0x89, 0x54, 0x7F, 0xF5, 0x51, 0x90, 0x00, 0x01, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x1F, 0xF5,
+0x53, 0xEF, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x52, 0x90, 0x00, 0x02, 0x12,
+0x06, 0xA2, 0xFF, 0x54, 0x03, 0xF5, 0x54, 0xEF, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0xF5, 0x57, 0x90,
+0x00, 0x02, 0x12, 0x06, 0xA2, 0xFF, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0xF5, 0x55, 0xEF,
+0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0xF5, 0x56, 0x90, 0x00, 0x02, 0x12, 0x06, 0xA2,
+0xFF, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xF5, 0x59, 0xEF, 0x54, 0x04, 0x13, 0x13, 0x54,
+0x3F, 0xF5, 0x5A, 0xE5, 0x56, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0xFF, 0x75, 0xF0,
+0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0xE5, 0x55,
+0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19,
+0x12, 0x45, 0xA9, 0xE0, 0x54, 0xBF, 0x4F, 0xF0, 0xE5, 0x59, 0x60, 0x02, 0x81, 0x78, 0xE5, 0x53,
+0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x18, 0x12, 0x45, 0xA9, 0xE0, 0x54,
+0xE0, 0x4F, 0xF0, 0xE5, 0x54, 0x54, 0x03, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19,
+0x12, 0x45, 0xA9, 0xE0, 0x54, 0xFC, 0x4F, 0xF0, 0xEF, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0x75, 0xF0,
+0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xF3, 0x4F, 0xF0, 0xE5, 0x52,
+0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x18, 0x12,
+0x45, 0xA9, 0xE0, 0x54, 0xDF, 0x4F, 0xF0, 0xE5, 0x57, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0xFF, 0x75,
+0xF0, 0x04, 0xE5, 0x51, 0x90, 0x96, 0x19, 0x12, 0x45, 0xA9, 0xE0, 0x54, 0xCF, 0x4F, 0xF0, 0x74,
+0x16, 0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0x74, 0x16,
+0x25, 0x51, 0xF5, 0x82, 0xE4, 0x34, 0x99, 0xF5, 0x83, 0xE0, 0xFF, 0xE5, 0x5A, 0x25, 0xE0, 0x25,
+0xE0, 0xFE, 0xEF, 0x4E, 0xF0, 0xE4, 0xF5, 0x58, 0x85, 0x58, 0x82, 0x75, 0x83, 0x00, 0xA3, 0xA3,
+0xA3, 0x12, 0x06, 0xA2, 0xFF, 0x75, 0xF0, 0x08, 0xE5, 0x51, 0x90, 0x89, 0x00, 0x12, 0x45, 0xA9,
+0xE5, 0x82, 0x25, 0x58, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x05, 0x58, 0xE5,
+0x58, 0xB4, 0x04, 0xD4, 0xAF, 0x51, 0x11, 0x5F, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0xD3, 0x10, 0xAF,
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x5B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x37, 0x4E, 0x90,
+0xA3, 0x65, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x5D, 0x12, 0x45, 0x71, 0x12, 0x08, 0x3A, 0x90, 0xA3,
+0x65, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90,
+0xA3, 0x5D, 0x12, 0x45, 0x71, 0x90, 0xA3, 0x61, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03,
+0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA3, 0x69, 0x12, 0x08, 0x6D, 0x90,
+0xA3, 0x69, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x5B, 0xE0, 0xFE,
+0xA3, 0xE0, 0xFF, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0xA2, 0x30, 0x12, 0x45,
+0xA9, 0xE0, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x07, 0xED, 0xF0, 0xEF, 0x14, 0x60, 0x02, 0xC1, 0x07, 0x90, 0x06,
+0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0xA4, 0x07, 0xE0, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x90, 0x04,
+0x42, 0xE0, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00,
+0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x08, 0x91,
+0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x61, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x09, 0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x00, 0x10, 0x90, 0xA4, 0x07, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54,
+0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x08, 0x47, 0x78, 0x04, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x61,
+0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0A, 0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00,
+0x00, 0x0C, 0x00, 0x90, 0xA4, 0x07, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF,
+0xE4, 0x78, 0x0A, 0x12, 0x08, 0x5A, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x0D,
+0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x0C, 0x00, 0x00, 0x00, 0x90, 0xA4, 0x07, 0xE0,
+0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x1A, 0x12, 0x08, 0x5A, 0x90,
+0xA3, 0x61, 0x12, 0x08, 0x6D, 0x7F, 0x18, 0x7E, 0x08, 0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x91,
+0x79, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x4F, 0x12, 0x08,
+0x79, 0x00, 0x00, 0x04, 0x00, 0x80, 0x65, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0xA3,
+0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00,
+0x00, 0x00, 0x7F, 0x00, 0x7E, 0x08, 0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00,
+0x00, 0x01, 0x90, 0xA3, 0x61, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09,
+0x91, 0x7D, 0x90, 0xA3, 0x5D, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x90, 0xA3, 0x61, 0x12,
+0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0x91, 0x79, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00,
+0x0C, 0x00, 0x90, 0xA3, 0x4F, 0x12, 0x08, 0x79, 0x00, 0x00, 0x0C, 0x00, 0xD1, 0x7D, 0xD0, 0xD0,
+0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x4F, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C,
+0x00, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0x49, 0xEC, 0xF0, 0xA3,
+0xED, 0xF0, 0x90, 0xA3, 0x48, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x3E, 0x02, 0x90, 0xA3,
+0x53, 0x12, 0x08, 0x6D, 0x90, 0xA3, 0x4B, 0x12, 0x45, 0x71, 0x12, 0x08, 0x3A, 0x90, 0xA3, 0x53,
+0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0xA3,
+0x4B, 0x12, 0x45, 0x71, 0x90, 0xA3, 0x4F, 0x12, 0x45, 0x8D, 0x12, 0x45, 0x46, 0xD0, 0x03, 0xD0,
+0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x45, 0x53, 0x90, 0xA3, 0x57, 0x12, 0x08, 0x6D, 0x90, 0xA3,
+0x49, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0xA3, 0x57, 0x12, 0x45, 0x71, 0x90, 0xAA, 0x96, 0x12,
+0x08, 0x6D, 0x90, 0xA3, 0x48, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x3D, 0x09, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA3, 0xD8, 0xEF, 0xF0, 0xED, 0x64, 0x01,
+0x70, 0x2F, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x72, 0x80, 0x08, 0x90, 0xA3, 0xD8,
+0xE0, 0x24, 0xFE, 0xF5, 0x72, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF,
+0x72, 0xD1, 0x73, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0xAF, 0x72, 0x80,
+0x20, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0xD8, 0xE0, 0xFF,
+0xD1, 0x73, 0x90, 0xA3, 0x4B, 0x12, 0x08, 0x79, 0x00, 0x00, 0x00, 0xFF, 0x90, 0xA3, 0xD8, 0xE0,
+0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0xA3, 0x4F, 0x12, 0x08, 0x6D, 0x7D, 0x18, 0x7C, 0x00, 0x7F,
+0x01, 0xD1, 0x83, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7B, 0x01, 0x7A, 0xA2, 0x79, 0xDB, 0x7F, 0xFB,
+0x7E, 0x01, 0x12, 0x34, 0xC1, 0xBF, 0x01, 0x16, 0x90, 0xA2, 0xDB, 0xE0, 0x54, 0x30, 0xFF, 0xBF,
+0x20, 0x07, 0x90, 0xA2, 0x56, 0x74, 0x01, 0xF0, 0x22, 0xE4, 0x90, 0xA2, 0x56, 0xF0, 0x22, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x00, 0x7E, 0x08, 0x12, 0x37, 0x4E, 0x90, 0xA2, 0xDE,
+0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x37, 0x4E, 0x90, 0xA2, 0xE2, 0x12, 0x08, 0x6D,
+0x90, 0xA2, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4, 0xFE, 0xFD, 0xFC, 0xEF, 0x60,
+0x24, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF, 0xEC, 0x90, 0xA2, 0xDE, 0x12,
+0x08, 0x6D, 0x90, 0xA2, 0xDE, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9, 0x12, 0x08, 0x6D, 0x7F, 0x00,
+0x7E, 0x08, 0x12, 0x38, 0x45, 0x90, 0xA2, 0xE2, 0x12, 0x45, 0x71, 0xEF, 0x54, 0x01, 0xFF, 0xE4,
+0xFE, 0xFD, 0xFC, 0xEF, 0x60, 0x24, 0x90, 0xA2, 0xE2, 0x12, 0x45, 0x71, 0xEF, 0x54, 0xFE, 0xFF,
+0xEC, 0x90, 0xA2, 0xE2, 0x12, 0x08, 0x6D, 0x90, 0xA2, 0xE2, 0x12, 0x45, 0x71, 0x90, 0xAA, 0xB9,
+0x12, 0x08, 0x6D, 0x7F, 0x00, 0x7E, 0x09, 0x12, 0x38, 0x45, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4,
+0x90, 0xA0, 0x90, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79,
+0x11, 0x12, 0x08, 0xAA, 0x90, 0xA1, 0x11, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0,
+0xA3, 0xF0, 0xA3, 0x74, 0x0C, 0xF0, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x49, 0x5E, 0x90, 0x05,
+0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x14, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0,
+0x44, 0x40, 0xF0, 0x7D, 0x23, 0x12, 0x46, 0xF8, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0, 0x22, 0x12,
+0x60, 0x4D, 0x7D, 0x24, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0,
+0x90, 0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x12, 0x46, 0xFD, 0x90, 0xA1, 0x14, 0x74, 0x02, 0xF0,
+0x22, 0x7D, 0x25, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90,
+0xA1, 0x14, 0x74, 0x04, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x48, 0xE4, 0xF0, 0x90, 0x01,
+0x3C, 0x74, 0x02, 0xF0, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0C,
+0xEF, 0x54, 0xFB, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1, 0x23, 0xE0,
+0x04, 0xF0, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0xA1, 0xB9, 0xE0, 0xFF, 0x90, 0xA1,
+0x23, 0xE0, 0xD3, 0x9F, 0x40, 0x0E, 0x90, 0xA0, 0x90, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xA1, 0x17,
+0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0xA3, 0x05, 0xF0, 0xE0, 0xFD, 0x54,
+0xC0, 0x70, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x54, 0xFE, 0xF0, 0x80, 0x7E, 0xED, 0x30, 0xE6, 0x4D,
+0x90, 0xA1, 0x1A, 0xE0, 0x64, 0x02, 0x70, 0x2B, 0x90, 0xA1, 0x16, 0xE0, 0xFF, 0xC3, 0x13, 0x20,
+0xE0, 0x09, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x29, 0x90, 0xA1, 0x18, 0xE0, 0x54,
+0x0F, 0x64, 0x01, 0x70, 0x2F, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x4B,
+0x58, 0x80, 0x21, 0x90, 0xA1, 0x1E, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0xA1, 0x18, 0xE0, 0x54, 0x0F,
+0x64, 0x02, 0x60, 0x04, 0x31, 0x9E, 0x80, 0x0C, 0x12, 0x4F, 0x9B, 0x80, 0x07, 0x90, 0xA1, 0x1E,
+0xE0, 0x54, 0xFE, 0xF0, 0x90, 0xA3, 0x05, 0xE0, 0x90, 0xA1, 0x1E, 0x30, 0xE7, 0x1B, 0xE0, 0x44,
+0x02, 0xF0, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0xBA, 0xE0, 0x90, 0xA3, 0xAF, 0x12, 0x48,
+0x21, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0xA1,
+0xBE, 0xE0, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x20, 0x90, 0x04, 0x1D, 0xE0, 0x70, 0x1A, 0x90, 0x9F,
+0x9E, 0xE0, 0xFF, 0x7B, 0x18, 0xE4, 0xFD, 0x12, 0x4A, 0xB2, 0x90, 0xA4, 0x02, 0xEE, 0xF0, 0xA3,
+0xEF, 0xF0, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0x90, 0xA1, 0x16, 0xE0, 0x13, 0x13, 0x13,
+0x54, 0x1F, 0x30, 0xE0, 0x05, 0x90, 0x01, 0x5B, 0xE4, 0xF0, 0x90, 0x06, 0x92, 0x74, 0x02, 0xF0,
+0x90, 0x01, 0x3C, 0x74, 0x04, 0xF0, 0xE4, 0x90, 0xA3, 0xAE, 0xF0, 0x90, 0xA1, 0xBB, 0xE0, 0xC3,
+0x13, 0x54, 0x7F, 0x90, 0xA3, 0xAF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x12, 0x48,
+0x29, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x08, 0xF0, 0x22, 0x90, 0xA1, 0xCD, 0xE0, 0x30, 0xE0, 0x17,
+0x90, 0xA1, 0xDF, 0xE0, 0x70, 0x60, 0x90, 0xA1, 0x1C, 0xE0, 0xD3, 0x94, 0x00, 0x50, 0x57, 0x90,
+0xA1, 0xBF, 0xE0, 0x60, 0x4E, 0x80, 0x4F, 0x12, 0x73, 0xF1, 0xEF, 0x64, 0x01, 0x70, 0x47, 0x90,
+0xA1, 0x1E, 0xE0, 0xFF, 0x54, 0x03, 0x70, 0x3E, 0x90, 0xA1, 0x1C, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E,
+0x40, 0x34, 0xEF, 0x20, 0xE2, 0x30, 0x90, 0xA1, 0x1E, 0xE0, 0x20, 0xE4, 0x29, 0x90, 0xA1, 0x17,
+0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x1E, 0x90, 0xA1, 0xBF, 0xE0, 0x70, 0x18, 0x90, 0x06,
+0x62, 0xE0, 0x20, 0xE1, 0x11, 0x90, 0x06, 0x62, 0xE0, 0x30, 0xE0, 0x07, 0xE0, 0x54, 0xFC, 0x64,
+0x80, 0x60, 0x03, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0xEF, 0x60, 0x3B, 0x90, 0xA0, 0x90, 0xE0,
+0x64, 0x01, 0x70, 0x33, 0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x2B, 0x7F, 0x0F, 0x12,
+0x49, 0x5E, 0x90, 0x06, 0x04, 0xE0, 0x54, 0xBF, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x49, 0x74,
+0xBF, 0x01, 0x14, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x40, 0xF0, 0x7D, 0x06, 0x7F, 0x01, 0x12, 0x55,
+0x87, 0x90, 0xA1, 0x15, 0x74, 0x06, 0xF0, 0x22, 0x90, 0xA0, 0x90, 0xE0, 0x64, 0x01, 0x70, 0x28,
+0x90, 0xA1, 0x17, 0xE0, 0x54, 0xFD, 0xF0, 0x7D, 0x2C, 0x7F, 0x6F, 0x12, 0x49, 0x5E, 0x12, 0x49,
+0x69, 0xBF, 0x01, 0x14, 0x90, 0xA1, 0x16, 0xE0, 0x44, 0x80, 0xF0, 0x7D, 0x0E, 0x7F, 0x01, 0x12,
+0x55, 0x87, 0x90, 0xA1, 0x15, 0x74, 0x0E, 0xF0, 0x22, 0x7D, 0x2D, 0x12, 0x4C, 0x04, 0x90, 0x01,
+0x37, 0x74, 0x02, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x5A, 0x91, 0x12, 0x46, 0xFD, 0xE4, 0xFD, 0x7F,
+0x01, 0x12, 0x55, 0x87, 0xE4, 0x90, 0xA1, 0x15, 0xF0, 0x22, 0x7D, 0x2E, 0x7F, 0x6F, 0x12, 0x49,
+0x5E, 0x7D, 0x02, 0x7F, 0x01, 0x12, 0x55, 0x87, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0x90,
+0xA1, 0x15, 0x74, 0x02, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x12, 0x49, 0x5E, 0x7D, 0x04, 0x7F, 0x01,
+0x12, 0x55, 0x87, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0xA1, 0x15, 0x74, 0x04, 0xF0,
+0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0xA1, 0x79, 0xC0, 0x02, 0x08, 0xAA,
+0x90, 0xA3, 0xBD, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x81, 0x00, 0xE0, 0x54, 0x0F, 0xFD, 0xAC,
+0x07, 0x74, 0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x74,
+0x0D, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF0, 0xAC, 0x07, 0x74,
+0x12, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0xFA, 0xF0, 0x74, 0x11, 0x2C,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x1F, 0xF0, 0xAC, 0x07, 0x74, 0x06, 0x2C,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x44, 0x0E, 0xF0, 0x90, 0x04, 0xA7, 0xE4, 0xF0,
+0x90, 0x04, 0xA6, 0xF0, 0x90, 0x04, 0xA5, 0x74, 0xFF, 0xF0, 0x90, 0x04, 0xA4, 0x74, 0xFD, 0xF0,
+0x74, 0x14, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x4D, 0xFD, 0x74,
+0x14, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xED, 0xF0, 0x22, 0x90, 0xA3, 0xBB, 0xE0,
+0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0xA4, 0x0C, 0xEF, 0xF0, 0x90, 0x9F, 0x9F,
+0xE0, 0xFF, 0x90, 0x04, 0x1C, 0xE0, 0x6F, 0x70, 0x49, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x0E, 0x70,
+0x15, 0x90, 0xA4, 0x0C, 0xE0, 0x70, 0x3B, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06,
+0x04, 0x12, 0x55, 0x7F, 0x80, 0x26, 0x90, 0xA1, 0x1D, 0xE0, 0x64, 0x06, 0x70, 0x24, 0x90, 0xA4,
+0x0C, 0xE0, 0x60, 0x1E, 0x90, 0xA1, 0x16, 0xE0, 0x54, 0xBF, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x44,
+0x40, 0xF0, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0xA1, 0x1D, 0x74, 0x04, 0xF0, 0xE4, 0xFD, 0xFF, 0x12,
+0x49, 0x5E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFE, 0xEF, 0xC3, 0x13, 0xFD, 0xEF, 0x30, 0xE0,
+0x02, 0x7E, 0x80, 0x90, 0xFD, 0x10, 0xED, 0xF0, 0xAF, 0x06, 0x22, 0x00, 0x14, 0xF9,
};
-u4Byte ArrayLength_MP_8723B_FW_MP = 31554;
+u4Byte ArrayLength_MP_8723B_FW_MP = 31870;
void
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c
index 3246fbb..98068e6 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.c
@@ -18,41 +18,95 @@
*
******************************************************************************/
-//#include "Mp_Precomp.h"
+
#include "../odm_precomp.h"
#if (RTL8723B_SUPPORT == 1)
static BOOLEAN
-CheckCondition(
- const u4Byte Condition,
- const u4Byte Hex
+CheckPositive(
+ IN PDM_ODM_T pDM_Odm,
+ IN const u4Byte Condition1,
+ IN const u4Byte Condition2
)
{
- u4Byte _board = (Hex & 0x000000FF);
- u4Byte _interface = (Hex & 0x0000FF00) >> 8;
- u4Byte _platform = (Hex & 0x00FF0000) >> 16;
- u4Byte cond = Condition;
+ u1Byte _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA
+ ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA
+ ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA
+ ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA
+ ((pDM_Odm->BoardType & BIT2) >> 2) << 4; // _BT
- if ( Condition == 0xCDCDCDCD )
- return TRUE;
+ u4Byte cond1 = Condition1, cond2 = Condition2;
+ u4Byte driver1 = pDM_Odm->CutVersion << 24 |
+ pDM_Odm->SupportPlatform << 16 |
+ pDM_Odm->PackageType << 12 |
+ pDM_Odm->SupportInterface << 8 |
+ _BoardType;
- cond = Condition & 0x000000FF;
- if ( (_board != cond) && (cond != 0xFF) )
- return FALSE;
+ u4Byte driver2 = pDM_Odm->TypeGLNA << 0 |
+ pDM_Odm->TypeGPA << 8 |
+ pDM_Odm->TypeALNA << 16 |
+ pDM_Odm->TypeAPA << 24;
- cond = Condition & 0x0000FF00;
- cond = cond >> 8;
- if ( ((_interface & cond) == 0) && (cond != 0x07) )
- return FALSE;
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));
- cond = Condition & 0x00FF0000;
- cond = cond >> 16;
- if ( ((_platform & cond) == 0) && (cond != 0x0F) )
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ (" (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ (" (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));
+
+
+ //============== Value Defined Check ===============//
+ //QFN Type [15:12] and Cut Version [27:24] need to do value check
+
+ if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
+ return FALSE;
+ if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
+ return FALSE;
+
+ //=============== Bit Defined Check ================//
+ // We don't care [31:28] and [23:20]
+ //
+ cond1 &= 0x000F0FFF;
+ driver1 &= 0x000F0FFF;
+
+ if ((cond1 & driver1) == cond1)
+ {
+ u4Byte bitMask = 0;
+ if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE
+ return TRUE;
+
+ if ((cond1 & BIT0) != 0) //GLNA
+ bitMask |= 0x000000FF;
+ if ((cond1 & BIT1) != 0) //GPA
+ bitMask |= 0x0000FF00;
+ if ((cond1 & BIT2) != 0) //ALNA
+ bitMask |= 0x00FF0000;
+ if ((cond1 & BIT3) != 0) //APA
+ bitMask |= 0xFF000000;
+
+ if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched
+ return TRUE;
+ else
+ return FALSE;
+ }
+ else
+ {
return FALSE;
+ }
+}
+static BOOLEAN
+CheckNegative(
+ IN PDM_ODM_T pDM_Odm,
+ IN const u4Byte Condition1,
+ IN const u4Byte Condition2
+ )
+{
return TRUE;
}
-
/******************************************************************************
* MAC_REG.TXT
******************************************************************************/
@@ -169,69 +223,73 @@ ODM_ReadAndConfig_MP_8723B_MAC_REG(
IN PDM_ODM_T pDM_Odm
)
{
- #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
-
- u4Byte hex = 0;
- u4Byte i = 0;
- u2Byte count = 0;
- pu4Byte ptr_array = NULL;
- u1Byte platform = pDM_Odm->SupportPlatform;
- u1Byte _interface = pDM_Odm->SupportInterface;
- u1Byte board = pDM_Odm->BoardType;
- u4Byte ArrayLen = sizeof(Array_MP_8723B_MAC_REG)/sizeof(u4Byte);
- pu4Byte Array = Array_MP_8723B_MAC_REG;
-
-
- hex += board;
- hex += _interface << 8;
- hex += platform << 16;
- hex += 0xFF000000;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_MAC_REG, hex = 0x%X\n", hex));
-
- for (i = 0; i < ArrayLen; i += 2 )
- {
- u4Byte v1 = Array[i];
- u4Byte v2 = Array[i+1];
+ u4Byte i = 0;
+ u4Byte ArrayLen = sizeof(Array_MP_8723B_MAC_REG)/sizeof(u4Byte);
+ pu4Byte Array = Array_MP_8723B_MAC_REG;
- // This (offset, data) pair meets the condition.
- if ( v1 < 0xCDCDCDCD )
- {
- odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);
- continue;
- }
- else
- { // This line is the start line of branch.
- if ( !CheckCondition(Array[i], hex) )
- { // Discard the following (offset, data) pairs.
- READ_NEXT_PAIR(v1, v2, i);
- while (v2 != 0xDEAD &&
- v2 != 0xCDEF &&
- v2 != 0xCDCD && i < ArrayLen -2)
- {
- READ_NEXT_PAIR(v1, v2, i);
- }
- i -= 2; // prevent from for-loop += 2
- }
- else // Configure matched pairs and skip to end of if-else.
- {
- READ_NEXT_PAIR(v1, v2, i);
- while (v2 != 0xDEAD &&
- v2 != 0xCDEF &&
- v2 != 0xCDCD && i < ArrayLen -2)
- {
- odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);
- READ_NEXT_PAIR(v1, v2, i);
- }
-
- while (v2 != 0xDEAD && i < ArrayLen -2)
- {
- READ_NEXT_PAIR(v1, v2, i);
- }
-
- }
- }
- }
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_MAC_REG\n"));
+
+ for (i = 0; i < ArrayLen; i += 2 )
+ {
+ u4Byte v1 = Array[i];
+ u4Byte v2 = Array[i+1];
+
+ // This (offset, data) pair doesn't care the condition.
+ if ( v1 < 0x40000000 )
+ {
+ odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);
+ continue;
+ }
+ else
+ { // This line is the beginning of branch.
+ BOOLEAN bMatched = TRUE;
+ u1Byte cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+
+ if (cCond == COND_ELSE) { // ELSE, ENDIF
+ bMatched = TRUE;
+ READ_NEXT_PAIR(v1, v2, i);
+ } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) {
+ bMatched = FALSE;
+ READ_NEXT_PAIR(v1, v2, i);
+ READ_NEXT_PAIR(v1, v2, i);
+ } else {
+ READ_NEXT_PAIR(v1, v2, i);
+ if ( ! CheckNegative(pDM_Odm, v1, v2) )
+ bMatched = FALSE;
+ else
+ bMatched = TRUE;
+ READ_NEXT_PAIR(v1, v2, i);
+ }
+ if ( bMatched == FALSE )
+ { // Condition isn't matched. Discard the following (offset, data) pairs.
+ while (v1 < 0x40000000 && i < ArrayLen -2)
+ READ_NEXT_PAIR(v1, v2, i);
+
+ i -= 2; // prevent from for-loop += 2
+ }
+ else // Configure matched pairs and skip to end of if-else.
+ {
+ while (v1 < 0x40000000 && i < ArrayLen-2) {
+ odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);
+ READ_NEXT_PAIR(v1, v2, i);
+ }
+
+ // Keeps reading until ENDIF.
+ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+ while (cCond != COND_ENDIF && i < ArrayLen-2) {
+ READ_NEXT_PAIR(v1, v2, i);
+ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+ }
+ }
+ }
+ }
+}
+
+u4Byte
+ODM_GetVersion_MP_8723B_MAC_REG(void)
+{
+ return 11;
}
#endif // end of HWIMG_SUPPORT
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h
index 9745a2c..1f74db8 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MAC.h
@@ -22,7 +22,6 @@
#ifndef __INC_MP_MAC_HW_IMG_8723B_H
#define __INC_MP_MAC_HW_IMG_8723B_H
-//static BOOLEAN CheckCondition(const u4Byte Condition, const u4Byte Hex);
/******************************************************************************
* MAC_REG.TXT
@@ -32,6 +31,7 @@ void
ODM_ReadAndConfig_MP_8723B_MAC_REG( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_MAC_REG(void);
#endif
#endif // end of HWIMG_SUPPORT
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.c b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.c
index 7126d6d..23e0867 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.c
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.c
@@ -23,67 +23,654 @@
#if (RTL8723B_SUPPORT==1)
#ifdef CONFIG_MP_INCLUDED
-//rtl8723b_mp_bcut_bt40_fw_asic_rom_patch-svn11495-0x803D33F8-20140110-MP-array_for_dcut unsigned char bt_mp_patch_array[19144] = {
+
+//#define SIZE_OF_BT_MP_PATCH 20564
u8 Rtl8723BFwBTImgArray[Rtl8723BFwBTImgArrayLength] = {
-0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x69, 0x49, 0xb2, 0x20, 0xda, 0x49, 0xb2, 0x40, 0x9a, 0x49, 0xb3, 0x49, 0xb0, 0x42, 0x34, 0x82, 0x34, 0x80, 0xcb, 0x48, 0xb3, 0x40, 0xcb, 0x48, 0xb2, 0x20, 0xc2, 0x48, 0xb2, 0x20, 0xc2, 0x48, 0xb2, 0x20, 0xca, 0x48, 0xb3, 0x49, 0xb2, 0x60, 0xda, 0x49, 0xb3, 0x49, 0xb2, 0x60, 0xda, 0x49, 0xb3, 0x4a, 0xb2, 0x60, 0xda, 0x4a, 0xb3, 0x4a, 0xb2, 0x60, 0xda, 0x4a, 0xb3, 0x4b, 0xb2, 0x60, 0xda, 0x4b, 0xb3, 0x4b, 0xb2, 0x60, 0xda, 0x4b, 0xb3, 0x4c, 0xb2, 0x60, 0xda, 0x4c, 0xb3, 0x4c, 0xb2, 0x60, 0xda, 0x4c, 0xb3, 0x4d, 0xb2, 0x60, 0xda, 0x4d, 0xb3, 0x4d, 0xb2, 0x60, 0xda, 0x4d, 0xb3, 0x4e, 0xb2, 0x60, 0xda, 0x4e, 0xb3, 0x4e, 0xb2, 0x60, 0xda, 0x4e, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x50, 0xb2, 0x60, 0xda, 0x50, 0xb3, 0x50, 0xb2, 0x80, 0x18, 0xce, 0x2d, 0x60, 0xda, 0x4f, 0xb3, 0x50, 0xb2, 0x60, 0xda, 0x50, 0xb3, 0x50, 0xb2, 0x60, 0xda, 0x50, 0xb3, 0x51, 0xb2, 0x60, 0xda, 0x51, 0xb3, 0x51, 0xb2, 0x60, 0xda, 0x51, 0xb3, 0x52, 0xb2, 0x60, 0xda, 0x52, 0xb3, 0x52, 0xb2, 0x60, 0xda, 0x45, 0xf1, 0x09, 0x6a, 0x00, 0xf1, 0x50, 0xc8, 0x50, 0xb2, 0x00, 0xf4, 0x00, 0x6b, 0xa0, 0xf0, 0x76, 0xc8, 0x43, 0xd8, 0x4e, 0xb2, 0x4f, 0xb3, 0x25, 0xd8, 0x44, 0xd8, 0x02, 0x6a, 0x80, 0xf1, 0x42, 0xc0, 0x00, 0xf2, 0x00, 0x6a, 0xa0, 0xf0, 0x52, 0xc8, 0x90, 0x6a, 0xa0, 0xf0, 0x54, 0xc8, 0xa0, 0xf0, 0x58, 0xc8, 0x48, 0xb2, 0x60, 0xda, 0x48, 0xb3, 0x49, 0xb2, 0x60, 0xda, 0x49, 0xb3, 0x49, 0xb2, 0x60, 0xda, 0x49, 0xb3, 0x4a, 0xb2, 0x60, 0xda, 0x26, 0xd8, 0x27, 0xd8, 0x28, 0xd8, 0x80, 0x18, 0xde, 0x33, 0x29, 0xd8, 0xc0, 0xf1, 0x7f, 0xa0, 0x46, 0xb2, 0x60, 0xc2, 0xe0, 0xf1, 0x62, 0xa0, 0x45, 0xb2, 0x60, 0xc2, 0x45, 0xb2, 0x00, 0x6b, 0x60, 0xc2, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x00, 0x65, 0x54, 0x8b, 0x10, 0x80, 0xc4, 0xea, 0x10, 0x80, 0x46, 0x00, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x44, 0x00, 0x11, 0x80, 0xf9, 0x95, 0x11,
-0x80, 0xfa, 0x95, 0x11, 0x80, 0xfc, 0x95, 0x11, 0x80, 0x35, 0xc8, 0x10, 0x80, 0xe8, 0x07, 0x11, 0x80, 0xbd, 0xc2, 0x10, 0x80, 0x24, 0x19, 0x11, 0x80, 0x6d, 0xc2, 0x10, 0x80, 0x80, 0x19, 0x11, 0x80, 0x1d, 0xdf, 0x10, 0x80, 0x14, 0x07, 0x11, 0x80, 0x31, 0xd1, 0x10, 0x80, 0x1c, 0x19, 0x11, 0x80, 0x29, 0xba, 0x10, 0x80, 0x20, 0x19, 0x11, 0x80, 0x99, 0xd3, 0x10, 0x80, 0xb0, 0x07, 0x11, 0x80, 0x49, 0xb9, 0x10, 0x80, 0xf8, 0x06, 0x11, 0x80, 0x59, 0xd4, 0x10, 0x80, 0x08, 0x07, 0x11, 0x80, 0x31, 0xca, 0x10, 0x80, 0xe0, 0x06, 0x11, 0x80, 0xa5, 0xc9, 0x10, 0x80, 0xd0, 0x07, 0x11, 0x80, 0xcd, 0xb9, 0x10, 0x80, 0xc8, 0x07, 0x11, 0x80, 0xe9, 0xb9, 0x10, 0x80, 0xa0, 0x07, 0x11, 0x80, 0xcd, 0xcc, 0x10, 0x80, 0xe8, 0x06, 0x11, 0x80, 0xd5, 0xcd, 0x10, 0x80, 0x48, 0x19, 0x11, 0x80, 0x45, 0xe7, 0x10, 0x80, 0x90, 0x07, 0x11, 0x80, 0x79, 0xba, 0x10, 0x80, 0x34, 0x08, 0x11, 0x80, 0x61, 0xdb, 0x10, 0x80, 0xf8, 0x1a, 0x11, 0x80, 0xcd, 0xca, 0x10, 0x80, 0x40, 0x19, 0x11, 0x80, 0xa1, 0xba, 0x10, 0x80, 0xc4, 0x07, 0x11, 0x80, 0xf9, 0xc8, 0x10, 0x80, 0x74, 0x19, 0x11, 0x80, 0x75, 0xdf, 0x10, 0x80, 0x74, 0x07, 0x11, 0x80, 0x14, 0xc0, 0x52, 0x02, 0x58, 0xd5, 0xc8, 0x19, 0x85, 0xaf, 0x10, 0x80, 0x7c, 0x07, 0x11, 0x80, 0xb9, 0xd5, 0x10, 0x80, 0xb4, 0x07, 0x11, 0x80, 0xd5, 0xd4, 0x10, 0x80, 0x58, 0x08, 0x11, 0x80, 0xc9, 0xba, 0x10, 0x80, 0x1c, 0x1a, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x08, 0x96, 0x11, 0x80, 0xfe, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x0c, 0xb0, 0x90, 0x67, 0x00, 0x6d, 0x00, 0x18, 0x40, 0x33, 0x3c, 0x6e, 0x01, 0x6a, 0x4b, 0xea, 0x47, 0xd8, 0x70, 0x6a, 0x43, 0xc0, 0x0a, 0x6a, 0x4c, 0xc0, 0x08, 0x6a, 0x4d, 0xc0, 0x00, 0x6b, 0x05, 0xb2, 0x60, 0xc2, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xcc, 0x95, 0x11, 0x80, 0xd6, 0x63, 0x53, 0x62, 0x52, 0xd1, 0x51, 0xd0, 0x00, 0xf4, 0x05, 0x6a, 0x7d, 0x67, 0x52, 0xcb, 0x0d, 0x6a, 0x20, 0xf0, 0x46, 0xc3, 0x20, 0xf0, 0x07, 0x04, 0x71, 0xb5, 0x00, 0x18, 0x0d, 0x33, 0x06, 0x6e, 0x9d, 0x67, 0x01, 0x6a, 0x00, 0x6b, 0x20, 0xf0, 0x4f
-, 0xc4, 0x20, 0xf0, 0x53, 0xc4, 0x6c, 0xb2, 0x20, 0xf0, 0x6d, 0xc4, 0x20, 0xf0, 0x6e, 0xc4, 0x20, 0xf0, 0x70, 0xc4, 0x20, 0xf0, 0x71, 0xc4, 0x20, 0xf0, 0x72, 0xc4, 0xc0, 0xf1, 0x6a, 0xc2, 0xc0, 0xf1, 0x7e, 0xc2, 0x03, 0x6b, 0x02, 0x6c, 0xc0, 0xf1, 0x7c, 0xc2, 0x64, 0xb3, 0xc0, 0xf1, 0x89, 0xc2, 0xc0, 0xf1, 0x88, 0xc2, 0xc0, 0xf1, 0x9d, 0xc2, 0x80, 0xc3, 0x61, 0xb3, 0x00, 0x6c, 0x80, 0xdb, 0x81, 0xdb, 0x60, 0xf1, 0x70, 0xa2, 0x44, 0x67, 0x02, 0x73, 0x07, 0x60, 0x03, 0x73, 0xa0, 0xf0, 0x07, 0x60, 0x01, 0x73, 0xa0, 0xf0, 0x04, 0x60, 0x0f, 0x10, 0xc0, 0xf2, 0x0c, 0x6b, 0x78, 0xea, 0x58, 0xb4, 0x12, 0xeb, 0x6d, 0xe4, 0xc0, 0xf0, 0x68, 0xa3, 0x80, 0xf0, 0x19, 0x2b, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xf1, 0x61, 0x00, 0x18, 0xc8, 0x5e, 0x09, 0x04, 0x4a, 0xd2, 0x80, 0xf0, 0x10, 0x2a, 0x7d, 0x67, 0x20, 0xf0, 0x6d, 0xa3, 0x5d, 0x67, 0x9d, 0x67, 0x20, 0xf0, 0x4e, 0xa2, 0x20, 0xf0, 0x8f, 0xa4, 0x4e, 0xd3, 0x7d, 0x67, 0x4f, 0xd2, 0x4d, 0xd4, 0x5d, 0x67, 0x20, 0xf0, 0x93, 0xa3, 0x20, 0xf0, 0x50, 0xa2, 0x20, 0xf0, 0x02, 0x05, 0x4b, 0xd4, 0x4c, 0xd2, 0x20, 0xf0, 0x12, 0xa3, 0x20, 0xf0, 0x31, 0xa3, 0x00, 0x18, 0x28, 0xe2, 0x08, 0x04, 0x02, 0x22, 0x4a, 0xd2, 0x70, 0x10, 0x5d, 0x67, 0x00, 0x30, 0x2d, 0xe8, 0x31, 0xaa, 0xc0, 0xf2, 0x0c, 0x6a, 0x38, 0xb5, 0x58, 0xe9, 0x3b, 0xb2, 0x12, 0xe9, 0x45, 0xe1, 0xe0, 0xf0, 0x88, 0x41, 0x00, 0x18, 0x0d, 0x33, 0x06, 0x6e, 0x4f, 0x93, 0x4e, 0x94, 0x60, 0x32, 0x8d, 0xea, 0x60, 0xf2, 0x58, 0xc9, 0x5d, 0x67, 0x30, 0xf1, 0x64, 0x42, 0x40, 0xa3, 0x7d, 0x67, 0x30, 0xf1, 0x80, 0x43, 0xe0, 0xf0, 0x55, 0xc1, 0x60, 0xa4, 0x9d, 0x67, 0x20, 0xf1, 0x4c, 0x44, 0xe0, 0xf0, 0x77, 0xc1, 0x80, 0xa2, 0x7d, 0x67, 0xe0, 0xf0, 0x98, 0xc1, 0x20, 0xf0, 0x40, 0xa3, 0xe0, 0xf0, 0x4e, 0xc1, 0x01, 0x6a, 0x60, 0xf2, 0x5a, 0xc1, 0x00, 0x18, 0xe5, 0x9c, 0x91, 0xab, 0x9d, 0x67, 0x20, 0xf1, 0x48, 0x44, 0x80, 0xa2, 0x02, 0x32, 0x5e, 0x32, 0x00, 0xf1, 0x8c, 0xc1, 0x13, 0x22, 0xef, 0xf7, 0x1f, 0x6a, 0x0c, 0xea, 0x01, 0x6b, 0x80, 0xf0, 0x44, 0xc9, 0x06, 0x6c, 0x04, 0xd3, 0xfc, 0x6d, 0x1e, 0xb3, 0x80, 0xf5,
-0x19, 0x6e, 0x20, 0xf5, 0x17, 0x6f, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x06, 0x10, 0x5d, 0x67, 0x20, 0xf1, 0x68, 0x42, 0x40, 0xab, 0x80, 0xf0, 0x44, 0xc9, 0x00, 0x18, 0x92, 0xa0, 0x09, 0x04, 0x02, 0x67, 0x0e, 0x22, 0x7d, 0x67, 0x20, 0xf0, 0x80, 0xa3, 0xe0, 0xf0, 0xa3, 0xa1, 0x00, 0x18, 0x02, 0xe2, 0x00, 0x65, 0x0a, 0xb4, 0x00, 0x18, 0xfe, 0xe1, 0x00, 0x65, 0x4a, 0xd0, 0x08, 0x10, 0x5d, 0x67, 0x91, 0xaa, 0x20, 0x18, 0xfa, 0x25, 0x01, 0x6d, 0x02, 0x10, 0x0c, 0x6b, 0x4a, 0xd3, 0x4a, 0x92, 0x53, 0x97, 0x52, 0x91, 0x51, 0x90, 0x00, 0xef, 0x2a, 0x63, 0xa4, 0x95, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, 0x5c, 0x53, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x10, 0xb3, 0x00, 0x6d, 0xc0, 0xf1, 0xaa, 0xc3, 0xc0, 0xf1, 0xbe, 0xc3, 0xff, 0x6a, 0x03, 0x6d, 0x8c, 0xea, 0xc0, 0xf1, 0xbc, 0xc3, 0x02, 0x6c, 0x0b, 0xb5, 0xc0, 0xf1, 0x89, 0xc3, 0xc0, 0xf1, 0x88, 0xc3, 0xc0, 0xf1, 0x9d, 0xc3, 0x60, 0xf1, 0x40, 0xc3, 0x80, 0xc5, 0x00, 0x18, 0x2e, 0xaa, 0x82, 0x67, 0x06, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, 0x5c, 0x53, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x00, 0xf4, 0x06, 0x6a, 0x7d, 0x67, 0x4a, 0xcb, 0x03, 0x6a, 0x56, 0xc3, 0x13, 0x6a, 0x59, 0xc3, 0x1d, 0xb2, 0x6d, 0xa2, 0x08, 0x73, 0x1a, 0x60, 0xff, 0x6c, 0x09, 0x4c, 0x98, 0xeb, 0x1b, 0xb2, 0x01, 0x6d, 0x12, 0xec, 0x91, 0xe2, 0x20, 0xf1, 0xcf, 0xa4, 0xac, 0xee, 0x0f, 0x26, 0x00, 0xf1, 0x52, 0xaa, 0x47, 0xeb, 0xac, 0xea, 0x0a, 0x22, 0x20, 0xf1, 0x4c, 0xac, 0x7d, 0x67, 0x05, 0x04, 0x57, 0xc3, 0x42, 0x32, 0x58, 0xc3, 0x00, 0x18, 0x88, 0x4f, 0x04, 0x05, 0x0e, 0xb2, 0x4c, 0xa2, 0x0a, 0x72, 0x14, 0x60, 0xc0, 0xf2, 0x0c, 0x6b, 0x78, 0xea, 0x0d, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0xe0, 0xf0, 0x66, 0xa2, 0x01, 0x73, 0x0a, 0x61, 0x60, 0xf2, 0x56, 0xaa, 0x7d, 0x67, 0x05, 0x04, 0x57, 0xc3, 0x42, 0x32, 0x58, 0xc3, 0x00, 0x18, 0x88, 0x4f, 0x04, 0x05, 0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xa4, 0x3c
-, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x46, 0xd0, 0x00, 0x6a, 0x18, 0xb3, 0x9d, 0x67, 0x40, 0xdb, 0x41, 0xdb, 0x04, 0xf0, 0x06, 0x6b, 0x68, 0xcc, 0x54, 0xc4, 0x56, 0xc4, 0x57, 0xc4, 0x58, 0xc4, 0x59, 0xc4, 0x5a, 0xc4, 0x5b, 0xc4, 0x5c, 0xc4, 0x5d, 0xc4, 0x5e, 0xc4, 0x5f, 0xc4, 0x0f, 0x6b, 0x07, 0x6a, 0x04, 0x00, 0x72, 0xc4, 0x20, 0xf0, 0x40, 0xc4, 0x20, 0x6b, 0x03, 0x6a, 0x73, 0xc4, 0x75, 0xc4, 0x20, 0xf0, 0x41, 0xc4, 0x00, 0x18, 0x13, 0xca, 0x90, 0x67, 0x7d, 0x67, 0x04, 0xf0, 0x0a, 0x6a, 0x48, 0xcb, 0x01, 0x6a, 0x90, 0x67, 0x52, 0xc3, 0x00, 0x18, 0x8b, 0xca, 0x53, 0xc3, 0x47, 0x97, 0x46, 0x90, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, 0x5c, 0x53, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x00, 0x6a, 0x21, 0xb3, 0x9d, 0x67, 0x40, 0xdb, 0x41, 0xdb, 0x04, 0xf0, 0x0d, 0x6b, 0x68, 0xcc, 0x19, 0x6b, 0x72, 0xc4, 0x60, 0x6b, 0x6b, 0xeb, 0x73, 0xc4, 0x75, 0xc4, 0x1b, 0xb3, 0x54, 0xc4, 0x56, 0xc4, 0x57, 0xc4, 0x58, 0xc4, 0x94, 0xa3, 0xbd, 0x67, 0x5f, 0xc5, 0x99, 0xc5, 0x95, 0xa3, 0x20, 0xf0, 0x40, 0xc5, 0x20, 0xf0, 0x42, 0xc5, 0x9a, 0xc5, 0x96, 0xa3, 0x20, 0xf0, 0x44, 0xc5, 0x20, 0xf0, 0x45, 0xc5, 0x9b, 0xc5, 0x97, 0xa3, 0x20, 0xf0, 0x47, 0xc5, 0x20, 0xf0, 0x49, 0xc5, 0x9c, 0xc5, 0x98, 0xa3, 0x79, 0xa3, 0x9d, 0xc5, 0x7e, 0xc5, 0x02, 0x6b, 0x20, 0xf0, 0x61, 0xc5, 0x20, 0xf0, 0x63, 0xc5, 0x1e, 0x6b, 0x20, 0xf0, 0x66, 0xc5, 0x12, 0x6b, 0x20, 0xf0, 0x68, 0xc5, 0x20, 0xf0, 0x6a, 0xc5, 0x20, 0xf0, 0x4b, 0xc5, 0x00, 0x18, 0x41, 0xc8, 0x04, 0x04, 0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x0c, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x7d, 0x67, 0x04, 0xf0, 0x1d, 0x6a, 0x48, 0xcb, 0x01, 0x6a, 0x52, 0xc3, 0x08, 0xb2, 0x41, 0xaa, 0x7f, 0x6b, 0x04, 0x04, 0x4a, 0x32, 0x6c, 0xea, 0x7d, 0x67, 0x00, 0x18, 0xa2, 0xc5, 0x53, 0xc3, 0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdb, 0x63, 0x49, 0x62, 0x48, 0xd1, 0x47, 0xd0, 0x00, 0x69, 0x0e, 0xb2, 0x7d, 0x67, 0x20, 0xda, 0x21, 0xda, 0x04, 0xf0, 0x1f,
-0x6a, 0x48, 0xcb, 0x0b, 0xb2, 0x81, 0xf1, 0x48, 0xaa, 0x0b, 0xb0, 0x32, 0xc3, 0x04, 0x04, 0x00, 0x18, 0x1c, 0xc5, 0x4c, 0xd8, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x29, 0xc0, 0x44, 0xc0, 0x49, 0x97, 0x48, 0x91, 0x47, 0x90, 0x00, 0xef, 0x25, 0x63, 0x5c, 0x53, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x46, 0xd0, 0x00, 0x68, 0x0b, 0xb2, 0x7d, 0x67, 0x00, 0xda, 0x01, 0xda, 0x04, 0xf0, 0x1f, 0x6a, 0x12, 0xc3, 0x04, 0x04, 0x00, 0x18, 0x1c, 0xc5, 0x48, 0xcb, 0x07, 0xb2, 0x84, 0xa2, 0x41, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x64, 0xc2, 0x09, 0xc2, 0x47, 0x97, 0x46, 0x90, 0x00, 0xef, 0x24, 0x63, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x1c, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x1b, 0xb2, 0x64, 0xa2, 0x07, 0x6d, 0x6e, 0x34, 0xac, 0xec, 0x05, 0x54, 0x06, 0x61, 0x39, 0x6c, 0x8b, 0xec, 0x6c, 0xec, 0x20, 0x6b, 0x6d, 0xec, 0x84, 0xc2, 0x15, 0xb2, 0x64, 0xa2, 0x07, 0x6c, 0x14, 0xb5, 0x6e, 0x33, 0x8c, 0xeb, 0x6d, 0xe5, 0x60, 0xa3, 0xc3, 0xa2, 0x6c, 0xec, 0x0f, 0x6b, 0x6b, 0xeb, 0x84, 0x35, 0xcc, 0xeb, 0xad, 0xeb, 0x63, 0xc2, 0xbd, 0x67, 0x04, 0xf0, 0x1e, 0x6b, 0x68, 0xcd, 0x03, 0x6b, 0x72, 0xc5, 0x61, 0xaa, 0x7f, 0x6d, 0x6a, 0x33, 0xac, 0xeb, 0xbd, 0x67, 0x73, 0xc5, 0x40, 0x9a, 0x95, 0xc5, 0x04, 0x04, 0x42, 0x32, 0x00, 0x18, 0x58, 0xc5, 0x54, 0xc5, 0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xf4, 0xe7, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x02, 0xf1, 0x01, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x06, 0xb2, 0x84, 0xa2, 0x41, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x64, 0xc2, 0x00, 0x6b, 0x69, 0xc2, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x7c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x79, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x22
-, 0x67, 0x1e, 0xb3, 0xff, 0xf7, 0x1f, 0x68, 0x80, 0x9b, 0x0c, 0xe9, 0x4c, 0xe8, 0x4c, 0x9b, 0x96, 0x34, 0xe3, 0xf7, 0x1f, 0x6d, 0x49, 0xe0, 0xac, 0xec, 0x98, 0xea, 0x4c, 0xdb, 0x4e, 0x9b, 0x49, 0xe1, 0x4e, 0xdb, 0x12, 0xec, 0x8d, 0xdb, 0x7d, 0xf2, 0x01, 0x6b, 0x63, 0xe8, 0x02, 0x60, 0x63, 0xe9, 0x1d, 0x61, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x01, 0xf6, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0xf6, 0x00, 0x6b, 0xc2, 0x67, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6d, 0xee, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x11, 0xb2, 0x47, 0x9a, 0xff, 0x68, 0x8c, 0xe8, 0x01, 0x4a, 0x04, 0x22, 0x0f, 0xb4, 0x00, 0x18, 0xcb, 0x1c, 0x00, 0x65, 0x11, 0x20, 0x00, 0x69, 0x0b, 0xb0, 0x01, 0x6c, 0x0b, 0xb5, 0x0c, 0xb6, 0xf1, 0x67, 0x00, 0x18, 0xd9, 0x1c, 0x04, 0xd1, 0x87, 0x98, 0x00, 0x18, 0xbe, 0x1c, 0x14, 0x6d, 0x00, 0x6a, 0x30, 0xc8, 0x20, 0xf0, 0x49, 0xc0, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xac, 0x95, 0x11, 0x80, 0x31, 0xa9, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0xff, 0x6b, 0x0c, 0xea, 0x02, 0x4b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x00, 0xf2, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0x0c, 0xb0, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0xd1, 0xa8, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x42, 0x6c, 0x80, 0x18, 0x18, 0x2a, 0x00, 0x6c, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x44, 0xc0, 0x00, 0x6a, 0x49, 0xc0, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0,
-0x20, 0xb2, 0x47, 0x9a, 0x08, 0xd4, 0x8e, 0xea, 0x05, 0x22, 0x01, 0x4c, 0x03, 0x24, 0x00, 0x18, 0xcb, 0x1c, 0x08, 0x04, 0x1b, 0xb0, 0x64, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x08, 0x2a, 0x47, 0x98, 0x01, 0x4a, 0x29, 0x22, 0x18, 0xb4, 0x00, 0x18, 0xcb, 0x1c, 0x00, 0x65, 0x24, 0x10, 0x02, 0x69, 0x6c, 0xe9, 0xff, 0x6a, 0x4c, 0xe9, 0x07, 0x21, 0x80, 0x18, 0xf3, 0x29, 0x00, 0x65, 0x50, 0xa8, 0x01, 0x4a, 0x50, 0xc8, 0x18, 0x10, 0x7d, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x04, 0x6b, 0x4c, 0xeb, 0x06, 0x23, 0x50, 0xa8, 0x20, 0xf0, 0x29, 0xc0, 0x01, 0x4a, 0x50, 0xc8, 0x0b, 0x10, 0x20, 0xf0, 0x49, 0xa0, 0x19, 0x5a, 0x04, 0x60, 0x01, 0x4a, 0x20, 0xf0, 0x49, 0xc0, 0x03, 0x10, 0x80, 0x18, 0x2e, 0x2a, 0x00, 0x65, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x90, 0x95, 0x11, 0x80, 0xac, 0x95, 0x11, 0x80, 0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x6c, 0x02, 0xf0, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x2c, 0xb2, 0xc1, 0xaa, 0x7f, 0x6a, 0x3f, 0x6c, 0xca, 0x36, 0x4c, 0xee, 0x80, 0x4a, 0x81, 0x4a, 0x4d, 0xee, 0xff, 0x6a, 0x4c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x01, 0xf6, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0xf6, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x03, 0x69, 0x2b, 0xe9, 0xc2, 0x67, 0x2c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0xc2, 0x67, 0x2c, 0xee, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x80, 0x18, 0x18, 0x2a, 0x01, 0x6c, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62
-, 0x04, 0xd0, 0x00, 0x6c, 0xc4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0x6e, 0xff, 0xf7, 0x1f, 0x6b, 0x04, 0x4e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x01, 0x6d, 0x0b, 0xb0, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x00, 0x6c, 0x80, 0x18, 0x18, 0x2a, 0x44, 0xc0, 0x80, 0x18, 0xf3, 0x29, 0x00, 0x65, 0x00, 0x6a, 0x49, 0xc0, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x38, 0xb0, 0x90, 0xa0, 0x4f, 0xa0, 0x04, 0x05, 0x80, 0x34, 0x4d, 0xec, 0x4e, 0xa0, 0x80, 0x34, 0x00, 0x18, 0x69, 0xbc, 0x4d, 0xec, 0x7d, 0x67, 0x48, 0xab, 0x8f, 0xa0, 0xdd, 0x67, 0x4c, 0xcb, 0x49, 0xab, 0xaa, 0xae, 0x4d, 0xcb, 0x4e, 0xa0, 0x80, 0x33, 0x68, 0x33, 0x48, 0x32, 0x6d, 0xea, 0x03, 0x6b, 0xac, 0xeb, 0x6d, 0xea, 0x70, 0xa0, 0x4e, 0xce, 0x9a, 0x34, 0x68, 0x32, 0x7e, 0x33, 0x8d, 0xea, 0x05, 0x23, 0x09, 0xf4, 0x00, 0x6b, 0x4d, 0xeb, 0x6f, 0xce, 0x06, 0x10, 0x0a, 0xf0, 0x00, 0x6b, 0x6b, 0xeb, 0x4d, 0xeb, 0x5d, 0x67, 0x6f, 0xca, 0x00, 0x6a, 0x21, 0x10, 0xdd, 0x67, 0x44, 0x35, 0xb5, 0xe6, 0xac, 0xad, 0x01, 0x6e, 0xa7, 0xeb, 0xcc, 0xed, 0x0c, 0x25, 0x0f, 0x6d, 0x77, 0xe5, 0xc4, 0xed, 0xa6, 0x67, 0x8d, 0xed, 0xa0, 0x34, 0x80, 0x34, 0x83, 0x34, 0x83, 0x34, 0xff, 0xf7, 0x1f, 0x6d, 0xac, 0xec, 0x01, 0x4b, 0xff, 0x6d, 0xac, 0xeb, 0x10, 0x5b, 0xe7, 0x61, 0x44, 0x33, 0x01, 0x4a, 0xdd, 0x67, 0xac, 0xea, 0x6d, 0xe6, 0x04, 0x5a, 0x8c, 0xcb, 0x03, 0x60, 0x00, 0x6c, 0x64, 0x67, 0xdc, 0x17, 0x5d, 0x67, 0xcc, 0xaa, 0x51, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x7d, 0x67, 0xcd, 0xab, 0x50, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x5d, 0x67, 0xce, 0xaa, 0x4f, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x7d, 0x67, 0xcf, 0xab, 0x4e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x5e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02,
-0xf0, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x5e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0xff, 0x6b, 0x01, 0x4b, 0xc2, 0x67, 0x53, 0xb1, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x44, 0xa1, 0x07, 0x6b, 0xa3, 0xa1, 0x4e, 0x32, 0x6c, 0xea, 0x44, 0x34, 0x0f, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc1, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x04, 0xd3, 0xc3, 0xa1, 0x04, 0x93, 0x71, 0x6c, 0xc6, 0x36, 0x6c, 0xee, 0x0c, 0xea, 0x8b, 0xec, 0x8c, 0xea, 0xd0, 0x36, 0x4d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x60, 0xa1, 0x01, 0x6a, 0x01, 0x68, 0x6c, 0xea, 0x0b, 0x22, 0x44, 0xa1, 0x80, 0x48, 0xff, 0x48, 0x4c, 0xe8, 0xff, 0x6a, 0x4c, 0xe8, 0x0b, 0xe8, 0xc0, 0xf7, 0x02, 0x30, 0x03, 0x6a, 0x03, 0xe2, 0x39, 0xb1, 0x56, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x80, 0x99, 0x00, 0x33, 0xe3, 0xf7, 0x1f, 0x6d, 0x96, 0x34, 0xac, 0xec, 0x78, 0x33, 0x8d, 0xeb, 0xfb, 0xf7, 0x1f, 0x6c, 0x8c, 0xeb, 0xff, 0xf7, 0x1f, 0x68, 0x1c, 0xf0, 0x00, 0x6c, 0x8b, 0xec, 0x0c, 0xea, 0xc3, 0x67, 0x8c, 0xea, 0x4d, 0xee, 0x56, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0xc7, 0xa1, 0x46, 0xa1, 0x58, 0x6c, 0xc0, 0x36, 0x4d, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x04, 0x6b, 0x6b, 0xeb, 0x0c, 0xea, 0x6c, 0xea, 0x68, 0xa1, 0x03, 0x6c, 0xc2, 0x67, 0x8c, 0xeb, 0x6d, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x80, 0x18, 0xb8, 0x2a, 0x00, 0x65, 0x63, 0xa1, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x1e, 0x22, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x80, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xc5, 0xa1, 0xe0, 0xf1, 0x1d, 0x6b, 0x6b, 0xeb, 0x0c, 0xea, 0x6c, 0xea, 0xc8, 0x36, 0xe0, 0xf3, 0x19, 0x4b, 0x6c, 0xee, 0x59, 0x6c, 0x01, 0x6d, 0x4d, 0xee, 0x0b, 0x10, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x81, 0x6b, 0x6b, 0xeb, 0xc2
-, 0x67, 0x57, 0x6c, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x65, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x42, 0xb0, 0x43, 0xa0, 0x07, 0x6b, 0xff, 0xf7, 0x1f, 0x69, 0x52, 0x32, 0x6c, 0xea, 0x05, 0x4a, 0x80, 0x18, 0xf2, 0x2a, 0x04, 0xd2, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x2c, 0xea, 0x02, 0xf0, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x2c, 0xea, 0x00, 0xf2, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x42, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xd2, 0xa8, 0x51, 0xc8, 0x53, 0xa8, 0xc0, 0x36, 0xc0, 0x36, 0x4d, 0xee, 0x02, 0xf0, 0x00, 0x5e, 0x02, 0x61, 0xe1, 0xf7, 0x1f, 0x6e, 0x28, 0xb1, 0x20, 0xf0, 0x48, 0xa1, 0x0f, 0x6b, 0xd0, 0x36, 0x6c, 0xea, 0x4d, 0xee, 0x42, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0x02, 0xf0, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x04, 0x94, 0x1f, 0xf7, 0x01, 0x6b, 0x0c, 0xea, 0x6b, 0xeb, 0x6c, 0xea, 0x1a, 0xb3, 0x8d, 0xe3, 0x20, 0xf1, 0xda, 0xa3, 0x02, 0x6c, 0x00, 0x6d, 0xc0, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4d, 0xee, 0xc1, 0xa9, 0x7f, 0x6a, 0x3f, 0x6c, 0xca, 0x36, 0x4c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0x6d, 0xc2, 0x67, 0xad, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x80, 0x18, 0x18, 0x2a, 0x01, 0x6c, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x90, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x33, 0xb3, 0xe3, 0xa3, 0x07, 0x6a, 0x05, 0xd3, 0xf2, 0x37, 0x4c, 0xef, 0x05, 0x4f, 0x80, 0x18, 0xf2, 0x2a, 0x04, 0xd7, 0x57, 0x6c,
-0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02, 0xf0, 0x00, 0x69, 0xc2, 0x67, 0x2d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x00, 0xf2, 0x01, 0x6e, 0x0c, 0xea, 0xcb, 0xee, 0x4c, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xd1, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x04, 0x97, 0x1f, 0xf7, 0x01, 0x6c, 0x0c, 0xea, 0x8b, 0xec, 0x8c, 0xea, 0x1a, 0xb4, 0xfd, 0xe4, 0x20, 0xf1, 0xda, 0xa7, 0x02, 0x6c, 0x00, 0x6d, 0xc0, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4d, 0xee, 0x05, 0x93, 0x7f, 0x6a, 0x3f, 0x6c, 0xc1, 0xab, 0x00, 0x6d, 0xca, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0x6d, 0xc2, 0x67, 0xad, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6c, 0xee, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x80, 0x18, 0xf2, 0x2a, 0x00, 0x65, 0x00, 0x6b, 0x0c, 0xb2, 0x6e, 0xda, 0x6c, 0xda, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x00, 0xf2, 0x01, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x59, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6c, 0xee, 0x80, 0x18, 0x70, 0x2a, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x90, 0x95, 0x11, 0x80, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0x42, 0xa4, 0xff, 0x6b, 0x04, 0x67, 0xff, 0x4a, 0x6c, 0xea, 0x25, 0x5a, 0x23, 0xa4, 0x2d, 0x60, 0x04, 0x0b, 0x44, 0x32, 0x49, 0xe3, 0x40, 0x8a, 0x4d, 0xe3, 0x00, 0xeb, 0x00, 0x65, 0x00, 0x65, 0x4f, 0x00, 0xa3, 0x00, 0xb3, 0x02, 0x41, 0x03, 0x7b, 0x03, 0xef, 0x03, 0x17, 0x04, 0x29, 0x04, 0x37, 0x04, 0x4d, 0x04, 0x5b, 0x04, 0x4b, 0x00, 0x4b, 0x00, 0x69, 0x04, 0x61, 0x05, 0x79, 0x05, 0x4b, 0x00, 0x91, 0x05, 0x9f, 0x05, 0xad, 0x05, 0xdf, 0x05, 0xed, 0x05, 0xff, 0x05
-, 0x0d, 0x06, 0x1f, 0x06, 0x23, 0x06, 0x27, 0x06, 0x33, 0x06, 0x45, 0x06, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x5d, 0x06, 0x95, 0x06, 0x9d, 0x06, 0xaf, 0x06, 0x00, 0x6a, 0x4a, 0x13, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x02, 0xf1, 0x03, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x80, 0x18, 0x18, 0x2a, 0x00, 0x6c, 0x00, 0x18, 0xe8, 0x58, 0x00, 0x65, 0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0x60, 0xf6, 0x00, 0xb2, 0x0a, 0x6b, 0x6c, 0xc2, 0x08, 0x6b, 0x6d, 0xc2, 0x00, 0x6b, 0x69, 0xc2, 0x6a, 0xc2, 0x0f, 0x13, 0x0e, 0x59, 0x00, 0xf3, 0x08, 0x60, 0x40, 0xf6, 0x04, 0xb2, 0x06, 0x21, 0x64, 0xa2, 0x40, 0x6a, 0x6c, 0xea, 0x00, 0xf3, 0x00, 0x2a, 0x06, 0x10, 0x84, 0xa2, 0x40, 0x6b, 0x8c, 0xeb, 0x02, 0x2b, 0x29, 0xc2, 0xfd, 0x12, 0x20, 0xf6, 0x08, 0xb2, 0x69, 0xa2, 0x0e, 0x59, 0x29, 0xc2, 0x06, 0xd3, 0xe0, 0xf0, 0x03, 0x60, 0x04, 0x0a, 0x24, 0x31, 0x25, 0xe2, 0x60, 0x89, 0x69, 0xe2, 0x00, 0xea, 0x00, 0x65, 0x1d, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0xef, 0x00, 0x0f, 0x01, 0x13, 0x01, 0x1d, 0x01, 0xb9, 0x01, 0x21, 0x01, 0x29, 0x01, 0x31, 0x01, 0x39, 0x01, 0x6d, 0x01, 0xa7, 0x01, 0xe0, 0xf5, 0x0c, 0xb2, 0x44, 0xa2, 0x01, 0x6b, 0x4c, 0xeb, 0x12, 0x23, 0x02, 0x6b, 0x4c, 0xeb, 0x04, 0x23, 0x80, 0x18, 0xa2, 0x2a, 0x00, 0x65, 0x18, 0x10, 0x06, 0x92, 0x02, 0x72, 0x04, 0x61, 0x80, 0x18, 0x2e, 0x2a, 0x00, 0x65, 0x11, 0x10, 0x80, 0x18, 0xe1, 0x29, 0x00, 0x65, 0x0d, 0x10, 0x04, 0x6b, 0x4c, 0xeb, 0x0a, 0x23, 0x02, 0x6b, 0x4c, 0xeb, 0x04, 0x23, 0x80, 0x18, 0x9f, 0x29, 0x00, 0x65, 0x03, 0x10, 0x80, 0x18, 0xb2, 0x29, 0x00, 0x65, 0xa0, 0xf5, 0x04, 0xb1, 0x6c, 0x99, 0xed, 0x99, 0x4e, 0x99, 0x09, 0xd3, 0x08, 0xd7, 0x00, 0x18, 0xe8, 0x58, 0x07, 0xd2, 0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0x0a, 0x6a, 0x4c, 0xc1, 0x08, 0x6a, 0x4d, 0xc1, 0x06, 0x92, 0x09, 0x93, 0x08, 0x97, 0x02, 0x5a, 0xa0, 0xf2, 0x01, 0x60, 0x6c, 0xd9, 0x07,
-0x93, 0xed, 0xd9, 0x6e, 0xd9, 0x9c, 0x12, 0x60, 0xf5, 0x04, 0xb1, 0x64, 0xa1, 0x02, 0x6a, 0x6d, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x80, 0x18, 0xd1, 0x2b, 0x44, 0xc1, 0x25, 0x10, 0x40, 0xf5, 0x10, 0xb3, 0x84, 0xa3, 0x03, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0x04, 0x6c, 0x4c, 0xec, 0x07, 0x24, 0x02, 0x6c, 0x8b, 0xec, 0x4c, 0xec, 0x80, 0x18, 0xc1, 0x29, 0x84, 0xc3, 0x05, 0x10, 0x01, 0x6c, 0x4d, 0xec, 0x80, 0x18, 0x54, 0x2b, 0x84, 0xc3, 0x20, 0xf5, 0x04, 0xb3, 0x84, 0xa3, 0x40, 0x6a, 0x1f, 0x11, 0x00, 0xf5, 0x1c, 0xb1, 0x64, 0xa1, 0x03, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x80, 0x18, 0x9a, 0x2b, 0x44, 0xc1, 0x64, 0xa1, 0x40, 0x6a, 0x6d, 0xea, 0x44, 0xc1, 0x67, 0x12, 0x01, 0x6c, 0x01, 0x10, 0x02, 0x6c, 0x80, 0x18, 0x18, 0x29, 0x00, 0x65, 0x60, 0x12, 0x03, 0x6c, 0xfa, 0x17, 0x80, 0x18, 0x6c, 0x29, 0x00, 0x65, 0x5a, 0x12, 0x80, 0x18, 0x51, 0x29, 0x00, 0x65, 0x56, 0x12, 0x80, 0x18, 0x2c, 0x29, 0x00, 0x65, 0x52, 0x12, 0xc0, 0xf4, 0x10, 0xb2, 0x80, 0xa2, 0x01, 0x6b, 0x8c, 0xeb, 0xc0, 0xf4, 0x0c, 0xb4, 0x60, 0xc4, 0x60, 0x9a, 0xc0, 0xf4, 0x08, 0xb4, 0x76, 0x33, 0xc0, 0xf4, 0x60, 0x33, 0x80, 0xf5, 0x62, 0x33, 0x60, 0xcc, 0x40, 0xa2, 0x0f, 0x6b, 0x00, 0x6c, 0x46, 0x32, 0x6c, 0xea, 0xa0, 0xf4, 0x10, 0xb3, 0x40, 0xc3, 0x19, 0x10, 0x80, 0xf4, 0x1c, 0xb2, 0x80, 0xa2, 0x01, 0x6b, 0x8c, 0xeb, 0x80, 0xf4, 0x18, 0xb4, 0x60, 0xc4, 0x60, 0x9a, 0x80, 0xf4, 0x14, 0xb4, 0x76, 0x33, 0xc0, 0xf4, 0x60, 0x33, 0x80, 0xf5, 0x62, 0x33, 0x60, 0xcc, 0x40, 0xa2, 0x0f, 0x6b, 0x01, 0x6c, 0x46, 0x32, 0x6c, 0xea, 0x60, 0xf4, 0x1c, 0xb3, 0x40, 0xc3, 0x80, 0x18, 0xff, 0x33, 0x00, 0x65, 0x1b, 0x12, 0x60, 0xf4, 0x04, 0xb2, 0x40, 0xa2, 0x0f, 0x6b, 0x46, 0x32, 0x6c, 0xea, 0x60, 0xf4, 0x04, 0xb3, 0x40, 0xc3, 0x80, 0x18, 0x9b, 0x28, 0x00, 0x65, 0x00, 0xf2, 0x0d, 0x22, 0x12, 0x72, 0x00, 0xf2, 0x06, 0x60, 0x00, 0x6c, 0x04, 0x6b, 0x05, 0x12, 0x04, 0x59, 0x00, 0xf2, 0x00, 0x60, 0x80, 0x18, 0x18, 0x2a, 0x00, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x02, 0xf1, 0x03, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57
-, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x00, 0x18, 0xe8, 0x58, 0x00, 0x65, 0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0xfd, 0xb3, 0x0a, 0x6a, 0x4c, 0xc3, 0x08, 0x6a, 0x2a, 0xc3, 0x4d, 0xc3, 0x00, 0x1c, 0x73, 0x1b, 0x09, 0xd3, 0x09, 0x93, 0xa2, 0x67, 0x05, 0x6a, 0x84, 0xa3, 0x4b, 0xea, 0x01, 0x71, 0x8c, 0xea, 0x44, 0xc3, 0x09, 0x61, 0x03, 0x6c, 0x80, 0x18, 0x18, 0x29, 0x08, 0xd5, 0x00, 0x18, 0x81, 0x56, 0x00, 0x6c, 0x08, 0x95, 0x05, 0x10, 0x02, 0x71, 0x03, 0x61, 0x04, 0x6c, 0x4d, 0xec, 0x84, 0xc3, 0x00, 0x1c, 0x7a, 0x1b, 0x85, 0x67, 0xc0, 0x11, 0x4f, 0x59, 0xa0, 0xf1, 0x19, 0x60, 0x44, 0xa4, 0x08, 0x5a, 0xa0, 0xf1, 0x15, 0x60, 0xe8, 0xb3, 0x7f, 0x6a, 0xa1, 0xab, 0x2c, 0xea, 0x48, 0x34, 0xe0, 0xf1, 0x1d, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x41, 0xcb, 0x84, 0xa0, 0x07, 0x6a, 0xa3, 0xa3, 0x8c, 0xea, 0x50, 0x34, 0x71, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc3, 0xa3, 0x11, 0x0a, 0x59, 0x44, 0xa4, 0x65, 0xa4, 0x80, 0xf1, 0x1a, 0x60, 0x60, 0x33, 0x4d, 0xeb, 0xe3, 0xf7, 0x1f, 0x6c, 0xd8, 0xb2, 0x6c, 0xec, 0x94, 0x35, 0xdb, 0xb6, 0x80, 0x9a, 0xcc, 0xec, 0xad, 0xec, 0x80, 0xda, 0xd9, 0xb5, 0x24, 0x34, 0x91, 0xe5, 0x80, 0xac, 0x8c, 0x34, 0x62, 0xec, 0x80, 0xf1, 0x06, 0x61, 0x03, 0x59, 0x06, 0x60, 0x80, 0xa2, 0x02, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x60, 0xc2, 0x0c, 0x10, 0x80, 0xa2, 0xa4, 0xa2, 0x01, 0x6b, 0x8d, 0xeb, 0x06, 0x59, 0x60, 0xc2, 0x98, 0x67, 0x7f, 0x6b, 0x9c, 0x34, 0xac, 0xeb, 0x8d, 0xeb, 0x64, 0xc2, 0xcc, 0xb2, 0x25, 0xe2, 0x80, 0xa1, 0xc5, 0xb3, 0x0f, 0x6a, 0x8c, 0xea, 0xa0, 0xa3, 0x44, 0x34, 0x1f, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x63, 0x11, 0x45, 0xa4, 0x08, 0x5a, 0x60, 0xf1, 0x01, 0x60, 0x44, 0xa4, 0xbd, 0xb3, 0xa4, 0xa3, 0x40, 0x32, 0x2d, 0xea, 0x53, 0xcb, 0x85, 0xa4, 0x07, 0x6a, 0x8c, 0xea, 0x4c, 0x34, 0x39, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x44, 0xc3, 0x55, 0x11, 0x44, 0xa4, 0xb5, 0xb3, 0x40, 0x32, 0x2d, 0xea, 0x52, 0xcb, 0x45, 0xa4, 0x20, 0xf0, 0x48, 0xc3, 0x4c, 0x11,
-0xb1, 0xb2, 0x26, 0xc2, 0x64, 0xa4, 0x67, 0xc2, 0x65, 0xa4, 0x68, 0xc2, 0x45, 0x11, 0xae, 0xb2, 0x63, 0xa2, 0x3e, 0x35, 0x7f, 0x6c, 0xbc, 0x35, 0x8c, 0xeb, 0xad, 0xeb, 0x8c, 0xe9, 0x63, 0xc2, 0x25, 0xc2, 0x3a, 0x11, 0xa8, 0xb2, 0x2e, 0xc2, 0x64, 0xa4, 0x6f, 0xc2, 0x65, 0xa4, 0x70, 0xc2, 0x33, 0x11, 0xa5, 0xb2, 0x31, 0xc2, 0x64, 0xa4, 0x72, 0xc2, 0x65, 0xa4, 0x73, 0xc2, 0x2c, 0x11, 0xa1, 0xb3, 0x49, 0xa3, 0x0a, 0x72, 0x2c, 0x61, 0x8c, 0xa3, 0x00, 0x6a, 0x0a, 0x74, 0x0e, 0x60, 0xc0, 0xf2, 0x0c, 0x4a, 0x58, 0xec, 0xa3, 0xb2, 0x12, 0xec, 0x91, 0xe2, 0xc0, 0xf0, 0x48, 0xa4, 0x04, 0x72, 0x05, 0x6a, 0x03, 0x60, 0x0a, 0x6a, 0x4c, 0xc3, 0x00, 0x6a, 0x96, 0xb3, 0x8d, 0xa3, 0x08, 0x74, 0x5d, 0x60, 0xff, 0x6a, 0x09, 0x4a, 0x58, 0xec, 0x9b, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x20, 0xf1, 0xaf, 0xa2, 0x01, 0x6a, 0x4c, 0xed, 0x06, 0x25, 0x00, 0xf1, 0x72, 0xab, 0x67, 0xec, 0x4c, 0xeb, 0x05, 0x6a, 0x4c, 0x2b, 0x8c, 0xb2, 0x08, 0x6b, 0x6d, 0xc2, 0x00, 0x6a, 0x47, 0x10, 0x8b, 0x42, 0xff, 0x6b, 0x6c, 0xec, 0x03, 0x5c, 0x1a, 0x60, 0x00, 0x6a, 0xc0, 0xf2, 0x0c, 0x6c, 0x98, 0xea, 0x8c, 0xb3, 0x12, 0xec, 0x91, 0xe3, 0xc0, 0xf0, 0x68, 0xa4, 0x04, 0x73, 0x09, 0x61, 0xe0, 0xf0, 0xa8, 0x9c, 0x80, 0xb3, 0xa5, 0xdb, 0xe0, 0xf0, 0x8c, 0xac, 0x4c, 0xc3, 0x8c, 0xcb, 0x26, 0x10, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xe8, 0x61, 0x27, 0x10, 0x88, 0x42, 0x6c, 0xec, 0x02, 0x5c, 0x24, 0x60, 0x00, 0x6a, 0xff, 0x6c, 0x09, 0x4c, 0x98, 0xea, 0x7e, 0xb3, 0x01, 0x6d, 0x12, 0xec, 0x91, 0xe3, 0x20, 0xf1, 0xcf, 0xa4, 0xac, 0xee, 0x12, 0x26, 0x00, 0xf1, 0x72, 0xab, 0x67, 0xea, 0xac, 0xeb, 0x0d, 0x23, 0x60, 0xf1, 0xbe, 0xac, 0x6e, 0xb3, 0xaa, 0xcb, 0x80, 0xf1, 0xa0, 0xac, 0xab, 0xcb, 0x80, 0xf1, 0x82, 0xac, 0x4d, 0xc3, 0x8c, 0xcb, 0x05, 0x6a, 0x06, 0x10, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x08, 0x5a, 0xde, 0x61, 0x04, 0x6a, 0x66, 0xb3, 0x6a, 0xa3, 0x40, 0x32, 0x6d, 0xea, 0x67, 0x10, 0x6c, 0xb3, 0x20, 0xf0, 0x9e, 0xa3, 0x20, 0xf0, 0x5d, 0xa3, 0x20, 0xf0, 0x7c, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x6e, 0x10, 0x66, 0xb3, 0x40, 0xf0
-, 0x81, 0xa3, 0x40, 0xf0, 0x40, 0xa3, 0x20, 0xf0, 0x7f, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x62, 0x10, 0x57, 0xb2, 0x34, 0xc2, 0x64, 0xa4, 0x75, 0xc2, 0x65, 0xa4, 0x76, 0xc2, 0x91, 0x10, 0x54, 0xb2, 0x37, 0xc2, 0x64, 0xa4, 0x78, 0xc2, 0x65, 0xa4, 0x79, 0xc2, 0x8a, 0x10, 0x4f, 0x41, 0xff, 0x6b, 0x6c, 0xea, 0x09, 0x5a, 0x80, 0xf0, 0x00, 0x60, 0x5c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x4c, 0xeb, 0x79, 0x6a, 0x4b, 0xea, 0x4c, 0xeb, 0x2c, 0x36, 0x78, 0x6a, 0x4c, 0xee, 0x5c, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6d, 0xee, 0x71, 0x10, 0x44, 0xb3, 0x8c, 0x9b, 0x4d, 0xb5, 0x58, 0xab, 0xac, 0xec, 0x8c, 0xdb, 0x21, 0x10, 0x40, 0xb4, 0xac, 0x9c, 0xff, 0xf7, 0x1f, 0x6b, 0xa2, 0x32, 0xac, 0xeb, 0x42, 0x32, 0x6c, 0xdc, 0x18, 0x10, 0x3c, 0xb3, 0x8e, 0x9b, 0x45, 0xb5, 0x5c, 0xab, 0xac, 0xec, 0x8e, 0xdb, 0x11, 0x10, 0x38, 0xb4, 0xae, 0x9c, 0xff, 0xf7, 0x1f, 0x6b, 0xa2, 0x32, 0xac, 0xeb, 0x42, 0x32, 0x6e, 0xdc, 0x08, 0x10, 0x78, 0x6c, 0x03, 0x10, 0x76, 0x6c, 0x01, 0x10, 0x77, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x02, 0x6c, 0x13, 0x10, 0x2f, 0xb3, 0x96, 0xa3, 0x55, 0xa3, 0x74, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x08, 0x10, 0x2a, 0xb3, 0x99, 0xa3, 0x58, 0xa3, 0x77, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x6d, 0xea, 0x03, 0x6c, 0x00, 0x6b, 0x35, 0x10, 0x64, 0x6a, 0x58, 0xe9, 0x2e, 0xb4, 0x40, 0x9c, 0x01, 0x4a, 0x12, 0xe9, 0x03, 0x22, 0x00, 0x18, 0xcb, 0x1c, 0x00, 0x65, 0x27, 0x21, 0x80, 0x18, 0x28, 0x37, 0x00, 0x65, 0x00, 0x6a, 0x01, 0x6c, 0x27, 0xb5, 0x28, 0xb6, 0xe2, 0x67, 0x00, 0x18, 0xd9, 0x1c, 0x04, 0xd2, 0x24, 0xb2, 0x80, 0x9a, 0x00, 0x18, 0xbe, 0x1c, 0xb1, 0x67, 0x16, 0x10, 0x1f, 0xb2, 0x80, 0xf1, 0x21, 0xc2, 0x12, 0x10, 0x1d, 0xb2, 0x00, 0x6b, 0x80, 0xf1, 0x71, 0xc2, 0x0d, 0x21, 0x01, 0x6b, 0x80, 0xf1, 0x71, 0xc2, 0x09, 0x10, 0x01, 0x6a, 0x2c, 0xea, 0x1c, 0xb3, 0x40, 0xc3, 0x04, 0x10, 0x00, 0x6c, 0x03, 0x6b, 0x44, 0x67, 0x03, 0x10, 0x00, 0x6c, 0x64, 0x67, 0x44, 0x67, 0x90, 0x34, 0x6d, 0xec, 0x83, 0xc0, 0x81, 0xa0, 0x10,
-0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x61, 0xc0, 0xa0, 0x98, 0x02, 0x6c, 0x00, 0x18, 0xa5, 0x2e, 0xc2, 0x67, 0x01, 0x6a, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0xfc, 0x95, 0x11, 0x80, 0xf9, 0x95, 0x11, 0x80, 0x1f, 0x00, 0xfc, 0xff, 0xe0, 0xe7, 0x10, 0x80, 0xd4, 0xe7, 0x10, 0x80, 0x20, 0x56, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0xff, 0xff, 0x90, 0x04, 0x11, 0x80, 0xa1, 0xdc, 0x10, 0x80, 0xcc, 0x95, 0x11, 0x80, 0x20, 0xe8, 0x00, 0x65, 0x0c, 0xb2, 0x0d, 0xb4, 0x60, 0xa4, 0xa0, 0x9a, 0x04, 0x6a, 0x6c, 0xea, 0x0c, 0x22, 0x40, 0xf7, 0xa2, 0x35, 0x66, 0x33, 0x01, 0x6c, 0xae, 0xeb, 0x8c, 0xeb, 0xff, 0x6c, 0x8c, 0xeb, 0x00, 0x6a, 0x04, 0x23, 0x20, 0xe8, 0x01, 0x6a, 0x05, 0xb2, 0x40, 0xa2, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x50, 0xa0, 0x00, 0xb0, 0x08, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x07, 0xb2, 0x40, 0x9a, 0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, 0x05, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x05, 0xb3, 0x63, 0xda, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x90, 0x04, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0xa1, 0xdc, 0x10, 0x80, 0x00, 0x6a, 0x6f, 0xb5, 0x55, 0xe5, 0xa0, 0xa5, 0x6e, 0xb3, 0x51, 0xe3, 0x20, 0xf1, 0xba, 0xc4, 0x01, 0x4a, 0xff, 0x6c, 0x8c, 0xea, 0x10, 0x5a, 0xf4, 0x61, 0x60, 0xf1, 0xa1, 0xa3, 0xfe, 0x75, 0x0b, 0x60, 0x0f, 0x6a, 0xac, 0xea, 0xaf, 0x42, 0x8c, 0xed, 0x05, 0x5d, 0x05, 0x60, 0x10, 0x6c, 0x4d, 0xec, 0x60, 0xf1, 0x81, 0xc3, 0x03, 0x10, 0x15, 0x6a, 0x60, 0xf1, 0x41, 0xc3, 0x61, 0xb2, 0x0d, 0x6b, 0x40, 0xf1, 0x7a, 0xc2, 0x0b, 0x6b, 0x40, 0xf1, 0x7b, 0xc2, 0x40, 0xf1, 0x7c, 0xc2, 0x40, 0xf1, 0x7d, 0xc2, 0x40, 0xf1, 0x7e, 0xc2, 0x00, 0x6b, 0x80, 0xf0, 0x7d, 0xc2, 0x24, 0xf0, 0x10, 0x6b, 0x60, 0xf1, 0x62, 0xca, 0x06, 0xf7, 0x19, 0x6b, 0x60, 0xf1, 0x64, 0xca, 0x0b, 0xf2, 0x10, 0x6b, 0x60, 0xf1, 0x66, 0xca, 0x0e, 0xf5, 0x0a, 0x6b, 0x60, 0xf1, 0x68, 0xca, 0x04, 0xf5, 0x00, 0x6b, 0x6b, 0xeb, 0x60, 0xf1, 0x6a, 0xca, 0x00, 0x6b, 0xc0, 0xf1, 0x68, 0xca, 0xc0, 0xf1, 0x6a, 0xca, 0xc0, 0xf1, 0x6c, 0xca, 0xc0
-, 0xf1, 0x6e, 0xca, 0x40, 0xf1, 0x7f, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x01, 0x6b, 0x40, 0xf1, 0x7f, 0xc2, 0x46, 0xb2, 0x60, 0xf1, 0x60, 0xa2, 0xff, 0x73, 0x04, 0x61, 0x02, 0x6b, 0x6b, 0xeb, 0x60, 0xf1, 0x60, 0xc2, 0x42, 0xb2, 0x80, 0xf1, 0x62, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x05, 0x6b, 0x80, 0xf1, 0x62, 0xc2, 0x3e, 0xb2, 0x01, 0x6b, 0x80, 0xf1, 0x60, 0xc2, 0x80, 0xf1, 0x71, 0xc2, 0x80, 0xf1, 0x61, 0xa2, 0xfe, 0x73, 0x03, 0x61, 0x0f, 0x6b, 0x80, 0xf1, 0x61, 0xc2, 0x37, 0xb2, 0x02, 0x6b, 0x80, 0xf1, 0x63, 0xc2, 0x80, 0xf1, 0x72, 0xc2, 0x00, 0x6a, 0x35, 0xb4, 0x51, 0xe4, 0x80, 0xa4, 0x32, 0xb3, 0x4d, 0xe3, 0x80, 0xf1, 0x84, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0d, 0x5a, 0xf4, 0x61, 0x00, 0x6a, 0x2f, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x25, 0xb3, 0x4d, 0xe3, 0x80, 0xf1, 0x93, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0d, 0x5a, 0xe6, 0x61, 0x00, 0x6a, 0x23, 0xb4, 0x51, 0xe4, 0x80, 0xa4, 0x1e, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x80, 0xc3, 0x20, 0xb4, 0x51, 0xe4, 0x80, 0xa4, 0xc0, 0xf1, 0x82, 0xc3, 0x1f, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x11, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x84, 0xc3, 0x15, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x07, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x86, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x02, 0x5a, 0xc5, 0x61, 0x20, 0xe8, 0x00, 0x65, 0xc4, 0xe9, 0x10, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xd4, 0xe9, 0x10, 0x80, 0xec, 0xe9, 0x10, 0x80, 0xe4, 0xe9, 0x10, 0x80, 0xe8, 0xe9, 0x10, 0x80, 0xfc, 0xe9, 0x10, 0x80, 0x00, 0xea, 0x10, 0x80, 0xff, 0x6a, 0x4c, 0xee, 0x4c, 0xec, 0x4c, 0xed, 0xec, 0xea, 0x57, 0xe5, 0x00, 0xf6,
-0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0xb8, 0xed, 0xd3, 0xe4, 0x00, 0xf6, 0x80, 0x34, 0x00, 0xf6, 0x83, 0x34, 0xff, 0xf7, 0x1f, 0x6b, 0x12, 0xed, 0x98, 0xec, 0x12, 0xec, 0x89, 0xe5, 0x20, 0xe8, 0x6c, 0xea, 0x20, 0xe8, 0x00, 0x65, 0x0a, 0xb2, 0x20, 0xf0, 0x70, 0xa2, 0x16, 0x6a, 0x6c, 0xea, 0x12, 0x72, 0x04, 0x61, 0x40, 0xa4, 0x01, 0x5a, 0x58, 0x67, 0x40, 0xc4, 0x06, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x04, 0x52, 0x58, 0x67, 0x01, 0x6b, 0x20, 0xe8, 0x6e, 0xea, 0x4c, 0x00, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x00, 0x6a, 0x11, 0xb3, 0x60, 0x9b, 0x4c, 0x35, 0xff, 0x6c, 0xad, 0xe3, 0xc3, 0xa3, 0x80, 0x6b, 0x6b, 0xeb, 0x6c, 0xee, 0x8c, 0xee, 0x14, 0x2e, 0x0c, 0xb6, 0xc0, 0x9e, 0xb9, 0xe6, 0xc3, 0xa6, 0x6c, 0xee, 0x8c, 0xee, 0x0d, 0x2e, 0x0a, 0xb6, 0xc0, 0x9e, 0xb5, 0xe6, 0xa3, 0xa5, 0xac, 0xeb, 0x8c, 0xeb, 0x06, 0x2b, 0x01, 0x4a, 0x8c, 0xea, 0x11, 0x5a, 0xe3, 0x61, 0x20, 0xe8, 0x01, 0x6a, 0x20, 0xe8, 0x00, 0x6a, 0xf4, 0x1d, 0x11, 0x80, 0xcc, 0x1d, 0x11, 0x80, 0x04, 0x1f, 0x11, 0x80, 0x20, 0xe8, 0x01, 0x6a, 0x06, 0xb2, 0x60, 0xa2, 0x01, 0x6a, 0x6c, 0xea, 0x05, 0x22, 0x40, 0x9c, 0x11, 0x6b, 0x6b, 0xeb, 0x6c, 0xea, 0x40, 0xdc, 0x20, 0xe8, 0x00, 0x6a, 0x08, 0x96, 0x11, 0x80, 0x0d, 0xb2, 0x40, 0xa2, 0x08, 0x22, 0x0d, 0xb2, 0x60, 0xa2, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x0d, 0x2a, 0x0a, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x60, 0x9c, 0x02, 0xf0, 0x00, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x01, 0x6b, 0x02, 0xb2, 0x60, 0xc2, 0x20, 0xe8, 0x00, 0x6a, 0x98, 0x07, 0x11, 0x80, 0xdc, 0x37, 0x11, 0x80, 0x6c, 0x21, 0x11, 0x80, 0x64, 0xa4, 0x43, 0xa4, 0xc0, 0xa5, 0x60, 0x33, 0x4d, 0xe3, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xeb, 0x7f, 0xf4, 0x0f, 0x73, 0x00, 0x6a, 0x09, 0x61, 0xc9, 0xe4, 0x01, 0x6b, 0x62, 0xc2, 0x41, 0x46, 0xff, 0x6b, 0x6c, 0xea, 0x41, 0xc4, 0x40, 0xc5, 0x01, 0x6a, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6a, 0x05, 0xb3, 0x40, 0xc3, 0x05, 0xb3, 0x40, 0xc3, 0x00, 0x6b, 0x04, 0xb2, 0x20, 0xe8, 0x60, 0xca, 0x00, 0x65, 0xf9, 0x95, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0xfc, 0x95
-, 0x11, 0x80, 0x40, 0xac, 0x01, 0xf4, 0x03, 0x6b, 0x6e, 0xea, 0x06, 0x2a, 0x05, 0xb3, 0x40, 0xc3, 0x05, 0xb3, 0x40, 0xc3, 0x05, 0xb3, 0x40, 0xcb, 0x20, 0xe8, 0x00, 0x6a, 0x00, 0x65, 0xf9, 0x95, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0xfc, 0x95, 0x11, 0x80, 0x08, 0xb3, 0xa0, 0xa3, 0x01, 0x6b, 0x40, 0x9c, 0xac, 0xeb, 0x02, 0x23, 0x10, 0x6b, 0x6d, 0xea, 0x02, 0x6b, 0xac, 0xeb, 0x02, 0x23, 0x04, 0xb3, 0x6d, 0xea, 0x40, 0xdc, 0x20, 0xe8, 0x00, 0x6a, 0x08, 0x96, 0x11, 0x80, 0x00, 0x00, 0x10, 0x00, 0x0b, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6b, 0xfd, 0x4a, 0x6c, 0xea, 0x02, 0x5a, 0x0b, 0x60, 0x08, 0xb2, 0x40, 0xa2, 0x08, 0x2a, 0x63, 0xa4, 0x02, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x03, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x43, 0xc4, 0x20, 0xe8, 0x00, 0x6a, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0x89, 0x04, 0x11, 0x80, 0xf6, 0x63, 0x13, 0x62, 0x12, 0xd1, 0x11, 0xd0, 0x45, 0xa4, 0xff, 0xf7, 0x1f, 0x68, 0xac, 0xe8, 0xa4, 0xa4, 0x0e, 0xd2, 0x63, 0xb2, 0x40, 0x82, 0x11, 0x6e, 0x00, 0x52, 0xa0, 0xf0, 0x1a, 0x60, 0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xe8, 0x60, 0xb2, 0x01, 0x6b, 0xac, 0xeb, 0x12, 0xe9, 0x45, 0xe1, 0xc0, 0xf0, 0x48, 0xa1, 0x04, 0x72, 0x06, 0x60, 0x13, 0x72, 0x04, 0x60, 0x90, 0x67, 0x17, 0x6d, 0xc3, 0x67, 0x0b, 0x10, 0xe0, 0xf0, 0xc7, 0xa1, 0x6a, 0xee, 0x0b, 0x61, 0x80, 0xf0, 0x4c, 0xa9, 0x04, 0x6d, 0xac, 0xea, 0x06, 0x2a, 0x90, 0x67, 0x17, 0x6d, 0x20, 0x18, 0xf6, 0x27, 0x24, 0x6f, 0x98, 0x10, 0x04, 0x4c, 0x41, 0xac, 0x0a, 0xd2, 0x42, 0xac, 0x0b, 0xd2, 0x43, 0xac, 0x08, 0xd2, 0x84, 0xac, 0x4e, 0xb2, 0x09, 0xe2, 0x09, 0xd4, 0x80, 0xa2, 0x03, 0x5c, 0x01, 0x4c, 0x01, 0x61, 0x00, 0x6c, 0x80, 0xc2, 0x49, 0xb2, 0x09, 0xe2, 0x40, 0xa2, 0x03, 0x72, 0x55, 0x61, 0x08, 0x94, 0x02, 0x6f, 0x02, 0x5c, 0x03, 0x61, 0x84, 0x37, 0xff, 0x6a, 0x4c, 0xef, 0x09, 0x94, 0x03, 0x24, 0x02, 0x4f, 0xff, 0x6a, 0x4c, 0xef, 0x0a, 0x92, 0x0b, 0x96, 0x90, 0x67, 0x00, 0x6d, 0x0f, 0xd3, 0x20, 0x18, 0x4b, 0x29, 0x04, 0xd2, 0x0c, 0xd2, 0x0c, 0x94, 0x02, 0x6a, 0x04, 0xd2, 0x3c, 0xb2, 0x05, 0xd2, 0x3a, 0xb2, 0x06, 0xd4, 0x09, 0xe2, 0x0d, 0xd2, 0x40, 0xa2, 0x04,
-0x6c, 0xfa, 0x6d, 0x86, 0xf4, 0x01, 0x6e, 0xc2, 0xf7, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x0c, 0x92, 0x0f, 0x93, 0x2a, 0x22, 0x0d, 0x94, 0x00, 0x6a, 0xc3, 0x67, 0x40, 0xc4, 0x17, 0x6d, 0x00, 0x6a, 0x90, 0x67, 0x1c, 0x6f, 0x04, 0xd2, 0x20, 0x18, 0x04, 0x28, 0x0f, 0xd2, 0x7d, 0x67, 0x87, 0x43, 0x25, 0x4c, 0x60, 0xac, 0x9d, 0x67, 0x80, 0xf0, 0x7e, 0xc9, 0x67, 0x44, 0x19, 0x4b, 0x80, 0xab, 0x7d, 0x67, 0xa0, 0xf0, 0x82, 0xc9, 0x87, 0x43, 0x1d, 0x4c, 0x60, 0xac, 0x9d, 0x67, 0xa0, 0xf0, 0x66, 0xc9, 0x67, 0x44, 0x21, 0x4b, 0x80, 0xab, 0xa0, 0xf0, 0x80, 0xc9, 0x0f, 0x92, 0x00, 0xf2, 0x5d, 0xc1, 0x00, 0xf2, 0x5e, 0xc1, 0x2d, 0x10, 0x0b, 0x92, 0x08, 0x94, 0x0e, 0x95, 0x04, 0xd2, 0x0a, 0x97, 0x09, 0x92, 0x05, 0xd4, 0xd0, 0x67, 0x83, 0x67, 0x0f, 0xd3, 0x20, 0x18, 0x25, 0x2c, 0x06, 0xd2, 0x01, 0x6e, 0x0f, 0x93, 0x1e, 0x22, 0xc3, 0x67, 0xe2, 0x67, 0x90, 0x67, 0x17, 0x6d, 0x20, 0x18, 0xf6, 0x27, 0x0f, 0xd2, 0x0f, 0x92, 0x80, 0xf0, 0xfe, 0xa9, 0xb0, 0x67, 0x82, 0x67, 0x00, 0x18, 0xb4, 0x52, 0x02, 0x6e, 0x90, 0x67, 0x20, 0x18, 0xfa, 0x25, 0x04, 0x6d, 0x01, 0x6a, 0x4b, 0xea, 0x00, 0xf2, 0x54, 0xc9, 0x00, 0x6a, 0x00, 0xf2, 0x56, 0xc1, 0x20, 0x18, 0x95, 0x28, 0x00, 0x65, 0x01, 0x6e, 0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x46, 0x67, 0x00, 0xef, 0x0a, 0x63, 0xb8, 0x51, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xd0, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xf2, 0x63, 0x1b, 0x62, 0x1a, 0xd1, 0x19, 0xd0, 0x20, 0xf5, 0x1c, 0xb2, 0x7d, 0x67, 0x40, 0xaa, 0x51, 0xcb, 0x20, 0xf0, 0x82, 0xa3, 0x20, 0xf5, 0x14, 0xb2, 0x92, 0x35, 0xa0, 0xc2, 0x13, 0xd5, 0x20, 0xf0, 0x63, 0xa3, 0x01, 0x6a, 0x86, 0x34, 0x6e, 0x31, 0x4c, 0xe9, 0x66, 0x33, 0x4c, 0xeb, 0x24, 0x31, 0x6d, 0xe9, 0x07, 0x6b, 0x6c, 0xec, 0x10, 0xd4, 0x7c, 0x6c, 0x98, 0xe9, 0x00, 0xf5, 0x10, 0xb3, 0xb1, 0x67, 0x12, 0xec, 0x6d, 0xe4, 0x12, 0xd3, 0x60, 0xa3, 0x10, 0x94, 0x6c, 0xea, 0x00, 0x18, 0x49, 0xbd, 0x14, 0xd2, 0x11, 0xd2, 0x11, 0x93, 0x0a, 0x6a, 0x58, 0xeb, 0xe0, 0xf4, 0x14, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x61, 0xaa, 0xe0, 0xf4, 0x0c, 0xb2, 0x60, 0xc2, 0xe0, 0xf4, 0x0c
-, 0xb2, 0x40, 0x9a, 0x04, 0x22, 0x20, 0xf0, 0x02, 0x04, 0x40, 0xea, 0x00, 0x65, 0x13, 0x94, 0x09, 0x74, 0x07, 0x61, 0x10, 0x95, 0x00, 0x6c, 0x01, 0x25, 0x82, 0x41, 0x00, 0x18, 0xb8, 0x82, 0x00, 0x65, 0x7d, 0x67, 0x20, 0xf0, 0x43, 0xa3, 0x01, 0x68, 0x0c, 0xea, 0x2d, 0x22, 0xc0, 0xf4, 0x00, 0xb2, 0x40, 0xa2, 0x03, 0x6b, 0x6c, 0xea, 0x14, 0x22, 0xa0, 0xf4, 0x18, 0xb3, 0x46, 0xab, 0x9d, 0x67, 0x50, 0xcc, 0xc0, 0xf2, 0x0c, 0x6c, 0x98, 0xea, 0xa0, 0xf4, 0x0c, 0xb4, 0x12, 0xea, 0x49, 0xe4, 0x00, 0x6c, 0x20, 0xf2, 0x9d, 0xc2, 0xe0, 0xf0, 0xa3, 0xa2, 0x00, 0x18, 0x13, 0x3d, 0x8e, 0xa3, 0x80, 0xf4, 0x18, 0xb2, 0x60, 0xf1, 0x4b, 0xa2, 0x20, 0xf2, 0x0d, 0x22, 0x00, 0x6a, 0x80, 0xf4, 0x0c, 0xb3, 0x04, 0xd2, 0x05, 0xd3, 0x06, 0xd2, 0x06, 0x6c, 0xfa, 0x6d, 0xc6, 0xf1, 0x18, 0x6e, 0xc0, 0xf5, 0x19, 0x6f, 0x32, 0x10, 0x10, 0x94, 0xb1, 0x67, 0x20, 0x18, 0xc0, 0x0e, 0x09, 0x06, 0x0d, 0x2a, 0x10, 0x93, 0x60, 0xf4, 0x0c, 0xb2, 0x69, 0xe2, 0x40, 0xa2, 0x01, 0x72, 0x00, 0xf2, 0x12, 0x61, 0x60, 0xf4, 0x00, 0xb2, 0x69, 0xe2, 0x00, 0xc2, 0x0d, 0x12, 0x13, 0x94, 0x02, 0x74, 0x20, 0x61, 0x20, 0xf4, 0x18, 0xb2, 0x40, 0xa2, 0x00, 0xf2, 0x05, 0x2a, 0x20, 0xf4, 0x1c, 0xb2, 0x44, 0x9a, 0x02, 0x72, 0xe0, 0xf1, 0x1f, 0x60, 0x00, 0x18, 0x1b, 0xaa, 0x00, 0x65, 0x00, 0x18, 0xa5, 0x3a, 0x00, 0x65, 0x20, 0xf4, 0x08, 0xb3, 0x04, 0xd0, 0x05, 0xd3, 0x06, 0xd2, 0x06, 0x6c, 0xfa, 0x6d, 0xe6, 0xf1, 0x1d, 0x6e, 0xc0, 0xf5, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x00, 0x65, 0xea, 0x11, 0x10, 0x94, 0xb1, 0x67, 0x00, 0x18, 0xe8, 0xdf, 0x08, 0x06, 0xff, 0x72, 0xe0, 0xf1, 0x02, 0x60, 0x00, 0xf4, 0x04, 0xb2, 0x40, 0x9a, 0xbd, 0x67, 0x10, 0xad, 0x0d, 0x22, 0x14, 0x93, 0x3c, 0x6c, 0x12, 0x95, 0x98, 0xeb, 0x7d, 0x67, 0xd1, 0xab, 0x12, 0xec, 0x91, 0xe5, 0x04, 0x4c, 0x40, 0xea, 0xb0, 0x67, 0xc0, 0xf1, 0x0f, 0x2a, 0xc0, 0xf2, 0x0c, 0x6a, 0x58, 0xe8, 0x13, 0x93, 0xf1, 0xb2, 0x12, 0x94, 0x12, 0xe8, 0x41, 0xe0, 0x01, 0x6a, 0x44, 0xeb, 0x14, 0x93, 0x15, 0xd2, 0x3c, 0x6a, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x72, 0xa2, 0x02, 0x73, 0xe0, 0xf0, 0x00, 0x61,
-0x20, 0xf0, 0x70, 0xa2, 0xff, 0x73, 0xc0, 0xf0, 0x1b, 0x60, 0x20, 0xf0, 0x74, 0xa2, 0x10, 0x95, 0xae, 0xeb, 0xc0, 0xf0, 0x15, 0x2b, 0x13, 0x95, 0x96, 0xaa, 0xa0, 0x33, 0x70, 0x33, 0x8e, 0xeb, 0xc0, 0xf0, 0x0e, 0x2b, 0x20, 0xf0, 0x76, 0xa2, 0x01, 0x4b, 0x20, 0xf0, 0x76, 0xc2, 0xc0, 0xf0, 0x4d, 0xa0, 0x02, 0x72, 0x15, 0x61, 0x15, 0x93, 0x08, 0xf4, 0x10, 0x6a, 0x6c, 0xea, 0x06, 0x22, 0xa0, 0xf0, 0x5c, 0xa8, 0x01, 0x4a, 0xa0, 0xf0, 0x5c, 0xc8, 0x0a, 0x10, 0x15, 0x94, 0x11, 0xf1, 0x00, 0x6a, 0x8c, 0xea, 0x05, 0x22, 0xc0, 0xf0, 0x42, 0xa8, 0x01, 0x4a, 0xc0, 0xf0, 0x42, 0xc8, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0xbd, 0x67, 0x70, 0xad, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x50, 0xa2, 0x6a, 0xea, 0x0e, 0x60, 0x02, 0x6c, 0x04, 0xd4, 0xcb, 0xb4, 0x05, 0xd4, 0xfa, 0x6d, 0x02, 0x6c, 0x46, 0xf2, 0x04, 0x6e, 0x61, 0xf4, 0x17, 0x6f, 0x06, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x56, 0xa2, 0x04, 0x5a, 0x15, 0x61, 0xbf, 0xb2, 0x60, 0xf1, 0x45, 0xa2, 0x11, 0x22, 0x20, 0x18, 0x02, 0x26, 0x00, 0x65, 0x2e, 0xea, 0x0c, 0x22, 0xc0, 0xf0, 0x58, 0xa0, 0x09, 0x2a, 0x00, 0x18, 0xac, 0x3b, 0x01, 0x6c, 0xbd, 0xb3, 0x80, 0xa3, 0x01, 0x6a, 0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0xb9, 0xb3, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0xb6, 0xa2, 0xc0, 0xf0, 0x4a, 0xab, 0x03, 0x6c, 0x42, 0x32, 0x4a, 0x32, 0x8c, 0xea, 0x44, 0x32, 0x42, 0xed, 0x2f, 0x61, 0xac, 0xb2, 0x60, 0xf1, 0x47, 0xa2, 0x2b, 0x22, 0x17, 0xd3, 0x20, 0x18, 0x02, 0x26, 0x16, 0xd4, 0x2e, 0xea, 0x17, 0x93, 0x16, 0x94, 0x23, 0x22, 0xc0, 0xf0, 0x59, 0xa0, 0x20, 0x2a, 0xab, 0xb2, 0xa0, 0xaa, 0x02, 0x6a, 0xac, 0xea, 0x1b, 0x2a, 0xc0, 0xf0, 0x6a, 0xab, 0xa9, 0xb5, 0x40, 0xa5, 0x62, 0x33, 0x72, 0x33, 0x8c, 0xeb, 0x01, 0x4a, 0xff, 0x6e, 0x64, 0x33, 0xcc, 0xea, 0x01, 0x4b, 0x7a, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x40, 0xc5, 0x10, 0xea, 0x09, 0x2a, 0x00, 0x18, 0x97, 0x3b, 0x01, 0x6c, 0x9c, 0xb3, 0x80, 0xa3, 0x01, 0x6a, 0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3
-, 0x9a, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x10, 0x6b, 0x6c, 0xea, 0x30, 0x22, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x56, 0xa2, 0x04, 0x5a, 0x04, 0x61, 0x95, 0xb2, 0x00, 0xf1, 0x54, 0xa2, 0x06, 0x2a, 0xe0, 0xf0, 0x47, 0xa0, 0x1f, 0x2a, 0x93, 0xb2, 0x40, 0xa2, 0x1c, 0x2a, 0x92, 0xb3, 0x40, 0xa3, 0xff, 0x6c, 0x01, 0x4a, 0x8c, 0xea, 0x40, 0xc3, 0x8a, 0xb3, 0x7c, 0x4b, 0x78, 0x9b, 0x07, 0x6c, 0x7a, 0x33, 0x8c, 0xeb, 0x64, 0x33, 0x01, 0x4b, 0x7b, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x10, 0xea, 0x09, 0x2a, 0x00, 0x18, 0x6c, 0xd0, 0x01, 0x6c, 0x88, 0xb3, 0x80, 0xa3, 0x01, 0x6a, 0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0xe0, 0xf0, 0x67, 0xa0, 0x15, 0x94, 0xff, 0x6a, 0x01, 0x5b, 0x78, 0x67, 0x6b, 0xeb, 0x6c, 0xea, 0x19, 0xf5, 0x18, 0x6b, 0x8c, 0xeb, 0x04, 0x23, 0x10, 0x95, 0x02, 0x25, 0x01, 0x6a, 0x02, 0x10, 0xff, 0x72, 0x03, 0x60, 0x7d, 0xb4, 0x31, 0xe4, 0x40, 0xc4, 0x6f, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6c, 0xfd, 0x4a, 0x8c, 0xea, 0x02, 0x5a, 0x10, 0x60, 0x80, 0xf2, 0x5c, 0xa0, 0x03, 0x72, 0x0c, 0x61, 0x11, 0x94, 0x0a, 0x6a, 0xbd, 0x67, 0x58, 0xec, 0x91, 0xad, 0x60, 0xb5, 0x17, 0xd3, 0x12, 0xea, 0x00, 0x18, 0x86, 0x07, 0x55, 0xe5, 0x17, 0x93, 0x06, 0x23, 0x5d, 0x67, 0x90, 0xaa, 0x00, 0x18, 0x51, 0xa3, 0x17, 0xd3, 0x17, 0x93, 0x5f, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6c, 0xfd, 0x4a, 0x8c, 0xea, 0x02, 0x5a, 0x04, 0x60, 0x80, 0xf2, 0x5c, 0xa0, 0x03, 0x72, 0x0c, 0x60, 0x59, 0xb2, 0x29, 0xe2, 0x80, 0xf1, 0x40, 0xa2, 0x07, 0x22, 0x91, 0x67, 0x00, 0x18, 0xce, 0x06, 0x17, 0xd3, 0x10, 0xd2, 0x17, 0x93, 0x02, 0x10, 0x00, 0x6c, 0x10, 0xd4, 0x11, 0x95, 0x2a, 0x25, 0x5f, 0xb2, 0x29, 0xe2, 0x44, 0xa2, 0x01, 0x6c, 0x46, 0x32, 0x8c, 0xea, 0x23, 0x22, 0x22, 0x2b, 0x5c, 0xb2, 0xa9, 0xe2, 0x60, 0xa2, 0x6a, 0x33, 0x60, 0xc2, 0xe0, 0xf0, 0x47, 0xa0, 0x01, 0x72, 0x19, 0x61, 0x59, 0xb2, 0xa9, 0xe2, 0x40, 0xa2, 0x15, 0x2a, 0x60, 0xf0, 0x56, 0xa8, 0x7d, 0x67, 0x01, 0x4a, 0x60, 0xf0, 0x56, 0xc8, 0x20, 0xf3, 0x0b, 0x6a, 0x58, 0xcb, 0x53, 0xb2, 0x80, 0x9a, 0x0d, 0x92, 0xb0, 0xab, 0x0b, 0x96, 0x04,
-0xd2, 0x0c, 0x97, 0x0e, 0x92, 0x0a, 0xd5, 0x00, 0x18, 0x8e, 0x1c, 0x05, 0xd2, 0x4e, 0xb2, 0x40, 0x9a, 0x06, 0x22, 0x7d, 0x67, 0xb1, 0xab, 0x10, 0x96, 0x40, 0xea, 0x08, 0x04, 0x57, 0x2a, 0x44, 0xb2, 0x40, 0xa2, 0x19, 0x2a, 0x40, 0xb2, 0x40, 0xa2, 0x16, 0x2a, 0xc0, 0xf0, 0x6d, 0xa0, 0x02, 0x6c, 0x46, 0xb2, 0x8e, 0xeb, 0x0a, 0x23, 0x01, 0x6b, 0x60, 0xc2, 0x37, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x03, 0x6c, 0x42, 0x32, 0x46, 0x32, 0x4c, 0xec, 0x03, 0x10, 0x60, 0xc2, 0x40, 0xb2, 0x80, 0xa2, 0x00, 0x18, 0x6c, 0xd0, 0x00, 0x65, 0x10, 0x95, 0x02, 0x2d, 0x13, 0x92, 0x08, 0x22, 0x13, 0x93, 0x01, 0x73, 0x27, 0x61, 0x10, 0x94, 0x25, 0x2c, 0x25, 0xb2, 0x44, 0x9a, 0x22, 0x22, 0xe0, 0xf0, 0x47, 0xa0, 0x01, 0x6d, 0xae, 0xea, 0x1d, 0x2a, 0x36, 0xb3, 0x02, 0x49, 0x28, 0x31, 0x27, 0xe3, 0x60, 0x99, 0x00, 0x53, 0x16, 0x61, 0x11, 0x93, 0x14, 0x23, 0x11, 0x94, 0x0a, 0x6b, 0x18, 0xf0, 0x00, 0x6d, 0x78, 0xec, 0x14, 0xb4, 0x12, 0xeb, 0x6d, 0xe4, 0x83, 0xab, 0x00, 0x18, 0x5c, 0x3b, 0x16, 0xd2, 0x11, 0x95, 0x16, 0x92, 0x26, 0xb3, 0xad, 0xe3, 0x40, 0xc3, 0x23, 0xb3, 0xad, 0xe3, 0x40, 0xc3, 0x13, 0xb2, 0x60, 0xf1, 0x49, 0xa2, 0x01, 0x72, 0x08, 0x61, 0x00, 0xf2, 0x52, 0xa0, 0x05, 0x22, 0xa0, 0xf0, 0x44, 0xa8, 0x01, 0x4a, 0xa0, 0xf0, 0x44, 0xc8, 0x1b, 0x97, 0x1a, 0x91, 0x19, 0x90, 0x00, 0xef, 0x0e, 0x63, 0x00, 0x65, 0x08, 0x00, 0x00, 0xb6, 0x89, 0x04, 0x11, 0x80, 0xf8, 0x37, 0x11, 0x80, 0x40, 0x3b, 0x11, 0x80, 0xd8, 0x1a, 0x11, 0x80, 0xdc, 0x1a, 0x11, 0x80, 0x0c, 0x52, 0x11, 0x80, 0x18, 0x52, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xd4, 0x19, 0x11, 0x80, 0xdc, 0x19, 0x11, 0x80, 0x28, 0x1a, 0x11, 0x80, 0x37, 0x1a, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x20, 0x01, 0x00, 0xb6, 0x38, 0x1a, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x8e, 0x1b, 0x11, 0x80, 0x36, 0x1a, 0x11, 0x80, 0x34, 0x1a, 0x11, 0x80, 0xc8, 0x19, 0x11, 0x80, 0xd4, 0x3b, 0x11, 0x80, 0x90, 0x19, 0x11, 0x80, 0x84, 0x19, 0x11, 0x80, 0xe4, 0x37, 0x11, 0x80, 0x24, 0x1a, 0x11, 0x80, 0xf9, 0x19, 0x11, 0x80, 0x49, 0x00, 0x11, 0x80, 0x0c, 0xa3, 0x00
-, 0xb0, 0xfc, 0x63, 0x07, 0x62, 0x0f, 0xb3, 0x60, 0xf1, 0x64, 0x9b, 0x0f, 0xb2, 0x6c, 0xea, 0x0f, 0xb3, 0x6e, 0xea, 0x13, 0x2a, 0x0e, 0xb2, 0xff, 0xf7, 0x1f, 0x6b, 0xff, 0x6c, 0x40, 0xaa, 0x1f, 0x4c, 0x4c, 0xeb, 0x5d, 0x67, 0x68, 0xca, 0x08, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x7d, 0x67, 0x50, 0xc3, 0x00, 0x18, 0x5c, 0x3b, 0xa8, 0xab, 0x07, 0x97, 0x00, 0xef, 0x04, 0x63, 0x2c, 0x52, 0x11, 0x80, 0xff, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x00, 0xb6, 0xf0, 0x63, 0x1f, 0x62, 0x1e, 0xd1, 0x1d, 0xd0, 0x80, 0xac, 0xc0, 0xf2, 0x0c, 0x68, 0xc3, 0xb2, 0x18, 0xec, 0x18, 0xd4, 0xa0, 0xa5, 0x12, 0xd5, 0x12, 0xe8, 0x41, 0xe0, 0xe0, 0xf0, 0x47, 0xa0, 0x13, 0xd2, 0xa0, 0xf0, 0x60, 0xa8, 0x19, 0xd3, 0xa0, 0xf0, 0x82, 0xa8, 0x80, 0xf0, 0x7e, 0xa8, 0x17, 0xd4, 0xa0, 0xf0, 0xa6, 0xa8, 0x16, 0xd5, 0xe0, 0xf0, 0x4e, 0xa0, 0x11, 0xd2, 0x00, 0x6a, 0xc0, 0xf2, 0x44, 0xc0, 0xc0, 0xf2, 0x45, 0xc0, 0xe0, 0xf0, 0x23, 0xa0, 0x11, 0x94, 0x1b, 0xd3, 0x00, 0x18, 0x49, 0xbd, 0xb1, 0x67, 0x0a, 0x6c, 0x98, 0xea, 0x14, 0xd2, 0xb0, 0xb2, 0x12, 0xec, 0x49, 0xe4, 0x15, 0xd2, 0xe0, 0xf0, 0xa3, 0xa0, 0x00, 0x18, 0x56, 0x3d, 0x11, 0x94, 0x12, 0x92, 0x1b, 0x93, 0x0c, 0x22, 0x13, 0x94, 0x01, 0x74, 0x09, 0x61, 0x15, 0x92, 0x03, 0xf4, 0x00, 0x6c, 0x18, 0xf0, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x1b, 0x93, 0x00, 0x1c, 0x73, 0x1b, 0x1b, 0xd3, 0x0a, 0x04, 0xb1, 0x67, 0x00, 0x18, 0x44, 0x97, 0x1a, 0xd2, 0x0a, 0x92, 0xa1, 0xb4, 0x1b, 0x93, 0x46, 0x32, 0x01, 0x4a, 0x8c, 0xea, 0x0a, 0xd2, 0xa0, 0xf2, 0x9e, 0xa8, 0x10, 0xd4, 0x07, 0x2c, 0x12, 0x95, 0x01, 0x75, 0x04, 0x61, 0x00, 0x1c, 0x7a, 0x1b, 0x1a, 0x94, 0x26, 0x11, 0x06, 0x22, 0x05, 0x23, 0x7b, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x10, 0xe9, 0x01, 0x10, 0x00, 0x69, 0xff, 0xf7, 0x1f, 0x6c, 0x27, 0xe3, 0x8c, 0xe9, 0x19, 0x94, 0x85, 0xe1, 0x23, 0xeb, 0x01, 0x60, 0x67, 0xe1, 0x12, 0x95, 0x01, 0x75, 0x02, 0x60, 0x10, 0xd3, 0x16, 0x10, 0x8d, 0xb3, 0xa0, 0xf2, 0x8c, 0x98, 0x8c, 0xeb, 0x43, 0xeb, 0x67, 0xe2, 0x03, 0x61, 0x8b, 0xb1, 0x67, 0xe1, 0x45, 0xe1, 0x10, 0x95,
-0x4b, 0xe3, 0xba, 0xe9, 0x01, 0x2d, 0xe5, 0xe8, 0x12, 0xe9, 0x01, 0x49, 0xb8, 0xe9, 0x12, 0xe9, 0x25, 0xe2, 0x83, 0xb2, 0x4c, 0xe9, 0x11, 0x93, 0xe0, 0xf0, 0xa3, 0xa0, 0x02, 0x6c, 0x74, 0x32, 0xa0, 0x35, 0xff, 0x6b, 0x6c, 0xea, 0xac, 0x35, 0x4d, 0xed, 0xff, 0xf7, 0x1f, 0x6a, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x0a, 0x93, 0x71, 0xe1, 0x11, 0xd4, 0x05, 0x10, 0x11, 0x95, 0x10, 0x92, 0x55, 0xe5, 0x11, 0xd5, 0x45, 0xe1, 0x08, 0x59, 0xf9, 0x61, 0x00, 0x18, 0xa5, 0x3a, 0x1b, 0xd3, 0x11, 0x94, 0x1b, 0x93, 0x6f, 0xe4, 0x64, 0x33, 0x6d, 0xe2, 0x70, 0xd8, 0x10, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4e, 0x6c, 0x11, 0x95, 0xff, 0xf7, 0x1f, 0x6a, 0x48, 0x6c, 0x4c, 0xed, 0x19, 0xd5, 0x00, 0x18, 0x5c, 0x3b, 0x1b, 0xd2, 0x13, 0x93, 0x12, 0x2b, 0x16, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0x6c, 0x17, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4a, 0x6c, 0x67, 0xb3, 0x1b, 0x92, 0x00, 0xf2, 0x1c, 0x6c, 0xa0, 0xab, 0x40, 0x6b, 0x4c, 0xed, 0x6d, 0xed, 0x4c, 0xed, 0x16, 0x10, 0x63, 0xb3, 0x7c, 0x4b, 0x78, 0x9b, 0x10, 0xf0, 0x00, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x16, 0x94, 0x03, 0x24, 0x4c, 0x6c, 0x01, 0x6d, 0x05, 0x10, 0x4c, 0x6c, 0x00, 0x6d, 0x02, 0x10, 0x16, 0x95, 0x4c, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x17, 0x95, 0x4a, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x07, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x6c, 0x12, 0x95, 0x0e, 0x2d, 0x13, 0x92, 0x01, 0x72, 0x0b, 0x61, 0x14, 0x93, 0x53, 0xb2, 0x69, 0xe2, 0xa0, 0xc2, 0x52, 0xb2, 0x69, 0xe2, 0x7d, 0x67, 0x87, 0x43, 0x41, 0x4c, 0x60, 0xa4, 0x60, 0xc2, 0x1a, 0x94, 0x00, 0x1c, 0x7a, 0x1b, 0x02, 0x49, 0x00, 0x18, 0x1c, 0x04, 0x00, 0x65, 0x01, 0xf0, 0x00, 0x6d, 0x00, 0x18, 0x91, 0xbe, 0x5e, 0x6c, 0x11, 0x95, 0x19, 0x94, 0x03, 0x6a, 0x04, 0xd2, 0x48, 0xb2, 0x05, 0xd2, 0x06, 0xd4, 0xa4, 0x32, 0x07, 0xd5, 0x00, 0x6c, 0xfa, 0x6d, 0x85, 0xf5, 0x0f, 0x6e, 0x40, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x08, 0xd2, 0x12, 0x92, 0x1f, 0x2a, 0x13, 0x93, 0x01, 0x73, 0x0c, 0x61, 0x15, 0x92, 0x18, 0xf0, 0x00, 0x6c, 0x03, 0xf4, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x20, 0x6a, 0x00, 0xf2, 0x50, 0xc0, 0x24, 0x10
-, 0x51, 0x59, 0x06, 0x61, 0x18, 0x95, 0xff, 0xf7, 0x1f, 0x6c, 0x00, 0x18, 0xc7, 0x9c, 0x2c, 0xec, 0x15, 0x93, 0x18, 0xf0, 0x00, 0x6c, 0x01, 0xf4, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97, 0xc3, 0xab, 0x13, 0x94, 0x12, 0x2c, 0x12, 0x95, 0x10, 0x25, 0x51, 0x59, 0x0e, 0x61, 0x18, 0x95, 0xff, 0xf7, 0x1f, 0x6c, 0x00, 0x18, 0xc7, 0x9c, 0x2c, 0xec, 0x15, 0x92, 0x01, 0xf4, 0x00, 0x6c, 0x18, 0xf0, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x10, 0x94, 0x7d, 0x67, 0x60, 0xf2, 0x0b, 0x6a, 0x5a, 0xcb, 0x25, 0xb2, 0x0b, 0xd4, 0x80, 0x9a, 0x0e, 0x92, 0x10, 0x95, 0x0c, 0x96, 0x04, 0xd2, 0x0d, 0x97, 0x0f, 0x92, 0x00, 0x18, 0x8e, 0x1c, 0x05, 0xd2, 0x03, 0x6a, 0x10, 0x95, 0x04, 0xd2, 0x1d, 0xb2, 0x05, 0xd2, 0x16, 0x93, 0x17, 0x92, 0x06, 0xd5, 0x05, 0x6c, 0xfa, 0x6d, 0xe5, 0xf5, 0x05, 0x6e, 0x82, 0xf7, 0x1e, 0x6f, 0x07, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x08, 0xd3, 0x14, 0x94, 0x0d, 0x24, 0x64, 0x67, 0xff, 0x4b, 0x68, 0x33, 0x15, 0xb4, 0x71, 0xe4, 0x00, 0x6a, 0x40, 0xdc, 0x14, 0xb4, 0x71, 0xe4, 0x40, 0xdc, 0x13, 0xb4, 0x6d, 0xe4, 0x40, 0xdb, 0x18, 0x95, 0x12, 0xb2, 0x00, 0x6b, 0xa9, 0xe2, 0x60, 0xc2, 0x1f, 0x97, 0x1e, 0x91, 0x1d, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x10, 0x63, 0x20, 0x56, 0x11, 0x80, 0x40, 0x3b, 0x11, 0x80, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x08, 0x1c, 0x02, 0x00, 0xb6, 0x4c, 0x00, 0x11, 0x80, 0x84, 0x19, 0x11, 0x80, 0x90, 0x19, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xa0, 0x48, 0x11, 0x80, 0x44, 0x1a, 0x11, 0x80, 0x74, 0x1a, 0x11, 0x80, 0xa4, 0x1a, 0x11, 0x80, 0xd0, 0x95, 0x11, 0x80, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd1, 0x0d, 0xd0, 0x7a, 0xb2, 0x01, 0x6c, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x78, 0xb3, 0x60, 0xab, 0x09, 0xd3, 0x78, 0xb3, 0x60, 0xa3, 0x8e, 0xeb, 0x04, 0x2b, 0x77, 0xb4, 0x60, 0xc4, 0x77, 0xb4, 0x60, 0xc4, 0x00, 0x6b, 0x08, 0xd3, 0xd5, 0x10, 0x75, 0xb3, 0x60, 0x9b, 0x05, 0x23, 0x08, 0xf0, 0x00, 0x6b, 0x4c, 0xeb, 0xc0, 0xf0, 0x12, 0x23, 0x09, 0x94, 0x08, 0xf0, 0x00, 0x6b, 0x4c, 0xeb, 0x8f, 0xe8, 0x4c, 0xe8, 0x00, 0x31, 0x20, 0x31, 0x23, 0x31, 0x23, 0x31, 0x03, 0x23, 0x00, 0x18, 0x05,
-0x9c, 0x00, 0x65, 0x6b, 0xb2, 0x7c, 0x4a, 0x55, 0x9a, 0x02, 0x6b, 0x6c, 0xea, 0x0f, 0x22, 0x00, 0x51, 0x0d, 0x60, 0x00, 0x18, 0xde, 0x1a, 0x00, 0x65, 0x67, 0xb2, 0x40, 0xf0, 0x63, 0xa2, 0x06, 0x23, 0xff, 0xf7, 0x1e, 0x6b, 0x6c, 0xe8, 0x00, 0x6b, 0x40, 0xf0, 0x63, 0xc2, 0x08, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xcd, 0x09, 0x00, 0x65, 0x02, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x80, 0x18, 0x2b, 0x2f, 0x00, 0x65, 0x01, 0x6a, 0x0c, 0xea, 0x46, 0x22, 0x00, 0x18, 0x42, 0x13, 0x00, 0x6c, 0x5a, 0xb2, 0x40, 0xa2, 0x40, 0x22, 0x59, 0xb2, 0x60, 0xf1, 0x44, 0xa2, 0x3c, 0x22, 0x58, 0xb1, 0xe0, 0xf0, 0x47, 0xa1, 0x01, 0x72, 0x37, 0x61, 0xc0, 0xf0, 0x48, 0xa1, 0x04, 0x5a, 0x33, 0x61, 0xc0, 0xf0, 0x4d, 0xa1, 0x02, 0x6b, 0x6e, 0xea, 0x2e, 0x2a, 0xe0, 0xf0, 0x8e, 0xa1, 0xe0, 0xf0, 0xa3, 0xa1, 0xc3, 0x67, 0x00, 0x18, 0x8f, 0x3c, 0x0a, 0xd2, 0x00, 0xf2, 0x65, 0xa1, 0x0a, 0x92, 0x0f, 0x73, 0x13, 0x60, 0x9d, 0x67, 0x01, 0x6b, 0x03, 0x6e, 0x78, 0xc4, 0x5a, 0xc4, 0x64, 0x6b, 0x00, 0x6c, 0x06, 0x05, 0xe6, 0x67, 0x04, 0xd3, 0x00, 0x18, 0x23, 0xe3, 0x05, 0xd2, 0x0f, 0x6a, 0x00, 0xf2, 0x45, 0xc1, 0x00, 0x18, 0xce, 0x06, 0x00, 0x6c, 0x3f, 0xb2, 0xa0, 0xa2, 0xe1, 0xf7, 0x1d, 0x6a, 0xa0, 0x35, 0xb0, 0x35, 0x4d, 0xed, 0x3f, 0xb2, 0x81, 0xa2, 0xff, 0xf7, 0x1f, 0x6a, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x20, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xf4, 0x05, 0x00, 0x65, 0x04, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x43, 0x11, 0x00, 0x65, 0x02, 0xf0, 0x00, 0x6a, 0x0c, 0xea, 0x09, 0x22, 0x00, 0x18, 0x5f, 0x11, 0x00, 0x65, 0x33, 0xb2, 0x40, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xb6, 0xa3, 0x00, 0x65, 0x00, 0xf6, 0x00, 0x6a, 0x0c, 0xea, 0x06, 0x22, 0x2f, 0xb2, 0xff, 0xf7, 0x1f, 0x6c, 0x40, 0xaa, 0x4c, 0xec, 0x08, 0xd4, 0x00, 0xf2, 0x00, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xf6, 0x12, 0x08, 0x94, 0x00, 0xf4, 0x00, 0x6a, 0x0c, 0xea, 0x0f, 0x22, 0x00, 0x18, 0x2f, 0x13, 0x08, 0x94, 0xfe, 0xf7, 0x1f, 0x6d, 0x00, 0x18, 0xac, 0xbe, 0x5e, 0x6c, 0x1b, 0xb2, 0xe0, 0xf0, 0x54, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xb9, 0xab, 0x00, 0x65, 0x01, 0xf0, 0x00
-, 0x69, 0x50, 0x67, 0x2c, 0xea, 0x07, 0x22, 0x00, 0x18, 0x17, 0x13, 0x00, 0x65, 0x5e, 0x6c, 0x00, 0x18, 0x91, 0xbe, 0xb1, 0x67, 0xff, 0x6a, 0x01, 0x4a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x46, 0x05, 0x00, 0x65, 0x08, 0xb2, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x09, 0x94, 0x8f, 0xeb, 0x4c, 0xeb, 0x3f, 0xf7, 0x06, 0x2b, 0x0f, 0x97, 0x0e, 0x91, 0x0d, 0x90, 0x00, 0xef, 0x08, 0x63, 0x00, 0x65, 0xbe, 0x00, 0x00, 0xb6, 0x7e, 0x04, 0x11, 0x80, 0xcc, 0x3b, 0x11, 0x80, 0x3b, 0x1a, 0x11, 0x80, 0x0c, 0x3b, 0x11, 0x80, 0xe8, 0x3b, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x50, 0x46, 0x11, 0x80, 0xf9, 0x95, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x34, 0xf2, 0x04, 0x80, 0xf0, 0x1a, 0x11, 0x80, 0x5c, 0x00, 0x00, 0xb6, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x2b, 0xb2, 0x40, 0x9a, 0x1e, 0xf4, 0x01, 0x6b, 0x6b, 0xeb, 0x4d, 0xeb, 0x40, 0x9c, 0x04, 0x67, 0x6c, 0xea, 0x7c, 0x6b, 0x4c, 0xeb, 0x40, 0xdc, 0x05, 0x23, 0x25, 0xb3, 0x26, 0xb2, 0x00, 0x18, 0xe5, 0x39, 0x60, 0xda, 0x61, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x99, 0x02, 0x00, 0x65, 0x61, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x80, 0x18, 0x83, 0x31, 0x00, 0x65, 0x61, 0xa0, 0x10, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xe0, 0x03, 0x00, 0x65, 0x61, 0xa0, 0x08, 0x6a, 0x4c, 0xeb, 0x0a, 0x23, 0x15, 0xb3, 0x61, 0xa3, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xc0, 0x00, 0x00, 0x65, 0x00, 0x18, 0xe6, 0x37, 0x00, 0x65, 0x61, 0xa0, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xad, 0x02, 0x00, 0x65, 0x61, 0xa0, 0x20, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x2d, 0x02, 0x00, 0x65, 0x0b, 0xb2, 0x60, 0xa2, 0x04, 0x23, 0x00, 0x6b, 0x00, 0x18, 0x5a, 0x33, 0x60, 0xc2, 0x00, 0x6b, 0x08, 0xb2, 0x60, 0xc2, 0x05, 0x97, 0x04, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x03, 0x63, 0xf4, 0x21, 0x11, 0x80, 0x32, 0x97, 0x79, 0x23, 0x60, 0x8b, 0x10, 0x80, 0x98, 0x07, 0x11, 0x80, 0xe4, 0x07, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x22, 0xb0, 0x40, 0xa0, 0x01, 0x69, 0x2c, 0xea, 0x38, 0x22, 0x21, 0xb2,
-0x00, 0x6b, 0x60, 0xda, 0x00, 0x18, 0x64, 0x35, 0x04, 0xd2, 0x04, 0x92, 0x1e, 0xb3, 0xff, 0x6c, 0x60, 0xda, 0x1e, 0xb2, 0x60, 0x9a, 0x40, 0xa0, 0x40, 0xf7, 0x62, 0x33, 0x46, 0x32, 0x2c, 0xea, 0x8c, 0xea, 0x2c, 0xeb, 0x4e, 0xeb, 0x04, 0x2b, 0x19, 0xb3, 0x80, 0x9b, 0x01, 0x4c, 0x80, 0xdb, 0x18, 0xb3, 0x80, 0xa3, 0x07, 0x6b, 0x8c, 0xeb, 0x1a, 0x23, 0x40, 0x6b, 0x8c, 0xeb, 0x17, 0x2b, 0x0f, 0xb3, 0xa0, 0xa3, 0x08, 0x6b, 0xac, 0xeb, 0x12, 0x23, 0x10, 0xb3, 0x04, 0x6c, 0xac, 0xec, 0x60, 0x9b, 0x06, 0x24, 0x40, 0xf7, 0x62, 0x33, 0x01, 0x6c, 0x8c, 0xeb, 0x6e, 0xea, 0x02, 0x10, 0x0d, 0xb2, 0x40, 0xa2, 0x04, 0x2a, 0x0a, 0xb2, 0x60, 0x9a, 0x01, 0x4b, 0x60, 0xda, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0x6a, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x08, 0x96, 0x11, 0x80, 0xcc, 0x07, 0x11, 0x80, 0xc9, 0xb9, 0x10, 0x80, 0x50, 0xa0, 0x00, 0xb0, 0x08, 0x22, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x1d, 0xb2, 0x7c, 0x4a, 0x55, 0x9a, 0x20, 0x6b, 0x6c, 0xea, 0x2d, 0x2a, 0x1b, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0x04, 0x72, 0x28, 0x60, 0x03, 0x72, 0x26, 0x60, 0x19, 0xb2, 0x40, 0x9a, 0x23, 0x2a, 0x18, 0xb2, 0x40, 0xa2, 0x01, 0x6f, 0x18, 0xb3, 0x56, 0x36, 0xec, 0xee, 0x01, 0x4e, 0x64, 0x6f, 0xf8, 0xee, 0x80, 0xab, 0xff, 0x6d, 0x12, 0xee, 0xc2, 0xec, 0x12, 0x61, 0x40, 0x6b, 0x4c, 0xeb, 0xac, 0xeb, 0x13, 0x23, 0x07, 0x6b, 0x4c, 0xeb, 0xac, 0xeb, 0x0f, 0x23, 0x80, 0x18, 0x5e, 0x2e, 0x00, 0x65, 0x00, 0x6c, 0x01, 0x2a, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x65, 0x05, 0x10, 0x01, 0x4c, 0x80, 0xcb, 0x02, 0x10, 0x01, 0x6a, 0x01, 0x10, 0x00, 0x6a, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xe8, 0x3b, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x00, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x12, 0xb2, 0xa0, 0xa2, 0x40, 0x6a, 0x60, 0x9c, 0xac, 0xea, 0xff, 0x6c, 0x0d, 0x22, 0x07, 0x6a, 0xac, 0xea, 0x8c, 0xea, 0x09, 0x22, 0x8c, 0xeb, 0x13, 0x23, 0x00, 0x6b, 0x0c, 0xb2, 0x60, 0xca, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x0c, 0x10, 0xff, 0x6a, 0x6c, 0xea
-, 0x09, 0x22, 0x09, 0xb2, 0x60, 0xa2, 0x1e, 0x6a, 0x6c, 0xea, 0x06, 0x6b, 0x6e, 0xea, 0x02, 0x2a, 0x06, 0xb3, 0x40, 0xc3, 0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x04, 0x96, 0x11, 0x80, 0x00, 0x96, 0x11, 0x80, 0x44, 0x20, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x06, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x04, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x06, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x04, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x12, 0xb2, 0x60, 0xa2, 0x40, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x07, 0x6a, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x0d, 0xb3, 0x0d, 0xb2, 0x60, 0xda, 0x0d, 0xb3, 0x7c, 0x4b, 0x0d, 0xb2, 0x78, 0x9b, 0x6c, 0xea, 0x08, 0x22, 0x0c, 0xb2, 0x54, 0xf5, 0x0f, 0x6b, 0x60, 0xda, 0x03, 0x10, 0x00, 0x1c, 0xb7, 0x1b, 0x00, 0x65, 0x09, 0xb2, 0x40, 0x9a, 0xfa, 0x2a, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x04, 0x96, 0x11, 0x80, 0x20, 0x4e, 0xa5, 0x01, 0x78, 0xa0, 0x00, 0xb0, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x40, 0x00, 0xb8, 0xa0, 0x00, 0xb0, 0xe8, 0x3b, 0x11, 0x80, 0xf1, 0x63, 0x1d, 0x62, 0x1c, 0xd1, 0x1b, 0xd0, 0xff, 0xf7, 0x1f, 0x6a, 0x8c, 0xea, 0x57, 0xb3, 0x16, 0xd2, 0x48, 0x32, 0x49, 0xe3, 0x00, 0x6b, 0x00, 0x9a, 0x15, 0xd3, 0x17, 0xd3, 0x9d, 0x10, 0x43, 0xa8, 0x43, 0x2a, 0x15, 0x93, 0x01, 0x4b, 0x15, 0xd3, 0x15, 0x94, 0xff, 0x6b, 0x6c, 0xec, 0x0b, 0x5c, 0x15, 0xd4, 0x02, 0x61, 0x46, 0xd8, 0x92, 0x10, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x82, 0x67, 0x47, 0x98, 0x02, 0x72, 0x2b, 0x61, 0x17, 0x92, 0x0e, 0x2a, 0x16, 0x93, 0x68, 0x32, 0x46, 0xb3, 0x49, 0xe3, 0x60, 0x9a, 0x04, 0x2b, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65, 0x7f, 0x10, 0x66, 0x98, 0x14, 0xd3, 0x60, 0xda, 0x05, 0x10, 0x46, 0x98, 0x17, 0x93, 0x46, 0xdb, 0x46, 0x98, 0x14, 0xd2, 0x01, 0x6a, 0x47, 0xd8, 0x00, 0x6a, 0x00, 0x1c, 0x7a, 0x1b, 0x46, 0xd8, 0x43,
-0x98, 0x03, 0x22, 0x80, 0x98, 0x40, 0xea, 0xa5, 0x98, 0x44, 0x98, 0x01, 0x72, 0x65, 0x61, 0x47, 0x98, 0x01, 0x72, 0x62, 0x61, 0x80, 0x98, 0x20, 0x18, 0x7a, 0x34, 0xa2, 0x98, 0x5d, 0x10, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65, 0x06, 0x98, 0x14, 0xd0, 0x57, 0x10, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x82, 0x67, 0x47, 0x98, 0x02, 0x72, 0x09, 0x61, 0x43, 0xa8, 0x66, 0x98, 0xff, 0x4a, 0x43, 0xc8, 0x00, 0x1c, 0x7a, 0x1b, 0x14, 0xd3, 0x17, 0xd0, 0x04, 0x10, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65, 0x14, 0xd0, 0x47, 0x98, 0x02, 0x72, 0x40, 0x61, 0x63, 0x98, 0x25, 0xb2, 0x4b, 0xe3, 0x3c, 0x2a, 0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xea, 0x23, 0xb3, 0x12, 0xe9, 0x65, 0xe1, 0x8b, 0x99, 0x60, 0x98, 0x8e, 0xeb, 0x2d, 0x2b, 0xe0, 0xf0, 0xa3, 0xa1, 0x12, 0x04, 0x00, 0x18, 0x44, 0x97, 0x18, 0xd2, 0x0b, 0x6b, 0x04, 0xd3, 0x1c, 0xb3, 0x05, 0xd3, 0x18, 0x92, 0x12, 0x93, 0x02, 0x6c, 0x07, 0xd2, 0x06, 0xd3, 0xe0, 0xf0, 0x43, 0xa1, 0xfa, 0x6d, 0xe4, 0xf2, 0x07, 0x6e, 0x08, 0xd2, 0xe0, 0xf0, 0x4e, 0xa1, 0x64, 0xf4, 0x14, 0x6f, 0x09, 0xd2, 0x4d, 0x99, 0x0a, 0xd2, 0x60, 0xf2, 0x52, 0xa1, 0x0b, 0xd2, 0x60, 0xf2, 0x53, 0xa1, 0x0c, 0xd2, 0x4c, 0x99, 0x0d, 0xd2, 0x40, 0x98, 0x0e, 0xd2, 0x43, 0xa8, 0x0f, 0xd2, 0x48, 0x98, 0x20, 0x18, 0xa3, 0x30, 0x10, 0xd2, 0x05, 0x10, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xc4, 0x61, 0x14, 0x90, 0x7f, 0xf7, 0x01, 0x28, 0x1d, 0x97, 0x1c, 0x91, 0x1b, 0x90, 0x00, 0xef, 0x0f, 0x63, 0xb8, 0x8a, 0x11, 0x80, 0xe5, 0xb9, 0x04, 0x80, 0x20, 0x56, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xc8, 0x72, 0x04, 0x61, 0x80, 0x18, 0xcd, 0x32, 0x80, 0xac, 0x03, 0x10, 0x20, 0x18, 0x89, 0x35, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd0, 0x68, 0xa4, 0x01, 0x6a, 0x04, 0x67, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x0a, 0x02, 0x00, 0x65, 0x56, 0x2a, 0x68, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x38, 0xb3, 0x01, 0x22, 0x01, 0x6a, 0x40, 0xc3, 0x68, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x97, 0x01, 0x90, 0x67, 0x47, 0x2a, 0x68, 0xa0, 0x08, 0x6a, 0x6c
-, 0xea, 0x04, 0x22, 0x00, 0x18, 0x72, 0x01, 0x90, 0x67, 0x3f, 0x2a, 0x2f, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x02, 0x6b, 0x6c, 0xea, 0x18, 0x22, 0x68, 0xa0, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0xf0, 0x01, 0x90, 0x67, 0x2e, 0x2a, 0x68, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0xdc, 0x01, 0x90, 0x67, 0x26, 0x2a, 0x62, 0x98, 0xc1, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x37, 0x22, 0x20, 0xb2, 0x80, 0xf0, 0x7c, 0xa2, 0x5d, 0x67, 0x20, 0xf0, 0x70, 0xc2, 0x04, 0x6a, 0x6c, 0xea, 0x07, 0x22, 0x66, 0xa0, 0x7f, 0x6a, 0x6c, 0xea, 0x21, 0x6b, 0x6b, 0xeb, 0x6c, 0xea, 0x46, 0xc0, 0x18, 0xb2, 0x20, 0xf0, 0x7b, 0xa2, 0x5d, 0x67, 0x20, 0xf0, 0x74, 0xc2, 0x40, 0x6a, 0x6c, 0xea, 0x05, 0x22, 0x66, 0xa0, 0x21, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x46, 0xc0, 0x00, 0x18, 0x69, 0x37, 0x84, 0x40, 0x05, 0x6a, 0x04, 0xd2, 0x0f, 0xb2, 0x05, 0xd2, 0x40, 0x98, 0x04, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x43, 0x98, 0x44, 0xf2, 0x13, 0x6e, 0xa1, 0xf1, 0x1a, 0x6f, 0x07, 0xd2, 0x42, 0x98, 0x08, 0xd2, 0x41, 0x98, 0x09, 0xd2, 0x44, 0x98, 0x20, 0x18, 0xa3, 0x30, 0x0a, 0xd2, 0x0f, 0x97, 0x0e, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x08, 0x63, 0x00, 0x65, 0x09, 0x96, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xf7, 0x63, 0x11, 0x62, 0x10, 0xd1, 0x0f, 0xd0, 0x59, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x40, 0x33, 0x28, 0x6e, 0x80, 0x18, 0x8c, 0x28, 0x00, 0x65, 0x56, 0xb2, 0x80, 0xf0, 0x9c, 0xa2, 0x40, 0x6b, 0x55, 0xb5, 0x8d, 0xeb, 0x97, 0xaa, 0x80, 0xf0, 0x7c, 0xc2, 0x08, 0x6b, 0x8d, 0xeb, 0x96, 0xaa, 0x77, 0xca, 0x07, 0xf4, 0x01, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x50, 0xb4, 0x76, 0xca, 0x60, 0x9c, 0xad, 0xeb, 0x60, 0xdc, 0x00, 0x6c, 0x4e, 0xb3, 0x80, 0xcb, 0x78, 0xaa, 0x4d, 0xb2, 0x80, 0xa2, 0x01, 0x6d, 0x8e, 0x32, 0xac, 0xea, 0x50, 0x36, 0x11, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x92, 0x33, 0xac, 0xeb, 0xcd, 0xea, 0x60, 0x33, 0xff, 0xf5, 0x1e, 0x4d, 0x64, 0x33, 0xac, 0xea, 0x6d, 0xea, 0x07, 0x6b, 0x8c, 0xeb, 0x04, 0x53, 0x04, 0x61, 0x07, 0x6b, 0x6b, 0xeb, 0x4c, 0xeb, 0x07, 0x10, 0x03, 0x6c, 0x6c, 0xec, 0x84, 0x33,
-0x07, 0x6c, 0x8b, 0xec, 0x4c, 0xec, 0x8d, 0xeb, 0x39, 0xb2, 0x78, 0xca, 0x3c, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x38, 0xb2, 0x60, 0xa2, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x12, 0x22, 0x00, 0x68, 0x00, 0x18, 0x44, 0x1c, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x00, 0x18, 0x44, 0x1c, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x01, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0x04, 0x58, 0xef, 0x61, 0x2c, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x11, 0x22, 0x2a, 0xb4, 0xa3, 0xa4, 0x09, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x43, 0xc4, 0x01, 0x6d, 0x28, 0xb4, 0x76, 0x32, 0xac, 0xea, 0xc0, 0xa4, 0x03, 0x4a, 0x54, 0x35, 0x1f, 0x6a, 0xcc, 0xea, 0xad, 0xea, 0x40, 0xc4, 0x20, 0xb2, 0x00, 0xa2, 0x20, 0xb2, 0xc0, 0xa2, 0x22, 0xb2, 0xa0, 0xa2, 0x22, 0xb2, 0x04, 0x6c, 0x6c, 0xec, 0x40, 0x9a, 0x65, 0x67, 0x0b, 0x24, 0xc6, 0x34, 0x40, 0xf7, 0x42, 0x32, 0x8e, 0xea, 0x01, 0x6c, 0x8c, 0xea, 0xff, 0x6c, 0x8c, 0xea, 0x00, 0x6b, 0x01, 0x22, 0x01, 0x6b, 0x1a, 0xb2, 0x07, 0x69, 0xe0, 0x9a, 0x18, 0xb2, 0x80, 0x9a, 0x19, 0xb2, 0x40, 0x9a, 0x04, 0xd1, 0x07, 0xd6, 0x08, 0xd5, 0x0a, 0xd7, 0x0b, 0xd4, 0x16, 0xb1, 0x05, 0x6c, 0xfa, 0x6d, 0x84, 0xf1, 0x09, 0x6e, 0xa4, 0xf3, 0x12, 0x6f, 0x05, 0xd1, 0x06, 0xd0, 0x09, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x0c, 0xd2, 0x11, 0x97, 0x10, 0x91, 0x0f, 0x90, 0x00, 0xef, 0x09, 0x63, 0xd0, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x01, 0x00, 0x5c, 0xa0, 0x00, 0xb0, 0x00, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x08, 0x96, 0x11, 0x80, 0x30, 0x21, 0x11, 0x80, 0x10, 0x21, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x50, 0xa0, 0x00, 0xb0, 0x40, 0xa0, 0x00, 0xb0, 0x2c, 0x00, 0x00, 0xb5, 0xc8, 0xe7, 0x04, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x18, 0xb2, 0x19, 0xb3, 0x63, 0xea, 0x26, 0x61, 0x18, 0xb2, 0x80, 0x9a, 0x18, 0xb3, 0x8e, 0xeb, 0x21, 0x2b, 0x02, 0xaa, 0x17, 0xb5, 0x1d, 0x10, 0x17, 0xb4, 0x42, 0x45, 0x43, 0xec, 0x1a, 0x61, 0xc0, 0xa2, 0xff, 0xf7, 0x1f, 0x6f, 0x43, 0x46, 0x43, 0xe8, 0x14, 0x61, 0x45, 0xe5
-, 0x23, 0xec, 0x11, 0x61, 0x81, 0xa5, 0x60, 0xa5, 0x80, 0x34, 0x6d, 0xec, 0xec, 0xec, 0xe0, 0xf3, 0x14, 0x5c, 0x09, 0x60, 0x43, 0xe0, 0x0d, 0xb2, 0x03, 0x4d, 0x91, 0xe2, 0x00, 0x18, 0x0d, 0x33, 0xec, 0xe8, 0xb1, 0x67, 0xe2, 0x28, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0xf0, 0xff, 0x10, 0x80, 0xc4, 0xea, 0x10, 0x80, 0xc8, 0xea, 0x10, 0x80, 0x55, 0xab, 0x23, 0x87, 0xce, 0xea, 0x10, 0x80, 0xff, 0xff, 0x10, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd1, 0x0d, 0xd0, 0xff, 0x69, 0x42, 0xb0, 0x8c, 0xe9, 0x61, 0xf3, 0x06, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x22, 0x6c, 0x20, 0xf0, 0xbf, 0xa0, 0xf3, 0x6a, 0x24, 0x6c, 0xa0, 0x35, 0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed, 0x40, 0xf0, 0xa1, 0xa0, 0x40, 0xf0, 0x40, 0xa0, 0x26, 0x6c, 0xa0, 0x35, 0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed, 0xeb, 0xf0, 0x12, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x28, 0x6c, 0x93, 0xf7, 0x1a, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x2a, 0x6c, 0x00, 0x18, 0x5e, 0x3a, 0x01, 0x6c, 0x02, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x20, 0x6d, 0x2e, 0xb2, 0x20, 0x6d, 0x5e, 0x6c, 0x60, 0xaa, 0x9f, 0xf7, 0x1f, 0x6a, 0xee, 0xf1, 0x09, 0x68, 0x6c, 0xea, 0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed, 0xff, 0x6c, 0x09, 0x4c, 0x00, 0x18, 0x5c, 0x3b, 0x03, 0x6d, 0x27, 0xb2, 0x41, 0xa2, 0x27, 0xb3, 0x01, 0xf4, 0x00, 0x6d, 0x6d, 0xe2, 0x80, 0xab, 0xff, 0xf7, 0x1f, 0x6b, 0x8c, 0xe8, 0x24, 0xb4, 0xc0, 0xa4, 0x07, 0x6c, 0x8c, 0xee, 0x23, 0xb4, 0x80, 0xac, 0xc0, 0x36, 0xc4, 0x36, 0x8d, 0xed, 0x21, 0xb4, 0x80, 0xa4, 0x09, 0xd2, 0x0a, 0xd3, 0x80, 0x34, 0x90, 0x34, 0x8d, 0xed, 0x1f, 0xb4, 0x81, 0xa4, 0x6c, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x08, 0xd6, 0x1d, 0xb4, 0xa0, 0xa4, 0x08, 0x96, 0xff, 0x6c, 0xa0, 0x35, 0x09, 0x92, 0x0a, 0x93, 0xbc, 0x35, 0x21, 0x4c, 0xcd, 0xed, 0x0d, 0xec, 0x8d, 0xed, 0x6c, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x82, 0x67, 0x02, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x20, 0x6d, 0x00, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x0d, 0x6d, 0x0b, 0x21, 0x04, 0x00, 0x90, 0x67, 0x55, 0x6d, 0x00, 0x18, 0x40, 0x33, 0x0a, 0x6e, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x29, 0x3d, 0xd0,
-0x67, 0x0f, 0x97, 0x0e, 0x91, 0x0d, 0x90, 0x00, 0xef, 0x08, 0x63, 0x4c, 0x00, 0x11, 0x80, 0x5e, 0x00, 0x00, 0xb6, 0x3c, 0xf2, 0x04, 0x80, 0x00, 0x00, 0x00, 0xb6, 0x28, 0x05, 0x11, 0x80, 0xfc, 0x95, 0x11, 0x80, 0xf9, 0x95, 0x11, 0x80, 0x34, 0xf2, 0x04, 0x80, 0xfa, 0x95, 0x11, 0x80, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, 0x89, 0xb2, 0x0d, 0xd5, 0x60, 0xa2, 0x01, 0x6a, 0x04, 0x67, 0x6c, 0xea, 0x26, 0x67, 0x03, 0x22, 0x00, 0x6b, 0x86, 0xb2, 0x60, 0xda, 0x40, 0xa8, 0x7f, 0xf4, 0x15, 0x72, 0x34, 0x60, 0x7f, 0xf4, 0x16, 0x6b, 0x63, 0xea, 0x16, 0x60, 0x7f, 0xf4, 0x10, 0x72, 0x5c, 0x60, 0xfb, 0x4b, 0x63, 0xea, 0x09, 0x60, 0x1f, 0xf4, 0x16, 0x72, 0x41, 0x60, 0x7f, 0xf4, 0x0f, 0x72, 0x00, 0x6d, 0xe0, 0xf0, 0x0b, 0x60, 0xde, 0x10, 0x7f, 0xf4, 0x13, 0x72, 0x2b, 0x60, 0x7f, 0xf4, 0x14, 0x72, 0x2b, 0x60, 0xd7, 0x10, 0x9f, 0xf4, 0x11, 0x72, 0xa0, 0xf0, 0x01, 0x60, 0x9f, 0xf4, 0x12, 0x6b, 0x63, 0xea, 0x07, 0x60, 0x9f, 0xf4, 0x00, 0x72, 0x79, 0x60, 0x9f, 0xf4, 0x10, 0x72, 0x7d, 0x60, 0xc8, 0x10, 0x5f, 0xf5, 0x04, 0x72, 0x3f, 0x60, 0x5f, 0xf5, 0x05, 0x72, 0x34, 0x60, 0x9f, 0xf4, 0x12, 0x72, 0xa0, 0xf0, 0x05, 0x60, 0xbd, 0x10, 0x63, 0xa0, 0x69, 0xb2, 0x60, 0xc2, 0x64, 0xa0, 0x69, 0xb2, 0x60, 0xc2, 0x46, 0xa0, 0x65, 0xa0, 0x40, 0x32, 0x6d, 0xea, 0x67, 0xb3, 0x40, 0xcb, 0x7c, 0x10, 0x43, 0xa0, 0x64, 0xb3, 0x5f, 0x10, 0x65, 0xb2, 0x84, 0xa2, 0x19, 0x6b, 0x6b, 0xeb, 0x6c, 0xec, 0x84, 0xc2, 0x85, 0xa2, 0x8c, 0xeb, 0x65, 0xc2, 0x6f, 0x10, 0x61, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x01, 0x68, 0x6c, 0xea, 0x80, 0xf0, 0x1d, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x5d, 0xb2, 0x80, 0x18, 0x5e, 0x2e, 0x00, 0xc2, 0x00, 0x68, 0x80, 0xf0, 0x13, 0x2a, 0x00, 0x18, 0xa3, 0x35, 0x00, 0x65, 0x8f, 0x10, 0x43, 0xa0, 0x00, 0x6c, 0x01, 0x22, 0x01, 0x6c, 0x80, 0x18, 0xff, 0x33, 0x00, 0x65, 0x52, 0x10, 0x24, 0xa0, 0x63, 0xa0, 0x1f, 0x6a, 0x4c, 0xe9, 0x52, 0xb2, 0x01, 0x23, 0x01, 0x6b, 0x20, 0xf0, 0x6e, 0xc2, 0x02, 0x6a, 0x04, 0xd2, 0x50, 0xb2, 0x05, 0xd2, 0x4e, 0xb3, 0x20, 0xf0, 0x4e, 0xa3, 0x05, 0x6c, 0xfa, 0x6d, 0x63, 0xf7, 0x1d, 0x6e, 0x41
-, 0xf5, 0x10, 0x6f, 0x06, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd1, 0x0c, 0x21, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x1f, 0x6b, 0x4c, 0xeb, 0x05, 0x23, 0x2e, 0xeb, 0x03, 0x2b, 0x42, 0xb2, 0x20, 0xf0, 0x2f, 0xc2, 0x85, 0xa0, 0x40, 0xb3, 0x07, 0x6a, 0x8c, 0xea, 0xa3, 0xa3, 0x50, 0x34, 0x71, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc3, 0x1f, 0x10, 0x63, 0xa0, 0x00, 0x6a, 0x01, 0x23, 0x01, 0x6a, 0x3b, 0xb3, 0x40, 0xc3, 0x18, 0x10, 0x42, 0xa0, 0x15, 0x72, 0x54, 0x61, 0x39, 0xb4, 0xa3, 0x40, 0x00, 0x18, 0x0d, 0x33, 0x10, 0x6e, 0x73, 0xa0, 0x37, 0xb2, 0x40, 0xf1, 0x7a, 0xc2, 0x74, 0xa0, 0x40, 0xf1, 0x7b, 0xc2, 0x75, 0xa0, 0x40, 0xf1, 0x7c, 0xc2, 0x76, 0xa0, 0x40, 0xf1, 0x7d, 0xc2, 0x77, 0xa0, 0x40, 0xf1, 0x7e, 0xc2, 0x00, 0x6d, 0x3e, 0x10, 0x42, 0xa0, 0x12, 0x72, 0x3a, 0x61, 0x2e, 0xb4, 0xa3, 0x40, 0x00, 0x18, 0x0d, 0x33, 0x0d, 0x6e, 0x50, 0xa0, 0x2a, 0xb1, 0xc0, 0xf1, 0x40, 0xc1, 0x51, 0xa0, 0xc0, 0xf1, 0x41, 0xc1, 0x52, 0xa0, 0xc0, 0xf1, 0x42, 0xc1, 0x53, 0xa0, 0xc0, 0xf1, 0x43, 0xc1, 0x54, 0xa0, 0x80, 0xf1, 0x43, 0xc1, 0xe5, 0x17, 0x42, 0xa0, 0x12, 0x72, 0x21, 0x61, 0x22, 0xb4, 0xa3, 0x40, 0x00, 0x18, 0x0d, 0x33, 0x0d, 0x6e, 0x50, 0xa0, 0x1d, 0xb1, 0xc0, 0xf1, 0x44, 0xc1, 0x51, 0xa0, 0xc0, 0xf1, 0x45, 0xc1, 0x52, 0xa0, 0xc0, 0xf1, 0x46, 0xc1, 0x53, 0xa0, 0xc0, 0xf1, 0x47, 0xc1, 0x54, 0xa0, 0x80, 0xf1, 0x52, 0xc1, 0xcc, 0x17, 0x01, 0x68, 0x0d, 0x93, 0x00, 0x6a, 0x00, 0xc3, 0x40, 0xc1, 0x00, 0x6a, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x12, 0x6d, 0x00, 0x18, 0x8d, 0x8f, 0x80, 0xa8, 0x01, 0x6a, 0xf5, 0x17, 0x00, 0x65, 0x08, 0x96, 0x11, 0x80, 0xcc, 0x07, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0xf9, 0x95, 0x11, 0x80, 0xfc, 0x95, 0x11, 0x80, 0xb8, 0x51, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfe, 0x95, 0x11, 0x80, 0x86, 0x01, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xd0, 0x01, 0x11, 0x80, 0xdf, 0x01, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x16, 0xb0, 0x60, 0xa0, 0x07, 0x6a, 0x6c, 0xea, 0x21, 0x22,
-0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x40, 0xa0, 0x01, 0x6b, 0x14, 0x6c, 0x56, 0x32, 0x6c, 0xea, 0x00, 0x18, 0xf1, 0x24, 0x84, 0xea, 0x0f, 0xb2, 0x60, 0x9a, 0x24, 0x6a, 0x05, 0x6c, 0x58, 0xeb, 0x0d, 0xb3, 0xfa, 0x6d, 0xa3, 0xf5, 0x0d, 0x6e, 0x01, 0xf0, 0x0c, 0x6f, 0x12, 0xea, 0x49, 0xe3, 0x0a, 0xb3, 0x63, 0xda, 0x00, 0x6a, 0x0a, 0xb3, 0x04, 0xd2, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x04, 0x96, 0x11, 0x80, 0x28, 0x00, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0xad, 0xca, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x0f, 0xb0, 0x60, 0xa0, 0x07, 0x6a, 0x6c, 0xea, 0x14, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x40, 0xa0, 0x01, 0x6b, 0x14, 0x6c, 0x56, 0x32, 0x6c, 0xea, 0x00, 0x18, 0xf1, 0x24, 0x84, 0xea, 0x08, 0xb2, 0x60, 0x9a, 0x24, 0x6a, 0x58, 0xeb, 0x07, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x06, 0xb3, 0x63, 0xda, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x04, 0x96, 0x11, 0x80, 0x28, 0x00, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x8d, 0xca, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x19, 0xb2, 0xa0, 0x9a, 0x19, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x26, 0x22, 0x18, 0xb2, 0x80, 0xa2, 0x07, 0x6a, 0x8c, 0xea, 0x21, 0x22, 0x16, 0xb2, 0x41, 0xaa, 0x80, 0xf4, 0x40, 0x32, 0x80, 0xf5, 0x42, 0x32, 0xac, 0xea, 0x19, 0x22, 0x40, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0xff, 0x6d, 0xac, 0xea, 0x13, 0x22, 0x40, 0x6a, 0x4c, 0xec, 0x04, 0x2c, 0x80, 0x18, 0xe6, 0x34, 0x00, 0x65, 0x0c, 0x10, 0x00, 0x6d, 0x0c, 0xb4, 0x4c, 0xeb, 0xa0, 0xcc, 0x04, 0x23, 0x80, 0x18, 0x02, 0x35, 0x00, 0x65, 0x03, 0x10, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x2c, 0x00, 0x00, 0xb5, 0x08, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x10, 0x21, 0x11, 0x80, 0x00, 0x96, 0x11, 0x80, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, 0x40, 0xac, 0x03, 0xf0, 0x03, 0x6b, 0x04, 0x67, 0x4e, 0xeb, 0x25, 0x67, 0x1c, 0x2b, 0x2f, 0xb2, 0x02, 0x6c, 0xc0, 0xf1, 0x6a, 0xc2, 0xc0, 0xf1, 0x89, 0xc2, 0xc0, 0xf1, 0x88, 0xc2, 0x2c, 0xb3
-, 0x80, 0xa3, 0x01, 0x4c, 0x80, 0xc3, 0x03, 0x6b, 0x60, 0xf1, 0x60, 0xc2, 0x00, 0x18, 0x2e, 0xaa, 0x03, 0x6c, 0x28, 0xb3, 0x80, 0xa3, 0x05, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0x09, 0x6c, 0x8b, 0xec, 0x8c, 0xea, 0x40, 0xc3, 0x3a, 0x10, 0xff, 0xf5, 0x10, 0x72, 0x0f, 0x61, 0x43, 0xa4, 0x22, 0xb3, 0x02, 0x6c, 0xfa, 0x6d, 0x6d, 0xe2, 0x60, 0x9b, 0x04, 0xd4, 0x20, 0xb4, 0x05, 0xd4, 0x06, 0xd2, 0x07, 0xd3, 0x04, 0x6c, 0x63, 0xf3, 0x0e, 0x6e, 0x1c, 0x10, 0xff, 0xf5, 0x11, 0x72, 0x25, 0x61, 0x47, 0xa4, 0x66, 0xa4, 0xfa, 0x6d, 0x40, 0x32, 0x6d, 0xea, 0x65, 0xa4, 0x40, 0x32, 0x63, 0xf3, 0x1a, 0x6e, 0x6d, 0xea, 0x64, 0xa4, 0x40, 0x32, 0x83, 0xa4, 0x6d, 0xea, 0x12, 0xb3, 0x6d, 0xe4, 0x40, 0xdb, 0x02, 0x6b, 0x04, 0xd3, 0x11, 0xb3, 0x05, 0xd3, 0x63, 0xa0, 0x07, 0xd2, 0x04, 0x6c, 0x06, 0xd3, 0xc2, 0xf7, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x00, 0x65, 0x80, 0xa8, 0x00, 0x6d, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0x66, 0x6a, 0x40, 0xc1, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0x6a, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, 0x30, 0x3b, 0x11, 0x80, 0x00, 0xa0, 0x00, 0xb0, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x62, 0xa4, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6d, 0xac, 0xea, 0x0b, 0x22, 0x1d, 0xb2, 0xa1, 0xa2, 0x0c, 0x6a, 0xac, 0xea, 0x0c, 0x72, 0x09, 0x60, 0x7f, 0x6a, 0x6c, 0xea, 0x21, 0x6b, 0x6b, 0xeb, 0x02, 0x10, 0x21, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x42, 0xc4, 0x62, 0xa4, 0xa0, 0x6a, 0x4c, 0xeb, 0x0e, 0x23, 0x14, 0xb4, 0x96, 0xac, 0x14, 0xb5, 0x01, 0x6e, 0x82, 0x34, 0x96, 0x34, 0x40, 0x9d, 0xcc, 0xec, 0x12, 0xb6, 0x80, 0x34, 0x80, 0x34, 0xcc, 0xea, 0x8d, 0xea, 0x40, 0xdd, 0x0c, 0xb2, 0x80, 0xa2, 0x1e, 0x6a, 0x8c, 0xea, 0x02, 0x72, 0x0e, 0x61, 0x0d, 0xb2, 0x40, 0xa2, 0x0b, 0x22, 0x0d, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x02, 0x61, 0x00, 0x6c, 0x02, 0x23, 0x04, 0x2a, 0x01, 0x6c, 0x00, 0x18, 0xbe, 0x33, 0x00, 0x65, 0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x44, 0x20, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x5c, 0xa0, 0x00, 0xb0, 0xff, 0xff, 0xfe, 0xff, 0x09, 0x96, 0x11,
-0x80, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x68, 0x18, 0xb4, 0x04, 0x32, 0x49, 0xe4, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x0e, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe4, 0xc0, 0xaa, 0x3f, 0x6c, 0x6c, 0xec, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0x1e, 0x58, 0xeb, 0x61, 0x00, 0x68, 0x0e, 0xb4, 0x04, 0x32, 0x49, 0xe4, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x0e, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe4, 0xc0, 0xaa, 0x3f, 0x6c, 0x6c, 0xec, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0x22, 0x58, 0xeb, 0x61, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x44, 0xe9, 0x10, 0x80, 0x80, 0xe9, 0x10, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x0e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x22, 0x67, 0x10, 0xf0, 0x00, 0x6e, 0x0c, 0xe9, 0xcb, 0xee, 0x2d, 0xee, 0x0c, 0xee, 0x0e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x24, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xd1, 0x67, 0x0e, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x04, 0xd2, 0x04, 0x92, 0xe1, 0xf7, 0x1f, 0x6b, 0x09, 0x97, 0x4c, 0xeb, 0x43, 0x67, 0x0c, 0xea, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x68, 0x24, 0x67, 0x04, 0x32, 0x49, 0xe1, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x29, 0x60, 0x1e, 0xf0, 0x00, 0x6a, 0x6c, 0xea, 0x0c, 0xf0, 0x00, 0x72, 0x07, 0x61, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe1, 0x00, 0x18, 0x3f, 0x1c, 0x80, 0xaa, 0x18, 0x10, 0x04, 0xf0, 0x00, 0x72, 0x0b, 0x61, 0xff, 0x6c, 0x8c, 0xeb, 0x40, 0x6a, 0x67, 0x33, 0x4d, 0xeb, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe1, 0x6c, 0xec, 0x01, 0x6d, 0x07, 0x10, 0x0d, 0x2a, 0x41, 0x40, 0x44, 0x32, 0xff, 0x6c, 0x49, 0xe1, 0x6c, 0xec, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xc0, 0xaa, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0xd1, 0x17, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x20, 0x6b, 0x4d, 0xeb, 0xff, 0xf7, 0x1f, 0x6e, 0x6c, 0xee, 0x00
-, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x04, 0x6c, 0x00, 0x18, 0x3f, 0x1c, 0x50, 0x6c, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x05, 0x97, 0x1f, 0x6b, 0x6c, 0xea, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0xff, 0x68, 0x00, 0x6e, 0x01, 0x6d, 0x8c, 0xe8, 0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x5a, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x5c, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x22, 0x67, 0xff, 0xf7, 0x1f, 0x6b, 0x6c, 0xe9, 0xff, 0xf7, 0x1e, 0x6e, 0x6c, 0xea, 0x5a, 0x6c, 0x01, 0x6d, 0x2c, 0xee, 0x08, 0xd2, 0x00, 0x18, 0x4d, 0xa6, 0x09, 0xd3, 0x08, 0x92, 0x09, 0x93, 0x03, 0x6e, 0x4d, 0xee, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x5c, 0x6c, 0x4c, 0xb4, 0x80, 0x18, 0xc6, 0x35, 0x00, 0x65, 0x80, 0x18, 0xe3, 0x35, 0x00, 0x65, 0x08, 0x5a, 0x05, 0x61, 0x02, 0x6c, 0x00, 0x6d, 0x1d, 0xf6, 0x00, 0x6e, 0x04, 0x10, 0x02, 0x6c, 0x00, 0x6d, 0x19, 0xf6, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x65, 0x43, 0xb4, 0x80, 0x18, 0xc6, 0x35, 0x00, 0x65, 0x06, 0x20, 0x90, 0x67, 0x00, 0x18, 0x44, 0x1c, 0x00, 0x68, 0x70, 0x67, 0x23, 0x10, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x41, 0x6c, 0x38, 0xf0, 0x03, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x18, 0x3f, 0x1c, 0x0a, 0x6c, 0x00, 0x68, 0x7e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x00, 0xf2, 0x00, 0x6b, 0x4c, 0xeb, 0x02, 0x23, 0x00, 0x6b, 0x0a, 0x10, 0x00, 0x18, 0x44, 0x1c, 0x0a, 0x6c, 0x01, 0x48, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xe8, 0x64, 0x58, 0xed, 0x61, 0x01, 0x6b, 0x2d, 0xb4, 0x80, 0x18, 0xc6, 0x35, 0x09, 0xd3, 0x5a, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xd1, 0x67, 0x08, 0x96, 0x5c, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x7e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x40, 0x6c, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x08, 0xd2, 0x09, 0x93, 0x09, 0x23, 0x21, 0x6c, 0x08, 0xf2, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x69, 0x07, 0x10, 0x21, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d,
-0xff, 0xf7, 0x1f, 0x69, 0x4c, 0xe9, 0x16, 0xb3, 0x01, 0x6a, 0x04, 0x6c, 0xfa, 0x6d, 0xe2, 0xf7, 0x0a, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x05, 0xd3, 0x06, 0xd0, 0x09, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x04, 0xd2, 0x09, 0x93, 0x02, 0x6a, 0x04, 0xd2, 0x05, 0xd3, 0x08, 0x93, 0xff, 0xf7, 0x1f, 0x6a, 0x05, 0x6c, 0x6c, 0xea, 0xfa, 0x6d, 0xe2, 0xf7, 0x0b, 0x6e, 0x44, 0xf5, 0x18, 0x6f, 0x06, 0xd1, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x51, 0x67, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63, 0x04, 0xea, 0x10, 0x80, 0x14, 0xea, 0x10, 0x80, 0x94, 0xea, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xf5, 0x63, 0x15, 0x62, 0x14, 0xd1, 0x13, 0xd0, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x3f, 0x6c, 0x00, 0x6d, 0xff, 0x69, 0x00, 0x18, 0xab, 0xa5, 0x02, 0x67, 0x2c, 0xea, 0xff, 0xf7, 0x1f, 0x6b, 0x6c, 0xe8, 0x0c, 0xd2, 0x0c, 0x95, 0x02, 0x30, 0x01, 0x6a, 0x2c, 0xe8, 0x82, 0x67, 0xd0, 0x67, 0xe2, 0x67, 0x11, 0xd3, 0x80, 0x18, 0xf1, 0x35, 0x04, 0xd2, 0x0c, 0x95, 0x03, 0x6a, 0x00, 0x6c, 0xd0, 0x67, 0x0f, 0x6f, 0x80, 0x18, 0xf1, 0x35, 0x04, 0xd2, 0x42, 0x34, 0x1f, 0x6d, 0x8a, 0x34, 0x56, 0x32, 0xac, 0xec, 0xac, 0xea, 0x0c, 0x95, 0x03, 0x6e, 0x0b, 0xd4, 0x04, 0xd6, 0x00, 0x6c, 0xd0, 0x67, 0x0f, 0x6f, 0x80, 0x18, 0xf1, 0x35, 0x0a, 0xd2, 0x42, 0x37, 0x1f, 0x6c, 0xea, 0x37, 0x8c, 0xef, 0x09, 0xd7, 0x56, 0x35, 0x8c, 0xed, 0x0b, 0x96, 0x09, 0x94, 0x08, 0xd5, 0x2c, 0xed, 0x2c, 0xee, 0x2c, 0xec, 0x0d, 0xd5, 0x0a, 0x97, 0x97, 0xe6, 0x10, 0xd6, 0x0d, 0x96, 0x2c, 0xef, 0x0e, 0xd4, 0xd3, 0xe7, 0x00, 0xf6, 0x80, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x98, 0xec, 0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0x11, 0x93, 0x0f, 0xd7, 0x12, 0xec, 0xb8, 0xed, 0x12, 0xed, 0xb1, 0xe4, 0x6c, 0xec, 0x11, 0x5c, 0x09, 0x60, 0x09, 0x94, 0x0b, 0x95, 0x08, 0x96, 0x0a, 0x97, 0xa5, 0xe4, 0x27, 0x31, 0x6c, 0xe9, 0xe1, 0xe6, 0x50, 0x10, 0x0c, 0x95, 0xd0, 0x67, 0x03, 0x6a, 0x00, 0x6c, 0x0f, 0x6f, 0x11, 0xd3, 0x80, 0x18, 0xf1, 0x35, 0x04, 0xd2, 0x42, 0x34, 0x1f, 0x6d, 0x8a, 0x34, 0xac, 0xec, 0x10, 0x96, 0xe4, 0x67, 0x2c, 0xef, 0x56, 0x30, 0xac, 0xe8, 0xf7, 0xe6
-, 0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0x0d, 0x65, 0x0f, 0x95, 0x0c, 0xe9, 0x11, 0x93, 0x3b, 0xe5, 0x00, 0xf6, 0xc0, 0x36, 0x00, 0xf6, 0xc3, 0x36, 0xd8, 0xee, 0xa8, 0x67, 0x12, 0xee, 0xb8, 0xed, 0x12, 0xed, 0xb9, 0xe6, 0x0e, 0x95, 0x6c, 0xee, 0x11, 0x5e, 0xff, 0xe5, 0x0d, 0x95, 0x00, 0xf6, 0xe0, 0x37, 0x00, 0xf6, 0xe3, 0x37, 0x27, 0xe5, 0x00, 0xf6, 0x20, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0xb8, 0xed, 0x12, 0xed, 0xf8, 0xef, 0x12, 0xef, 0xf5, 0xe5, 0x6c, 0xed, 0x09, 0x60, 0xc3, 0xed, 0x0d, 0x61, 0x0b, 0x97, 0xe5, 0xe4, 0x0a, 0x94, 0x27, 0x31, 0x6c, 0xe9, 0x81, 0xe0, 0x0c, 0x10, 0x11, 0x5d, 0x04, 0x61, 0x00, 0x6c, 0x11, 0x68, 0x10, 0x69, 0x09, 0x10, 0x09, 0x95, 0x08, 0x96, 0xa5, 0xe4, 0x27, 0x31, 0x6c, 0xe9, 0xc1, 0xe0, 0x07, 0x30, 0x6c, 0xe8, 0x01, 0x6c, 0x1f, 0x6b, 0x4c, 0xeb, 0x08, 0x24, 0x10, 0xf0, 0x00, 0x6a, 0x4b, 0xea, 0x4d, 0xeb, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xeb, 0x11, 0x10, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x11, 0xd3, 0x46, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6e, 0x00, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x11, 0x93, 0x20, 0x31, 0x28, 0x31, 0x14, 0x30, 0x2d, 0xe8, 0x6d, 0xe8, 0x00, 0x36, 0xc0, 0x36, 0xc3, 0x36, 0xff, 0xf7, 0x1f, 0x6a, 0xc3, 0x36, 0x4c, 0xee, 0x21, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x0e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x21, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x02, 0x67, 0x02, 0x6b, 0x04, 0xd3, 0x01, 0x6c, 0x09, 0xb3, 0xfa, 0x6d, 0xa3, 0xf0, 0x0c, 0x6e, 0xa4, 0xf3, 0x0d, 0x6f, 0x06, 0xd0, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x15, 0x97, 0x14, 0x91, 0x13, 0x90, 0x00, 0xef, 0x0b, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd0, 0x40, 0xb3, 0xc0, 0xf1, 0x90, 0xa3, 0x05, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0x9d, 0x67, 0x20, 0xf0, 0x40, 0xc4, 0xc0, 0xf1, 0x50, 0xc3, 0x00, 0x18, 0x29, 0xa8, 0x00, 0x65, 0x3a, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x5e, 0x6e, 0x38, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x34, 0x6e, 0x80, 0x18, 0xb1, 0x35, 0x00, 0x65, 0x02,
-0x67, 0x01, 0x6a, 0x04, 0xd2, 0x02, 0x6c, 0x33, 0xb2, 0xfa, 0x6d, 0x03, 0xf1, 0x0f, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x05, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd0, 0x7b, 0x70, 0x2f, 0xb4, 0x01, 0x60, 0x2f, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x22, 0x6e, 0x2d, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x2c, 0x6e, 0x2c, 0xb2, 0x80, 0x9a, 0x2c, 0xb2, 0x4c, 0xec, 0x23, 0xb2, 0xe0, 0xf1, 0x63, 0xa2, 0xff, 0x73, 0x07, 0x60, 0x04, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x1e, 0xf0, 0x02, 0x6a, 0x8d, 0xea, 0x04, 0x10, 0x26, 0xb2, 0xff, 0x73, 0x8d, 0xea, 0x05, 0x60, 0x08, 0x6c, 0x6c, 0xec, 0x02, 0x24, 0x23, 0xb3, 0x6c, 0xea, 0x1f, 0xb3, 0x80, 0x18, 0x95, 0x35, 0x40, 0xdb, 0x00, 0x18, 0x1b, 0xa7, 0x00, 0x65, 0x00, 0x18, 0xd2, 0xa6, 0x00, 0x65, 0x00, 0x18, 0x1e, 0xa4, 0x00, 0x65, 0x1d, 0xb2, 0x40, 0x9a, 0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, 0x1b, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x1a, 0xb3, 0x63, 0xda, 0x01, 0x6b, 0x1a, 0xb2, 0x80, 0x18, 0x56, 0x36, 0x60, 0xc2, 0x00, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x02, 0x6e, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x10, 0x6e, 0x00, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x0b, 0x97, 0x0a, 0x90, 0x00, 0xef, 0x06, 0x63, 0x4c, 0x00, 0x11, 0x80, 0x40, 0x02, 0x11, 0x80, 0xfc, 0xe7, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xa8, 0xe8, 0x10, 0x80, 0x64, 0xe8, 0x10, 0x80, 0xec, 0xe8, 0x10, 0x80, 0xac, 0xa0, 0x00, 0xb0, 0x00, 0x00, 0xef, 0xff, 0x01, 0xf0, 0x10, 0x00, 0xff, 0xff, 0xef, 0xff, 0x90, 0x04, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0xa1, 0xdc, 0x10, 0x80, 0x22, 0x1b, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x5b, 0xb2, 0x20, 0xf0, 0x6e, 0xa2, 0x03, 0x23, 0x20, 0xf0, 0x4f, 0xa2, 0x26, 0x10, 0x64, 0xa2, 0x41, 0x6a, 0x6c, 0xea, 0x41, 0x72, 0x0f, 0x61, 0x00, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0xa4, 0x67, 0xff, 0xf7, 0x1f, 0x6b, 0x4c, 0xeb, 0x62, 0x33, 0x72, 0x33, 0x00, 0x6a, 0x16, 0x23, 0x80, 0x18, 0xe3, 0x35, 0x00, 0x65, 0x12, 0x10, 0xa0, 0xf1, 0x1a, 0x6c, 0x10, 0xf0, 0x0f, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x4b, 0xb2, 0x60, 0xaa, 0xff
-, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x42, 0x32, 0x3f, 0x6b, 0x6c, 0xea, 0x46, 0x32, 0xff, 0x6b, 0x6c, 0xea, 0x47, 0xb3, 0x80, 0xf1, 0x81, 0xa3, 0x7f, 0x22, 0x46, 0xb5, 0xa0, 0xa5, 0x7c, 0x2d, 0x8b, 0xe2, 0x00, 0xf6, 0x40, 0x32, 0x00, 0xf6, 0x43, 0x32, 0x04, 0xd2, 0x42, 0xb2, 0x60, 0xf1, 0x52, 0xa2, 0x5e, 0x2a, 0x80, 0xf1, 0x40, 0xa3, 0x5b, 0x22, 0x80, 0xf1, 0x43, 0xa3, 0x03, 0x2a, 0x01, 0x6a, 0x80, 0xf1, 0x43, 0xc3, 0x3d, 0xb2, 0x00, 0x82, 0x39, 0xb2, 0x80, 0xf1, 0x43, 0xa2, 0x04, 0x93, 0x5a, 0xeb, 0x01, 0x2a, 0xe5, 0xe8, 0x00, 0x18, 0x9c, 0xa6, 0x12, 0xec, 0x32, 0xb2, 0x20, 0xf0, 0x6e, 0xa2, 0x05, 0x2b, 0x64, 0xa2, 0x41, 0x6a, 0x6c, 0xea, 0x41, 0x72, 0x40, 0x61, 0x32, 0xb2, 0x40, 0x82, 0x4e, 0xe8, 0x3c, 0x20, 0x31, 0xb2, 0x60, 0xa2, 0x07, 0x5b, 0x02, 0x61, 0x06, 0x6b, 0x60, 0xc2, 0x2e, 0xb2, 0xa0, 0xa2, 0x27, 0xb2, 0x63, 0xa2, 0x07, 0x6c, 0x72, 0x36, 0x8c, 0xee, 0xc2, 0xed, 0x06, 0x60, 0x8c, 0xed, 0x88, 0x4c, 0xb0, 0x35, 0x6c, 0xec, 0xad, 0xec, 0x83, 0xc2, 0x21, 0xb2, 0x43, 0xa2, 0x07, 0x6b, 0x02, 0x6c, 0x52, 0x32, 0x6c, 0xea, 0x61, 0x42, 0x8b, 0xec, 0x8c, 0xeb, 0x23, 0xb4, 0x20, 0xf1, 0x16, 0x4b, 0xff, 0xf7, 0x1f, 0x68, 0x8d, 0xe3, 0x20, 0xab, 0x01, 0x6b, 0x4c, 0xeb, 0x6c, 0x33, 0x02, 0x6c, 0x00, 0x6d, 0x0c, 0xe9, 0x00, 0x18, 0xab, 0xa5, 0x27, 0xeb, 0x1f, 0xf7, 0x01, 0x6b, 0x0c, 0xea, 0x6b, 0xeb, 0x0c, 0xe9, 0x6c, 0xea, 0x20, 0x31, 0x0c, 0xe9, 0xc2, 0x67, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x2d, 0xee, 0x0f, 0xb2, 0x80, 0xf1, 0x71, 0xa2, 0x10, 0x23, 0x80, 0xf1, 0x72, 0xa2, 0x03, 0x2b, 0x01, 0x6b, 0x80, 0xf1, 0x72, 0xc2, 0x0a, 0xb2, 0x80, 0xf1, 0x52, 0xa2, 0x04, 0x93, 0x5a, 0xeb, 0x01, 0x2a, 0xe5, 0xe8, 0x00, 0x18, 0x3e, 0xa8, 0x12, 0xec, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xba, 0x01, 0x00, 0xb6, 0x4c, 0x00, 0x11, 0x80, 0xfe, 0x95, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0x25, 0x1b, 0x11, 0x80, 0x78, 0x04, 0x11, 0x80, 0x00, 0x00, 0x00, 0xb6, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0xff, 0xf7, 0x1f, 0x69, 0x02, 0x74, 0x0e, 0xd4,
-0x0f, 0xd5, 0x11, 0xd7, 0xcc, 0xe9, 0x1d, 0x61, 0x2b, 0xb2, 0x61, 0xa2, 0x0c, 0x6a, 0x6c, 0xea, 0x0c, 0x72, 0x17, 0x61, 0x00, 0x6a, 0x29, 0xb3, 0x60, 0x9b, 0xc0, 0xf7, 0x62, 0x33, 0x11, 0x23, 0x27, 0xb3, 0x01, 0x4a, 0x43, 0xeb, 0xf7, 0x60, 0x00, 0x6a, 0x26, 0xb3, 0x02, 0x6c, 0xfa, 0x6d, 0x42, 0xf3, 0x0a, 0x6e, 0xe1, 0xf3, 0x00, 0x6f, 0x04, 0xd2, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x21, 0xb0, 0x60, 0xa0, 0x07, 0x6a, 0x6c, 0xea, 0x28, 0x22, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x60, 0xa0, 0x08, 0xd2, 0x40, 0x6a, 0x6c, 0xea, 0x07, 0x22, 0x00, 0x6b, 0x1b, 0xb2, 0x60, 0xca, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x16, 0x10, 0x19, 0xb4, 0xa0, 0xa4, 0x19, 0xb2, 0x04, 0x6b, 0xac, 0xeb, 0x40, 0x9a, 0x09, 0x23, 0x40, 0xf7, 0x42, 0x33, 0xa6, 0x32, 0x6e, 0xea, 0x01, 0x6b, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x02, 0x10, 0x13, 0xb2, 0x40, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xa3, 0x35, 0x00, 0x65, 0x00, 0x1c, 0x7a, 0x1b, 0x08, 0x94, 0x11, 0x97, 0x0e, 0x94, 0x0f, 0x95, 0x00, 0x18, 0x3e, 0x20, 0xd1, 0x67, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63, 0x00, 0x65, 0x44, 0x20, 0x11, 0x80, 0x1c, 0xa3, 0x00, 0xb0, 0xa0, 0x86, 0x01, 0x00, 0xc8, 0xe7, 0x04, 0x80, 0x04, 0x96, 0x11, 0x80, 0x00, 0x96, 0x11, 0x80, 0x08, 0x96, 0x11, 0x80, 0x50, 0xa0, 0x00, 0xb0, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x02, 0x67, 0x0f, 0xb2, 0x60, 0x9a, 0x0f, 0xb2, 0x00, 0x6c, 0x6e, 0xea, 0x02, 0x2a, 0x0e, 0xb2, 0x80, 0x9a, 0x0e, 0xb3, 0x82, 0x34, 0x82, 0x34, 0x40, 0x9b, 0xff, 0xf7, 0x1f, 0x6d, 0x80, 0x34, 0xac, 0xea, 0x80, 0x34, 0x8d, 0xea, 0x40, 0xdb, 0x00, 0x18, 0xfd, 0x25, 0x00, 0x6c, 0x00, 0x1c, 0x7a, 0x1b, 0x90, 0x67, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x60, 0x8b, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23, 0x64, 0x8b, 0x10, 0x80, 0x30, 0x00, 0x00, 0xb5, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x44, 0x67, 0x80, 0x9c, 0x3f, 0x6b, 0xff, 0x6e, 0x8c, 0xeb, 0x30, 0x73, 0x80, 0xf0, 0x00, 0x61, 0x62, 0xa2, 0x02, 0x6c, 0xa8, 0x43, 0xea, 0x4d, 0xa3, 0xec, 0x5e, 0x61, 0xa4, 0xa2
-, 0x83, 0xa2, 0x05, 0x5d, 0x68, 0x60, 0x04, 0x0e, 0xa4, 0x35, 0xb5, 0xe6, 0xa0, 0x8d, 0xb9, 0xe6, 0x00, 0xee, 0x00, 0x65, 0x0f, 0x00, 0x91, 0x01, 0x0b, 0x00, 0x4f, 0x00, 0x5b, 0x00, 0x63, 0xb4, 0x29, 0x10, 0x1e, 0x73, 0x18, 0x61, 0x00, 0x6b, 0xc0, 0xf2, 0x0c, 0x6d, 0xb8, 0xeb, 0x60, 0xb6, 0x12, 0xed, 0xd5, 0xe5, 0xe0, 0xf0, 0xe3, 0xa5, 0x5e, 0xb6, 0x8e, 0xef, 0x04, 0x2f, 0x40, 0xf2, 0x88, 0x45, 0xa0, 0xde, 0x16, 0x10, 0x00, 0x6d, 0xa0, 0xde, 0x01, 0x4b, 0xff, 0x6d, 0xac, 0xeb, 0x0a, 0x5b, 0xea, 0x61, 0x40, 0x10, 0x57, 0xb3, 0x80, 0x9b, 0x3d, 0x24, 0x40, 0xf2, 0x08, 0x4c, 0x08, 0x10, 0x0a, 0x6b, 0x78, 0xec, 0x54, 0xb3, 0x12, 0xec, 0x71, 0xe4, 0x02, 0x10, 0x53, 0xb4, 0x01, 0x10, 0x31, 0x24, 0x62, 0xa2, 0x1e, 0x73, 0x0a, 0x61, 0x62, 0xa4, 0xc1, 0xa4, 0x60, 0x33, 0x60, 0x33, 0xc0, 0x36, 0x6d, 0xee, 0x60, 0xa4, 0x6d, 0xee, 0x63, 0xa4, 0x0b, 0x10, 0x1f, 0x73, 0x0e, 0x61, 0x66, 0xa4, 0xc5, 0xa4, 0x60, 0x33, 0x60, 0x33, 0xc0, 0x36, 0x6d, 0xee, 0x64, 0xa4, 0x6d, 0xee, 0x67, 0xa4, 0x00, 0xf6, 0x60, 0x33, 0x6d, 0xee, 0x04, 0x6b, 0x16, 0x10, 0xc9, 0xa4, 0x68, 0xa4, 0xc0, 0x36, 0x6d, 0xee, 0x02, 0x6b, 0x10, 0x10, 0x0d, 0x73, 0x04, 0x61, 0x01, 0x6b, 0x3f, 0xb2, 0x60, 0xc2, 0x68, 0x10, 0x0c, 0x6c, 0x8e, 0xeb, 0x65, 0x2b, 0x3c, 0xb4, 0xa0, 0xa4, 0x02, 0x25, 0x60, 0xc4, 0x60, 0x10, 0x00, 0x6b, 0xc3, 0x67, 0x81, 0xa2, 0x70, 0x33, 0x63, 0xc2, 0x10, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x61, 0xc2, 0xa0, 0x9a, 0x00, 0x18, 0xa5, 0x2e, 0x02, 0x6c, 0x54, 0x10, 0x23, 0x73, 0x52, 0x60, 0x11, 0x73, 0x30, 0x61, 0xa1, 0x9a, 0x82, 0x32, 0x42, 0x32, 0xcc, 0xea, 0x1c, 0x22, 0xa2, 0x32, 0xcc, 0xea, 0x34, 0x5a, 0x07, 0x61, 0x1f, 0xf7, 0x01, 0x6a, 0x4b, 0xea, 0x4c, 0xed, 0x06, 0xf2, 0x00, 0x6a, 0x4d, 0xed, 0xa2, 0x32, 0xff, 0x6b, 0x6c, 0xea, 0x14, 0x5a, 0x07, 0x60, 0x1f, 0xf7, 0x01, 0x6a, 0x4b, 0xea, 0x4c, 0xed, 0x02, 0xf4, 0x00, 0x6a, 0x4d, 0xed, 0x00, 0xf6, 0x82, 0x33, 0x23, 0xb2, 0x60, 0xc2, 0x02, 0x10, 0x21, 0xb3, 0x40, 0xc3, 0x20, 0xb2, 0x40, 0xa2, 0xff, 0x6b, 0xff, 0x4a, 0x6c, 0xea, 0x0e, 0x5a, 0x26, 0x60, 0x01, 0x6b, 0x1d, 0xb2, 0x00,
-0x18, 0x4d, 0xf4, 0x60, 0xc2, 0x20, 0x10, 0x1b, 0x73, 0x1c, 0x61, 0x82, 0x34, 0x82, 0x34, 0xcc, 0xec, 0x03, 0x2c, 0x00, 0xf2, 0x00, 0x68, 0x02, 0x10, 0x20, 0xf2, 0x00, 0x68, 0xa0, 0xf1, 0x06, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0xb0, 0x67, 0x01, 0x6a, 0x04, 0xd2, 0x04, 0x6c, 0x12, 0xb2, 0xfa, 0x6d, 0xa2, 0xf2, 0x16, 0x6e, 0xa1, 0xf1, 0x14, 0x6f, 0x05, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd0, 0x02, 0x10, 0x00, 0x6a, 0x01, 0x10, 0x01, 0x6a, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x0a, 0xb4, 0x66, 0x17, 0x24, 0x51, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x6c, 0x07, 0x11, 0x80, 0x78, 0x51, 0x11, 0x80, 0x54, 0x4d, 0x11, 0x80, 0xf8, 0x95, 0x11, 0x80, 0x66, 0x07, 0x11, 0x80, 0x0a, 0x96, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x78, 0x4d, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0xff, 0x6d, 0x00, 0x18, 0x93, 0x8c, 0xcc, 0xed, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xe0, 0xf3, 0x0a, 0x72, 0x04, 0x61, 0x00, 0x18, 0xcb, 0xed, 0x00, 0x65, 0x03, 0x10, 0x00, 0x18, 0x58, 0xf5, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x15, 0x3a, 0x00, 0x65, 0x0c, 0xb2, 0x20, 0xf0, 0x55, 0xa2, 0x05, 0x2a, 0x80, 0xf1, 0x10, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x6d, 0x08, 0xb2, 0x40, 0x9a, 0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, 0x06, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x06, 0xb3, 0x63, 0xda, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x3c, 0x95, 0x11, 0x80, 0x90, 0x04, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0xa1, 0xdc, 0x10, 0x80, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, 0x44, 0xac, 0x04, 0x67, 0x01, 0x72, 0x1f, 0x61, 0x20, 0x9c, 0x02, 0x6a, 0x04, 0xd2, 0x21, 0xb2, 0x05, 0xd2, 0x06, 0xd1, 0x41, 0x9c, 0xfa, 0x6d, 0x04, 0x6c, 0x21, 0xf2, 0x05, 0x6e, 0x41, 0xf5, 0x0b, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x3f, 0x6a, 0x2c, 0xea, 0x30, 0x72, 0x27, 0x61, 0x41, 0xa8, 0xff, 0x6b, 0x6c, 0xea, 0x23, 0x2a, 0x17, 0xb3, 0x40, 0xdb, 0x17, 0xb3, 0x40, 0xdb, 0x17, 0xb3, 0x40, 0xdb, 0x1c, 0x10, 0x17, 0xb2, 0x20, 0xa2, 0x19, 0x29, 0x02, 0x6a, 0x04, 0xd2, 0x10, 0xb2, 0x05
-, 0xd2, 0x40, 0x9c, 0xfa, 0x6d, 0x61, 0xf2, 0x07, 0x6e, 0x06, 0xd2, 0x41, 0x9c, 0x41, 0xf5, 0x0c, 0x6f, 0x05, 0x6c, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x0e, 0xb2, 0x40, 0xa2, 0x06, 0x22, 0x40, 0xa0, 0x30, 0x72, 0x03, 0x60, 0x0c, 0xb2, 0x20, 0xda, 0x03, 0x10, 0x00, 0x18, 0x15, 0x31, 0x90, 0x67, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0x54, 0x8b, 0x10, 0x80, 0x5c, 0x8b, 0x10, 0x80, 0x68, 0x8b, 0x10, 0x80, 0x67, 0x07, 0x11, 0x80, 0xcc, 0x95, 0x11, 0x80, 0x68, 0x07, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0xfc, 0xba, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xf7, 0x63, 0x11, 0x62, 0x10, 0xd0, 0x00, 0x18, 0x79, 0xbb, 0x04, 0x67, 0x44, 0xa8, 0x20, 0xf3, 0x01, 0x72, 0x4b, 0x61, 0x28, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0x03, 0x72, 0x46, 0x61, 0x27, 0xb2, 0x40, 0xaa, 0x01, 0x72, 0x13, 0x61, 0x26, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x0f, 0x61, 0x25, 0xb2, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0xff, 0x6b, 0x01, 0x4b, 0x4c, 0xeb, 0x06, 0x23, 0xff, 0xf6, 0x1f, 0x6d, 0xac, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x1e, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x2b, 0x61, 0x1d, 0xb2, 0x40, 0xa2, 0x28, 0x2a, 0x09, 0x6a, 0x04, 0xd2, 0x1c, 0xb2, 0x05, 0xd2, 0x1c, 0xb2, 0x80, 0xf2, 0x7e, 0xa2, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd3, 0x80, 0xf2, 0x7f, 0xa2, 0xa1, 0xf1, 0x19, 0x6e, 0xc1, 0xf3, 0x19, 0x6f, 0x07, 0xd3, 0xa0, 0xf2, 0x60, 0xa2, 0x08, 0xd3, 0xa0, 0xf2, 0x61, 0xa2, 0x09, 0xd3, 0xa0, 0xf2, 0x62, 0xa2, 0x0a, 0xd3, 0xa0, 0xf2, 0x63, 0xa2, 0x0b, 0xd3, 0xa0, 0xf2, 0x68, 0xa2, 0x0c, 0xd3, 0xa0, 0xf2, 0x66, 0xaa, 0x0d, 0xd3, 0xa0, 0xf2, 0x44, 0xaa, 0x20, 0x18, 0xa3, 0x30, 0x0e, 0xd2, 0x11, 0x97, 0x10, 0x90, 0x00, 0xef, 0x09, 0x63, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0x40, 0x1a, 0x11, 0x80, 0x3b, 0x1a, 0x11, 0x80, 0xac, 0x00, 0x00, 0xb6, 0xe8, 0x39, 0x11, 0x80, 0xcc, 0x3b, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x20, 0x56, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xe0, 0xf1, 0x14, 0x6b, 0x6e, 0xea, 0x04, 0x2a, 0x60, 0xac, 0x05, 0xb5, 0x6d, 0xe5, 0x40, 0xc3,
-0x00, 0x18, 0xde, 0x5c, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xd0, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x03, 0x8e, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x5f, 0x5d, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xf1, 0x63, 0x1d, 0x62, 0x1c, 0xd1, 0x1b, 0xd0, 0x44, 0xac, 0x60, 0xf2, 0x04, 0x68, 0x4e, 0xe8, 0x1e, 0x28, 0x5e, 0xb2, 0x60, 0xf1, 0x52, 0xa2, 0xa0, 0xf0, 0x0e, 0x22, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x00, 0x18, 0xe8, 0x58, 0x22, 0x67, 0x59, 0xb2, 0x00, 0xc2, 0x59, 0xb2, 0x00, 0xc2, 0x59, 0xb2, 0x00, 0xca, 0x80, 0x18, 0x18, 0x29, 0x03, 0x6c, 0x00, 0x18, 0x81, 0x56, 0x00, 0x6c, 0x20, 0x18, 0xf1, 0x25, 0x00, 0x65, 0x00, 0x1c, 0x7a, 0x1b, 0x91, 0x67, 0x98, 0x10, 0x80, 0xf4, 0x00, 0x72, 0x80, 0xf0, 0x11, 0x61, 0x00, 0x9c, 0x64, 0xa0, 0xab, 0xa8, 0x66, 0x32, 0x13, 0x72, 0x18, 0xd5, 0x05, 0x60, 0x18, 0x72, 0x03, 0x60, 0x17, 0x72, 0x80, 0xf0, 0x05, 0x61, 0xa4, 0xa4, 0x21, 0x9c, 0x66, 0x33, 0xba, 0xc0, 0x16, 0x04, 0x00, 0x18, 0x44, 0x97, 0x19, 0xd3, 0x19, 0x93, 0x7f, 0x73, 0x04, 0x60, 0x00, 0x6c, 0xe1, 0xf4, 0x16, 0x6f, 0x03, 0x10, 0x85, 0xa0, 0x01, 0xf4, 0x16, 0x6f, 0x10, 0x6d, 0x44, 0xa0, 0x04, 0xd5, 0x40, 0xb5, 0x05, 0xd5, 0x16, 0x95, 0x07, 0xd3, 0x08, 0xd4, 0x06, 0xd5, 0x99, 0xa0, 0xa2, 0x67, 0x0a, 0xd1, 0x09, 0xd4, 0x01, 0x6c, 0x8c, 0xed, 0x0b, 0xd5, 0xab, 0xa8, 0x60, 0xf7, 0x09, 0x6e, 0x0c, 0xd5, 0x39, 0xb5, 0x25, 0xe5, 0xa4, 0xa1, 0x0e, 0xd2, 0xac, 0xec, 0x0d, 0xd4, 0x45, 0xa0, 0x04, 0x6c, 0xfa, 0x6d, 0x0f, 0xd2, 0x46, 0xa0, 0x10, 0xd2, 0x47, 0xa0, 0x11, 0xd2, 0x48, 0xa0, 0x12, 0xd2, 0x49, 0xa0, 0x13, 0xd2, 0x4a, 0xa0, 0x14, 0xd2, 0x4b, 0xa0, 0x19, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x15, 0xd2, 0x18, 0x92, 0x19, 0x93, 0xff, 0x72, 0x3c, 0x60, 0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xea, 0x2a, 0xb2, 0x12, 0xe9, 0x25, 0xe2, 0xe0, 0xf0, 0x46, 0xa1, 0x01, 0x72, 0x32, 0x61, 0xc0, 0xf0, 0x48, 0xa1, 0x0b, 0x72, 0x11, 0x61, 0x25, 0xb2, 0x80, 0x9a, 0x00, 0x18, 0xe8, 0x1c, 0xb0, 0x67, 0x00, 0xf2, 0x0f, 0xa1, 0x01, 0x6a, 0x4e, 0xe8
-, 0x2d, 0x28, 0x8b, 0x99, 0x00, 0x18, 0xb8, 0x1c, 0x00, 0x6d, 0x00, 0xf2, 0x0f, 0xc1, 0x26, 0x10, 0x18, 0x94, 0xb0, 0x67, 0x00, 0x18, 0x58, 0xe2, 0x19, 0xd3, 0x19, 0x93, 0x17, 0x73, 0x05, 0x61, 0x18, 0x95, 0x80, 0x18, 0xbf, 0x2e, 0x90, 0x67, 0x10, 0x10, 0x13, 0x73, 0x05, 0x61, 0x18, 0x95, 0x20, 0x18, 0x05, 0x04, 0x90, 0x67, 0x09, 0x10, 0x18, 0x73, 0x07, 0x61, 0x12, 0x6a, 0xc0, 0xf0, 0x48, 0xc1, 0x18, 0x95, 0x20, 0x18, 0x58, 0x01, 0x90, 0x67, 0x0e, 0xb2, 0x80, 0x9a, 0x00, 0x18, 0xe8, 0x1c, 0xb0, 0x67, 0x03, 0x10, 0x20, 0x18, 0x43, 0x24, 0x00, 0x65, 0x1d, 0x97, 0x1c, 0x91, 0x1b, 0x90, 0x00, 0xef, 0x0f, 0x63, 0x2c, 0x52, 0x11, 0x80, 0xf9, 0x95, 0x11, 0x80, 0xfa, 0x95, 0x11, 0x80, 0xfc, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xd4, 0x3b, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x9c, 0x48, 0x11, 0x80, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0x01, 0x6b, 0x6b, 0xeb, 0x25, 0xb2, 0x60, 0xda, 0x00, 0x68, 0x0e, 0x10, 0x0c, 0x6b, 0x78, 0xe8, 0x12, 0xeb, 0x49, 0xe3, 0x62, 0x9a, 0x07, 0x23, 0x20, 0x18, 0x9c, 0x32, 0x81, 0x9a, 0x03, 0x22, 0x1e, 0xb2, 0x00, 0xda, 0x06, 0x10, 0x01, 0x48, 0x1d, 0xb2, 0x80, 0xf0, 0x64, 0xa2, 0x02, 0xeb, 0xed, 0x60, 0x1c, 0xb3, 0x1c, 0xb2, 0x60, 0xda, 0x1c, 0xb3, 0x7c, 0x4b, 0x1c, 0xb2, 0x78, 0x9b, 0x6c, 0xea, 0x04, 0x22, 0x1b, 0xb2, 0x54, 0xf5, 0x0f, 0x6b, 0x60, 0xda, 0x1a, 0xb2, 0x40, 0xa2, 0xff, 0x72, 0x07, 0x61, 0x19, 0xb2, 0x40, 0xaa, 0x04, 0x2a, 0x00, 0x18, 0x74, 0x39, 0x00, 0x65, 0x01, 0x10, 0x00, 0x6a, 0x0d, 0xb3, 0x60, 0x9b, 0x81, 0x43, 0x07, 0x2c, 0x14, 0xb3, 0x60, 0x9b, 0xc7, 0x23, 0xc6, 0x2a, 0x40, 0xeb, 0x00, 0x65, 0xc3, 0x17, 0x0c, 0x68, 0x18, 0xeb, 0x08, 0xb2, 0x04, 0x01, 0xb1, 0x67, 0x12, 0xe8, 0x41, 0xe0, 0x20, 0x18, 0xa3, 0x32, 0x81, 0x98, 0xb8, 0x2a, 0x40, 0x98, 0x40, 0xea, 0x91, 0x67, 0xb4, 0x17, 0x2c, 0x8a, 0x11, 0x80, 0x30, 0x8a, 0x11, 0x80, 0x20, 0x4e, 0xa5, 0x01, 0x78, 0xa0, 0x00, 0xb0, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x40, 0x00, 0xb8, 0xa0, 0x00, 0xb0, 0x6e, 0x04, 0x11, 0x80, 0x0e, 0x19, 0x11, 0x80, 0x9c, 0x86, 0x11, 0x80, 0xf6, 0x63, 0x13, 0x62, 0x12,
-0xd1, 0x11, 0xd0, 0x09, 0x6a, 0x04, 0xd2, 0x31, 0xb2, 0x05, 0xd2, 0x31, 0xb2, 0x40, 0xaa, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x30, 0xb2, 0x40, 0xaa, 0xa0, 0xf5, 0x03, 0x6e, 0xa1, 0xf3, 0x16, 0x6f, 0x07, 0xd2, 0x2d, 0xb2, 0x40, 0x9a, 0x08, 0xd2, 0x2d, 0xb2, 0x40, 0xf0, 0x61, 0xa2, 0x09, 0xd3, 0x40, 0xf0, 0x60, 0xa2, 0x0a, 0xd3, 0x20, 0xf0, 0x7f, 0xa2, 0x0b, 0xd3, 0x20, 0xf0, 0x7e, 0xa2, 0x0c, 0xd3, 0x20, 0xf0, 0x7d, 0xa2, 0x0d, 0xd3, 0x20, 0xf0, 0x5c, 0xa2, 0x20, 0x18, 0xa3, 0x30, 0x0e, 0xd2, 0x04, 0xf7, 0x10, 0x6d, 0x00, 0x18, 0xcb, 0x31, 0x01, 0x6c, 0x21, 0xb2, 0x60, 0x9a, 0x21, 0xb2, 0x6e, 0xea, 0x11, 0x2a, 0x20, 0xb1, 0x60, 0x99, 0x20, 0xb2, 0x21, 0xb0, 0x6c, 0xea, 0x4e, 0xe8, 0x0a, 0x28, 0x00, 0xf6, 0x62, 0x33, 0x1f, 0xb2, 0x60, 0xc2, 0x3f, 0xf4, 0x00, 0x6c, 0x00, 0x18, 0x8d, 0x8f, 0x00, 0x6d, 0x00, 0xd9, 0x1c, 0xb2, 0x80, 0x9a, 0x1c, 0xb3, 0x8e, 0xeb, 0x01, 0x2b, 0x60, 0xda, 0x1b, 0xb2, 0x80, 0x9a, 0x1b, 0xb3, 0x8e, 0xeb, 0x01, 0x2b, 0x60, 0xda, 0x11, 0xb3, 0x0f, 0xb2, 0x60, 0xda, 0x18, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x62, 0xda, 0x63, 0xda, 0x00, 0x1c, 0x43, 0x1b, 0x64, 0xda, 0x80, 0x18, 0x5b, 0x39, 0x00, 0x65, 0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x00, 0xef, 0x0a, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0x44, 0x00, 0x11, 0x80, 0x46, 0x00, 0x11, 0x80, 0x68, 0x21, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x58, 0x8b, 0x10, 0x80, 0xef, 0xbe, 0x23, 0x87, 0x5c, 0x8b, 0x10, 0x80, 0xff, 0xff, 0xff, 0x00, 0xee, 0xff, 0xc0, 0x00, 0x80, 0x07, 0x11, 0x80, 0x60, 0x8b, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23, 0x68, 0x8b, 0x10, 0x80, 0x58, 0x3b, 0x7a, 0x93, 0xd0, 0x74, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x13, 0xb3, 0x14, 0xb2, 0x60, 0xda, 0x14, 0xb2, 0x14, 0xb3, 0x63, 0xda, 0x14, 0xb3, 0x72, 0xda, 0x14, 0xb3, 0x75, 0xda, 0x14, 0xb3, 0x69, 0xda, 0x14, 0xb3, 0x6c, 0xda, 0x14, 0xb3, 0x6f, 0xda, 0x14, 0xb3, 0x66, 0xda, 0x14, 0xb3, 0x7b, 0xda, 0x14, 0xb3, 0x60, 0xda, 0x14, 0xb3, 0x80, 0x18, 0x8c, 0x28, 0x78, 0xda, 0x13, 0xb3, 0x14, 0xb2, 0x60, 0xda, 0x00, 0x6b, 0x13, 0xb2, 0x80, 0x18, 0x8d, 0x39, 0x60, 0xc2, 0x05
-, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x69, 0xe1, 0x10, 0x80, 0xe8, 0x1d, 0x11, 0x80, 0x30, 0x8a, 0x11, 0x80, 0xad, 0xcc, 0x10, 0x80, 0xc5, 0xe3, 0x10, 0x80, 0xb5, 0xe3, 0x10, 0x80, 0xa5, 0xe3, 0x10, 0x80, 0x7d, 0xe3, 0x10, 0x80, 0xa9, 0xe2, 0x10, 0x80, 0x99, 0xe2, 0x10, 0x80, 0xe5, 0xe1, 0x10, 0x80, 0x9d, 0xe1, 0x10, 0x80, 0x7d, 0xe1, 0x10, 0x80, 0x35, 0xde, 0x10, 0x80, 0x64, 0x2f, 0x11, 0x80, 0xf8, 0x95, 0x11, 0x80, 0x04, 0x0b, 0x0f, 0x04, 0x0a, 0x0e, 0x08, 0x0b, 0x0f, 0x00, 0x00, 0x00, 0x1b, 0x00, 0xb7, 0x00, 0x53, 0x01, 0x36, 0x00, 0x6f, 0x01, 0xa7, 0x02, 0x53, 0x00, 0x28, 0x02, 0xfd, 0x03, 0x25, 0x00, 0x07, 0x04, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x74, 0x41, 0x01, 0x10, 0xac, 0x80, 0x01, 0xf0, 0x0a, 0x22, 0x62, 0x02, 0x4e, 0x22, 0x9a, 0x06, 0x50, 0x22, 0x9a, 0x06, 0x34, 0x21, 0xf5, 0xff, 0x36, 0x21, 0xff, 0xfe, 0x18, 0x20, 0x0f, 0x69, 0x34, 0x20, 0x55, 0x22, 0x38, 0x20, 0xa8, 0xc0, 0x25, 0x00, 0x00, 0x72, 0x26, 0x00, 0x00, 0x72, 0x3d, 0x00, 0x00, 0xfe, 0x2e, 0x00, 0x95, 0xa7, 0x32, 0x00, 0x95, 0xa7, 0x22, 0x00, 0x00, 0x84, 0x27, 0x00, 0xa0, 0x6a, 0x28, 0x00, 0xa0, 0x6a, 0x29, 0x00, 0x03, 0x22, 0x2a, 0x00, 0x01, 0x20, 0x2b, 0x00, 0xc9, 0xad, 0x2f, 0x00, 0xc9, 0xad, 0x33, 0x00, 0x00, 0xc0, 0x37, 0x00, 0x00, 0xc0, 0x3c, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x30, 0x00, 0x23, 0x20, 0x31, 0x00, 0x2a, 0x08, 0x32, 0x00, 0x64, 0x04, 0x33, 0x00, 0x42, 0x40, 0x34, 0x00, 0xcc, 0x27, 0x35, 0x00, 0xd0, 0x48, 0x36, 0x00, 0x00, 0x40, 0x37, 0x00, 0x10, 0x05, 0x38, 0x00, 0x0c, 0x00, 0x39, 0x00, 0x70, 0x02, 0x22, 0x00, 0x04, 0xc0, 0x2b, 0x00, 0x43, 0x00, 0x2c, 0x00, 0x43, 0x00, 0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x30, 0x00, 0x23, 0x20, 0x31, 0x00, 0x4a, 0x08, 0x32, 0x00, 0x64, 0x04, 0x33, 0x00, 0x84, 0xf8, 0x34, 0x00, 0x7e, 0x11, 0x35, 0x00, 0xd0, 0xf8, 0x37, 0x00, 0x90, 0x05, 0x38, 0x00, 0x08, 0x00, 0x36, 0x00, 0x00, 0x40, 0x39, 0x00, 0x70, 0x02, 0x22, 0x00, 0x04, 0xc0, 0x2b, 0x00, 0x43, 0x00,
-0x2c, 0x00, 0x43, 0x00, 0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x06, 0x10, 0x3f, 0x00, 0x01, 0x00, 0x00, 0x60, 0x01, 0x00, 0x1c, 0x00, 0x21, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x35, 0x00, 0xd0, 0x4e, 0x0e, 0x00, 0xe2, 0x51, 0x24, 0x00, 0x01, 0x00, 0x00, 0x60, 0x00, 0x01, 0x0e, 0x00, 0xe2, 0xd1, 0x35, 0x00, 0xd0, 0x48, 0x0e, 0x00, 0xe2, 0x51, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10, 0x11, 0x00, 0x30, 0x00, 0x12, 0x00, 0x00, 0x04, 0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x9b, 0x7d, 0x13, 0x00, 0x0e, 0x60, 0x13, 0x00, 0x9e, 0x5c, 0x13, 0x00, 0x0a, 0x30, 0x13, 0x00, 0xf8, 0x2f, 0x13, 0x00, 0xc5, 0x1f, 0x13, 0x00, 0x90, 0x00, 0x19, 0x00, 0x9b, 0x7d, 0x19, 0x00, 0x0e, 0x60, 0x19, 0x00, 0x9e, 0x5c, 0x19, 0x00, 0x0a, 0x30, 0x19, 0x00, 0xf8, 0x2f, 0x19, 0x00, 0xc5, 0x1f, 0x19, 0x00, 0x90, 0x00, 0xff, 0xff, 0xff, 0xff, 0x15, 0x00, 0x40, 0x00, 0x15, 0x00, 0xc0, 0x20, 0x15, 0x00, 0xc0, 0x41, 0x15, 0x00, 0xc0, 0x68, 0x15, 0x00, 0xc0, 0x89, 0x15, 0x00, 0xc0, 0xb0, 0x15, 0x00, 0xc0, 0xd1, 0x15, 0x00, 0xc0, 0xf3, 0x1a, 0x00, 0x40, 0x00, 0x1a, 0x00, 0xc0, 0x20, 0x1a, 0x00, 0xc0, 0x41, 0x1a, 0x00, 0xc0, 0x68, 0x1a, 0x00, 0xc0, 0x89, 0x1a, 0x00, 0xc0, 0xb0, 0x1a, 0x00, 0xc0, 0xd1, 0x1a, 0x00, 0xc0, 0xf3, 0xff, 0xff, 0xff, 0xff, 0x08, 0x08, 0x08, 0x08, 0x0b, 0x28, 0x2b, 0x2e, 0x6b, 0x6e, 0x8b, 0x8e, 0xce, 0xee, 0xee, 0xee, 0xf7, 0xf7, 0xf9, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0d, 0x17, 0x18, 0x19, 0x19, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00, 0x19, 0x19, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0xf4, 0x01, 0x00, 0x20, 0x01, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x20, 0x00, 0x48, 0x42, 0x20, 0x00, 0x01
-, 0x44, 0x20, 0x00, 0x48, 0x46, 0x20, 0x00, 0x81, 0x48, 0x20, 0x00, 0x00, 0x4a, 0x20, 0x00, 0xf8, 0x4c, 0x20, 0x00, 0x00, 0x4e, 0x20, 0xd8, 0x00, 0x50, 0x20, 0x90, 0xcc, 0x52, 0x20, 0x00, 0x18, 0x54, 0x20, 0x10, 0x8c, 0x56, 0x20, 0x00, 0xe0, 0x58, 0x20, 0x00, 0x50, 0x5a, 0x20, 0x00, 0x80, 0x5c, 0x20, 0x00, 0x20, 0x5e, 0x20, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x0e, 0x20, 0x01, 0x00, 0x02, 0x20, 0x60, 0xc0, 0x00, 0x60, 0x0a, 0x00, 0x02, 0x20, 0x20, 0xc0, 0x00, 0x60, 0x0a, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x01, 0x00, 0x02, 0x20, 0x20, 0x00, 0x0c, 0x20, 0x10, 0x00, 0x0e, 0x20, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x48, 0xc9, 0x6c, 0xe7, 0x2c, 0x00, 0x00, 0xf8, 0x33, 0x3d, 0x80
+0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x69, 0x4f, 0xb2, 0x20, 0xda, 0x4f, 0xb2, 0x40, 0x9a, 0x4f, 0xb3, 0x4f, 0xb0, 0x42, 0x34, 0x82, 0x34, 0x80, 0xcb, 0x4e, 0xb3, 0x40, 0xcb,
+0x4e, 0xb2, 0x20, 0xc2, 0x4e, 0xb2, 0x20, 0xc2, 0x01, 0x6b, 0x4e, 0xb2, 0x60, 0xc2, 0x4e, 0xb2, 0x20, 0xc2, 0x4e, 0xb2, 0x20, 0xc2, 0x4e, 0xb2, 0x20, 0xca, 0x4e, 0xb3, 0x4e, 0xb2, 0x60, 0xda,
+0x4e, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x50, 0xb2, 0x60, 0xda, 0x50, 0xb3, 0x50, 0xb2, 0x60, 0xda, 0x50, 0xb3, 0x51, 0xb2, 0x60, 0xda, 0x51, 0xb3,
+0x51, 0xb2, 0x60, 0xda, 0x51, 0xb3, 0x52, 0xb2, 0x60, 0xda, 0x52, 0xb3, 0x52, 0xb2, 0x60, 0xda, 0x52, 0xb3, 0x53, 0xb2, 0x60, 0xda, 0x53, 0xb3, 0x53, 0xb2, 0x60, 0xda, 0x53, 0xb3, 0x54, 0xb2,
+0x60, 0xda, 0x54, 0xb3, 0x54, 0xb2, 0x60, 0xda, 0x54, 0xb3, 0x55, 0xb2, 0x60, 0xda, 0x55, 0xb3, 0x55, 0xb2, 0x60, 0xda, 0x55, 0xb3, 0x56, 0xb2, 0x80, 0x18, 0xf8, 0x2d, 0x60, 0xda, 0x55, 0xb3,
+0x55, 0xb2, 0x60, 0xda, 0x55, 0xb3, 0x56, 0xb2, 0x60, 0xda, 0x56, 0xb3, 0x56, 0xb2, 0x60, 0xda, 0x56, 0xb3, 0x57, 0xb2, 0x60, 0xda, 0x57, 0xb3, 0x57, 0xb2, 0x60, 0xda, 0x57, 0xb3, 0x58, 0xb2,
+0x60, 0xda, 0x45, 0xf1, 0x09, 0x6a, 0x00, 0xf1, 0x50, 0xc8, 0x56, 0xb2, 0x00, 0xf4, 0x00, 0x6b, 0xa0, 0xf0, 0x76, 0xc8, 0x43, 0xd8, 0x54, 0xb2, 0x54, 0xb3, 0x25, 0xd8, 0x44, 0xd8, 0x02, 0x6a,
+0x80, 0xf1, 0x42, 0xc0, 0x00, 0xf2, 0x00, 0x6a, 0xa0, 0xf0, 0x52, 0xc8, 0x90, 0x6a, 0xa0, 0xf0, 0x54, 0xc8, 0xa0, 0xf0, 0x58, 0xc8, 0x4e, 0xb2, 0x60, 0xda, 0x4e, 0xb3, 0x4e, 0xb2, 0x60, 0xda,
+0x4e, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x4f, 0xb3, 0x4f, 0xb2, 0x60, 0xda, 0x00, 0x6a, 0xe0, 0xf1, 0x45, 0xc0, 0x26, 0xd8, 0x27, 0xd8, 0x28, 0xd8, 0x80, 0x18, 0x4d, 0x34, 0x29, 0xd8, 0x80, 0x18,
+0x8e, 0x36, 0x00, 0x65, 0xc0, 0xf1, 0x7f, 0xa0, 0x48, 0xb2, 0x60, 0xc2, 0xe0, 0xf1, 0x62, 0xa0, 0x47, 0xb2, 0x60, 0xc2, 0x47, 0xb2, 0x00, 0x6b, 0x60, 0xc2, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90,
+0x00, 0xef, 0x04, 0x63, 0x54, 0x8b, 0x10, 0x80, 0x50, 0xf0, 0x10, 0x80, 0x46, 0x00, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x44, 0x00, 0x11, 0x80, 0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80,
+0x08, 0x96, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0xe1, 0xc9, 0x10, 0x80, 0xe8, 0x07, 0x11, 0x80, 0xf9, 0xc3, 0x10, 0x80, 0x24, 0x19, 0x11, 0x80,
+0xa9, 0xc3, 0x10, 0x80, 0x80, 0x19, 0x11, 0x80, 0x01, 0xe4, 0x10, 0x80, 0x14, 0x07, 0x11, 0x80, 0x9d, 0xd3, 0x10, 0x80, 0x1c, 0x19, 0x11, 0x80, 0xed, 0xba, 0x10, 0x80, 0x20, 0x19, 0x11, 0x80,
+0x25, 0xd6, 0x10, 0x80, 0xb0, 0x07, 0x11, 0x80, 0x0d, 0xba, 0x10, 0x80, 0xf8, 0x06, 0x11, 0x80, 0xe5, 0xd6, 0x10, 0x80, 0x08, 0x07, 0x11, 0x80, 0xdd, 0xcb, 0x10, 0x80, 0xe0, 0x06, 0x11, 0x80,
+0x51, 0xcb, 0x10, 0x80, 0xd0, 0x07, 0x11, 0x80, 0x91, 0xba, 0x10, 0x80, 0xc8, 0x07, 0x11, 0x80, 0xad, 0xba, 0x10, 0x80, 0xa0, 0x07, 0x11, 0x80, 0x89, 0xce, 0x10, 0x80, 0xe8, 0x06, 0x11, 0x80,
+0x91, 0xcf, 0x10, 0x80, 0x48, 0x19, 0x11, 0x80, 0xad, 0xec, 0x10, 0x80, 0x90, 0x07, 0x11, 0x80, 0x6d, 0xbb, 0x10, 0x80, 0x34, 0x08, 0x11, 0x80, 0x09, 0xdf, 0x10, 0x80, 0xf8, 0x1a, 0x11, 0x80,
+0x79, 0xcc, 0x10, 0x80, 0x40, 0x19, 0x11, 0x80, 0xc5, 0xbb, 0x10, 0x80, 0xc4, 0x07, 0x11, 0x80, 0xa5, 0xca, 0x10, 0x80, 0x74, 0x19, 0x11, 0x80, 0x59, 0xe4, 0x10, 0x80, 0x74, 0x07, 0x11, 0x80,
+0x14, 0xc0, 0x52, 0x02, 0x58, 0xd5, 0xc8, 0x19, 0x2d, 0xb0, 0x10, 0x80, 0x7c, 0x07, 0x11, 0x80, 0x45, 0xd8, 0x10, 0x80, 0xb4, 0x07, 0x11, 0x80, 0x61, 0xd7, 0x10, 0x80, 0x58, 0x08, 0x11, 0x80,
+0xed, 0xbb, 0x10, 0x80, 0x1c, 0x1a, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x1c, 0x96, 0x11, 0x80, 0x09, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x0d, 0xb0, 0x90, 0x67, 0x00, 0x6d,
+0x00, 0x18, 0x40, 0x33, 0x40, 0x6e, 0x01, 0x6a, 0x4b, 0xea, 0x47, 0xd8, 0x70, 0x6a, 0x43, 0xc0, 0x0a, 0x6a, 0x4c, 0xc0, 0x08, 0x6a, 0x4d, 0xc0, 0x06, 0xb3, 0x00, 0x6a, 0x40, 0xc3, 0x06, 0xb3,
+0x40, 0xc3, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xd0, 0x95, 0x11, 0x80, 0xd1, 0x95, 0x11, 0x80, 0xd6, 0x63, 0x53, 0x62, 0x52, 0xd1, 0x51, 0xd0,
+0x00, 0xf4, 0x05, 0x6a, 0x7d, 0x67, 0x52, 0xcb, 0x0d, 0x6a, 0x20, 0xf0, 0x46, 0xc3, 0x20, 0xf0, 0x07, 0x04, 0x71, 0xb5, 0x00, 0x18, 0x0d, 0x33, 0x06, 0x6e, 0x9d, 0x67, 0x01, 0x6a, 0x00, 0x6b,
+0x20, 0xf0, 0x4f, 0xc4, 0x20, 0xf0, 0x53, 0xc4, 0x6c, 0xb2, 0x20, 0xf0, 0x6d, 0xc4, 0x20, 0xf0, 0x6e, 0xc4, 0x20, 0xf0, 0x70, 0xc4, 0x20, 0xf0, 0x71, 0xc4, 0x20, 0xf0, 0x72, 0xc4, 0xc0, 0xf1,
+0x6a, 0xc2, 0xc0, 0xf1, 0x7e, 0xc2, 0x03, 0x6b, 0x02, 0x6c, 0xc0, 0xf1, 0x7c, 0xc2, 0x64, 0xb3, 0xc0, 0xf1, 0x89, 0xc2, 0xc0, 0xf1, 0x88, 0xc2, 0xc0, 0xf1, 0x9d, 0xc2, 0x80, 0xc3, 0x61, 0xb3,
+0x00, 0x6c, 0x80, 0xdb, 0x81, 0xdb, 0x60, 0xf1, 0x70, 0xa2, 0x44, 0x67, 0x02, 0x73, 0x07, 0x60, 0x03, 0x73, 0xa0, 0xf0, 0x07, 0x60, 0x01, 0x73, 0xa0, 0xf0, 0x04, 0x60, 0x0f, 0x10, 0xc0, 0xf2,
+0x0c, 0x6b, 0x78, 0xea, 0x58, 0xb4, 0x12, 0xeb, 0x6d, 0xe4, 0xc0, 0xf0, 0x68, 0xa3, 0x80, 0xf0, 0x19, 0x2b, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xf1, 0x61, 0x00, 0x18, 0xc8, 0x5e,
+0x09, 0x04, 0x4a, 0xd2, 0x80, 0xf0, 0x10, 0x2a, 0x7d, 0x67, 0x20, 0xf0, 0x6d, 0xa3, 0x5d, 0x67, 0x9d, 0x67, 0x20, 0xf0, 0x4e, 0xa2, 0x20, 0xf0, 0x8f, 0xa4, 0x4e, 0xd3, 0x7d, 0x67, 0x4f, 0xd2,
+0x4d, 0xd4, 0x5d, 0x67, 0x20, 0xf0, 0x93, 0xa3, 0x20, 0xf0, 0x50, 0xa2, 0x20, 0xf0, 0x02, 0x05, 0x4b, 0xd4, 0x4c, 0xd2, 0x20, 0xf0, 0x12, 0xa3, 0x20, 0xf0, 0x31, 0xa3, 0x00, 0x18, 0x28, 0xe2,
+0x08, 0x04, 0x02, 0x22, 0x4a, 0xd2, 0x70, 0x10, 0x5d, 0x67, 0x00, 0x30, 0x2d, 0xe8, 0x31, 0xaa, 0xc0, 0xf2, 0x0c, 0x6a, 0x38, 0xb5, 0x58, 0xe9, 0x3b, 0xb2, 0x12, 0xe9, 0x45, 0xe1, 0xe0, 0xf0,
+0x88, 0x41, 0x00, 0x18, 0x0d, 0x33, 0x06, 0x6e, 0x4f, 0x93, 0x4e, 0x94, 0x60, 0x32, 0x8d, 0xea, 0x60, 0xf2, 0x58, 0xc9, 0x5d, 0x67, 0x30, 0xf1, 0x64, 0x42, 0x40, 0xa3, 0x7d, 0x67, 0x30, 0xf1,
+0x80, 0x43, 0xe0, 0xf0, 0x55, 0xc1, 0x60, 0xa4, 0x9d, 0x67, 0x20, 0xf1, 0x4c, 0x44, 0xe0, 0xf0, 0x77, 0xc1, 0x80, 0xa2, 0x7d, 0x67, 0xe0, 0xf0, 0x98, 0xc1, 0x20, 0xf0, 0x40, 0xa3, 0xe0, 0xf0,
+0x4e, 0xc1, 0x01, 0x6a, 0x60, 0xf2, 0x5a, 0xc1, 0x00, 0x18, 0xe5, 0x9c, 0x91, 0xab, 0x9d, 0x67, 0x20, 0xf1, 0x48, 0x44, 0x80, 0xa2, 0x02, 0x32, 0x5e, 0x32, 0x00, 0xf1, 0x8c, 0xc1, 0x13, 0x22,
+0xef, 0xf7, 0x1f, 0x6a, 0x0c, 0xea, 0x01, 0x6b, 0x80, 0xf0, 0x44, 0xc9, 0x06, 0x6c, 0x04, 0xd3, 0xfc, 0x6d, 0x1e, 0xb3, 0x80, 0xf5, 0x12, 0x6e, 0x20, 0xf5, 0x17, 0x6f, 0x05, 0xd3, 0x20, 0x18,
+0xa3, 0x30, 0x06, 0xd2, 0x06, 0x10, 0x5d, 0x67, 0x20, 0xf1, 0x68, 0x42, 0x40, 0xab, 0x80, 0xf0, 0x44, 0xc9, 0x00, 0x18, 0x92, 0xa0, 0x09, 0x04, 0x02, 0x67, 0x0e, 0x22, 0x7d, 0x67, 0x20, 0xf0,
+0x80, 0xa3, 0xe0, 0xf0, 0xa3, 0xa1, 0x00, 0x18, 0x02, 0xe2, 0x00, 0x65, 0x0a, 0xb4, 0x00, 0x18, 0xfe, 0xe1, 0x00, 0x65, 0x4a, 0xd0, 0x08, 0x10, 0x5d, 0x67, 0x91, 0xaa, 0x20, 0x18, 0xfa, 0x25,
+0x01, 0x6d, 0x02, 0x10, 0x0c, 0x6b, 0x4a, 0xd3, 0x4a, 0x92, 0x53, 0x97, 0x52, 0x91, 0x51, 0x90, 0x00, 0xef, 0x2a, 0x63, 0xa4, 0x95, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80,
+0x5c, 0x53, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x10, 0xb3, 0x00, 0x6d, 0xc0, 0xf1, 0xaa, 0xc3, 0xc0, 0xf1, 0xbe, 0xc3, 0xff, 0x6a, 0x03, 0x6d,
+0x8c, 0xea, 0xc0, 0xf1, 0xbc, 0xc3, 0x02, 0x6c, 0x0b, 0xb5, 0xc0, 0xf1, 0x89, 0xc3, 0xc0, 0xf1, 0x88, 0xc3, 0xc0, 0xf1, 0x9d, 0xc3, 0x60, 0xf1, 0x40, 0xc3, 0x80, 0xc5, 0x00, 0x18, 0x2e, 0xaa,
+0x82, 0x67, 0x06, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, 0x5c, 0x53, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62,
+0x00, 0xf4, 0x06, 0x6a, 0x7d, 0x67, 0x4a, 0xcb, 0x03, 0x6a, 0x56, 0xc3, 0x13, 0x6a, 0x59, 0xc3, 0x1d, 0xb2, 0x6d, 0xa2, 0x08, 0x73, 0x1a, 0x60, 0xff, 0x6c, 0x09, 0x4c, 0x98, 0xeb, 0x1b, 0xb2,
+0x01, 0x6d, 0x12, 0xec, 0x91, 0xe2, 0x20, 0xf1, 0xcf, 0xa4, 0xac, 0xee, 0x0f, 0x26, 0x00, 0xf1, 0x52, 0xaa, 0x47, 0xeb, 0xac, 0xea, 0x0a, 0x22, 0x20, 0xf1, 0x4c, 0xac, 0x7d, 0x67, 0x05, 0x04,
+0x57, 0xc3, 0x42, 0x32, 0x58, 0xc3, 0x00, 0x18, 0x88, 0x4f, 0x04, 0x05, 0x0e, 0xb2, 0x4c, 0xa2, 0x0a, 0x72, 0x14, 0x60, 0xc0, 0xf2, 0x0c, 0x6b, 0x78, 0xea, 0x0d, 0xb3, 0x12, 0xea, 0x49, 0xe3,
+0xe0, 0xf0, 0x66, 0xa2, 0x01, 0x73, 0x0a, 0x61, 0x60, 0xf2, 0x56, 0xaa, 0x7d, 0x67, 0x05, 0x04, 0x57, 0xc3, 0x42, 0x32, 0x58, 0xc3, 0x00, 0x18, 0x88, 0x4f, 0x04, 0x05, 0x47, 0x97, 0x00, 0xef,
+0x24, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x46, 0xd0, 0x00, 0x6a, 0x18, 0xb3, 0x9d, 0x67, 0x40, 0xdb, 0x41, 0xdb,
+0x04, 0xf0, 0x06, 0x6b, 0x68, 0xcc, 0x54, 0xc4, 0x56, 0xc4, 0x57, 0xc4, 0x58, 0xc4, 0x59, 0xc4, 0x5a, 0xc4, 0x5b, 0xc4, 0x5c, 0xc4, 0x5d, 0xc4, 0x5e, 0xc4, 0x5f, 0xc4, 0x0f, 0x6b, 0x07, 0x6a,
+0x04, 0x00, 0x72, 0xc4, 0x20, 0xf0, 0x40, 0xc4, 0x20, 0x6b, 0x03, 0x6a, 0x73, 0xc4, 0x75, 0xc4, 0x20, 0xf0, 0x41, 0xc4, 0x00, 0x18, 0x13, 0xca, 0x90, 0x67, 0x7d, 0x67, 0x04, 0xf0, 0x0a, 0x6a,
+0x48, 0xcb, 0x01, 0x6a, 0x90, 0x67, 0x52, 0xc3, 0x00, 0x18, 0x8b, 0xca, 0x53, 0xc3, 0x47, 0x97, 0x46, 0x90, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65, 0x5c, 0x53, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62,
+0x00, 0x6a, 0x21, 0xb3, 0x9d, 0x67, 0x40, 0xdb, 0x41, 0xdb, 0x04, 0xf0, 0x0d, 0x6b, 0x68, 0xcc, 0x19, 0x6b, 0x72, 0xc4, 0x60, 0x6b, 0x6b, 0xeb, 0x73, 0xc4, 0x75, 0xc4, 0x1b, 0xb3, 0x54, 0xc4,
+0x56, 0xc4, 0x57, 0xc4, 0x58, 0xc4, 0x94, 0xa3, 0xbd, 0x67, 0x5f, 0xc5, 0x99, 0xc5, 0x95, 0xa3, 0x20, 0xf0, 0x40, 0xc5, 0x20, 0xf0, 0x42, 0xc5, 0x9a, 0xc5, 0x96, 0xa3, 0x20, 0xf0, 0x44, 0xc5,
+0x20, 0xf0, 0x45, 0xc5, 0x9b, 0xc5, 0x97, 0xa3, 0x20, 0xf0, 0x47, 0xc5, 0x20, 0xf0, 0x49, 0xc5, 0x9c, 0xc5, 0x98, 0xa3, 0x79, 0xa3, 0x9d, 0xc5, 0x7e, 0xc5, 0x02, 0x6b, 0x20, 0xf0, 0x61, 0xc5,
+0x20, 0xf0, 0x63, 0xc5, 0x1e, 0x6b, 0x20, 0xf0, 0x66, 0xc5, 0x12, 0x6b, 0x20, 0xf0, 0x68, 0xc5, 0x20, 0xf0, 0x6a, 0xc5, 0x20, 0xf0, 0x4b, 0xc5, 0x00, 0x18, 0x41, 0xc8, 0x04, 0x04, 0x47, 0x97,
+0x00, 0xef, 0x24, 0x63, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x0c, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x7d, 0x67, 0x04, 0xf0, 0x1d, 0x6a, 0x48, 0xcb,
+0x01, 0x6a, 0x52, 0xc3, 0x08, 0xb2, 0x41, 0xaa, 0x7f, 0x6b, 0x04, 0x04, 0x4a, 0x32, 0x6c, 0xea, 0x7d, 0x67, 0x00, 0x18, 0xa2, 0xc5, 0x53, 0xc3, 0x47, 0x97, 0x00, 0xef, 0x24, 0x63, 0x00, 0x65,
+0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdb, 0x63, 0x49, 0x62, 0x48, 0xd1, 0x47, 0xd0, 0x00, 0x69, 0x0e, 0xb2, 0x7d, 0x67, 0x20, 0xda, 0x21, 0xda, 0x04, 0xf0, 0x1f, 0x6a, 0x48, 0xcb,
+0x0b, 0xb2, 0x81, 0xf1, 0x48, 0xaa, 0x0b, 0xb0, 0x32, 0xc3, 0x04, 0x04, 0x00, 0x18, 0x1c, 0xc5, 0x4d, 0xd8, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x29, 0xc0, 0x44, 0xc0, 0x49, 0x97,
+0x48, 0x91, 0x47, 0x90, 0x00, 0xef, 0x25, 0x63, 0x5c, 0x53, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x46, 0xd0, 0x00, 0x68, 0x0b, 0xb2, 0x7d, 0x67,
+0x00, 0xda, 0x01, 0xda, 0x04, 0xf0, 0x1f, 0x6a, 0x12, 0xc3, 0x04, 0x04, 0x00, 0x18, 0x1c, 0xc5, 0x48, 0xcb, 0x07, 0xb2, 0x84, 0xa2, 0x41, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x64, 0xc2, 0x09, 0xc2,
+0x47, 0x97, 0x46, 0x90, 0x00, 0xef, 0x24, 0x63, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xdc, 0x63, 0x47, 0x62, 0x1c, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x1b, 0xb2, 0x64, 0xa2,
+0x07, 0x6d, 0x6e, 0x34, 0xac, 0xec, 0x05, 0x54, 0x06, 0x61, 0x39, 0x6c, 0x8b, 0xec, 0x6c, 0xec, 0x20, 0x6b, 0x6d, 0xec, 0x84, 0xc2, 0x15, 0xb2, 0x64, 0xa2, 0x07, 0x6c, 0x14, 0xb5, 0x6e, 0x33,
+0x8c, 0xeb, 0x6d, 0xe5, 0x60, 0xa3, 0xc3, 0xa2, 0x6c, 0xec, 0x0f, 0x6b, 0x6b, 0xeb, 0x84, 0x35, 0xcc, 0xeb, 0xad, 0xeb, 0x63, 0xc2, 0xbd, 0x67, 0x04, 0xf0, 0x1e, 0x6b, 0x68, 0xcd, 0x03, 0x6b,
+0x72, 0xc5, 0x61, 0xaa, 0x7f, 0x6d, 0x6a, 0x33, 0xac, 0xeb, 0xbd, 0x67, 0x73, 0xc5, 0x40, 0x9a, 0x95, 0xc5, 0x04, 0x04, 0x42, 0x32, 0x00, 0x18, 0x58, 0xc5, 0x54, 0xc5, 0x47, 0x97, 0x00, 0xef,
+0x24, 0x63, 0x00, 0x65, 0x5c, 0x53, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0x5c, 0xed, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b,
+0x02, 0xf1, 0x01, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x06, 0xb2, 0x84, 0xa2,
+0x41, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x64, 0xc2, 0x00, 0x6b, 0x69, 0xc2, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xf7, 0x63, 0x11, 0x62, 0x10, 0xd1, 0x0f, 0xd0,
+0x7c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x79, 0x6c, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x00, 0x18, 0xab, 0xa5, 0x22, 0x67, 0x3f, 0xb3, 0x0c, 0xe9, 0x4c, 0xe8, 0x58, 0xab, 0x8d, 0x9b,
+0xe3, 0xf7, 0x1f, 0x6d, 0x4b, 0xe0, 0x89, 0xe2, 0x80, 0x9b, 0x4d, 0xdb, 0x18, 0xcb, 0x96, 0x34, 0xac, 0xec, 0x98, 0xea, 0xaf, 0x9b, 0x12, 0xec, 0x8e, 0xdb, 0x99, 0xab, 0x39, 0xcb, 0x93, 0xe1,
+0xb1, 0xe4, 0x8f, 0xdb, 0x34, 0xb3, 0xa0, 0xa3, 0x0a, 0x5d, 0x18, 0x61, 0x06, 0x6d, 0x04, 0xd5, 0x32, 0xb5, 0x05, 0xd5, 0x02, 0xf1, 0x11, 0x6d, 0x06, 0xd5, 0x07, 0xd5, 0x0b, 0xd4, 0xfc, 0x6d,
+0x02, 0x6c, 0xc0, 0xf2, 0x08, 0x6e, 0xa4, 0xf3, 0x11, 0x6f, 0x0c, 0xd3, 0x08, 0xd0, 0x09, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x0a, 0xd1, 0x0c, 0x93, 0x00, 0x6a, 0x40, 0xc3, 0x26, 0xb2, 0x60, 0xa2,
+0x01, 0x4b, 0x60, 0xc2, 0x7d, 0xf2, 0x01, 0x6a, 0x43, 0xe8, 0x02, 0x60, 0x43, 0xe9, 0x3a, 0x61, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x01, 0xf6,
+0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0xf6, 0x00, 0x6b, 0xc2, 0x67,
+0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x03, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18,
+0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x05, 0xb2, 0x00, 0x6b,
+0x78, 0xca, 0x79, 0xca, 0x11, 0x97, 0x10, 0x91, 0x0f, 0x90, 0x00, 0xef, 0x09, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xd1, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfb, 0x63, 0x09, 0x62,
+0x08, 0xd1, 0x07, 0xd0, 0x11, 0xb2, 0x47, 0x9a, 0xff, 0x68, 0x8c, 0xe8, 0x01, 0x4a, 0x04, 0x22, 0x0f, 0xb4, 0x00, 0x18, 0xcb, 0x1c, 0x00, 0x65, 0x11, 0x20, 0x00, 0x69, 0x0b, 0xb0, 0x01, 0x6c,
+0x0b, 0xb5, 0x0c, 0xb6, 0xf1, 0x67, 0x00, 0x18, 0xd9, 0x1c, 0x04, 0xd1, 0x87, 0x98, 0x00, 0x18, 0xbe, 0x1c, 0x64, 0x6d, 0x00, 0x6a, 0x30, 0xc8, 0x20, 0xf0, 0x49, 0xc0, 0x09, 0x97, 0x08, 0x91,
+0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xac, 0x95, 0x11, 0x80, 0xed, 0xa9, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5,
+0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0xff, 0x6b, 0x0c, 0xea, 0x02, 0x4b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5,
+0x01, 0x6d, 0x0c, 0xea, 0x00, 0xf2, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0x0c, 0xb0, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6,
+0xc4, 0x67, 0xd1, 0xa8, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x42, 0x6c, 0x80, 0x18, 0x47, 0x2a, 0x00, 0x6c, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x44, 0xc0, 0x00, 0x6a, 0x49, 0xc0,
+0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x20, 0xb2, 0x47, 0x9a, 0x08, 0xd4, 0x8e, 0xea, 0x05, 0x22, 0x01, 0x4c,
+0x03, 0x24, 0x00, 0x18, 0xcb, 0x1c, 0x08, 0x04, 0x1b, 0xb0, 0x64, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x08, 0x2a, 0x47, 0x98, 0x01, 0x4a, 0x29, 0x22, 0x18, 0xb4, 0x00, 0x18, 0xcb, 0x1c, 0x00, 0x65,
+0x24, 0x10, 0x02, 0x69, 0x6c, 0xe9, 0xff, 0x6a, 0x4c, 0xe9, 0x07, 0x21, 0x80, 0x18, 0xfe, 0x29, 0x00, 0x65, 0x50, 0xa8, 0x01, 0x4a, 0x50, 0xc8, 0x18, 0x10, 0x7d, 0x6c, 0x00, 0x18, 0xab, 0xa5,
+0x01, 0x6d, 0x04, 0x6b, 0x4c, 0xeb, 0x06, 0x23, 0x50, 0xa8, 0x20, 0xf0, 0x29, 0xc0, 0x01, 0x4a, 0x50, 0xc8, 0x0b, 0x10, 0x20, 0xf0, 0x49, 0xa0, 0x19, 0x5a, 0x04, 0x60, 0x01, 0x4a, 0x20, 0xf0,
+0x49, 0xc0, 0x03, 0x10, 0x80, 0x18, 0x5d, 0x2a, 0x00, 0x65, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0x90, 0x95, 0x11, 0x80, 0xac, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62,
+0x04, 0xd0, 0x00, 0x6c, 0x02, 0xf0, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x19, 0xb2, 0xc1, 0xaa, 0x7f, 0x6a, 0x3f, 0x6c, 0xca, 0x36, 0x4c, 0xee, 0x80, 0x4a, 0x81, 0x4a, 0x4d, 0xee,
+0xff, 0x6a, 0x4c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x01, 0xf7, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee,
+0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0xc2, 0x67, 0x01, 0x6d, 0x6d, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c,
+0x80, 0x18, 0x47, 0x2a, 0x01, 0x6c, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x6c, 0xc4, 0x67, 0x00, 0x18,
+0x4d, 0xa6, 0xa4, 0x67, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0x6e, 0xff, 0xf7, 0x1f, 0x6b, 0x04, 0x4e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x01, 0x6d, 0x0b, 0xb0, 0x00, 0x18,
+0x4d, 0xa6, 0x57, 0x6c, 0x64, 0xa0, 0x41, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x00, 0x6c, 0x80, 0x18, 0x47, 0x2a, 0x44, 0xc0, 0x80, 0x18, 0xfe, 0x29, 0x00, 0x65, 0x00, 0x6a, 0x49, 0xc0, 0x05, 0x97,
+0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x38, 0xb0, 0x90, 0xa0, 0x4f, 0xa0, 0x04, 0x05, 0x80, 0x34, 0x4d, 0xec, 0x4e, 0xa0,
+0x80, 0x34, 0x00, 0x18, 0x69, 0xbc, 0x4d, 0xec, 0x7d, 0x67, 0x48, 0xab, 0x8f, 0xa0, 0xdd, 0x67, 0x4c, 0xcb, 0x49, 0xab, 0xaa, 0xae, 0x4d, 0xcb, 0x4e, 0xa0, 0x80, 0x33, 0x68, 0x33, 0x48, 0x32,
+0x6d, 0xea, 0x03, 0x6b, 0xac, 0xeb, 0x6d, 0xea, 0x70, 0xa0, 0x4e, 0xce, 0x9a, 0x34, 0x68, 0x32, 0x7e, 0x33, 0x8d, 0xea, 0x05, 0x23, 0x09, 0xf4, 0x00, 0x6b, 0x4d, 0xeb, 0x6f, 0xce, 0x06, 0x10,
+0x0a, 0xf0, 0x00, 0x6b, 0x6b, 0xeb, 0x4d, 0xeb, 0x5d, 0x67, 0x6f, 0xca, 0x00, 0x6a, 0x21, 0x10, 0xdd, 0x67, 0x44, 0x35, 0xb5, 0xe6, 0xac, 0xad, 0x01, 0x6e, 0xa7, 0xeb, 0xcc, 0xed, 0x0c, 0x25,
+0x0f, 0x6d, 0x77, 0xe5, 0xc4, 0xed, 0xa6, 0x67, 0x8d, 0xed, 0xa0, 0x34, 0x80, 0x34, 0x83, 0x34, 0x83, 0x34, 0xff, 0xf7, 0x1f, 0x6d, 0xac, 0xec, 0x01, 0x4b, 0xff, 0x6d, 0xac, 0xeb, 0x10, 0x5b,
+0xe7, 0x61, 0x44, 0x33, 0x01, 0x4a, 0xdd, 0x67, 0xac, 0xea, 0x6d, 0xe6, 0x04, 0x5a, 0x8c, 0xcb, 0x03, 0x60, 0x00, 0x6c, 0x64, 0x67, 0xdc, 0x17, 0x5d, 0x67, 0xcc, 0xaa, 0x51, 0x6c, 0x00, 0x18,
+0x4d, 0xa6, 0x01, 0x6d, 0x7d, 0x67, 0xcd, 0xab, 0x50, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x5d, 0x67, 0xce, 0xaa, 0x4f, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x7d, 0x67, 0xcf, 0xab,
+0x4e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x5e, 0x6c, 0x00, 0x18,
+0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02, 0xf0, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x5e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18,
+0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0xff, 0x6b, 0x01, 0x4b, 0xc2, 0x67, 0x53, 0xb1, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x44, 0xa1, 0x07, 0x6b, 0xa3, 0xa1, 0x4e, 0x32,
+0x6c, 0xea, 0x44, 0x34, 0x0f, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc1, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x04, 0xd3, 0xc3, 0xa1, 0x04, 0x93, 0x71, 0x6c, 0xc6, 0x36,
+0x6c, 0xee, 0x0c, 0xea, 0x8b, 0xec, 0x8c, 0xea, 0xd0, 0x36, 0x4d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x60, 0xa1, 0x01, 0x6a, 0x01, 0x68, 0x6c, 0xea, 0x0b, 0x22, 0x44, 0xa1,
+0x80, 0x48, 0xff, 0x48, 0x4c, 0xe8, 0xff, 0x6a, 0x4c, 0xe8, 0x0b, 0xe8, 0xc0, 0xf7, 0x02, 0x30, 0x03, 0x6a, 0x03, 0xe2, 0x39, 0xb1, 0x56, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x80, 0x99,
+0x00, 0x33, 0xe3, 0xf7, 0x1f, 0x6d, 0x96, 0x34, 0xac, 0xec, 0x78, 0x33, 0x8d, 0xeb, 0xfb, 0xf7, 0x1f, 0x6c, 0x8c, 0xeb, 0xff, 0xf7, 0x1f, 0x68, 0x1c, 0xf0, 0x00, 0x6c, 0x8b, 0xec, 0x0c, 0xea,
+0xc3, 0x67, 0x8c, 0xea, 0x4d, 0xee, 0x56, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0xc7, 0xa1, 0x46, 0xa1, 0x58, 0x6c, 0xc0, 0x36, 0x4d, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c,
+0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x04, 0x6b, 0x6b, 0xeb, 0x0c, 0xea, 0x6c, 0xea, 0x68, 0xa1, 0x03, 0x6c, 0xc2, 0x67, 0x8c, 0xeb, 0x6d, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d,
+0x80, 0x18, 0xd3, 0x2a, 0x00, 0x65, 0x63, 0xa1, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x1e, 0x22, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x80, 0x6b,
+0xc2, 0x67, 0x6d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xc5, 0xa1, 0xe0, 0xf1, 0x1d, 0x6b, 0x6b, 0xeb, 0x0c, 0xea, 0x6c, 0xea,
+0xc8, 0x36, 0xe0, 0xf3, 0x19, 0x4b, 0x6c, 0xee, 0x59, 0x6c, 0x01, 0x6d, 0x4d, 0xee, 0x0b, 0x10, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x81, 0x6b, 0x6b, 0xeb, 0xc2, 0x67,
+0x57, 0x6c, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x65, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62,
+0x08, 0xd1, 0x07, 0xd0, 0x42, 0xb0, 0x43, 0xa0, 0x07, 0x6b, 0xff, 0xf7, 0x1f, 0x69, 0x52, 0x32, 0x6c, 0xea, 0x05, 0x4a, 0x80, 0x18, 0x0d, 0x2b, 0x04, 0xd2, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5,
+0x01, 0x6d, 0x2c, 0xea, 0x02, 0xf0, 0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x2c, 0xea,
+0x00, 0xf2, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x42, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xd2, 0xa8, 0x51, 0xc8, 0x53, 0xa8, 0xc0, 0x36,
+0xc0, 0x36, 0x4d, 0xee, 0x02, 0xf0, 0x00, 0x5e, 0x02, 0x61, 0xe1, 0xf7, 0x1f, 0x6e, 0x28, 0xb1, 0x20, 0xf0, 0x48, 0xa1, 0x0f, 0x6b, 0xd0, 0x36, 0x6c, 0xea, 0x4d, 0xee, 0x42, 0x6c, 0x00, 0x18,
+0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0x02, 0xf0, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x04, 0x94, 0x1f, 0xf7,
+0x01, 0x6b, 0x0c, 0xea, 0x6b, 0xeb, 0x6c, 0xea, 0x1a, 0xb3, 0x8d, 0xe3, 0x20, 0xf1, 0xda, 0xa3, 0x02, 0x6c, 0x00, 0x6d, 0xc0, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4d, 0xee, 0xc1, 0xa9, 0x7f, 0x6a,
+0x3f, 0x6c, 0xca, 0x36, 0x4c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0x6d, 0xc2, 0x67, 0xad, 0xee, 0x00, 0x18, 0x4d, 0xa6,
+0x57, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x57, 0x6c, 0x80, 0x18, 0x47, 0x2a,
+0x01, 0x6c, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x90, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x33, 0xb3, 0xe3, 0xa3,
+0x07, 0x6a, 0x05, 0xd3, 0xf2, 0x37, 0x4c, 0xef, 0x05, 0x4f, 0x80, 0x18, 0x0d, 0x2b, 0x04, 0xd7, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02, 0xf0,
+0x00, 0x69, 0xc2, 0x67, 0x2d, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x00, 0xf2, 0x01, 0x6e, 0x0c, 0xea, 0xcb, 0xee, 0x4c, 0xee,
+0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xd1, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xa4, 0x67, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x04, 0x97, 0x1f, 0xf7, 0x01, 0x6c,
+0x0c, 0xea, 0x8b, 0xec, 0x8c, 0xea, 0x1a, 0xb4, 0xfd, 0xe4, 0x20, 0xf1, 0xda, 0xa7, 0x02, 0x6c, 0x00, 0x6d, 0xc0, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4d, 0xee, 0x05, 0x93, 0x7f, 0x6a, 0x3f, 0x6c,
+0xc1, 0xab, 0x00, 0x6d, 0xca, 0x36, 0x00, 0x18, 0x4d, 0xa6, 0x4c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0x6d, 0xc2, 0x67, 0xad, 0xee, 0x00, 0x18, 0x4d, 0xa6,
+0x57, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x02, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6c, 0xee, 0x09, 0x97, 0x08, 0x91,
+0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x59, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7,
+0x1f, 0x68, 0x0c, 0xea, 0x00, 0xf2, 0x00, 0x6b, 0xc2, 0x67, 0x6d, 0xee, 0x59, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x01, 0xf7,
+0x01, 0x6b, 0x6b, 0xeb, 0xc2, 0x67, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x0c, 0xea, 0x03, 0x6b, 0x6b, 0xeb, 0xc2, 0x67,
+0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x80, 0x18, 0x0d, 0x2b, 0x00, 0x65, 0x06, 0xb2, 0x00, 0x6b, 0x6f, 0xda, 0x6d, 0xda, 0x78, 0xca, 0x80, 0x18, 0x9f, 0x2a, 0x79, 0xca,
+0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x90, 0x95, 0x11, 0x80, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0x42, 0xa4, 0xff, 0x6b, 0x04, 0x67, 0xff, 0x4a, 0x6c, 0xea, 0x25, 0x5a,
+0x23, 0xa4, 0x2d, 0x60, 0x04, 0x0b, 0x44, 0x32, 0x49, 0xe3, 0x40, 0x8a, 0x4d, 0xe3, 0x00, 0xeb, 0x00, 0x65, 0x00, 0x65, 0x4f, 0x00, 0xa3, 0x00, 0xb3, 0x02, 0x41, 0x03, 0x7b, 0x03, 0xef, 0x03,
+0x17, 0x04, 0x29, 0x04, 0x37, 0x04, 0x4d, 0x04, 0x5b, 0x04, 0x4b, 0x00, 0x4b, 0x00, 0x69, 0x04, 0x61, 0x05, 0x79, 0x05, 0x4b, 0x00, 0x91, 0x05, 0x9f, 0x05, 0xad, 0x05, 0xdf, 0x05, 0xed, 0x05,
+0xff, 0x05, 0x0d, 0x06, 0x1f, 0x06, 0x23, 0x06, 0x27, 0x06, 0x33, 0x06, 0x45, 0x06, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x5d, 0x06, 0x95, 0x06, 0x9d, 0x06, 0xaf, 0x06, 0x00, 0x6a,
+0x4a, 0x13, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x02, 0xf1, 0x03, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d,
+0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x80, 0x18, 0x47, 0x2a, 0x00, 0x6c, 0x00, 0x18, 0xe8, 0x58, 0x00, 0x65, 0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54,
+0xc5, 0x67, 0x60, 0xf6, 0x00, 0xb2, 0x0a, 0x6b, 0x6c, 0xc2, 0x08, 0x6b, 0x6d, 0xc2, 0x00, 0x6b, 0x69, 0xc2, 0x6a, 0xc2, 0x0f, 0x13, 0x0e, 0x59, 0x00, 0xf3, 0x08, 0x60, 0x40, 0xf6, 0x04, 0xb2,
+0x06, 0x21, 0x64, 0xa2, 0x40, 0x6a, 0x6c, 0xea, 0x00, 0xf3, 0x00, 0x2a, 0x06, 0x10, 0x84, 0xa2, 0x40, 0x6b, 0x8c, 0xeb, 0x02, 0x2b, 0x29, 0xc2, 0xfd, 0x12, 0x20, 0xf6, 0x08, 0xb2, 0x69, 0xa2,
+0x0e, 0x59, 0x29, 0xc2, 0x06, 0xd3, 0xe0, 0xf0, 0x03, 0x60, 0x04, 0x0a, 0x24, 0x31, 0x25, 0xe2, 0x60, 0x89, 0x69, 0xe2, 0x00, 0xea, 0x00, 0x65, 0x1d, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0xef, 0x00,
+0x0f, 0x01, 0x13, 0x01, 0x1d, 0x01, 0xb9, 0x01, 0x21, 0x01, 0x29, 0x01, 0x31, 0x01, 0x39, 0x01, 0x6d, 0x01, 0xa7, 0x01, 0xe0, 0xf5, 0x0c, 0xb2, 0x44, 0xa2, 0x01, 0x6b, 0x4c, 0xeb, 0x12, 0x23,
+0x02, 0x6b, 0x4c, 0xeb, 0x04, 0x23, 0x80, 0x18, 0xbd, 0x2a, 0x00, 0x65, 0x18, 0x10, 0x06, 0x92, 0x02, 0x72, 0x04, 0x61, 0x80, 0x18, 0x5d, 0x2a, 0x00, 0x65, 0x11, 0x10, 0x80, 0x18, 0xec, 0x29,
+0x00, 0x65, 0x0d, 0x10, 0x04, 0x6b, 0x4c, 0xeb, 0x0a, 0x23, 0x02, 0x6b, 0x4c, 0xeb, 0x04, 0x23, 0x80, 0x18, 0xaa, 0x29, 0x00, 0x65, 0x03, 0x10, 0x80, 0x18, 0xbd, 0x29, 0x00, 0x65, 0xa0, 0xf5,
+0x04, 0xb1, 0x6d, 0x99, 0xee, 0x99, 0x4f, 0x99, 0x09, 0xd3, 0x08, 0xd7, 0x00, 0x18, 0xe8, 0x58, 0x07, 0xd2, 0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0x0a, 0x6a,
+0x4c, 0xc1, 0x08, 0x6a, 0x4d, 0xc1, 0x06, 0x92, 0x09, 0x93, 0x08, 0x97, 0x02, 0x5a, 0xa0, 0xf2, 0x01, 0x60, 0x6d, 0xd9, 0x07, 0x93, 0xee, 0xd9, 0x6f, 0xd9, 0x9c, 0x12, 0x60, 0xf5, 0x04, 0xb1,
+0x64, 0xa1, 0x02, 0x6a, 0x6d, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x80, 0x18, 0xec, 0x2b, 0x44, 0xc1, 0x25, 0x10, 0x40, 0xf5, 0x10, 0xb3, 0x84, 0xa3, 0x03, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0x04, 0x6c,
+0x4c, 0xec, 0x07, 0x24, 0x02, 0x6c, 0x8b, 0xec, 0x4c, 0xec, 0x80, 0x18, 0xcc, 0x29, 0x84, 0xc3, 0x05, 0x10, 0x01, 0x6c, 0x4d, 0xec, 0x80, 0x18, 0x6f, 0x2b, 0x84, 0xc3, 0x20, 0xf5, 0x04, 0xb3,
+0x84, 0xa3, 0x40, 0x6a, 0x1f, 0x11, 0x00, 0xf5, 0x1c, 0xb1, 0x64, 0xa1, 0x03, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x80, 0x18, 0xb5, 0x2b, 0x44, 0xc1, 0x64, 0xa1, 0x40, 0x6a,
+0x6d, 0xea, 0x44, 0xc1, 0x67, 0x12, 0x01, 0x6c, 0x01, 0x10, 0x02, 0x6c, 0x80, 0x18, 0x23, 0x29, 0x00, 0x65, 0x60, 0x12, 0x03, 0x6c, 0xfa, 0x17, 0x80, 0x18, 0x77, 0x29, 0x00, 0x65, 0x5a, 0x12,
+0x80, 0x18, 0x5c, 0x29, 0x00, 0x65, 0x56, 0x12, 0x80, 0x18, 0x37, 0x29, 0x00, 0x65, 0x52, 0x12, 0xc0, 0xf4, 0x10, 0xb2, 0x80, 0xa2, 0x01, 0x6b, 0x8c, 0xeb, 0xc0, 0xf4, 0x0c, 0xb4, 0x60, 0xc4,
+0x60, 0x9a, 0xc0, 0xf4, 0x08, 0xb4, 0x76, 0x33, 0xc0, 0xf4, 0x60, 0x33, 0x80, 0xf5, 0x62, 0x33, 0x60, 0xcc, 0x40, 0xa2, 0x0f, 0x6b, 0x00, 0x6c, 0x46, 0x32, 0x6c, 0xea, 0xa0, 0xf4, 0x10, 0xb3,
+0x40, 0xc3, 0x19, 0x10, 0x80, 0xf4, 0x1c, 0xb2, 0x80, 0xa2, 0x01, 0x6b, 0x8c, 0xeb, 0x80, 0xf4, 0x18, 0xb4, 0x60, 0xc4, 0x60, 0x9a, 0x80, 0xf4, 0x14, 0xb4, 0x76, 0x33, 0xc0, 0xf4, 0x60, 0x33,
+0x80, 0xf5, 0x62, 0x33, 0x60, 0xcc, 0x40, 0xa2, 0x0f, 0x6b, 0x01, 0x6c, 0x46, 0x32, 0x6c, 0xea, 0x60, 0xf4, 0x1c, 0xb3, 0x40, 0xc3, 0x80, 0x18, 0x6e, 0x34, 0x00, 0x65, 0x1b, 0x12, 0x60, 0xf4,
+0x04, 0xb2, 0x40, 0xa2, 0x0f, 0x6b, 0x46, 0x32, 0x6c, 0xea, 0x60, 0xf4, 0x04, 0xb3, 0x40, 0xc3, 0x80, 0x18, 0xa6, 0x28, 0x00, 0x65, 0x00, 0xf2, 0x0d, 0x22, 0x12, 0x72, 0x00, 0xf2, 0x06, 0x60,
+0x00, 0x6c, 0x04, 0x6b, 0x05, 0x12, 0x04, 0x59, 0x00, 0xf2, 0x00, 0x60, 0x80, 0x18, 0x47, 0x2a, 0x00, 0x6c, 0x57, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x02, 0xf1,
+0x03, 0x6e, 0x4c, 0xeb, 0xcb, 0xee, 0x6c, 0xee, 0x57, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x6c, 0xa4, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x00, 0x18, 0xe8, 0x58, 0x00, 0x65,
+0x00, 0x6d, 0x01, 0xf4, 0x03, 0x6c, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0xfd, 0xb3, 0x0a, 0x6a, 0x4c, 0xc3, 0x08, 0x6a, 0x2a, 0xc3, 0x4d, 0xc3, 0x00, 0x1c, 0x73, 0x1b, 0x09, 0xd3, 0x09, 0x93,
+0xa2, 0x67, 0x05, 0x6a, 0x84, 0xa3, 0x4b, 0xea, 0x01, 0x71, 0x8c, 0xea, 0x44, 0xc3, 0x09, 0x61, 0x03, 0x6c, 0x80, 0x18, 0x23, 0x29, 0x08, 0xd5, 0x00, 0x18, 0x81, 0x56, 0x00, 0x6c, 0x08, 0x95,
+0x05, 0x10, 0x02, 0x71, 0x03, 0x61, 0x04, 0x6c, 0x4d, 0xec, 0x84, 0xc3, 0x00, 0x1c, 0x7a, 0x1b, 0x85, 0x67, 0xc0, 0x11, 0x4f, 0x59, 0xa0, 0xf1, 0x19, 0x60, 0x44, 0xa4, 0x08, 0x5a, 0xa0, 0xf1,
+0x15, 0x60, 0xe8, 0xb3, 0x7f, 0x6a, 0xa1, 0xab, 0x2c, 0xea, 0x48, 0x34, 0xe0, 0xf1, 0x1d, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x41, 0xcb, 0x84, 0xa0, 0x07, 0x6a, 0xa3, 0xa3, 0x8c, 0xea,
+0x50, 0x34, 0x71, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc3, 0xa3, 0x11, 0x0a, 0x59, 0x44, 0xa4, 0x65, 0xa4, 0x80, 0xf1, 0x1a, 0x60, 0x60, 0x33, 0x4d, 0xeb, 0xe3, 0xf7, 0x1f, 0x6c,
+0xd8, 0xb2, 0x6c, 0xec, 0x94, 0x35, 0xdb, 0xb6, 0x80, 0x9a, 0xcc, 0xec, 0xad, 0xec, 0x80, 0xda, 0xd9, 0xb5, 0x24, 0x34, 0x91, 0xe5, 0x80, 0xac, 0x8c, 0x34, 0x62, 0xec, 0x80, 0xf1, 0x06, 0x61,
+0x03, 0x59, 0x06, 0x60, 0x80, 0xa2, 0x02, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x60, 0xc2, 0x0c, 0x10, 0x80, 0xa2, 0xa4, 0xa2, 0x01, 0x6b, 0x8d, 0xeb, 0x06, 0x59, 0x60, 0xc2, 0x98, 0x67, 0x7f, 0x6b,
+0x9c, 0x34, 0xac, 0xeb, 0x8d, 0xeb, 0x64, 0xc2, 0xcc, 0xb2, 0x25, 0xe2, 0x80, 0xa1, 0xc5, 0xb3, 0x0f, 0x6a, 0x8c, 0xea, 0xa0, 0xa3, 0x44, 0x34, 0x1f, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea,
+0x63, 0x11, 0x45, 0xa4, 0x08, 0x5a, 0x60, 0xf1, 0x01, 0x60, 0x44, 0xa4, 0xbd, 0xb3, 0xa4, 0xa3, 0x40, 0x32, 0x2d, 0xea, 0x53, 0xcb, 0x85, 0xa4, 0x07, 0x6a, 0x8c, 0xea, 0x4c, 0x34, 0x39, 0x6a,
+0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x44, 0xc3, 0x55, 0x11, 0x44, 0xa4, 0xb5, 0xb3, 0x40, 0x32, 0x2d, 0xea, 0x52, 0xcb, 0x45, 0xa4, 0x20, 0xf0, 0x48, 0xc3, 0x4c, 0x11, 0xb1, 0xb2, 0x26, 0xc2,
+0x64, 0xa4, 0x67, 0xc2, 0x65, 0xa4, 0x68, 0xc2, 0x45, 0x11, 0xae, 0xb2, 0x63, 0xa2, 0x3e, 0x35, 0x7f, 0x6c, 0xbc, 0x35, 0x8c, 0xeb, 0xad, 0xeb, 0x8c, 0xe9, 0x63, 0xc2, 0x25, 0xc2, 0x3a, 0x11,
+0xa8, 0xb2, 0x2e, 0xc2, 0x64, 0xa4, 0x6f, 0xc2, 0x65, 0xa4, 0x70, 0xc2, 0x33, 0x11, 0xa5, 0xb2, 0x31, 0xc2, 0x64, 0xa4, 0x72, 0xc2, 0x65, 0xa4, 0x73, 0xc2, 0x2c, 0x11, 0xa1, 0xb3, 0x49, 0xa3,
+0x0a, 0x72, 0x2c, 0x61, 0x8c, 0xa3, 0x00, 0x6a, 0x0a, 0x74, 0x0e, 0x60, 0xc0, 0xf2, 0x0c, 0x4a, 0x58, 0xec, 0xa3, 0xb2, 0x12, 0xec, 0x91, 0xe2, 0xc0, 0xf0, 0x48, 0xa4, 0x04, 0x72, 0x05, 0x6a,
+0x03, 0x60, 0x0a, 0x6a, 0x4c, 0xc3, 0x00, 0x6a, 0x96, 0xb3, 0x8d, 0xa3, 0x08, 0x74, 0x5d, 0x60, 0xff, 0x6a, 0x09, 0x4a, 0x58, 0xec, 0x9b, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x20, 0xf1, 0xaf, 0xa2,
+0x01, 0x6a, 0x4c, 0xed, 0x06, 0x25, 0x00, 0xf1, 0x72, 0xab, 0x67, 0xec, 0x4c, 0xeb, 0x05, 0x6a, 0x4c, 0x2b, 0x8c, 0xb2, 0x08, 0x6b, 0x6d, 0xc2, 0x00, 0x6a, 0x47, 0x10, 0x8b, 0x42, 0xff, 0x6b,
+0x6c, 0xec, 0x03, 0x5c, 0x1a, 0x60, 0x00, 0x6a, 0xc0, 0xf2, 0x0c, 0x6c, 0x98, 0xea, 0x8c, 0xb3, 0x12, 0xec, 0x91, 0xe3, 0xc0, 0xf0, 0x68, 0xa4, 0x04, 0x73, 0x09, 0x61, 0xe0, 0xf0, 0xa8, 0x9c,
+0x80, 0xb3, 0xa5, 0xdb, 0xe0, 0xf0, 0x8c, 0xac, 0x4c, 0xc3, 0x8c, 0xcb, 0x26, 0x10, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xe8, 0x61, 0x27, 0x10, 0x88, 0x42, 0x6c, 0xec, 0x02, 0x5c,
+0x24, 0x60, 0x00, 0x6a, 0xff, 0x6c, 0x09, 0x4c, 0x98, 0xea, 0x7e, 0xb3, 0x01, 0x6d, 0x12, 0xec, 0x91, 0xe3, 0x20, 0xf1, 0xcf, 0xa4, 0xac, 0xee, 0x12, 0x26, 0x00, 0xf1, 0x72, 0xab, 0x67, 0xea,
+0xac, 0xeb, 0x0d, 0x23, 0x60, 0xf1, 0xbe, 0xac, 0x6e, 0xb3, 0xaa, 0xcb, 0x80, 0xf1, 0xa0, 0xac, 0xab, 0xcb, 0x80, 0xf1, 0x82, 0xac, 0x4d, 0xc3, 0x8c, 0xcb, 0x05, 0x6a, 0x06, 0x10, 0x01, 0x4a,
+0xff, 0x6b, 0x6c, 0xea, 0x08, 0x5a, 0xde, 0x61, 0x04, 0x6a, 0x66, 0xb3, 0x6a, 0xa3, 0x40, 0x32, 0x6d, 0xea, 0x67, 0x10, 0x6c, 0xb3, 0x20, 0xf0, 0x9e, 0xa3, 0x20, 0xf0, 0x5d, 0xa3, 0x20, 0xf0,
+0x7c, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x6e, 0x10, 0x66, 0xb3, 0x40, 0xf0, 0x81, 0xa3, 0x40, 0xf0, 0x40, 0xa3, 0x20, 0xf0, 0x7f, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34,
+0x8d, 0xea, 0x62, 0x10, 0x57, 0xb2, 0x34, 0xc2, 0x64, 0xa4, 0x75, 0xc2, 0x65, 0xa4, 0x76, 0xc2, 0x91, 0x10, 0x54, 0xb2, 0x37, 0xc2, 0x64, 0xa4, 0x78, 0xc2, 0x65, 0xa4, 0x79, 0xc2, 0x8a, 0x10,
+0x4f, 0x41, 0xff, 0x6b, 0x6c, 0xea, 0x09, 0x5a, 0x80, 0xf0, 0x00, 0x60, 0x5c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0xff, 0xf7, 0x1f, 0x6b, 0x4c, 0xeb, 0x79, 0x6a, 0x4b, 0xea, 0x4c, 0xeb,
+0x2c, 0x36, 0x78, 0x6a, 0x4c, 0xee, 0x5c, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x6d, 0xee, 0x71, 0x10, 0x44, 0xb3, 0x8d, 0x9b, 0x4d, 0xb5, 0x5a, 0xab, 0xac, 0xec, 0x8d, 0xdb, 0x21, 0x10,
+0x40, 0xb4, 0xad, 0x9c, 0xff, 0xf7, 0x1f, 0x6b, 0xa2, 0x32, 0xac, 0xeb, 0x42, 0x32, 0x6d, 0xdc, 0x18, 0x10, 0x3c, 0xb3, 0x8f, 0x9b, 0x45, 0xb5, 0x5e, 0xab, 0xac, 0xec, 0x8f, 0xdb, 0x11, 0x10,
+0x38, 0xb4, 0xaf, 0x9c, 0xff, 0xf7, 0x1f, 0x6b, 0xa2, 0x32, 0xac, 0xeb, 0x42, 0x32, 0x6f, 0xdc, 0x08, 0x10, 0x78, 0x6c, 0x03, 0x10, 0x76, 0x6c, 0x01, 0x10, 0x77, 0x6c, 0x00, 0x18, 0xab, 0xa5,
+0x01, 0x6d, 0x02, 0x6c, 0x13, 0x10, 0x2f, 0xb3, 0x96, 0xa3, 0x55, 0xa3, 0x74, 0xa3, 0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x08, 0x10, 0x2a, 0xb3, 0x99, 0xa3, 0x58, 0xa3, 0x77, 0xa3,
+0x80, 0x34, 0x40, 0x32, 0x80, 0x34, 0x8d, 0xea, 0x6d, 0xea, 0x03, 0x6c, 0x00, 0x6b, 0x35, 0x10, 0x64, 0x6a, 0x58, 0xe9, 0x2e, 0xb4, 0x40, 0x9c, 0x01, 0x4a, 0x12, 0xe9, 0x03, 0x22, 0x00, 0x18,
+0xcb, 0x1c, 0x00, 0x65, 0x27, 0x21, 0x80, 0x18, 0x61, 0x38, 0x00, 0x65, 0x00, 0x6a, 0x01, 0x6c, 0x27, 0xb5, 0x28, 0xb6, 0xe2, 0x67, 0x00, 0x18, 0xd9, 0x1c, 0x04, 0xd2, 0x24, 0xb2, 0x80, 0x9a,
+0x00, 0x18, 0xbe, 0x1c, 0xb1, 0x67, 0x16, 0x10, 0x1f, 0xb2, 0x80, 0xf1, 0x21, 0xc2, 0x12, 0x10, 0x1d, 0xb2, 0x00, 0x6b, 0x80, 0xf1, 0x71, 0xc2, 0x0d, 0x21, 0x01, 0x6b, 0x80, 0xf1, 0x71, 0xc2,
+0x09, 0x10, 0x01, 0x6a, 0x2c, 0xea, 0x1c, 0xb3, 0x40, 0xc3, 0x04, 0x10, 0x00, 0x6c, 0x03, 0x6b, 0x44, 0x67, 0x03, 0x10, 0x00, 0x6c, 0x64, 0x67, 0x44, 0x67, 0x90, 0x34, 0x6d, 0xec, 0x83, 0xc0,
+0x81, 0xa0, 0x10, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x61, 0xc0, 0xa0, 0x98, 0x02, 0x6c, 0x00, 0x18, 0xa5, 0x2e, 0xc2, 0x67, 0x01, 0x6a, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63,
+0x90, 0x95, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x1f, 0x00, 0xfc, 0xff, 0x48, 0xed, 0x10, 0x80, 0x3c, 0xed, 0x10, 0x80, 0x20, 0x56, 0x11, 0x80,
+0xa4, 0x3c, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0xff, 0xff, 0x90, 0x04, 0x11, 0x80, 0x85, 0xe1, 0x10, 0x80, 0xd0, 0x95, 0x11, 0x80, 0x20, 0xe8, 0x00, 0x65, 0x0c, 0xb2, 0x0d, 0xb4,
+0x60, 0xa4, 0xa0, 0x9a, 0x04, 0x6a, 0x6c, 0xea, 0x0c, 0x22, 0x40, 0xf7, 0xa2, 0x35, 0x66, 0x33, 0x01, 0x6c, 0xae, 0xeb, 0x8c, 0xeb, 0xff, 0x6c, 0x8c, 0xeb, 0x00, 0x6a, 0x04, 0x23, 0x20, 0xe8,
+0x01, 0x6a, 0x05, 0xb2, 0x40, 0xa2, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x50, 0xa0, 0x00, 0xb0, 0x1c, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x07, 0xb2, 0x40, 0x9a, 0x61, 0x42, 0x07, 0x23,
+0x24, 0x6b, 0x78, 0xea, 0x05, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x05, 0xb3, 0x63, 0xda, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x90, 0x04, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x85, 0xe1, 0x10, 0x80,
+0x00, 0x6a, 0x76, 0xb5, 0x55, 0xe5, 0xa0, 0xa5, 0x75, 0xb3, 0x51, 0xe3, 0x20, 0xf1, 0xba, 0xc4, 0x01, 0x4a, 0xff, 0x6c, 0x8c, 0xea, 0x10, 0x5a, 0xf4, 0x61, 0x60, 0xf1, 0xa1, 0xa3, 0xfe, 0x75,
+0x0b, 0x60, 0x0f, 0x6a, 0xac, 0xea, 0xaf, 0x42, 0x8c, 0xed, 0x05, 0x5d, 0x05, 0x60, 0x10, 0x6c, 0x4d, 0xec, 0x60, 0xf1, 0x81, 0xc3, 0x03, 0x10, 0x15, 0x6a, 0x60, 0xf1, 0x41, 0xc3, 0x68, 0xb2,
+0x40, 0xf1, 0x7a, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x0d, 0x6b, 0x40, 0xf1, 0x7a, 0xc2, 0x64, 0xb2, 0x40, 0xf1, 0x7a, 0xa2, 0x0a, 0x73, 0x0c, 0x61, 0x0d, 0x6b, 0x40, 0xf1, 0x7a, 0xc2, 0x0b, 0x6b,
+0x40, 0xf1, 0x7b, 0xc2, 0x40, 0xf1, 0x7c, 0xc2, 0x40, 0xf1, 0x7d, 0xc2, 0x40, 0xf1, 0x7e, 0xc2, 0x5b, 0xb2, 0x00, 0x6b, 0x80, 0xf0, 0x7d, 0xc2, 0x24, 0xf0, 0x10, 0x6b, 0x60, 0xf1, 0x62, 0xca,
+0x06, 0xf7, 0x19, 0x6b, 0x60, 0xf1, 0x64, 0xca, 0x0b, 0xf2, 0x10, 0x6b, 0x60, 0xf1, 0x66, 0xca, 0x0e, 0xf5, 0x0a, 0x6b, 0x60, 0xf1, 0x68, 0xca, 0x04, 0xf5, 0x00, 0x6b, 0x6b, 0xeb, 0x60, 0xf1,
+0x6a, 0xca, 0x00, 0x6b, 0xc0, 0xf1, 0x68, 0xca, 0xc0, 0xf1, 0x6a, 0xca, 0xc0, 0xf1, 0x6c, 0xca, 0xc0, 0xf1, 0x6e, 0xca, 0x40, 0xf1, 0x7f, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x01, 0x6b, 0x40, 0xf1,
+0x7f, 0xc2, 0x47, 0xb2, 0x60, 0xf1, 0x60, 0xa2, 0xff, 0x73, 0x04, 0x61, 0x02, 0x6b, 0x6b, 0xeb, 0x60, 0xf1, 0x60, 0xc2, 0x42, 0xb2, 0x80, 0xf1, 0x62, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x05, 0x6b,
+0x80, 0xf1, 0x62, 0xc2, 0x3e, 0xb2, 0x01, 0x6b, 0x80, 0xf1, 0x60, 0xc2, 0x80, 0xf1, 0x71, 0xc2, 0x80, 0xf1, 0x61, 0xa2, 0xfe, 0x73, 0x03, 0x61, 0x0f, 0x6b, 0x80, 0xf1, 0x61, 0xc2, 0x38, 0xb2,
+0x02, 0x6b, 0x80, 0xf1, 0x63, 0xc2, 0x80, 0xf1, 0x72, 0xc2, 0x00, 0x6a, 0x35, 0xb4, 0x51, 0xe4, 0x80, 0xa4, 0x33, 0xb3, 0x4d, 0xe3, 0x80, 0xf1, 0x84, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea,
+0x0d, 0x5a, 0xf4, 0x61, 0x00, 0x6a, 0x30, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b,
+0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x25, 0xb3, 0x4d, 0xe3, 0x80, 0xf1, 0x93, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x0d, 0x5a, 0xe6, 0x61, 0x00, 0x6a, 0x23, 0xb4, 0x51, 0xe4,
+0x80, 0xa4, 0x1f, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x80, 0xc3, 0x21, 0xb4, 0x51, 0xe4, 0x80, 0xa4, 0xc0, 0xf1, 0x82, 0xc3, 0x1f, 0xb3, 0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb,
+0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x12, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x84, 0xc3, 0x16, 0xb3,
+0x4d, 0xe3, 0x60, 0xa3, 0xff, 0x6c, 0xe0, 0x4b, 0x8c, 0xeb, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x00, 0x54, 0x05, 0x60, 0x80, 0x4b, 0x00, 0xf6, 0x60, 0x34, 0x00, 0xf6, 0x83, 0x34,
+0x07, 0xb3, 0x4d, 0xe3, 0xc0, 0xf1, 0x86, 0xc3, 0x01, 0x4a, 0xff, 0x6b, 0x6c, 0xea, 0x02, 0x5a, 0xc5, 0x61, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x30, 0xef, 0x10, 0x80, 0x4c, 0x00, 0x11, 0x80,
+0x40, 0xef, 0x10, 0x80, 0x58, 0xef, 0x10, 0x80, 0x50, 0xef, 0x10, 0x80, 0x54, 0xef, 0x10, 0x80, 0x68, 0xef, 0x10, 0x80, 0x6c, 0xef, 0x10, 0x80, 0xff, 0x6a, 0x4c, 0xee, 0x4c, 0xec, 0x4c, 0xed,
+0xec, 0xea, 0x57, 0xe5, 0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0xb8, 0xed, 0xd3, 0xe4, 0x00, 0xf6, 0x80, 0x34, 0x00, 0xf6, 0x83, 0x34, 0xff, 0xf7, 0x1f, 0x6b, 0x12, 0xed, 0x98, 0xec,
+0x12, 0xec, 0x89, 0xe5, 0x20, 0xe8, 0x6c, 0xea, 0x20, 0xe8, 0x00, 0x65, 0x0a, 0xb2, 0x20, 0xf0, 0x70, 0xa2, 0x16, 0x6a, 0x6c, 0xea, 0x12, 0x72, 0x04, 0x61, 0x40, 0xa4, 0x01, 0x5a, 0x58, 0x67,
+0x40, 0xc4, 0x06, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x04, 0x52, 0x58, 0x67, 0x01, 0x6b, 0x20, 0xe8, 0x6e, 0xea, 0x4c, 0x00, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x00, 0x6a, 0x11, 0xb3,
+0x60, 0x9b, 0x4c, 0x35, 0xff, 0x6c, 0xad, 0xe3, 0xc3, 0xa3, 0x80, 0x6b, 0x6b, 0xeb, 0x6c, 0xee, 0x8c, 0xee, 0x14, 0x2e, 0x0c, 0xb6, 0xc0, 0x9e, 0xb9, 0xe6, 0xc3, 0xa6, 0x6c, 0xee, 0x8c, 0xee,
+0x0d, 0x2e, 0x0a, 0xb6, 0xc0, 0x9e, 0xb5, 0xe6, 0xa3, 0xa5, 0xac, 0xeb, 0x8c, 0xeb, 0x06, 0x2b, 0x01, 0x4a, 0x8c, 0xea, 0x11, 0x5a, 0xe3, 0x61, 0x20, 0xe8, 0x01, 0x6a, 0x20, 0xe8, 0x00, 0x6a,
+0xf4, 0x1d, 0x11, 0x80, 0xcc, 0x1d, 0x11, 0x80, 0x04, 0x1f, 0x11, 0x80, 0x20, 0xe8, 0x01, 0x6a, 0x06, 0xb2, 0x60, 0xa2, 0x01, 0x6a, 0x6c, 0xea, 0x05, 0x22, 0x40, 0x9c, 0x11, 0x6b, 0x6b, 0xeb,
+0x6c, 0xea, 0x40, 0xdc, 0x20, 0xe8, 0x00, 0x6a, 0x1c, 0x96, 0x11, 0x80, 0x0d, 0xb2, 0x40, 0xa2, 0x08, 0x22, 0x0d, 0xb2, 0x60, 0xa2, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea,
+0x0d, 0x2a, 0x0a, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x60, 0x9c, 0x02, 0xf0, 0x00, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x01, 0x6b, 0x02, 0xb2, 0x60, 0xc2, 0x20, 0xe8, 0x00, 0x6a,
+0x98, 0x07, 0x11, 0x80, 0xdc, 0x37, 0x11, 0x80, 0x6c, 0x21, 0x11, 0x80, 0x64, 0xa4, 0x43, 0xa4, 0xc0, 0xa5, 0x60, 0x33, 0x4d, 0xe3, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xeb, 0x7f, 0xf4, 0x0f, 0x73,
+0x00, 0x6a, 0x09, 0x61, 0xc9, 0xe4, 0x01, 0x6b, 0x62, 0xc2, 0x41, 0x46, 0xff, 0x6b, 0x6c, 0xea, 0x41, 0xc4, 0x40, 0xc5, 0x01, 0x6a, 0x20, 0xe8, 0x00, 0x65, 0x00, 0x65, 0x0d, 0xb3, 0xc0, 0xf0,
+0x8a, 0xab, 0x08, 0xf0, 0x01, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0xc0, 0xf0, 0x4a, 0xcb, 0x00, 0x6a, 0x09, 0xb3, 0x40, 0xc3, 0x09, 0xb3, 0x40, 0xc3, 0x00, 0x6a, 0x09, 0xb3, 0x40, 0xcb, 0x09, 0xb3,
+0x40, 0xc3, 0x09, 0xb3, 0x40, 0xc3, 0x01, 0x6b, 0x08, 0xb2, 0x20, 0xe8, 0x60, 0xc2, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80,
+0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80, 0x08, 0x96, 0x11, 0x80, 0x40, 0xac, 0x01, 0xf4, 0x03, 0x6b, 0x6e, 0xea, 0x16, 0x2a, 0x0d, 0xb4, 0xc0, 0xf0, 0xaa, 0xac, 0xf6, 0xf3, 0x1c, 0x4b,
+0xac, 0xeb, 0xc0, 0xf0, 0x6a, 0xcc, 0x0a, 0xb3, 0x40, 0xc3, 0x0a, 0xb4, 0x0a, 0xb3, 0x40, 0xc3, 0x40, 0xcc, 0x00, 0x6b, 0x09, 0xb2, 0x60, 0xc2, 0x09, 0xb2, 0x60, 0xc2, 0x01, 0x6b, 0x09, 0xb2,
+0x60, 0xc2, 0x20, 0xe8, 0x00, 0x6a, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80,
+0x08, 0x96, 0x11, 0x80, 0x08, 0xb3, 0xa0, 0xa3, 0x01, 0x6b, 0x40, 0x9c, 0xac, 0xeb, 0x02, 0x23, 0x10, 0x6b, 0x6d, 0xea, 0x02, 0x6b, 0xac, 0xeb, 0x02, 0x23, 0x04, 0xb3, 0x6d, 0xea, 0x40, 0xdc,
+0x20, 0xe8, 0x00, 0x6a, 0x1c, 0x96, 0x11, 0x80, 0x00, 0x00, 0x10, 0x00, 0x0b, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6b, 0xfd, 0x4a, 0x6c, 0xea, 0x02, 0x5a, 0x0b, 0x60, 0x08, 0xb2, 0x40, 0xa2,
+0x08, 0x2a, 0x63, 0xa4, 0x02, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x03, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x43, 0xc4, 0x20, 0xe8, 0x00, 0x6a, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0x89, 0x04, 0x11, 0x80,
+0xf6, 0x63, 0x13, 0x62, 0x12, 0xd1, 0x11, 0xd0, 0x45, 0xa4, 0xff, 0xf7, 0x1f, 0x68, 0xac, 0xe8, 0xa4, 0xa4, 0x0e, 0xd2, 0x63, 0xb2, 0x40, 0x82, 0x11, 0x6e, 0x00, 0x52, 0xa0, 0xf0, 0x1a, 0x60,
+0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xe8, 0x60, 0xb2, 0x01, 0x6b, 0xac, 0xeb, 0x12, 0xe9, 0x45, 0xe1, 0xc0, 0xf0, 0x48, 0xa1, 0x04, 0x72, 0x06, 0x60, 0x13, 0x72, 0x04, 0x60, 0x90, 0x67, 0x17, 0x6d,
+0xc3, 0x67, 0x0b, 0x10, 0xe0, 0xf0, 0xc7, 0xa1, 0x6a, 0xee, 0x0b, 0x61, 0x80, 0xf0, 0x4c, 0xa9, 0x04, 0x6d, 0xac, 0xea, 0x06, 0x2a, 0x90, 0x67, 0x17, 0x6d, 0x20, 0x18, 0xf6, 0x27, 0x24, 0x6f,
+0x98, 0x10, 0x04, 0x4c, 0x41, 0xac, 0x0a, 0xd2, 0x42, 0xac, 0x0b, 0xd2, 0x43, 0xac, 0x08, 0xd2, 0x84, 0xac, 0x4e, 0xb2, 0x09, 0xe2, 0x09, 0xd4, 0x80, 0xa2, 0x03, 0x5c, 0x01, 0x4c, 0x01, 0x61,
+0x00, 0x6c, 0x80, 0xc2, 0x49, 0xb2, 0x09, 0xe2, 0x40, 0xa2, 0x03, 0x72, 0x55, 0x61, 0x08, 0x94, 0x02, 0x6f, 0x02, 0x5c, 0x03, 0x61, 0x84, 0x37, 0xff, 0x6a, 0x4c, 0xef, 0x09, 0x94, 0x03, 0x24,
+0x02, 0x4f, 0xff, 0x6a, 0x4c, 0xef, 0x0a, 0x92, 0x0b, 0x96, 0x90, 0x67, 0x00, 0x6d, 0x0f, 0xd3, 0x20, 0x18, 0x4b, 0x29, 0x04, 0xd2, 0x0c, 0xd2, 0x0c, 0x94, 0x02, 0x6a, 0x04, 0xd2, 0x3c, 0xb2,
+0x05, 0xd2, 0x3a, 0xb2, 0x06, 0xd4, 0x09, 0xe2, 0x0d, 0xd2, 0x40, 0xa2, 0x04, 0x6c, 0xfa, 0x6d, 0x07, 0xf0, 0x14, 0x6e, 0xc2, 0xf7, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x0c, 0x92,
+0x0f, 0x93, 0x2a, 0x22, 0x0d, 0x94, 0x00, 0x6a, 0xc3, 0x67, 0x40, 0xc4, 0x17, 0x6d, 0x00, 0x6a, 0x90, 0x67, 0x1c, 0x6f, 0x04, 0xd2, 0x20, 0x18, 0x04, 0x28, 0x0f, 0xd2, 0x7d, 0x67, 0x87, 0x43,
+0x25, 0x4c, 0x60, 0xac, 0x9d, 0x67, 0x80, 0xf0, 0x7e, 0xc9, 0x67, 0x44, 0x19, 0x4b, 0x80, 0xab, 0x7d, 0x67, 0xa0, 0xf0, 0x82, 0xc9, 0x87, 0x43, 0x1d, 0x4c, 0x60, 0xac, 0x9d, 0x67, 0xa0, 0xf0,
+0x66, 0xc9, 0x67, 0x44, 0x21, 0x4b, 0x80, 0xab, 0xa0, 0xf0, 0x80, 0xc9, 0x0f, 0x92, 0x00, 0xf2, 0x5d, 0xc1, 0x00, 0xf2, 0x5e, 0xc1, 0x2d, 0x10, 0x0b, 0x92, 0x08, 0x94, 0x0e, 0x95, 0x04, 0xd2,
+0x0a, 0x97, 0x09, 0x92, 0x05, 0xd4, 0xd0, 0x67, 0x83, 0x67, 0x0f, 0xd3, 0x20, 0x18, 0x25, 0x2c, 0x06, 0xd2, 0x01, 0x6e, 0x0f, 0x93, 0x1e, 0x22, 0xc3, 0x67, 0xe2, 0x67, 0x90, 0x67, 0x17, 0x6d,
+0x20, 0x18, 0xf6, 0x27, 0x0f, 0xd2, 0x0f, 0x92, 0x80, 0xf0, 0xfe, 0xa9, 0xb0, 0x67, 0x82, 0x67, 0x00, 0x18, 0xb4, 0x52, 0x02, 0x6e, 0x90, 0x67, 0x20, 0x18, 0xfa, 0x25, 0x04, 0x6d, 0x01, 0x6a,
+0x4b, 0xea, 0x00, 0xf2, 0x54, 0xc9, 0x00, 0x6a, 0x00, 0xf2, 0x56, 0xc1, 0x20, 0x18, 0x95, 0x28, 0x00, 0x65, 0x01, 0x6e, 0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x46, 0x67, 0x00, 0xef, 0x0a, 0x63,
+0xb8, 0x51, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0xd8, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xf2, 0x63, 0x1b, 0x62, 0x1a, 0xd1, 0x19, 0xd0, 0x40, 0xf5, 0x14, 0xb2, 0x7d, 0x67, 0x40, 0xaa,
+0x51, 0xcb, 0x20, 0xf0, 0x82, 0xa3, 0x40, 0xf5, 0x0c, 0xb2, 0x92, 0x35, 0xa0, 0xc2, 0x13, 0xd5, 0x20, 0xf0, 0x63, 0xa3, 0x01, 0x6a, 0x86, 0x34, 0x6e, 0x31, 0x4c, 0xe9, 0x66, 0x33, 0x4c, 0xeb,
+0x24, 0x31, 0x6d, 0xe9, 0x07, 0x6b, 0x6c, 0xec, 0x10, 0xd4, 0x7c, 0x6c, 0x98, 0xe9, 0x20, 0xf5, 0x08, 0xb3, 0xb1, 0x67, 0x12, 0xec, 0x6d, 0xe4, 0x12, 0xd3, 0x60, 0xa3, 0x10, 0x94, 0x6c, 0xea,
+0x00, 0x18, 0x49, 0xbd, 0x14, 0xd2, 0x11, 0xd2, 0x11, 0x93, 0x0a, 0x6a, 0x58, 0xeb, 0x00, 0xf5, 0x0c, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x61, 0xaa, 0x00, 0xf5, 0x04, 0xb2, 0x60, 0xc2, 0x00, 0xf5,
+0x04, 0xb2, 0x40, 0x9a, 0x04, 0x22, 0x20, 0xf0, 0x02, 0x04, 0x40, 0xea, 0x00, 0x65, 0x13, 0x94, 0x09, 0x74, 0x07, 0x61, 0x10, 0x95, 0x00, 0x6c, 0x01, 0x25, 0x82, 0x41, 0x00, 0x18, 0xb8, 0x82,
+0x00, 0x65, 0x7d, 0x67, 0x20, 0xf0, 0x43, 0xa3, 0x01, 0x68, 0x0c, 0xea, 0x2d, 0x22, 0xc0, 0xf4, 0x18, 0xb2, 0x40, 0xa2, 0x03, 0x6b, 0x6c, 0xea, 0x14, 0x22, 0xc0, 0xf4, 0x10, 0xb3, 0x46, 0xab,
+0x9d, 0x67, 0x50, 0xcc, 0xc0, 0xf2, 0x0c, 0x6c, 0x98, 0xea, 0xc0, 0xf4, 0x04, 0xb4, 0x12, 0xea, 0x49, 0xe4, 0x00, 0x6c, 0x20, 0xf2, 0x9d, 0xc2, 0xe0, 0xf0, 0xa3, 0xa2, 0x00, 0x18, 0x13, 0x3d,
+0x8e, 0xa3, 0xa0, 0xf4, 0x10, 0xb2, 0x60, 0xf1, 0x4b, 0xa2, 0x20, 0xf2, 0x1a, 0x22, 0x00, 0x6a, 0xa0, 0xf4, 0x04, 0xb3, 0x04, 0xd2, 0x05, 0xd3, 0x06, 0xd2, 0x06, 0x6c, 0xfa, 0x6d, 0x26, 0xf5,
+0x05, 0x6e, 0xc0, 0xf5, 0x19, 0x6f, 0x32, 0x10, 0x10, 0x94, 0xb1, 0x67, 0x20, 0x18, 0xc0, 0x0e, 0x09, 0x06, 0x0d, 0x2a, 0x10, 0x93, 0x80, 0xf4, 0x04, 0xb2, 0x69, 0xe2, 0x40, 0xa2, 0x01, 0x72,
+0x00, 0xf2, 0x1f, 0x61, 0x60, 0xf4, 0x18, 0xb2, 0x69, 0xe2, 0x00, 0xc2, 0x1a, 0x12, 0x13, 0x94, 0x02, 0x74, 0x20, 0x61, 0x40, 0xf4, 0x10, 0xb2, 0x40, 0xa2, 0x00, 0xf2, 0x12, 0x2a, 0x40, 0xf4,
+0x14, 0xb2, 0x44, 0x9a, 0x02, 0x72, 0x00, 0xf2, 0x0c, 0x60, 0x00, 0x18, 0x1b, 0xaa, 0x00, 0x65, 0x00, 0x18, 0xa5, 0x3a, 0x00, 0x65, 0x40, 0xf4, 0x00, 0xb3, 0x04, 0xd0, 0x05, 0xd3, 0x06, 0xd2,
+0x06, 0x6c, 0xfa, 0x6d, 0x46, 0xf5, 0x0a, 0x6e, 0xc0, 0xf5, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x00, 0x65, 0xf7, 0x11, 0x10, 0x94, 0xb1, 0x67, 0x00, 0x18, 0xe8, 0xdf, 0x08, 0x06, 0xff, 0x72,
+0xe0, 0xf1, 0x0f, 0x60, 0x00, 0xf4, 0x1c, 0xb2, 0x40, 0x9a, 0xbd, 0x67, 0x10, 0xad, 0x0d, 0x22, 0x14, 0x93, 0x3c, 0x6c, 0x12, 0x95, 0x98, 0xeb, 0x7d, 0x67, 0xd1, 0xab, 0x12, 0xec, 0x91, 0xe5,
+0x04, 0x4c, 0x40, 0xea, 0xb0, 0x67, 0xc0, 0xf1, 0x1c, 0x2a, 0xc0, 0xf2, 0x0c, 0x6a, 0x58, 0xe8, 0x13, 0x93, 0xf7, 0xb2, 0x12, 0x94, 0x12, 0xe8, 0x41, 0xe0, 0x01, 0x6a, 0x44, 0xeb, 0x14, 0x93,
+0x15, 0xd2, 0x3c, 0x6a, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x72, 0xa2, 0x02, 0x73, 0xe0, 0xf0, 0x00, 0x61, 0x20, 0xf0, 0x70, 0xa2, 0xff, 0x73, 0xc0, 0xf0, 0x1b, 0x60, 0x20, 0xf0,
+0x74, 0xa2, 0x10, 0x95, 0xae, 0xeb, 0xc0, 0xf0, 0x15, 0x2b, 0x13, 0x95, 0x96, 0xaa, 0xa0, 0x33, 0x70, 0x33, 0x8e, 0xeb, 0xc0, 0xf0, 0x0e, 0x2b, 0x20, 0xf0, 0x76, 0xa2, 0x01, 0x4b, 0x20, 0xf0,
+0x76, 0xc2, 0xc0, 0xf0, 0x4d, 0xa0, 0x02, 0x72, 0x15, 0x61, 0x15, 0x93, 0x08, 0xf4, 0x10, 0x6a, 0x6c, 0xea, 0x06, 0x22, 0xa0, 0xf0, 0x5c, 0xa8, 0x01, 0x4a, 0xa0, 0xf0, 0x5c, 0xc8, 0x0a, 0x10,
+0x15, 0x94, 0x11, 0xf1, 0x00, 0x6a, 0x8c, 0xea, 0x05, 0x22, 0xc0, 0xf0, 0x42, 0xa8, 0x01, 0x4a, 0xc0, 0xf0, 0x42, 0xc8, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0xbd, 0x67, 0x70, 0xad,
+0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x50, 0xa2, 0x6a, 0xea, 0x0e, 0x60, 0x02, 0x6c, 0x04, 0xd4, 0xd1, 0xb4, 0x05, 0xd4, 0xfa, 0x6d, 0x02, 0x6c, 0xa6, 0xf5, 0x13, 0x6e, 0x61, 0xf4, 0x17, 0x6f,
+0x06, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0x56, 0xa2, 0x04, 0x5a, 0x15, 0x61, 0xc5, 0xb2, 0x60, 0xf1,
+0x45, 0xa2, 0x11, 0x22, 0x20, 0x18, 0x02, 0x26, 0x00, 0x65, 0x2e, 0xea, 0x0c, 0x22, 0xc0, 0xf0, 0x58, 0xa0, 0x09, 0x2a, 0x00, 0x18, 0xac, 0x3b, 0x01, 0x6c, 0xc3, 0xb3, 0x80, 0xa3, 0x01, 0x6a,
+0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0xbf, 0xb3, 0x12, 0xea, 0x49, 0xe4, 0x20, 0xf0, 0xb6, 0xa2, 0xc0, 0xf0, 0x4a, 0xab, 0x03, 0x6c, 0x42, 0x32,
+0x4a, 0x32, 0x8c, 0xea, 0x44, 0x32, 0x42, 0xed, 0x2f, 0x61, 0xb2, 0xb2, 0x60, 0xf1, 0x47, 0xa2, 0x2b, 0x22, 0x17, 0xd3, 0x20, 0x18, 0x02, 0x26, 0x16, 0xd4, 0x2e, 0xea, 0x17, 0x93, 0x16, 0x94,
+0x23, 0x22, 0xc0, 0xf0, 0x59, 0xa0, 0x20, 0x2a, 0xb1, 0xb2, 0xa0, 0xaa, 0x02, 0x6a, 0xac, 0xea, 0x1b, 0x2a, 0xc0, 0xf0, 0x6a, 0xab, 0xaf, 0xb5, 0x40, 0xa5, 0x62, 0x33, 0x72, 0x33, 0x8c, 0xeb,
+0x01, 0x4a, 0xff, 0x6e, 0x64, 0x33, 0xcc, 0xea, 0x01, 0x4b, 0x7a, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x40, 0xc5, 0x10, 0xea, 0x09, 0x2a, 0x00, 0x18, 0x97, 0x3b, 0x01, 0x6c, 0xa2, 0xb3, 0x80, 0xa3,
+0x01, 0x6a, 0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0xa0, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x10, 0x6b, 0x6c, 0xea, 0x30, 0x22, 0x14, 0x93, 0x3c, 0x6a, 0x12, 0x94, 0x58, 0xeb, 0x12, 0xea, 0x49, 0xe4,
+0x20, 0xf0, 0x56, 0xa2, 0x04, 0x5a, 0x04, 0x61, 0x9b, 0xb2, 0x00, 0xf1, 0x54, 0xa2, 0x06, 0x2a, 0xe0, 0xf0, 0x47, 0xa0, 0x1f, 0x2a, 0x99, 0xb2, 0x40, 0xa2, 0x1c, 0x2a, 0x98, 0xb3, 0x40, 0xa3,
+0xff, 0x6c, 0x01, 0x4a, 0x8c, 0xea, 0x40, 0xc3, 0x90, 0xb3, 0x7c, 0x4b, 0x78, 0x9b, 0x07, 0x6c, 0x7a, 0x33, 0x8c, 0xeb, 0x64, 0x33, 0x01, 0x4b, 0x7b, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x10, 0xea,
+0x09, 0x2a, 0x00, 0x18, 0x6c, 0xd0, 0x01, 0x6c, 0x8e, 0xb3, 0x80, 0xa3, 0x01, 0x6a, 0x44, 0xe9, 0x8d, 0xea, 0x40, 0xc3, 0xe0, 0xf0, 0x67, 0xa0, 0x15, 0x94, 0xff, 0x6a, 0x01, 0x5b, 0x78, 0x67,
+0x6b, 0xeb, 0x6c, 0xea, 0x19, 0xf5, 0x18, 0x6b, 0x8c, 0xeb, 0x04, 0x23, 0x10, 0x95, 0x02, 0x25, 0x01, 0x6a, 0x02, 0x10, 0xff, 0x72, 0x03, 0x60, 0x83, 0xb4, 0x31, 0xe4, 0x40, 0xc4, 0x75, 0xb2,
+0x60, 0xf1, 0x50, 0xa2, 0xff, 0x6c, 0xfd, 0x4a, 0x8c, 0xea, 0x02, 0x5a, 0x10, 0x60, 0x80, 0xf2, 0x5c, 0xa0, 0x03, 0x72, 0x0c, 0x61, 0x11, 0x94, 0x0a, 0x6a, 0xbd, 0x67, 0x58, 0xec, 0x91, 0xad,
+0x66, 0xb5, 0x17, 0xd3, 0x12, 0xea, 0x00, 0x18, 0x86, 0x07, 0x55, 0xe5, 0x17, 0x93, 0x06, 0x23, 0x5d, 0x67, 0x90, 0xaa, 0x00, 0x18, 0x51, 0xa3, 0x17, 0xd3, 0x17, 0x93, 0x65, 0xb2, 0x60, 0xf1,
+0x50, 0xa2, 0xff, 0x6c, 0xfd, 0x4a, 0x8c, 0xea, 0x02, 0x5a, 0x04, 0x60, 0x80, 0xf2, 0x5c, 0xa0, 0x03, 0x72, 0x0c, 0x60, 0x5f, 0xb2, 0x29, 0xe2, 0x80, 0xf1, 0x40, 0xa2, 0x07, 0x22, 0x91, 0x67,
+0x00, 0x18, 0xce, 0x06, 0x17, 0xd3, 0x10, 0xd2, 0x17, 0x93, 0x02, 0x10, 0x00, 0x6c, 0x10, 0xd4, 0x11, 0x95, 0x2a, 0x25, 0x65, 0xb2, 0x29, 0xe2, 0x44, 0xa2, 0x01, 0x6c, 0x46, 0x32, 0x8c, 0xea,
+0x23, 0x22, 0x22, 0x2b, 0x62, 0xb2, 0xa9, 0xe2, 0x60, 0xa2, 0x6a, 0x33, 0x60, 0xc2, 0xe0, 0xf0, 0x47, 0xa0, 0x01, 0x72, 0x19, 0x61, 0x5f, 0xb2, 0xa9, 0xe2, 0x40, 0xa2, 0x15, 0x2a, 0x60, 0xf0,
+0x56, 0xa8, 0x7d, 0x67, 0x01, 0x4a, 0x60, 0xf0, 0x56, 0xc8, 0x20, 0xf3, 0x0b, 0x6a, 0x58, 0xcb, 0x59, 0xb2, 0x80, 0x9a, 0x0d, 0x92, 0xb0, 0xab, 0x0b, 0x96, 0x04, 0xd2, 0x0c, 0x97, 0x0e, 0x92,
+0x0a, 0xd5, 0x00, 0x18, 0x8e, 0x1c, 0x05, 0xd2, 0x54, 0xb2, 0x40, 0x9a, 0x06, 0x22, 0x7d, 0x67, 0xb1, 0xab, 0x10, 0x96, 0x40, 0xea, 0x08, 0x04, 0x64, 0x2a, 0x4a, 0xb2, 0x40, 0xa2, 0x19, 0x2a,
+0x46, 0xb2, 0x40, 0xa2, 0x16, 0x2a, 0xc0, 0xf0, 0x6d, 0xa0, 0x02, 0x6c, 0x4c, 0xb2, 0x8e, 0xeb, 0x0a, 0x23, 0x01, 0x6b, 0x60, 0xc2, 0x3d, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x03, 0x6c, 0x42, 0x32,
+0x46, 0x32, 0x4c, 0xec, 0x03, 0x10, 0x60, 0xc2, 0x46, 0xb2, 0x80, 0xa2, 0x00, 0x18, 0x6c, 0xd0, 0x00, 0x65, 0x10, 0x95, 0x02, 0x2d, 0x13, 0x92, 0x08, 0x22, 0x13, 0x93, 0x01, 0x73, 0x34, 0x61,
+0x10, 0x94, 0x32, 0x2c, 0x2b, 0xb2, 0x44, 0x9a, 0x2f, 0x22, 0xe0, 0xf0, 0x47, 0xa0, 0x01, 0x6d, 0xae, 0xea, 0x2a, 0x2a, 0x3c, 0xb3, 0x02, 0x49, 0x28, 0x31, 0x27, 0xe3, 0x60, 0x99, 0x00, 0x53,
+0x23, 0x61, 0x11, 0x93, 0x21, 0x23, 0x11, 0x94, 0x0a, 0x6b, 0x18, 0xf0, 0x00, 0x6d, 0x78, 0xec, 0x1a, 0xb4, 0x12, 0xeb, 0x6d, 0xe4, 0x83, 0xab, 0x00, 0x18, 0x5c, 0x3b, 0x16, 0xd2, 0x11, 0x95,
+0x16, 0x92, 0x2c, 0xb3, 0xad, 0xe3, 0x40, 0xc3, 0x29, 0xb3, 0xad, 0xe3, 0x40, 0xc3, 0x01, 0x6b, 0x04, 0xd3, 0x03, 0x6c, 0x18, 0xb3, 0xfa, 0x6d, 0x86, 0xf6, 0x06, 0x6e, 0xc4, 0xf3, 0x15, 0x6f,
+0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x12, 0xb2, 0x60, 0xf1, 0x49, 0xa2, 0x01, 0x72, 0x08, 0x61, 0x00, 0xf2, 0x52, 0xa0, 0x05, 0x22, 0xa0, 0xf0, 0x44, 0xa8, 0x01, 0x4a, 0xa0, 0xf0,
+0x44, 0xc8, 0x1b, 0x97, 0x1a, 0x91, 0x19, 0x90, 0x00, 0xef, 0x0e, 0x63, 0x08, 0x00, 0x00, 0xb6, 0x89, 0x04, 0x11, 0x80, 0xf8, 0x37, 0x11, 0x80, 0x40, 0x3b, 0x11, 0x80, 0xd8, 0x1a, 0x11, 0x80,
+0xdc, 0x1a, 0x11, 0x80, 0x0c, 0x52, 0x11, 0x80, 0x18, 0x52, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xd4, 0x19, 0x11, 0x80, 0xdc, 0x19, 0x11, 0x80,
+0x28, 0x1a, 0x11, 0x80, 0x37, 0x1a, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x20, 0x01, 0x00, 0xb6, 0x38, 0x1a, 0x11, 0x80, 0xa4, 0x3c, 0x11, 0x80, 0x8e, 0x1b, 0x11, 0x80, 0x36, 0x1a, 0x11, 0x80,
+0x34, 0x1a, 0x11, 0x80, 0xc8, 0x19, 0x11, 0x80, 0xd4, 0x3b, 0x11, 0x80, 0x90, 0x19, 0x11, 0x80, 0x84, 0x19, 0x11, 0x80, 0xe4, 0x37, 0x11, 0x80, 0x24, 0x1a, 0x11, 0x80, 0xf9, 0x19, 0x11, 0x80,
+0x49, 0x00, 0x11, 0x80, 0x0c, 0xa3, 0x00, 0xb0, 0xfc, 0x63, 0x07, 0x62, 0x0f, 0xb3, 0x60, 0xf1, 0x64, 0x9b, 0x0f, 0xb2, 0x6c, 0xea, 0x0f, 0xb3, 0x6e, 0xea, 0x13, 0x2a, 0x0e, 0xb2, 0xff, 0xf7,
+0x1f, 0x6b, 0xff, 0x6c, 0x40, 0xaa, 0x1f, 0x4c, 0x4c, 0xeb, 0x5d, 0x67, 0x68, 0xca, 0x08, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x01, 0x6b, 0x6d, 0xea, 0x7d, 0x67, 0x50, 0xc3, 0x00, 0x18, 0x5c, 0x3b,
+0xa8, 0xab, 0x07, 0x97, 0x00, 0xef, 0x04, 0x63, 0x2c, 0x52, 0x11, 0x80, 0xff, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x00, 0xb6, 0xf0, 0x63, 0x1f, 0x62, 0x1e, 0xd1, 0x1d, 0xd0,
+0x80, 0xac, 0xc0, 0xf2, 0x0c, 0x68, 0xdf, 0xb2, 0x18, 0xec, 0x18, 0xd4, 0xa0, 0xa5, 0x12, 0xd5, 0x12, 0xe8, 0x41, 0xe0, 0xe0, 0xf0, 0x47, 0xa0, 0x13, 0xd2, 0xa0, 0xf0, 0x60, 0xa8, 0x19, 0xd3,
+0xa0, 0xf0, 0x82, 0xa8, 0x80, 0xf0, 0x7e, 0xa8, 0x17, 0xd4, 0xa0, 0xf0, 0xa6, 0xa8, 0x16, 0xd5, 0xe0, 0xf0, 0x4e, 0xa0, 0x11, 0xd2, 0x00, 0x6a, 0xc0, 0xf2, 0x44, 0xc0, 0xc0, 0xf2, 0x45, 0xc0,
+0xe0, 0xf0, 0x23, 0xa0, 0x11, 0x94, 0x1b, 0xd3, 0x00, 0x18, 0x49, 0xbd, 0xb1, 0x67, 0x0a, 0x6c, 0x98, 0xea, 0x14, 0xd2, 0xcc, 0xb2, 0x12, 0xec, 0x49, 0xe4, 0x15, 0xd2, 0xe0, 0xf0, 0xa3, 0xa0,
+0x00, 0x18, 0x56, 0x3d, 0x11, 0x94, 0x12, 0x92, 0x1b, 0x93, 0x1a, 0x22, 0x13, 0x94, 0x01, 0x74, 0x17, 0x61, 0x15, 0x92, 0x03, 0xf4, 0x00, 0x6c, 0x18, 0xf0, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97,
+0xc3, 0xaa, 0x01, 0x6a, 0x04, 0xd2, 0xc1, 0xb2, 0x05, 0xd2, 0x04, 0x6c, 0x7b, 0x6a, 0xfa, 0x6d, 0x06, 0xf0, 0x11, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x1b, 0x93,
+0x00, 0x1c, 0x73, 0x1b, 0x1b, 0xd3, 0x0a, 0x04, 0xb1, 0x67, 0x00, 0x18, 0x44, 0x97, 0x1a, 0xd2, 0x0a, 0x92, 0xb7, 0xb4, 0x1b, 0x93, 0x46, 0x32, 0x01, 0x4a, 0x8c, 0xea, 0x0a, 0xd2, 0xa0, 0xf2,
+0x9e, 0xa8, 0x10, 0xd4, 0x07, 0x2c, 0x12, 0x95, 0x01, 0x75, 0x04, 0x61, 0x00, 0x1c, 0x7a, 0x1b, 0x1a, 0x94, 0x50, 0x11, 0x06, 0x22, 0x05, 0x23, 0x7b, 0xea, 0x01, 0x2b, 0xe5, 0xe8, 0x10, 0xe9,
+0x01, 0x10, 0x00, 0x69, 0xff, 0xf7, 0x1f, 0x6c, 0x27, 0xe3, 0x8c, 0xe9, 0x19, 0x94, 0x85, 0xe1, 0x23, 0xeb, 0x01, 0x60, 0x67, 0xe1, 0x12, 0x95, 0x01, 0x75, 0x02, 0x60, 0x10, 0xd3, 0x16, 0x10,
+0xa3, 0xb3, 0xa0, 0xf2, 0x8c, 0x98, 0x8c, 0xeb, 0x43, 0xeb, 0x67, 0xe2, 0x03, 0x61, 0xa1, 0xb1, 0x67, 0xe1, 0x45, 0xe1, 0x10, 0x95, 0x4b, 0xe3, 0xba, 0xe9, 0x01, 0x2d, 0xe5, 0xe8, 0x12, 0xe9,
+0x01, 0x49, 0xb8, 0xe9, 0x12, 0xe9, 0x25, 0xe2, 0x99, 0xb2, 0x4c, 0xe9, 0x11, 0x93, 0xe0, 0xf0, 0xa3, 0xa0, 0x02, 0x6c, 0x74, 0x32, 0xa0, 0x35, 0xff, 0x6b, 0x6c, 0xea, 0xac, 0x35, 0x4d, 0xed,
+0xff, 0xf7, 0x1f, 0x6a, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x0a, 0x93, 0x71, 0xe1, 0x11, 0xd4, 0x05, 0x10, 0x11, 0x95, 0x10, 0x92, 0x55, 0xe5, 0x11, 0xd5, 0x45, 0xe1, 0x08, 0x59, 0xf9, 0x61,
+0x00, 0x18, 0xa5, 0x3a, 0x1b, 0xd3, 0x11, 0x94, 0x1b, 0x93, 0x6f, 0xe4, 0x64, 0x33, 0x6d, 0xe2, 0x70, 0xd8, 0x10, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4e, 0x6c, 0x11, 0x95, 0xff, 0xf7, 0x1f, 0x6a,
+0x48, 0x6c, 0x4c, 0xed, 0x19, 0xd5, 0x00, 0x18, 0x5c, 0x3b, 0x1b, 0xd2, 0x13, 0x93, 0x12, 0x2b, 0x16, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0x6c, 0x17, 0x95, 0x00, 0x18, 0x5c, 0x3b, 0x4a, 0x6c,
+0x7d, 0xb3, 0x1b, 0x92, 0x00, 0xf2, 0x1c, 0x6c, 0xa0, 0xab, 0x40, 0x6b, 0x4c, 0xed, 0x6d, 0xed, 0x4c, 0xed, 0x16, 0x10, 0x79, 0xb3, 0x7c, 0x4b, 0x78, 0x9b, 0x10, 0xf0, 0x00, 0x6a, 0x6c, 0xea,
+0x08, 0x22, 0x16, 0x94, 0x03, 0x24, 0x4c, 0x6c, 0x01, 0x6d, 0x05, 0x10, 0x4c, 0x6c, 0x00, 0x6d, 0x02, 0x10, 0x16, 0x95, 0x4c, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x17, 0x95, 0x4a, 0x6c,
+0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x07, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x6c, 0x12, 0x95, 0x0e, 0x2d, 0x13, 0x92, 0x01, 0x72, 0x0b, 0x61, 0x14, 0x93, 0x69, 0xb2, 0x69, 0xe2, 0xa0, 0xc2,
+0x68, 0xb2, 0x69, 0xe2, 0x7d, 0x67, 0x87, 0x43, 0x41, 0x4c, 0x60, 0xa4, 0x60, 0xc2, 0x1a, 0x94, 0x00, 0x1c, 0x7a, 0x1b, 0x02, 0x49, 0x00, 0x18, 0x1c, 0x04, 0x00, 0x65, 0x01, 0xf0, 0x00, 0x6d,
+0x00, 0x18, 0x91, 0xbe, 0x5e, 0x6c, 0x03, 0x6a, 0x19, 0x95, 0x04, 0xd2, 0x11, 0x92, 0x57, 0xb4, 0x05, 0xd4, 0x06, 0xd5, 0x07, 0xd2, 0x00, 0x6c, 0x44, 0x32, 0xfa, 0x6d, 0xa6, 0xf0, 0x1c, 0x6e,
+0x40, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x08, 0xd2, 0x12, 0x94, 0x3b, 0x2c, 0x13, 0x95, 0x01, 0x75, 0x1a, 0x61, 0x15, 0x92, 0x18, 0xf0, 0x00, 0x6c, 0x03, 0xf4, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97,
+0xc3, 0xaa, 0x01, 0x6a, 0x04, 0xd2, 0x49, 0xb3, 0x7b, 0x6a, 0x04, 0x6c, 0xfa, 0x6d, 0xc6, 0xf0, 0x1f, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x20, 0x6a,
+0x00, 0xf2, 0x50, 0xc0, 0x40, 0x10, 0x51, 0x59, 0x06, 0x61, 0x18, 0x95, 0xff, 0xf7, 0x1f, 0x6c, 0x00, 0x18, 0xc7, 0x9c, 0x2c, 0xec, 0x15, 0x92, 0x18, 0xf0, 0x00, 0x6c, 0x01, 0xf4, 0x00, 0x6d,
+0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x01, 0x6a, 0x04, 0xd2, 0x38, 0xb2, 0x05, 0xd2, 0x04, 0x6c, 0x7b, 0x6a, 0xfa, 0x6d, 0xe6, 0xf0, 0x10, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x20, 0x18, 0xa3, 0x30,
+0x06, 0xd2, 0x13, 0x93, 0x20, 0x2b, 0x12, 0x94, 0x1e, 0x24, 0x51, 0x59, 0x1c, 0x61, 0x18, 0x95, 0xff, 0xf7, 0x1f, 0x6c, 0x00, 0x18, 0xc7, 0x9c, 0x2c, 0xec, 0x15, 0x92, 0x01, 0xf4, 0x00, 0x6c,
+0x18, 0xf0, 0x00, 0x6d, 0x00, 0x18, 0xa6, 0x97, 0xc3, 0xaa, 0x01, 0x6a, 0x04, 0xd2, 0x27, 0xb2, 0x05, 0xd2, 0x04, 0x6c, 0x7b, 0x6a, 0xfa, 0x6d, 0x06, 0xf1, 0x01, 0x6e, 0xc4, 0xf3, 0x15, 0x6f,
+0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x10, 0x94, 0x7d, 0x67, 0x60, 0xf2, 0x0b, 0x6a, 0x5a, 0xcb, 0x25, 0xb2, 0x0b, 0xd4, 0x80, 0x9a, 0x0e, 0x92, 0x10, 0x95, 0x0c, 0x96, 0x04, 0xd2, 0x0d, 0x97,
+0x0f, 0x92, 0x00, 0x18, 0x8e, 0x1c, 0x05, 0xd2, 0x03, 0x6a, 0x10, 0x95, 0x04, 0xd2, 0x17, 0xb2, 0x05, 0xd2, 0x16, 0x93, 0x17, 0x92, 0x06, 0xd5, 0x05, 0x6c, 0xfa, 0x6d, 0x06, 0xf1, 0x15, 0x6e,
+0x82, 0xf7, 0x1e, 0x6f, 0x07, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x08, 0xd3, 0x14, 0x94, 0x0d, 0x24, 0x64, 0x67, 0xff, 0x4b, 0x68, 0x33, 0x15, 0xb4, 0x71, 0xe4, 0x00, 0x6a, 0x40, 0xdc, 0x14, 0xb4,
+0x71, 0xe4, 0x40, 0xdc, 0x13, 0xb4, 0x6d, 0xe4, 0x40, 0xdb, 0x18, 0x95, 0x12, 0xb2, 0x00, 0x6b, 0xa9, 0xe2, 0x60, 0xc2, 0x1f, 0x97, 0x1e, 0x91, 0x1d, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x10, 0x63,
+0x20, 0x56, 0x11, 0x80, 0x40, 0x3b, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x08, 0x1c, 0x02, 0x00, 0xb6, 0x4c, 0x00, 0x11, 0x80, 0x84, 0x19, 0x11, 0x80,
+0x90, 0x19, 0x11, 0x80, 0xa0, 0x48, 0x11, 0x80, 0x44, 0x1a, 0x11, 0x80, 0x74, 0x1a, 0x11, 0x80, 0xa4, 0x1a, 0x11, 0x80, 0xd8, 0x95, 0x11, 0x80, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd1, 0x0d, 0xd0,
+0x7a, 0xb2, 0x01, 0x6c, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x78, 0xb3, 0x60, 0xab, 0x09, 0xd3, 0x78, 0xb3, 0x60, 0xa3, 0x8e, 0xeb, 0x04, 0x2b, 0x77, 0xb4, 0x60, 0xc4, 0x77, 0xb4,
+0x60, 0xc4, 0x00, 0x6b, 0x08, 0xd3, 0xd5, 0x10, 0x75, 0xb3, 0x60, 0x9b, 0x05, 0x23, 0x08, 0xf0, 0x00, 0x6b, 0x4c, 0xeb, 0xc0, 0xf0, 0x12, 0x23, 0x09, 0x94, 0x08, 0xf0, 0x00, 0x6b, 0x4c, 0xeb,
+0x8f, 0xe8, 0x4c, 0xe8, 0x00, 0x31, 0x20, 0x31, 0x23, 0x31, 0x23, 0x31, 0x03, 0x23, 0x00, 0x18, 0x05, 0x9c, 0x00, 0x65, 0x6b, 0xb2, 0x7c, 0x4a, 0x55, 0x9a, 0x02, 0x6b, 0x6c, 0xea, 0x0f, 0x22,
+0x00, 0x51, 0x0d, 0x60, 0x00, 0x18, 0xde, 0x1a, 0x00, 0x65, 0x67, 0xb2, 0x40, 0xf0, 0x63, 0xa2, 0x06, 0x23, 0xff, 0xf7, 0x1e, 0x6b, 0x6c, 0xe8, 0x00, 0x6b, 0x40, 0xf0, 0x63, 0xc2, 0x08, 0x6a,
+0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xcd, 0x09, 0x00, 0x65, 0x02, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x80, 0x18, 0x74, 0x2f, 0x00, 0x65, 0x01, 0x6a, 0x0c, 0xea, 0x46, 0x22, 0x00, 0x18, 0x42, 0x13,
+0x00, 0x6c, 0x5a, 0xb2, 0x40, 0xa2, 0x40, 0x22, 0x59, 0xb2, 0x60, 0xf1, 0x44, 0xa2, 0x3c, 0x22, 0x58, 0xb1, 0xe0, 0xf0, 0x47, 0xa1, 0x01, 0x72, 0x37, 0x61, 0xc0, 0xf0, 0x48, 0xa1, 0x04, 0x5a,
+0x33, 0x61, 0xc0, 0xf0, 0x4d, 0xa1, 0x02, 0x6b, 0x6e, 0xea, 0x2e, 0x2a, 0xe0, 0xf0, 0x8e, 0xa1, 0xe0, 0xf0, 0xa3, 0xa1, 0xc3, 0x67, 0x00, 0x18, 0x8f, 0x3c, 0x0a, 0xd2, 0x00, 0xf2, 0x65, 0xa1,
+0x0a, 0x92, 0x0f, 0x73, 0x13, 0x60, 0x9d, 0x67, 0x01, 0x6b, 0x03, 0x6e, 0x78, 0xc4, 0x5a, 0xc4, 0x64, 0x6b, 0x00, 0x6c, 0x06, 0x05, 0xe6, 0x67, 0x04, 0xd3, 0x00, 0x18, 0x23, 0xe3, 0x05, 0xd2,
+0x0f, 0x6a, 0x00, 0xf2, 0x45, 0xc1, 0x00, 0x18, 0xce, 0x06, 0x00, 0x6c, 0x3f, 0xb2, 0xa0, 0xa2, 0xe1, 0xf7, 0x1d, 0x6a, 0xa0, 0x35, 0xb0, 0x35, 0x4d, 0xed, 0x3f, 0xb2, 0x81, 0xa2, 0xff, 0xf7,
+0x1f, 0x6a, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x20, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xf4, 0x05, 0x00, 0x65, 0x04, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x43, 0x11, 0x00, 0x65,
+0x02, 0xf0, 0x00, 0x6a, 0x0c, 0xea, 0x09, 0x22, 0x00, 0x18, 0x5f, 0x11, 0x00, 0x65, 0x33, 0xb2, 0x40, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xb6, 0xa3, 0x00, 0x65, 0x00, 0xf6, 0x00, 0x6a, 0x0c, 0xea,
+0x06, 0x22, 0x2f, 0xb2, 0xff, 0xf7, 0x1f, 0x6c, 0x40, 0xaa, 0x4c, 0xec, 0x08, 0xd4, 0x00, 0xf2, 0x00, 0x6a, 0x0c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xf6, 0x12, 0x08, 0x94, 0x00, 0xf4, 0x00, 0x6a,
+0x0c, 0xea, 0x0f, 0x22, 0x00, 0x18, 0x2f, 0x13, 0x08, 0x94, 0xfe, 0xf7, 0x1f, 0x6d, 0x00, 0x18, 0xac, 0xbe, 0x5e, 0x6c, 0x1b, 0xb2, 0xe0, 0xf0, 0x54, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xb9, 0xab,
+0x00, 0x65, 0x01, 0xf0, 0x00, 0x69, 0x50, 0x67, 0x2c, 0xea, 0x07, 0x22, 0x00, 0x18, 0x17, 0x13, 0x00, 0x65, 0x5e, 0x6c, 0x00, 0x18, 0x91, 0xbe, 0xb1, 0x67, 0xff, 0x6a, 0x01, 0x4a, 0x0c, 0xea,
+0x03, 0x22, 0x00, 0x18, 0x46, 0x05, 0x00, 0x65, 0x08, 0xb2, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x09, 0x94, 0x8f, 0xeb, 0x4c, 0xeb, 0x3f, 0xf7, 0x06, 0x2b, 0x0f, 0x97, 0x0e, 0x91,
+0x0d, 0x90, 0x00, 0xef, 0x08, 0x63, 0x00, 0x65, 0xbe, 0x00, 0x00, 0xb6, 0x7e, 0x04, 0x11, 0x80, 0xcc, 0x3b, 0x11, 0x80, 0x3b, 0x1a, 0x11, 0x80, 0x0c, 0x3b, 0x11, 0x80, 0xe8, 0x3b, 0x11, 0x80,
+0x4c, 0x00, 0x11, 0x80, 0x50, 0x46, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x34, 0xf2, 0x04, 0x80, 0xf0, 0x1a, 0x11, 0x80, 0x5c, 0x00, 0x00, 0xb6,
+0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x2b, 0xb2, 0x40, 0x9a, 0x1e, 0xf4, 0x01, 0x6b, 0x6b, 0xeb, 0x4d, 0xeb, 0x40, 0x9c, 0x04, 0x67, 0x6c, 0xea, 0x7c, 0x6b, 0x4c, 0xeb, 0x40, 0xdc, 0x05, 0x23,
+0x25, 0xb3, 0x26, 0xb2, 0x00, 0x18, 0xe5, 0x39, 0x60, 0xda, 0x61, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x99, 0x02, 0x00, 0x65, 0x61, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x03, 0x22,
+0x80, 0x18, 0xee, 0x31, 0x00, 0x65, 0x61, 0xa0, 0x10, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xe0, 0x03, 0x00, 0x65, 0x61, 0xa0, 0x08, 0x6a, 0x4c, 0xeb, 0x0a, 0x23, 0x15, 0xb3, 0x61, 0xa3,
+0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0xc0, 0x00, 0x00, 0x65, 0x00, 0x18, 0xe6, 0x37, 0x00, 0x65, 0x61, 0xa0, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18,
+0xad, 0x02, 0x00, 0x65, 0x61, 0xa0, 0x20, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x2d, 0x02, 0x00, 0x65, 0x0b, 0xb2, 0x60, 0xa2, 0x04, 0x23, 0x00, 0x6b, 0x00, 0x18, 0x5a, 0x33, 0x60, 0xc2,
+0x00, 0x6b, 0x08, 0xb2, 0x60, 0xc2, 0x05, 0x97, 0x04, 0x90, 0x01, 0x6a, 0x00, 0xef, 0x03, 0x63, 0xf4, 0x21, 0x11, 0x80, 0x32, 0x97, 0x79, 0x23, 0x60, 0x8b, 0x10, 0x80, 0x98, 0x07, 0x11, 0x80,
+0xe4, 0x07, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x22, 0xb0, 0x40, 0xa0, 0x01, 0x69, 0x2c, 0xea, 0x38, 0x22, 0x21, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x00, 0x18, 0x64, 0x35,
+0x04, 0xd2, 0x04, 0x92, 0x1e, 0xb3, 0xff, 0x6c, 0x60, 0xda, 0x1e, 0xb2, 0x60, 0x9a, 0x40, 0xa0, 0x40, 0xf7, 0x62, 0x33, 0x46, 0x32, 0x2c, 0xea, 0x8c, 0xea, 0x2c, 0xeb, 0x4e, 0xeb, 0x04, 0x2b,
+0x19, 0xb3, 0x80, 0x9b, 0x01, 0x4c, 0x80, 0xdb, 0x18, 0xb3, 0x80, 0xa3, 0x07, 0x6b, 0x8c, 0xeb, 0x1a, 0x23, 0x40, 0x6b, 0x8c, 0xeb, 0x17, 0x2b, 0x0f, 0xb3, 0xa0, 0xa3, 0x08, 0x6b, 0xac, 0xeb,
+0x12, 0x23, 0x10, 0xb3, 0x04, 0x6c, 0xac, 0xec, 0x60, 0x9b, 0x06, 0x24, 0x40, 0xf7, 0x62, 0x33, 0x01, 0x6c, 0x8c, 0xeb, 0x6e, 0xea, 0x02, 0x10, 0x0d, 0xb2, 0x40, 0xa2, 0x04, 0x2a, 0x0a, 0xb2,
+0x60, 0x9a, 0x01, 0x4b, 0x60, 0xda, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0x6a, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x1c, 0x96, 0x11, 0x80, 0xcc, 0x07, 0x11, 0x80, 0x8d, 0xba, 0x10, 0x80,
+0x50, 0xa0, 0x00, 0xb0, 0x08, 0x22, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x1d, 0xb2, 0x7c, 0x4a, 0x55, 0x9a, 0x20, 0x6b, 0x6c, 0xea, 0x2d, 0x2a,
+0x1b, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0x04, 0x72, 0x28, 0x60, 0x03, 0x72, 0x26, 0x60, 0x19, 0xb2, 0x40, 0x9a, 0x23, 0x2a, 0x18, 0xb2, 0x40, 0xa2, 0x01, 0x6f, 0x18, 0xb3, 0x56, 0x36, 0xec, 0xee,
+0x01, 0x4e, 0x64, 0x6f, 0xf8, 0xee, 0x80, 0xab, 0xff, 0x6d, 0x12, 0xee, 0xc2, 0xec, 0x12, 0x61, 0x40, 0x6b, 0x4c, 0xeb, 0xac, 0xeb, 0x13, 0x23, 0x07, 0x6b, 0x4c, 0xeb, 0xac, 0xeb, 0x0f, 0x23,
+0x80, 0x18, 0x8f, 0x2e, 0x00, 0x65, 0x00, 0x6c, 0x01, 0x2a, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x65, 0x05, 0x10, 0x01, 0x4c, 0x80, 0xcb, 0x02, 0x10, 0x01, 0x6a, 0x01, 0x10, 0x00, 0x6a,
+0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0xe8, 0x3b, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x16, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62,
+0x12, 0xb2, 0xa0, 0xa2, 0x40, 0x6a, 0x60, 0x9c, 0xac, 0xea, 0xff, 0x6c, 0x0d, 0x22, 0x07, 0x6a, 0xac, 0xea, 0x8c, 0xea, 0x09, 0x22, 0x8c, 0xeb, 0x13, 0x23, 0x00, 0x6b, 0x0c, 0xb2, 0x60, 0xca,
+0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x0c, 0x10, 0xff, 0x6a, 0x6c, 0xea, 0x09, 0x22, 0x09, 0xb2, 0x60, 0xa2, 0x1e, 0x6a, 0x6c, 0xea, 0x06, 0x6b, 0x6e, 0xea, 0x02, 0x2a, 0x06, 0xb3, 0x40, 0xc3,
+0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x18, 0x96, 0x11, 0x80, 0x16, 0x96, 0x11, 0x80, 0x44, 0x20, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x06, 0xb2, 0x60, 0xa2,
+0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x18, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x06, 0xb2, 0x60, 0xa2,
+0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x18, 0x96, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x12, 0xb2, 0x60, 0xa2,
+0x40, 0x6a, 0x6c, 0xea, 0x08, 0x22, 0x07, 0x6a, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x0d, 0xb3, 0x0d, 0xb2, 0x60, 0xda, 0x0d, 0xb3, 0x7c, 0x4b,
+0x0d, 0xb2, 0x78, 0x9b, 0x6c, 0xea, 0x08, 0x22, 0x0c, 0xb2, 0x54, 0xf5, 0x0f, 0x6b, 0x60, 0xda, 0x03, 0x10, 0x00, 0x1c, 0xb7, 0x1b, 0x00, 0x65, 0x09, 0xb2, 0x40, 0x9a, 0xfa, 0x2a, 0x05, 0x97,
+0x00, 0xef, 0x03, 0x63, 0x18, 0x96, 0x11, 0x80, 0x20, 0x4e, 0xa5, 0x01, 0x78, 0xa0, 0x00, 0xb0, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x40, 0x00, 0xb8, 0xa0, 0x00, 0xb0, 0xe8, 0x3b, 0x11, 0x80,
+0xf1, 0x63, 0x1d, 0x62, 0x1c, 0xd1, 0x1b, 0xd0, 0xff, 0xf7, 0x1f, 0x6a, 0x8c, 0xea, 0x00, 0x1c, 0x73, 0x1b, 0x16, 0xd2, 0x16, 0x94, 0x88, 0x33, 0x58, 0xb4, 0x6d, 0xe4, 0x82, 0x67, 0x00, 0x1c,
+0x7a, 0x1b, 0x00, 0x9b, 0x00, 0x6a, 0x15, 0xd2, 0x17, 0xd2, 0x9f, 0x10, 0x23, 0xa8, 0x45, 0x29, 0x15, 0x94, 0xff, 0x6a, 0x01, 0x4c, 0x4c, 0xec, 0x0b, 0x5c, 0x15, 0xd4, 0x06, 0x61, 0x00, 0x1c,
+0x73, 0x1b, 0x00, 0x65, 0x82, 0x67, 0x26, 0xd8, 0x0f, 0x10, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x82, 0x67, 0x47, 0x98, 0x02, 0x72, 0x2b, 0x61, 0x17, 0x92, 0x0e, 0x2a, 0x16, 0x93, 0x68, 0x32,
+0x46, 0xb3, 0x49, 0xe3, 0x60, 0x9a, 0x04, 0x2b, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65, 0x7f, 0x10, 0x66, 0x98, 0x14, 0xd3, 0x60, 0xda, 0x05, 0x10, 0x46, 0x98, 0x17, 0x93, 0x46, 0xdb, 0x46, 0x98,
+0x14, 0xd2, 0x01, 0x6a, 0x47, 0xd8, 0x00, 0x6a, 0x00, 0x1c, 0x7a, 0x1b, 0x46, 0xd8, 0x43, 0x98, 0x03, 0x22, 0x80, 0x98, 0x40, 0xea, 0xa5, 0x98, 0x44, 0x98, 0x01, 0x72, 0x65, 0x61, 0x47, 0x98,
+0x01, 0x72, 0x62, 0x61, 0x80, 0x98, 0x20, 0x18, 0x7a, 0x34, 0xa2, 0x98, 0x5d, 0x10, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65, 0x06, 0x98, 0x14, 0xd0, 0x57, 0x10, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65,
+0x82, 0x67, 0x47, 0x98, 0x02, 0x72, 0x09, 0x61, 0x43, 0xa8, 0x66, 0x98, 0xff, 0x4a, 0x43, 0xc8, 0x00, 0x1c, 0x7a, 0x1b, 0x14, 0xd3, 0x17, 0xd0, 0x04, 0x10, 0x00, 0x1c, 0x7a, 0x1b, 0x00, 0x65,
+0x14, 0xd0, 0x47, 0x98, 0x02, 0x72, 0x40, 0x61, 0x63, 0x98, 0x25, 0xb2, 0x4b, 0xe3, 0x3c, 0x2a, 0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xea, 0x23, 0xb3, 0x12, 0xe9, 0x65, 0xe1, 0x8b, 0x99, 0x60, 0x98,
+0x8e, 0xeb, 0x2d, 0x2b, 0xe0, 0xf0, 0xa3, 0xa1, 0x12, 0x04, 0x00, 0x18, 0x44, 0x97, 0x18, 0xd2, 0x0b, 0x6b, 0x04, 0xd3, 0x1c, 0xb3, 0x05, 0xd3, 0x18, 0x92, 0x12, 0x93, 0x02, 0x6c, 0x07, 0xd2,
+0x06, 0xd3, 0xe0, 0xf0, 0x43, 0xa1, 0xfa, 0x6d, 0xe4, 0xf5, 0x1e, 0x6e, 0x08, 0xd2, 0xe0, 0xf0, 0x4e, 0xa1, 0x64, 0xf4, 0x14, 0x6f, 0x09, 0xd2, 0x4d, 0x99, 0x0a, 0xd2, 0x60, 0xf2, 0x52, 0xa1,
+0x0b, 0xd2, 0x60, 0xf2, 0x53, 0xa1, 0x0c, 0xd2, 0x4c, 0x99, 0x0d, 0xd2, 0x40, 0x98, 0x0e, 0xd2, 0x43, 0xa8, 0x0f, 0xd2, 0x48, 0x98, 0x20, 0x18, 0xa3, 0x30, 0x10, 0xd2, 0x05, 0x10, 0x01, 0x4a,
+0xff, 0x6b, 0x6c, 0xea, 0x0a, 0x5a, 0xc4, 0x61, 0x14, 0x90, 0x5f, 0xf7, 0x1f, 0x28, 0x1d, 0x97, 0x1c, 0x91, 0x1b, 0x90, 0x00, 0xef, 0x0f, 0x63, 0xb8, 0x8a, 0x11, 0x80, 0xe5, 0xb9, 0x04, 0x80,
+0x20, 0x56, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xc8, 0x72, 0x04, 0x61, 0x80, 0x18, 0x38, 0x33, 0x80, 0xac, 0x03, 0x10, 0x20, 0x18, 0x89, 0x35, 0x00, 0x65,
+0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xf8, 0x63, 0x0f, 0x62, 0x0e, 0xd0, 0x68, 0xa4, 0x01, 0x6a, 0x04, 0x67, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x0a, 0x02, 0x00, 0x65, 0x56, 0x2a,
+0x68, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x38, 0xb3, 0x01, 0x22, 0x01, 0x6a, 0x40, 0xc3, 0x68, 0xa0, 0x04, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x97, 0x01, 0x90, 0x67, 0x47, 0x2a, 0x68, 0xa0,
+0x08, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0x72, 0x01, 0x90, 0x67, 0x3f, 0x2a, 0x2f, 0xb2, 0x7c, 0x4a, 0x58, 0x9a, 0x02, 0x6b, 0x6c, 0xea, 0x18, 0x22, 0x68, 0xa0, 0x80, 0x6a, 0x4b, 0xea,
+0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0xf0, 0x01, 0x90, 0x67, 0x2e, 0x2a, 0x68, 0xa0, 0x40, 0x6a, 0x6c, 0xea, 0x04, 0x22, 0x00, 0x18, 0xdc, 0x01, 0x90, 0x67, 0x26, 0x2a,
+0x62, 0x98, 0xc1, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x37, 0x22, 0x20, 0xb2, 0x80, 0xf0, 0x7c, 0xa2, 0x5d, 0x67, 0x20, 0xf0, 0x70, 0xc2, 0x04, 0x6a, 0x6c, 0xea, 0x07, 0x22, 0x66, 0xa0, 0x7f, 0x6a,
+0x6c, 0xea, 0x21, 0x6b, 0x6b, 0xeb, 0x6c, 0xea, 0x46, 0xc0, 0x18, 0xb2, 0x20, 0xf0, 0x7b, 0xa2, 0x5d, 0x67, 0x20, 0xf0, 0x74, 0xc2, 0x40, 0x6a, 0x6c, 0xea, 0x05, 0x22, 0x66, 0xa0, 0x21, 0x6a,
+0x4b, 0xea, 0x6c, 0xea, 0x46, 0xc0, 0x00, 0x18, 0x69, 0x37, 0x84, 0x40, 0x05, 0x6a, 0x04, 0xd2, 0x0f, 0xb2, 0x05, 0xd2, 0x40, 0x98, 0x04, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x43, 0x98, 0x44, 0xf5,
+0x1d, 0x6e, 0xa1, 0xf1, 0x1a, 0x6f, 0x07, 0xd2, 0x42, 0x98, 0x08, 0xd2, 0x41, 0x98, 0x09, 0xd2, 0x44, 0x98, 0x20, 0x18, 0xa3, 0x30, 0x0a, 0xd2, 0x0f, 0x97, 0x0e, 0x90, 0x01, 0x6a, 0x00, 0xef,
+0x08, 0x63, 0x00, 0x65, 0x1d, 0x96, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xf7, 0x63, 0x11, 0x62, 0x10, 0xd1, 0x0f, 0xd0, 0x59, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x40, 0x33,
+0x28, 0x6e, 0x80, 0x18, 0x95, 0x28, 0x00, 0x65, 0x56, 0xb2, 0x80, 0xf0, 0x9c, 0xa2, 0x40, 0x6b, 0x55, 0xb5, 0x8d, 0xeb, 0x97, 0xaa, 0x80, 0xf0, 0x7c, 0xc2, 0x08, 0x6b, 0x8d, 0xeb, 0x96, 0xaa,
+0x77, 0xca, 0x07, 0xf4, 0x01, 0x6b, 0x6b, 0xeb, 0x8c, 0xeb, 0x50, 0xb4, 0x76, 0xca, 0x60, 0x9c, 0xad, 0xeb, 0x60, 0xdc, 0x00, 0x6c, 0x4e, 0xb3, 0x80, 0xcb, 0x78, 0xaa, 0x4d, 0xb2, 0x80, 0xa2,
+0x01, 0x6d, 0x8e, 0x32, 0xac, 0xea, 0x50, 0x36, 0x11, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x92, 0x33, 0xac, 0xeb, 0xcd, 0xea, 0x60, 0x33, 0xff, 0xf5, 0x1e, 0x4d, 0x64, 0x33, 0xac, 0xea, 0x6d, 0xea,
+0x07, 0x6b, 0x8c, 0xeb, 0x04, 0x53, 0x04, 0x61, 0x07, 0x6b, 0x6b, 0xeb, 0x4c, 0xeb, 0x07, 0x10, 0x03, 0x6c, 0x6c, 0xec, 0x84, 0x33, 0x07, 0x6c, 0x8b, 0xec, 0x4c, 0xec, 0x8d, 0xeb, 0x39, 0xb2,
+0x78, 0xca, 0x3c, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x6c, 0xea, 0x03, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x38, 0xb2, 0x60, 0xa2, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea,
+0x12, 0x22, 0x00, 0x68, 0x00, 0x18, 0x44, 0x1c, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x00, 0x18, 0x44, 0x1c, 0x01, 0x6c, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x01, 0x48, 0xff, 0x6a,
+0x4c, 0xe8, 0x04, 0x58, 0xef, 0x61, 0x2c, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x11, 0x22, 0x2a, 0xb4, 0xa3, 0xa4, 0x09, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x43, 0xc4, 0x01, 0x6d, 0x28, 0xb4,
+0x76, 0x32, 0xac, 0xea, 0xc0, 0xa4, 0x03, 0x4a, 0x54, 0x35, 0x1f, 0x6a, 0xcc, 0xea, 0xad, 0xea, 0x40, 0xc4, 0x20, 0xb2, 0x00, 0xa2, 0x20, 0xb2, 0xc0, 0xa2, 0x22, 0xb2, 0xa0, 0xa2, 0x22, 0xb2,
+0x04, 0x6c, 0x6c, 0xec, 0x40, 0x9a, 0x65, 0x67, 0x0b, 0x24, 0xc6, 0x34, 0x40, 0xf7, 0x42, 0x32, 0x8e, 0xea, 0x01, 0x6c, 0x8c, 0xea, 0xff, 0x6c, 0x8c, 0xea, 0x00, 0x6b, 0x01, 0x22, 0x01, 0x6b,
+0x1a, 0xb2, 0x07, 0x69, 0xe0, 0x9a, 0x18, 0xb2, 0x80, 0x9a, 0x19, 0xb2, 0x40, 0x9a, 0x04, 0xd1, 0x07, 0xd6, 0x08, 0xd5, 0x0a, 0xd7, 0x0b, 0xd4, 0x16, 0xb1, 0x05, 0x6c, 0xfa, 0x6d, 0x84, 0xf4,
+0x13, 0x6e, 0xa4, 0xf3, 0x12, 0x6f, 0x05, 0xd1, 0x06, 0xd0, 0x09, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x0c, 0xd2, 0x11, 0x97, 0x10, 0x91, 0x0f, 0x90, 0x00, 0xef, 0x09, 0x63, 0xd8, 0x95, 0x11, 0x80,
+0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x01, 0x00, 0x5c, 0xa0, 0x00, 0xb0, 0x16, 0x96, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x1c, 0x96, 0x11, 0x80, 0x30, 0x21, 0x11, 0x80, 0x10, 0x21, 0x11, 0x80,
+0xd2, 0x06, 0x11, 0x80, 0x50, 0xa0, 0x00, 0xb0, 0x40, 0xa0, 0x00, 0xb0, 0x2c, 0x00, 0x00, 0xb5, 0xc8, 0xe7, 0x04, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x18, 0xb2, 0x19, 0xb3,
+0x63, 0xea, 0x26, 0x61, 0x18, 0xb2, 0x80, 0x9a, 0x18, 0xb3, 0x8e, 0xeb, 0x21, 0x2b, 0x02, 0xaa, 0x17, 0xb5, 0x1d, 0x10, 0x17, 0xb4, 0x42, 0x45, 0x43, 0xec, 0x1a, 0x61, 0xc0, 0xa2, 0xff, 0xf7,
+0x1f, 0x6f, 0x43, 0x46, 0x43, 0xe8, 0x14, 0x61, 0x45, 0xe5, 0x23, 0xec, 0x11, 0x61, 0x81, 0xa5, 0x60, 0xa5, 0x80, 0x34, 0x6d, 0xec, 0xec, 0xec, 0xe0, 0xf3, 0x14, 0x5c, 0x09, 0x60, 0x43, 0xe0,
+0x0d, 0xb2, 0x03, 0x4d, 0x91, 0xe2, 0x00, 0x18, 0x0d, 0x33, 0xec, 0xe8, 0xb1, 0x67, 0xe2, 0x28, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0xf0, 0xff, 0x10, 0x80,
+0x50, 0xf0, 0x10, 0x80, 0x54, 0xf0, 0x10, 0x80, 0x55, 0xab, 0x23, 0x87, 0x5a, 0xf0, 0x10, 0x80, 0xff, 0xff, 0x10, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xf4, 0x63, 0x17, 0x62, 0x16, 0xd1, 0x15, 0xd0,
+0xff, 0x69, 0x69, 0xb0, 0x61, 0xf3, 0x06, 0x6d, 0x8c, 0xe9, 0x00, 0x18, 0x5c, 0x3b, 0x22, 0x6c, 0x20, 0xf0, 0xbf, 0xa0, 0xf3, 0x6a, 0x24, 0x6c, 0xa0, 0x35, 0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed,
+0x40, 0xf0, 0xa1, 0xa0, 0x40, 0xf0, 0x40, 0xa0, 0x26, 0x6c, 0xa0, 0x35, 0x00, 0x18, 0x5c, 0x3b, 0x4d, 0xed, 0xeb, 0xf0, 0x12, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x28, 0x6c, 0x93, 0xf7, 0x1a, 0x6d,
+0x00, 0x18, 0x5c, 0x3b, 0x2a, 0x6c, 0x00, 0x18, 0x5e, 0x3a, 0x01, 0x6c, 0x02, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x20, 0x6d, 0x55, 0xb2, 0xff, 0xf7, 0x1f, 0x6b, 0x60, 0x6d, 0x80, 0xaa, 0x9f, 0xf7,
+0x1f, 0x6a, 0x8c, 0xea, 0x52, 0xb4, 0x80, 0xa4, 0x01, 0x2c, 0x20, 0x6d, 0x4d, 0xed, 0x6c, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x5e, 0x6c, 0xff, 0x6c, 0x09, 0x4c, 0x00, 0x18, 0x5c, 0x3b, 0x03, 0x6d,
+0x4c, 0xb2, 0x41, 0xa2, 0x00, 0x6d, 0x10, 0xd2, 0x10, 0x93, 0x4b, 0xb2, 0x49, 0xe3, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x83, 0x67, 0x49, 0xb3, 0x60, 0xa3, 0x4c, 0xec, 0x11, 0xd4, 0x12, 0xd3,
+0x47, 0xb3, 0x60, 0xa3, 0x0a, 0x2b, 0x41, 0xb3, 0x5e, 0x6c, 0xa0, 0xab, 0x80, 0x6b, 0x4c, 0xed, 0x6d, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0xf0, 0x6d, 0x42, 0xb0, 0x42, 0xb4, 0xe0, 0xf3,
+0x1d, 0x6e, 0x00, 0x18, 0x40, 0x33, 0x00, 0x65, 0xa0, 0xa8, 0x01, 0x6e, 0x3e, 0xb4, 0x00, 0x18, 0x42, 0x3b, 0x00, 0x6f, 0x40, 0xa8, 0x01, 0xf4, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x4d, 0xed,
+0x3a, 0xb2, 0x40, 0xa2, 0x40, 0x32, 0x50, 0x32, 0x4d, 0xed, 0x39, 0xb2, 0x81, 0xa2, 0x00, 0x18, 0x5c, 0x3b, 0x0c, 0xed, 0x11, 0x93, 0xee, 0xf1, 0x09, 0x6a, 0x12, 0x94, 0x6c, 0xea, 0x35, 0xb3,
+0x60, 0xa3, 0x07, 0x6d, 0x8c, 0xed, 0xa0, 0x35, 0x60, 0x33, 0x7c, 0x33, 0xa4, 0x35, 0x6d, 0xed, 0xff, 0x6b, 0x21, 0x4b, 0x6d, 0xea, 0x10, 0x94, 0x4d, 0xed, 0x00, 0x18, 0x5c, 0x3b, 0x0c, 0xed,
+0x02, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x20, 0x6d, 0x00, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x0d, 0x6d, 0x1f, 0xb2, 0x40, 0xa2, 0x08, 0x22, 0x28, 0xb2, 0x40, 0xa2, 0xc4, 0x6c, 0x40, 0x35, 0x4d, 0xed,
+0x00, 0x18, 0x5c, 0x3b, 0x0c, 0xed, 0x06, 0x6a, 0x04, 0xd2, 0x24, 0xb2, 0x05, 0xd2, 0x21, 0xb2, 0x40, 0xa2, 0x03, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x1c, 0xb2, 0x40, 0xa2, 0x44, 0xf1, 0x06, 0x6e,
+0xc4, 0xf3, 0x1a, 0x6f, 0x07, 0xd2, 0x17, 0xb2, 0x40, 0xaa, 0x08, 0xd2, 0x10, 0xb2, 0x40, 0xa2, 0x09, 0xd2, 0x19, 0xb2, 0x40, 0xa2, 0x0a, 0xd2, 0x11, 0xb2, 0x40, 0xa2, 0x20, 0x18, 0xa3, 0x30,
+0x0b, 0xd2, 0x0b, 0x21, 0x0c, 0x00, 0x90, 0x67, 0x55, 0x6d, 0x00, 0x18, 0x40, 0x33, 0x0a, 0x6e, 0x01, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x29, 0x3d, 0xd0, 0x67, 0x17, 0x97, 0x16, 0x91, 0x15, 0x90,
+0x00, 0xef, 0x0c, 0x63, 0x4c, 0x00, 0x11, 0x80, 0x5e, 0x00, 0x00, 0xb6, 0x06, 0x96, 0x11, 0x80, 0x3c, 0xf2, 0x04, 0x80, 0x00, 0x00, 0x00, 0xb6, 0x28, 0x05, 0x11, 0x80, 0x08, 0x96, 0x11, 0x80,
+0x04, 0x96, 0x11, 0x80, 0xa0, 0x94, 0x10, 0x80, 0x01, 0x96, 0x11, 0x80, 0x34, 0xf2, 0x04, 0x80, 0x02, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfa, 0x63, 0x0b, 0x62,
+0x0a, 0xd1, 0x09, 0xd0, 0x8e, 0xb2, 0x0d, 0xd5, 0x60, 0xa2, 0x01, 0x6a, 0x04, 0x67, 0x6c, 0xea, 0x26, 0x67, 0x03, 0x22, 0x00, 0x6b, 0x8b, 0xb2, 0x60, 0xda, 0x40, 0xa8, 0x7f, 0xf4, 0x15, 0x72,
+0x36, 0x60, 0x7f, 0xf4, 0x16, 0x6b, 0x63, 0xea, 0x16, 0x60, 0x7f, 0xf4, 0x10, 0x72, 0x67, 0x60, 0xfb, 0x4b, 0x63, 0xea, 0x09, 0x60, 0x1f, 0xf4, 0x16, 0x72, 0x4c, 0x60, 0x7f, 0xf4, 0x0f, 0x72,
+0x00, 0x6d, 0xe0, 0xf0, 0x16, 0x60, 0xe9, 0x10, 0x7f, 0xf4, 0x13, 0x72, 0x36, 0x60, 0x7f, 0xf4, 0x14, 0x72, 0x36, 0x60, 0xe2, 0x10, 0x9f, 0xf4, 0x11, 0x72, 0xa0, 0xf0, 0x0c, 0x60, 0x9f, 0xf4,
+0x12, 0x6b, 0x63, 0xea, 0x09, 0x60, 0x9f, 0xf4, 0x00, 0x72, 0x80, 0xf0, 0x03, 0x60, 0x9f, 0xf4, 0x10, 0x72, 0x80, 0xf0, 0x06, 0x60, 0xd1, 0x10, 0x5f, 0xf5, 0x04, 0x72, 0x48, 0x60, 0x5f, 0xf5,
+0x05, 0x72, 0x3d, 0x60, 0x9f, 0xf4, 0x12, 0x72, 0xa0, 0xf0, 0x0e, 0x60, 0xc6, 0x10, 0x63, 0xa0, 0x6d, 0xb2, 0x60, 0xc2, 0x64, 0xa0, 0x6d, 0xb2, 0x60, 0xc2, 0x46, 0xa0, 0x65, 0xa0, 0x40, 0x32,
+0x6d, 0xea, 0x6b, 0xb3, 0x40, 0xcb, 0x67, 0xa0, 0x6a, 0xb2, 0x60, 0xc2, 0x68, 0xa0, 0x6a, 0xb2, 0x60, 0xc2, 0x69, 0xa0, 0x69, 0xb2, 0x60, 0xc2, 0x7c, 0x10, 0x43, 0xa0, 0x63, 0xb3, 0x5f, 0x10,
+0x67, 0xb2, 0x84, 0xa2, 0x19, 0x6b, 0x6b, 0xeb, 0x6c, 0xec, 0x84, 0xc2, 0x85, 0xa2, 0x8c, 0xeb, 0x65, 0xc2, 0x6f, 0x10, 0x63, 0xb2, 0x60, 0xa2, 0x07, 0x6a, 0x01, 0x68, 0x6c, 0xea, 0x80, 0xf0,
+0x1d, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x5f, 0xb2, 0x80, 0x18, 0x8f, 0x2e, 0x00, 0xc2, 0x00, 0x68, 0x80, 0xf0, 0x13, 0x2a, 0x00, 0x18, 0xa3, 0x35, 0x00, 0x65, 0x8f, 0x10, 0x43, 0xa0,
+0x00, 0x6c, 0x01, 0x22, 0x01, 0x6c, 0x80, 0x18, 0x6e, 0x34, 0x00, 0x65, 0x52, 0x10, 0x24, 0xa0, 0x63, 0xa0, 0x1f, 0x6a, 0x4c, 0xe9, 0x55, 0xb2, 0x01, 0x23, 0x01, 0x6b, 0x20, 0xf0, 0x6e, 0xc2,
+0x02, 0x6a, 0x04, 0xd2, 0x52, 0xb2, 0x05, 0xd2, 0x50, 0xb3, 0x20, 0xf0, 0x4e, 0xa3, 0x05, 0x6c, 0xfa, 0x6d, 0x44, 0xf2, 0x06, 0x6e, 0x41, 0xf5, 0x10, 0x6f, 0x06, 0xd2, 0x20, 0x18, 0xa3, 0x30,
+0x07, 0xd1, 0x0c, 0x21, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x1f, 0x6b, 0x4c, 0xeb, 0x05, 0x23, 0x2e, 0xeb, 0x03, 0x2b, 0x45, 0xb2, 0x20, 0xf0, 0x2f, 0xc2, 0x85, 0xa0, 0x43, 0xb3,
+0x07, 0x6a, 0x8c, 0xea, 0xa3, 0xa3, 0x50, 0x34, 0x71, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0x8d, 0xea, 0x43, 0xc3, 0x1f, 0x10, 0x63, 0xa0, 0x00, 0x6a, 0x01, 0x23, 0x01, 0x6a, 0x3d, 0xb3, 0x40, 0xc3,
+0x18, 0x10, 0x42, 0xa0, 0x15, 0x72, 0x54, 0x61, 0x3b, 0xb4, 0xa3, 0x40, 0x00, 0x18, 0x0d, 0x33, 0x10, 0x6e, 0x73, 0xa0, 0x39, 0xb2, 0x40, 0xf1, 0x7a, 0xc2, 0x74, 0xa0, 0x40, 0xf1, 0x7b, 0xc2,
+0x75, 0xa0, 0x40, 0xf1, 0x7c, 0xc2, 0x76, 0xa0, 0x40, 0xf1, 0x7d, 0xc2, 0x77, 0xa0, 0x40, 0xf1, 0x7e, 0xc2, 0x00, 0x6d, 0x3e, 0x10, 0x42, 0xa0, 0x12, 0x72, 0x3a, 0x61, 0x30, 0xb4, 0xa3, 0x40,
+0x00, 0x18, 0x0d, 0x33, 0x0d, 0x6e, 0x50, 0xa0, 0x2c, 0xb1, 0xc0, 0xf1, 0x40, 0xc1, 0x51, 0xa0, 0xc0, 0xf1, 0x41, 0xc1, 0x52, 0xa0, 0xc0, 0xf1, 0x42, 0xc1, 0x53, 0xa0, 0xc0, 0xf1, 0x43, 0xc1,
+0x54, 0xa0, 0x80, 0xf1, 0x43, 0xc1, 0xe5, 0x17, 0x42, 0xa0, 0x12, 0x72, 0x21, 0x61, 0x25, 0xb4, 0xa3, 0x40, 0x00, 0x18, 0x0d, 0x33, 0x0d, 0x6e, 0x50, 0xa0, 0x20, 0xb1, 0xc0, 0xf1, 0x44, 0xc1,
+0x51, 0xa0, 0xc0, 0xf1, 0x45, 0xc1, 0x52, 0xa0, 0xc0, 0xf1, 0x46, 0xc1, 0x53, 0xa0, 0xc0, 0xf1, 0x47, 0xc1, 0x54, 0xa0, 0x80, 0xf1, 0x52, 0xc1, 0xcc, 0x17, 0x01, 0x68, 0x0d, 0x93, 0x00, 0x6a,
+0x00, 0xc3, 0x40, 0xc1, 0x00, 0x6a, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x12, 0x6d, 0x00, 0x18, 0x8d, 0x8f, 0x80, 0xa8, 0x01, 0x6a, 0xf5, 0x17, 0x1c, 0x96, 0x11, 0x80,
+0xcc, 0x07, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80, 0x08, 0x96, 0x11, 0x80, 0xb8, 0x51, 0x11, 0x80,
+0x18, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80, 0x90, 0x95, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x09, 0x96, 0x11, 0x80, 0x86, 0x01, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0xd0, 0x01, 0x11, 0x80,
+0xdf, 0x01, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x16, 0xb0, 0x60, 0xa0, 0x07, 0x6a, 0x6c, 0xea, 0x21, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x40, 0xa0, 0x01, 0x6b, 0x14, 0x6c,
+0x56, 0x32, 0x6c, 0xea, 0x00, 0x18, 0xf1, 0x24, 0x84, 0xea, 0x0f, 0xb2, 0x60, 0x9a, 0x24, 0x6a, 0x05, 0x6c, 0x58, 0xeb, 0x0d, 0xb3, 0xfa, 0x6d, 0xc3, 0xf7, 0x03, 0x6e, 0x01, 0xf0, 0x0c, 0x6f,
+0x12, 0xea, 0x49, 0xe3, 0x0a, 0xb3, 0x63, 0xda, 0x00, 0x6a, 0x0a, 0xb3, 0x04, 0xd2, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65,
+0x18, 0x96, 0x11, 0x80, 0x28, 0x00, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x59, 0xcc, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x0f, 0xb0, 0x60, 0xa0, 0x07, 0x6a,
+0x6c, 0xea, 0x14, 0x22, 0x00, 0x18, 0x4a, 0x24, 0x00, 0x6c, 0x40, 0xa0, 0x01, 0x6b, 0x14, 0x6c, 0x56, 0x32, 0x6c, 0xea, 0x00, 0x18, 0xf1, 0x24, 0x84, 0xea, 0x08, 0xb2, 0x60, 0x9a, 0x24, 0x6a,
+0x58, 0xeb, 0x07, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x06, 0xb3, 0x63, 0xda, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x18, 0x96, 0x11, 0x80, 0x28, 0x00, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80,
+0x39, 0xcc, 0x10, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x19, 0xb2, 0xa0, 0x9a, 0x19, 0xb2, 0x60, 0xa2, 0x10, 0x6a, 0x6c, 0xea, 0x26, 0x22, 0x18, 0xb2, 0x80, 0xa2, 0x07, 0x6a, 0x8c, 0xea, 0x21, 0x22,
+0x16, 0xb2, 0x41, 0xaa, 0x80, 0xf4, 0x40, 0x32, 0x80, 0xf5, 0x42, 0x32, 0xac, 0xea, 0x19, 0x22, 0x40, 0x6a, 0x4b, 0xea, 0xac, 0xea, 0xff, 0x6d, 0xac, 0xea, 0x13, 0x22, 0x40, 0x6a, 0x4c, 0xec,
+0x04, 0x2c, 0x80, 0x18, 0x89, 0x35, 0x00, 0x65, 0x0c, 0x10, 0x00, 0x6d, 0x0c, 0xb4, 0x4c, 0xeb, 0xa0, 0xcc, 0x04, 0x23, 0x80, 0x18, 0xa5, 0x35, 0x00, 0x65, 0x03, 0x10, 0x00, 0x18, 0x4a, 0x24,
+0x01, 0x6c, 0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x2c, 0x00, 0x00, 0xb5, 0x1c, 0x96, 0x11, 0x80, 0x18, 0x96, 0x11, 0x80, 0x10, 0x21, 0x11, 0x80, 0x16, 0x96, 0x11, 0x80,
+0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, 0x40, 0xac, 0x03, 0xf0, 0x03, 0x6b, 0x04, 0x67, 0x4e, 0xeb, 0x25, 0x67, 0x1c, 0x2b, 0x2f, 0xb2, 0x02, 0x6c, 0xc0, 0xf1, 0x6a, 0xc2, 0xc0, 0xf1,
+0x89, 0xc2, 0xc0, 0xf1, 0x88, 0xc2, 0x2c, 0xb3, 0x80, 0xa3, 0x01, 0x4c, 0x80, 0xc3, 0x03, 0x6b, 0x60, 0xf1, 0x60, 0xc2, 0x00, 0x18, 0x2e, 0xaa, 0x03, 0x6c, 0x28, 0xb3, 0x80, 0xa3, 0x05, 0x6a,
+0x4b, 0xea, 0x8c, 0xea, 0x09, 0x6c, 0x8b, 0xec, 0x8c, 0xea, 0x40, 0xc3, 0x3a, 0x10, 0xff, 0xf5, 0x10, 0x72, 0x0f, 0x61, 0x43, 0xa4, 0x22, 0xb3, 0x02, 0x6c, 0xfa, 0x6d, 0x6d, 0xe2, 0x60, 0x9b,
+0x04, 0xd4, 0x20, 0xb4, 0x05, 0xd4, 0x06, 0xd2, 0x07, 0xd3, 0x04, 0x6c, 0x63, 0xf5, 0x0f, 0x6e, 0x1c, 0x10, 0xff, 0xf5, 0x11, 0x72, 0x25, 0x61, 0x47, 0xa4, 0x66, 0xa4, 0xfa, 0x6d, 0x40, 0x32,
+0x6d, 0xea, 0x65, 0xa4, 0x40, 0x32, 0x63, 0xf5, 0x1b, 0x6e, 0x6d, 0xea, 0x64, 0xa4, 0x40, 0x32, 0x83, 0xa4, 0x6d, 0xea, 0x12, 0xb3, 0x6d, 0xe4, 0x40, 0xdb, 0x02, 0x6b, 0x04, 0xd3, 0x11, 0xb3,
+0x05, 0xd3, 0x63, 0xa0, 0x07, 0xd2, 0x04, 0x6c, 0x06, 0xd3, 0xc2, 0xf7, 0x1a, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x00, 0x65, 0x80, 0xa8, 0x00, 0x6d, 0x00, 0x18, 0x2b, 0x54, 0xc5, 0x67, 0x66, 0x6a,
+0x40, 0xc1, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0x6a, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0xb5, 0x51, 0x11, 0x80, 0x30, 0x3b, 0x11, 0x80, 0x00, 0xa0, 0x00, 0xb0,
+0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x62, 0xa4, 0x80, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0xff, 0x6d, 0xac, 0xea, 0x0b, 0x22, 0x1d, 0xb2, 0xa1, 0xa2, 0x0c, 0x6a, 0xac, 0xea, 0x0c, 0x72,
+0x09, 0x60, 0x7f, 0x6a, 0x6c, 0xea, 0x21, 0x6b, 0x6b, 0xeb, 0x02, 0x10, 0x21, 0x6a, 0x4b, 0xea, 0x6c, 0xea, 0x42, 0xc4, 0x62, 0xa4, 0xa0, 0x6a, 0x4c, 0xeb, 0x0e, 0x23, 0x14, 0xb4, 0x96, 0xac,
+0x14, 0xb5, 0x01, 0x6e, 0x82, 0x34, 0x96, 0x34, 0x40, 0x9d, 0xcc, 0xec, 0x12, 0xb6, 0x80, 0x34, 0x80, 0x34, 0xcc, 0xea, 0x8d, 0xea, 0x40, 0xdd, 0x0c, 0xb2, 0x80, 0xa2, 0x1e, 0x6a, 0x8c, 0xea,
+0x02, 0x72, 0x0e, 0x61, 0x0d, 0xb2, 0x40, 0xa2, 0x0b, 0x22, 0x0d, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x02, 0x61, 0x00, 0x6c, 0x02, 0x23, 0x04, 0x2a, 0x01, 0x6c, 0x00, 0x18, 0xbe, 0x33, 0x00, 0x65,
+0x05, 0x97, 0x00, 0x6a, 0x00, 0xef, 0x03, 0x63, 0x44, 0x20, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x5c, 0xa0, 0x00, 0xb0, 0xff, 0xff, 0xfe, 0xff, 0x1d, 0x96, 0x11, 0x80, 0xd2, 0x06, 0x11, 0x80,
+0xfd, 0x63, 0x05, 0x62, 0xff, 0x6e, 0x8c, 0xee, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6c, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0,
+0xff, 0xf7, 0x1f, 0x69, 0x04, 0x67, 0x2c, 0xe8, 0xd0, 0x67, 0xac, 0xe9, 0x21, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x80, 0x18, 0x38, 0x36, 0x01, 0x6c, 0x41, 0x6c, 0x01, 0x6d, 0x00, 0x18,
+0x4d, 0xa6, 0x20, 0x6e, 0x46, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x10, 0x6e, 0x47, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6e, 0xd1, 0x67, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6,
+0x43, 0x6c, 0x80, 0x18, 0x38, 0x36, 0x00, 0x6c, 0x02, 0x6a, 0x04, 0xd2, 0x01, 0x6c, 0x09, 0xb2, 0xfa, 0x6d, 0xc3, 0xf1, 0x06, 0x6e, 0xa4, 0xf3, 0x0d, 0x6f, 0x06, 0xd0, 0x07, 0xd1, 0x20, 0x18,
+0xa3, 0x30, 0x05, 0xd2, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x68, 0x18, 0xb4, 0x04, 0x32,
+0x49, 0xe4, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x0e, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe4, 0xc0, 0xaa, 0x3f, 0x6c, 0x6c, 0xec, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x02, 0x48, 0xff, 0x6a,
+0x4c, 0xe8, 0x1e, 0x58, 0xeb, 0x61, 0x00, 0x68, 0x0e, 0xb4, 0x04, 0x32, 0x49, 0xe4, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x0e, 0x60, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe4, 0xc0, 0xaa, 0x3f, 0x6c,
+0x6c, 0xec, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0x22, 0x58, 0xeb, 0x61, 0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xb0, 0xee, 0x10, 0x80,
+0xec, 0xee, 0x10, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x0e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x22, 0x67, 0x10, 0xf0, 0x00, 0x6e, 0x0c, 0xe9,
+0xcb, 0xee, 0x2d, 0xee, 0x0c, 0xee, 0x0e, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x24, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xd1, 0x67, 0x0e, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6,
+0x04, 0xd2, 0x04, 0x92, 0xe1, 0xf7, 0x1f, 0x6b, 0x09, 0x97, 0x4c, 0xeb, 0x43, 0x67, 0x0c, 0xea, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0,
+0x00, 0x69, 0xe0, 0xf1, 0x18, 0x68, 0x1c, 0xb2, 0x80, 0x6b, 0x6b, 0xeb, 0x90, 0x67, 0x60, 0xc2, 0x00, 0x18, 0x10, 0x23, 0x04, 0x05, 0xbd, 0x67, 0x90, 0xa5, 0x18, 0xb2, 0x2d, 0xe2, 0x01, 0x49,
+0x80, 0xc3, 0x01, 0x48, 0xff, 0xf7, 0x1f, 0x6b, 0x06, 0x59, 0x6c, 0xe8, 0xec, 0x61, 0x00, 0x6b, 0x66, 0xc2, 0x68, 0xc2, 0x67, 0xc2, 0x12, 0xb3, 0xe0, 0xf1, 0x85, 0xa3, 0x01, 0x6b, 0x6c, 0xec,
+0x0c, 0x2c, 0x84, 0xa2, 0xff, 0x6d, 0xff, 0x4c, 0xac, 0xec, 0x1f, 0x5c, 0x06, 0x60, 0x83, 0x82, 0x00, 0x54, 0x03, 0x60, 0x66, 0xc2, 0x67, 0xc2, 0x68, 0xc2, 0x08, 0xb2, 0x66, 0xa2, 0x04, 0x23,
+0x64, 0xa2, 0x07, 0xb2, 0x80, 0xf1, 0x61, 0xc2, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x13, 0xa0, 0x00, 0xb0, 0x0c, 0x96, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80,
+0xfc, 0x63, 0x07, 0x62, 0x06, 0xd1, 0x05, 0xd0, 0x00, 0x68, 0x24, 0x67, 0x04, 0x32, 0x49, 0xe1, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x73, 0x29, 0x60, 0x1e, 0xf0, 0x00, 0x6a, 0x6c, 0xea, 0x0c, 0xf0,
+0x00, 0x72, 0x07, 0x61, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe1, 0x00, 0x18, 0x3f, 0x1c, 0x80, 0xaa, 0x18, 0x10, 0x04, 0xf0, 0x00, 0x72, 0x0b, 0x61, 0xff, 0x6c, 0x8c, 0xeb, 0x40, 0x6a, 0x67, 0x33,
+0x4d, 0xeb, 0x41, 0x40, 0x44, 0x32, 0x49, 0xe1, 0x6c, 0xec, 0x01, 0x6d, 0x07, 0x10, 0x0d, 0x2a, 0x41, 0x40, 0x44, 0x32, 0xff, 0x6c, 0x49, 0xe1, 0x6c, 0xec, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6,
+0xc0, 0xaa, 0x02, 0x48, 0xff, 0x6a, 0x4c, 0xe8, 0xd1, 0x17, 0x07, 0x97, 0x06, 0x91, 0x05, 0x90, 0x00, 0xef, 0x04, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d,
+0x20, 0x6b, 0x4d, 0xeb, 0xff, 0xf7, 0x1f, 0x6e, 0x6c, 0xee, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x04, 0x6c, 0x00, 0x18, 0x3f, 0x1c, 0x50, 0x6c, 0x04, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d,
+0x05, 0x97, 0x1f, 0x6b, 0x6c, 0xea, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0xff, 0x68, 0x00, 0x6e, 0x01, 0x6d, 0x8c, 0xe8, 0x00, 0x18, 0x4d, 0xa6,
+0x40, 0x6c, 0x5a, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x5c, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x22, 0x67, 0xff, 0xf7, 0x1f, 0x6b, 0x6c, 0xe9, 0xff, 0xf7, 0x1e, 0x6e, 0x6c, 0xea,
+0x5a, 0x6c, 0x01, 0x6d, 0x2c, 0xee, 0x08, 0xd2, 0x00, 0x18, 0x4d, 0xa6, 0x09, 0xd3, 0x08, 0x92, 0x09, 0x93, 0x03, 0x6e, 0x4d, 0xee, 0x01, 0x6d, 0x6c, 0xee, 0x00, 0x18, 0x4d, 0xa6, 0x5c, 0x6c,
+0x4c, 0xb4, 0x80, 0x18, 0xb0, 0x36, 0x00, 0x65, 0x80, 0x18, 0xcd, 0x36, 0x00, 0x65, 0x08, 0x5a, 0x05, 0x61, 0x02, 0x6c, 0x00, 0x6d, 0x1d, 0xf6, 0x00, 0x6e, 0x04, 0x10, 0x02, 0x6c, 0x00, 0x6d,
+0x19, 0xf6, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x65, 0x43, 0xb4, 0x80, 0x18, 0xb0, 0x36, 0x00, 0x65, 0x06, 0x20, 0x90, 0x67, 0x00, 0x18, 0x44, 0x1c, 0x00, 0x68, 0x70, 0x67, 0x23, 0x10,
+0x01, 0x6d, 0xc5, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x41, 0x6c, 0x38, 0xf0, 0x03, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x01, 0x6d, 0x00, 0x18, 0x3f, 0x1c, 0x0a, 0x6c, 0x00, 0x68, 0x7e, 0x6c,
+0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x00, 0xf2, 0x00, 0x6b, 0x4c, 0xeb, 0x02, 0x23, 0x00, 0x6b, 0x0a, 0x10, 0x00, 0x18, 0x44, 0x1c, 0x0a, 0x6c, 0x01, 0x48, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xe8,
+0x64, 0x58, 0xed, 0x61, 0x01, 0x6b, 0x2d, 0xb4, 0x80, 0x18, 0xb0, 0x36, 0x09, 0xd3, 0x5a, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xd1, 0x67, 0x08, 0x96, 0x5c, 0x6c, 0x00, 0x18, 0x4d, 0xa6,
+0x01, 0x6d, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x18, 0x4d, 0xa6, 0x40, 0x6c, 0x7e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x01, 0x6d, 0x40, 0x6c, 0x01, 0x6d, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x08, 0xd2,
+0x09, 0x93, 0x09, 0x23, 0x21, 0x6c, 0x08, 0xf2, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x69, 0x07, 0x10, 0x21, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7,
+0x1f, 0x69, 0x4c, 0xe9, 0x16, 0xb3, 0x01, 0x6a, 0x04, 0x6c, 0xfa, 0x6d, 0xa3, 0xf1, 0x08, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x05, 0xd3, 0x06, 0xd0, 0x09, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x04, 0xd2,
+0x09, 0x93, 0x02, 0x6a, 0x04, 0xd2, 0x05, 0xd3, 0x08, 0x93, 0xff, 0xf7, 0x1f, 0x6a, 0x05, 0x6c, 0x6c, 0xea, 0xfa, 0x6d, 0xa3, 0xf1, 0x09, 0x6e, 0x44, 0xf5, 0x18, 0x6f, 0x06, 0xd1, 0x20, 0x18,
+0xa3, 0x30, 0x07, 0xd2, 0x51, 0x67, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63, 0x70, 0xef, 0x10, 0x80, 0x90, 0xef, 0x10, 0x80, 0x10, 0xf0, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80,
+0xf5, 0x63, 0x15, 0x62, 0x14, 0xd1, 0x13, 0xd0, 0x02, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x3f, 0x6c, 0x00, 0x6d, 0xff, 0x69, 0x00, 0x18, 0xab, 0xa5, 0x02, 0x67, 0x2c, 0xea, 0xff, 0xf7,
+0x1f, 0x6b, 0x6c, 0xe8, 0x0c, 0xd2, 0x0c, 0x95, 0x02, 0x30, 0x01, 0x6a, 0x2c, 0xe8, 0x82, 0x67, 0xd0, 0x67, 0xe2, 0x67, 0x11, 0xd3, 0x80, 0x18, 0xdb, 0x36, 0x04, 0xd2, 0x0c, 0x95, 0x03, 0x6a,
+0x00, 0x6c, 0xd0, 0x67, 0x0f, 0x6f, 0x80, 0x18, 0xdb, 0x36, 0x04, 0xd2, 0x42, 0x34, 0x1f, 0x6d, 0x8a, 0x34, 0x56, 0x32, 0xac, 0xec, 0xac, 0xea, 0x0c, 0x95, 0x03, 0x6e, 0x0b, 0xd4, 0x04, 0xd6,
+0x00, 0x6c, 0xd0, 0x67, 0x0f, 0x6f, 0x80, 0x18, 0xdb, 0x36, 0x0a, 0xd2, 0x42, 0x37, 0x1f, 0x6c, 0xea, 0x37, 0x8c, 0xef, 0x09, 0xd7, 0x56, 0x35, 0x8c, 0xed, 0x0b, 0x96, 0x09, 0x94, 0x08, 0xd5,
+0x2c, 0xed, 0x2c, 0xee, 0x2c, 0xec, 0x0d, 0xd5, 0x0a, 0x97, 0x97, 0xe6, 0x10, 0xd6, 0x0d, 0x96, 0x2c, 0xef, 0x0e, 0xd4, 0xd3, 0xe7, 0x00, 0xf6, 0x80, 0x34, 0x00, 0xf6, 0x83, 0x34, 0x98, 0xec,
+0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0x11, 0x93, 0x0f, 0xd7, 0x12, 0xec, 0xb8, 0xed, 0x12, 0xed, 0xb1, 0xe4, 0x6c, 0xec, 0x11, 0x5c, 0x09, 0x60, 0x09, 0x94, 0x0b, 0x95, 0x08, 0x96,
+0x0a, 0x97, 0xa5, 0xe4, 0x27, 0x31, 0x6c, 0xe9, 0xe1, 0xe6, 0x50, 0x10, 0x0c, 0x95, 0xd0, 0x67, 0x03, 0x6a, 0x00, 0x6c, 0x0f, 0x6f, 0x11, 0xd3, 0x80, 0x18, 0xdb, 0x36, 0x04, 0xd2, 0x42, 0x34,
+0x1f, 0x6d, 0x8a, 0x34, 0xac, 0xec, 0x10, 0x96, 0xe4, 0x67, 0x2c, 0xef, 0x56, 0x30, 0xac, 0xe8, 0xf7, 0xe6, 0x00, 0xf6, 0xa0, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0x0d, 0x65, 0x0f, 0x95, 0x0c, 0xe9,
+0x11, 0x93, 0x3b, 0xe5, 0x00, 0xf6, 0xc0, 0x36, 0x00, 0xf6, 0xc3, 0x36, 0xd8, 0xee, 0xa8, 0x67, 0x12, 0xee, 0xb8, 0xed, 0x12, 0xed, 0xb9, 0xe6, 0x0e, 0x95, 0x6c, 0xee, 0x11, 0x5e, 0xff, 0xe5,
+0x0d, 0x95, 0x00, 0xf6, 0xe0, 0x37, 0x00, 0xf6, 0xe3, 0x37, 0x27, 0xe5, 0x00, 0xf6, 0x20, 0x35, 0x00, 0xf6, 0xa3, 0x35, 0xb8, 0xed, 0x12, 0xed, 0xf8, 0xef, 0x12, 0xef, 0xf5, 0xe5, 0x6c, 0xed,
+0x09, 0x60, 0xc3, 0xed, 0x0d, 0x61, 0x0b, 0x97, 0xe5, 0xe4, 0x0a, 0x94, 0x27, 0x31, 0x6c, 0xe9, 0x81, 0xe0, 0x0c, 0x10, 0x11, 0x5d, 0x04, 0x61, 0x00, 0x6c, 0x11, 0x68, 0x10, 0x69, 0x09, 0x10,
+0x09, 0x95, 0x08, 0x96, 0xa5, 0xe4, 0x27, 0x31, 0x6c, 0xe9, 0xc1, 0xe0, 0x07, 0x30, 0x6c, 0xe8, 0x01, 0x6c, 0x1f, 0x6b, 0x4c, 0xeb, 0x08, 0x24, 0x10, 0xf0, 0x00, 0x6a, 0x4b, 0xea, 0x4d, 0xeb,
+0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xeb, 0x11, 0x10, 0x01, 0x6d, 0xc5, 0x67, 0x00, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x11, 0xd3, 0x46, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6e, 0x00, 0x6c,
+0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x11, 0x93, 0x20, 0x31, 0x28, 0x31, 0x14, 0x30, 0x2d, 0xe8, 0x6d, 0xe8, 0x00, 0x36, 0xc0, 0x36, 0xc3, 0x36, 0xff, 0xf7, 0x1f, 0x6a, 0xc3, 0x36,
+0x4c, 0xee, 0x21, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x0e, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x21, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0xab, 0xa5, 0x02, 0x67, 0x02, 0x6b, 0x04, 0xd3,
+0x01, 0x6c, 0x09, 0xb3, 0xfa, 0x6d, 0x63, 0xf2, 0x0a, 0x6e, 0xa4, 0xf3, 0x0d, 0x6f, 0x06, 0xd0, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x15, 0x97, 0x14, 0x91, 0x13, 0x90, 0x00, 0xef,
+0x0b, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0xf6, 0x63, 0x13, 0x62, 0x12, 0xd1, 0x11, 0xd0, 0x8c, 0xb3, 0xc0, 0xf1, 0x90, 0xa3, 0x05, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0x9d, 0x67, 0x20, 0xf0,
+0x50, 0xc4, 0xc0, 0xf1, 0x50, 0xc3, 0x00, 0x18, 0x29, 0xa8, 0x01, 0x68, 0x2c, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x69, 0x2c, 0xea, 0xc2, 0x67, 0x0d, 0xee, 0x2c, 0x6c,
+0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x30, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0x2c, 0xea, 0xc2, 0x67, 0x30, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x0d, 0xee, 0x7a, 0xb4, 0x00, 0x6d,
+0x00, 0x18, 0x94, 0xa8, 0x5e, 0x6e, 0x79, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x32, 0x6e, 0x80, 0x18, 0x79, 0x36, 0x00, 0x65, 0x62, 0x67, 0x02, 0x6c, 0x75, 0xb2, 0xfa, 0x6d, 0xc3, 0xf2,
+0x12, 0x6e, 0xc4, 0xf3, 0x15, 0x6f, 0x06, 0xd3, 0x0e, 0xd3, 0x04, 0xd0, 0x20, 0x18, 0xa3, 0x30, 0x05, 0xd2, 0x0e, 0x93, 0x8a, 0x4b, 0x6c, 0xe9, 0x10, 0x59, 0x07, 0x60, 0x04, 0xeb, 0x70, 0x67,
+0x30, 0xf4, 0x01, 0x6a, 0x4c, 0xeb, 0x6b, 0xb4, 0x01, 0x2b, 0x6b, 0xb4, 0x00, 0x6d, 0x00, 0x18, 0x94, 0xa8, 0x22, 0x6e, 0x30, 0x6e, 0x69, 0xb4, 0x00, 0x18, 0x94, 0xa8, 0x00, 0x6d, 0x2c, 0x6c,
+0x00, 0x18, 0xab, 0xa5, 0x00, 0x6d, 0xff, 0xf7, 0x1f, 0x68, 0x0c, 0xea, 0x02, 0x69, 0xc2, 0x67, 0x2b, 0xe9, 0x2c, 0xee, 0x2c, 0x6c, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x30, 0x6c, 0x00, 0x18,
+0xab, 0xa5, 0x00, 0x6d, 0x0c, 0xea, 0xc2, 0x67, 0x30, 0x6c, 0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x2c, 0xee, 0x10, 0x6c, 0x08, 0xf0, 0x00, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x11, 0x6c,
+0x00, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x3d, 0x6e, 0x12, 0x6c, 0x33, 0xf7, 0x16, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d, 0x18, 0x6c, 0x69, 0xf6, 0x0c, 0x6e, 0x00, 0x18, 0x4d, 0xa6, 0x00, 0x6d,
+0x4f, 0xb2, 0x00, 0x9a, 0x4f, 0xb2, 0x4c, 0xe8, 0x46, 0xb2, 0xe0, 0xf1, 0x63, 0xa2, 0xff, 0x73, 0x03, 0x60, 0x04, 0x6a, 0x6c, 0xea, 0x16, 0x2a, 0x4b, 0xb3, 0x81, 0xa3, 0x0c, 0x6a, 0x8c, 0xea,
+0x04, 0x72, 0x13, 0x61, 0x01, 0x6a, 0x04, 0xd2, 0x41, 0xb2, 0x03, 0x6b, 0x05, 0xd2, 0x8a, 0x32, 0x6c, 0xea, 0x83, 0x67, 0xfa, 0x6d, 0x03, 0xf3, 0x13, 0x6e, 0xa4, 0xf3, 0x0c, 0x6f, 0x20, 0x18,
+0xa3, 0x30, 0x06, 0xd2, 0x1e, 0xf0, 0x02, 0x6a, 0x01, 0x10, 0x40, 0xb2, 0x35, 0xb3, 0xe0, 0xf1, 0x83, 0xa3, 0x0d, 0xea, 0xff, 0x74, 0x05, 0x60, 0x08, 0x6b, 0x8c, 0xeb, 0x02, 0x23, 0x3c, 0xb3,
+0x6c, 0xea, 0x37, 0xb3, 0x80, 0x18, 0x5d, 0x36, 0x40, 0xdb, 0x00, 0x18, 0x1b, 0xa7, 0x00, 0x65, 0x00, 0x18, 0xd2, 0xa6, 0x00, 0x65, 0x00, 0x18, 0x1e, 0xa4, 0x00, 0x65, 0x35, 0xb2, 0x40, 0x9a,
+0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, 0x33, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x33, 0xb3, 0x63, 0xda, 0x01, 0x6b, 0x32, 0xb2, 0x60, 0xc2, 0x06, 0x6a, 0x04, 0xd2, 0x24, 0xb2, 0x05, 0xd2,
+0x30, 0xb0, 0x46, 0xa0, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x41, 0xa0, 0x43, 0xf3, 0x04, 0x6e, 0xa4, 0xf3, 0x11, 0x6f, 0x07, 0xd2, 0x40, 0xa0, 0x08, 0xd2, 0x43, 0xa0, 0x09, 0xd2, 0x42, 0xa0,
+0x0a, 0xd2, 0x44, 0xa0, 0x20, 0x18, 0xa3, 0x30, 0x0b, 0xd2, 0x47, 0xa0, 0x11, 0x22, 0x48, 0xa0, 0x0f, 0x22, 0x83, 0xa0, 0xa1, 0xa0, 0x42, 0xa0, 0x60, 0xa0, 0x80, 0x34, 0xa0, 0x35, 0x51, 0xe4,
+0x75, 0xe5, 0xff, 0xf7, 0x1f, 0x6a, 0x4c, 0xec, 0x80, 0x18, 0x3e, 0x36, 0x4c, 0xed, 0x03, 0x10, 0x80, 0x18, 0x40, 0x37, 0x00, 0x65, 0x00, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x02, 0x6e,
+0x57, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0x10, 0x6e, 0x00, 0x6c, 0x01, 0x6d, 0x00, 0x18, 0x4d, 0xa6, 0xc4, 0x67, 0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x00, 0xef, 0x0a, 0x63, 0x00, 0x65,
+0x4c, 0x00, 0x11, 0x80, 0x40, 0x02, 0x11, 0x80, 0x64, 0xed, 0x10, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x0c, 0xee, 0x10, 0x80, 0xc8, 0xed, 0x10, 0x80, 0x50, 0xee, 0x10, 0x80, 0xac, 0xa0, 0x00, 0xb0,
+0x00, 0x00, 0xef, 0xff, 0x44, 0x20, 0x11, 0x80, 0x01, 0xf0, 0x10, 0x00, 0xff, 0xff, 0xef, 0xff, 0x90, 0x04, 0x11, 0x80, 0xb8, 0x8b, 0x11, 0x80, 0x85, 0xe1, 0x10, 0x80, 0x22, 0x1b, 0x11, 0x80,
+0x0c, 0x96, 0x11, 0x80, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd1, 0x07, 0xd0, 0x5b, 0xb2, 0x20, 0xf0, 0x6e, 0xa2, 0x03, 0x23, 0x20, 0xf0, 0x4f, 0xa2, 0x26, 0x10, 0x64, 0xa2, 0x41, 0x6a, 0x6c, 0xea,
+0x41, 0x72, 0x0f, 0x61, 0x00, 0x6c, 0x00, 0x18, 0xab, 0xa5, 0xa4, 0x67, 0xff, 0xf7, 0x1f, 0x6b, 0x4c, 0xeb, 0x62, 0x33, 0x72, 0x33, 0x00, 0x6a, 0x16, 0x23, 0x80, 0x18, 0xcd, 0x36, 0x00, 0x65,
+0x12, 0x10, 0xa0, 0xf1, 0x1a, 0x6c, 0x10, 0xf0, 0x0f, 0x6d, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x65, 0x4b, 0xb2, 0x60, 0xaa, 0xff, 0xf7, 0x1f, 0x6a, 0x6c, 0xea, 0x42, 0x32, 0x3f, 0x6b, 0x6c, 0xea,
+0x46, 0x32, 0xff, 0x6b, 0x6c, 0xea, 0x47, 0xb3, 0x80, 0xf1, 0x81, 0xa3, 0x7f, 0x22, 0x46, 0xb5, 0xa0, 0xa5, 0x7c, 0x2d, 0x8b, 0xe2, 0x00, 0xf6, 0x40, 0x32, 0x00, 0xf6, 0x43, 0x32, 0x04, 0xd2,
+0x42, 0xb2, 0x60, 0xf1, 0x52, 0xa2, 0x5e, 0x2a, 0x80, 0xf1, 0x40, 0xa3, 0x5b, 0x22, 0x80, 0xf1, 0x43, 0xa3, 0x03, 0x2a, 0x01, 0x6a, 0x80, 0xf1, 0x43, 0xc3, 0x3d, 0xb2, 0x00, 0x82, 0x39, 0xb2,
+0x80, 0xf1, 0x43, 0xa2, 0x04, 0x93, 0x5a, 0xeb, 0x01, 0x2a, 0xe5, 0xe8, 0x00, 0x18, 0x9c, 0xa6, 0x12, 0xec, 0x32, 0xb2, 0x20, 0xf0, 0x6e, 0xa2, 0x05, 0x2b, 0x64, 0xa2, 0x41, 0x6a, 0x6c, 0xea,
+0x41, 0x72, 0x40, 0x61, 0x32, 0xb2, 0x40, 0x82, 0x4e, 0xe8, 0x3c, 0x20, 0x31, 0xb2, 0x60, 0xa2, 0x07, 0x5b, 0x02, 0x61, 0x06, 0x6b, 0x60, 0xc2, 0x2e, 0xb2, 0xa0, 0xa2, 0x27, 0xb2, 0x63, 0xa2,
+0x07, 0x6c, 0x72, 0x36, 0x8c, 0xee, 0xc2, 0xed, 0x06, 0x60, 0x8c, 0xed, 0x88, 0x4c, 0xb0, 0x35, 0x6c, 0xec, 0xad, 0xec, 0x83, 0xc2, 0x21, 0xb2, 0x43, 0xa2, 0x07, 0x6b, 0x02, 0x6c, 0x52, 0x32,
+0x6c, 0xea, 0x61, 0x42, 0x8b, 0xec, 0x8c, 0xeb, 0x23, 0xb4, 0x20, 0xf1, 0x16, 0x4b, 0xff, 0xf7, 0x1f, 0x68, 0x8d, 0xe3, 0x20, 0xab, 0x01, 0x6b, 0x4c, 0xeb, 0x6c, 0x33, 0x02, 0x6c, 0x00, 0x6d,
+0x0c, 0xe9, 0x00, 0x18, 0xab, 0xa5, 0x27, 0xeb, 0x1f, 0xf7, 0x01, 0x6b, 0x0c, 0xea, 0x6b, 0xeb, 0x0c, 0xe9, 0x6c, 0xea, 0x20, 0x31, 0x0c, 0xe9, 0xc2, 0x67, 0x02, 0x6c, 0x00, 0x6d, 0x00, 0x18,
+0x4d, 0xa6, 0x2d, 0xee, 0x0f, 0xb2, 0x80, 0xf1, 0x71, 0xa2, 0x10, 0x23, 0x80, 0xf1, 0x72, 0xa2, 0x03, 0x2b, 0x01, 0x6b, 0x80, 0xf1, 0x72, 0xc2, 0x0a, 0xb2, 0x80, 0xf1, 0x52, 0xa2, 0x04, 0x93,
+0x5a, 0xeb, 0x01, 0x2a, 0xe5, 0xe8, 0x00, 0x18, 0x3e, 0xa8, 0x12, 0xec, 0x09, 0x97, 0x08, 0x91, 0x07, 0x90, 0x00, 0xef, 0x05, 0x63, 0x00, 0x65, 0x90, 0x95, 0x11, 0x80, 0xba, 0x01, 0x00, 0xb6,
+0x4c, 0x00, 0x11, 0x80, 0x09, 0x96, 0x11, 0x80, 0x2c, 0x52, 0x11, 0x80, 0x25, 0x1b, 0x11, 0x80, 0x78, 0x04, 0x11, 0x80, 0x00, 0x00, 0x00, 0xb6, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0,
+0xff, 0xf7, 0x1f, 0x69, 0x02, 0x74, 0x0e, 0xd4, 0x0f, 0xd5, 0x11, 0xd7, 0xcc, 0xe9, 0x1d, 0x61, 0x2b, 0xb2, 0x61, 0xa2, 0x0c, 0x6a, 0x6c, 0xea, 0x0c, 0x72, 0x17, 0x61, 0x00, 0x6a, 0x29, 0xb3,
+0x60, 0x9b, 0xc0, 0xf7, 0x62, 0x33, 0x11, 0x23, 0x27, 0xb3, 0x01, 0x4a, 0x43, 0xeb, 0xf7, 0x60, 0x00, 0x6a, 0x26, 0xb3, 0x02, 0x6c, 0xfa, 0x6d, 0xc2, 0xf4, 0x12, 0x6e, 0xe1, 0xf3, 0x00, 0x6f,
+0x04, 0xd2, 0x05, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd2, 0x21, 0xb0, 0x60, 0xa0, 0x07, 0x6a, 0x6c, 0xea, 0x28, 0x22, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x60, 0xa0, 0x08, 0xd2, 0x40, 0x6a,
+0x6c, 0xea, 0x07, 0x22, 0x00, 0x6b, 0x1b, 0xb2, 0x60, 0xca, 0x00, 0x18, 0x4a, 0x24, 0x01, 0x6c, 0x16, 0x10, 0x19, 0xb4, 0xa0, 0xa4, 0x19, 0xb2, 0x04, 0x6b, 0xac, 0xeb, 0x40, 0x9a, 0x09, 0x23,
+0x40, 0xf7, 0x42, 0x33, 0xa6, 0x32, 0x6e, 0xea, 0x01, 0x6b, 0x6c, 0xea, 0xff, 0x6b, 0x6c, 0xea, 0x02, 0x10, 0x13, 0xb2, 0x40, 0xa2, 0x03, 0x22, 0x00, 0x18, 0xa3, 0x35, 0x00, 0x65, 0x00, 0x1c,
+0x7a, 0x1b, 0x08, 0x94, 0x11, 0x97, 0x0e, 0x94, 0x0f, 0x95, 0x00, 0x18, 0x3e, 0x20, 0xd1, 0x67, 0x0d, 0x97, 0x0c, 0x91, 0x0b, 0x90, 0x00, 0xef, 0x07, 0x63, 0x00, 0x65, 0x44, 0x20, 0x11, 0x80,
+0x1c, 0xa3, 0x00, 0xb0, 0xa0, 0x86, 0x01, 0x00, 0xc8, 0xe7, 0x04, 0x80, 0x18, 0x96, 0x11, 0x80, 0x16, 0x96, 0x11, 0x80, 0x1c, 0x96, 0x11, 0x80, 0x50, 0xa0, 0x00, 0xb0, 0xd2, 0x06, 0x11, 0x80,
+0xfd, 0x63, 0x05, 0x62, 0x04, 0xd0, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x02, 0x67, 0x0f, 0xb2, 0x60, 0x9a, 0x0f, 0xb2, 0x00, 0x6c, 0x6e, 0xea, 0x02, 0x2a, 0x0e, 0xb2, 0x80, 0x9a, 0x0e, 0xb3,
+0x82, 0x34, 0x82, 0x34, 0x40, 0x9b, 0xff, 0xf7, 0x1f, 0x6d, 0x80, 0x34, 0xac, 0xea, 0x80, 0x34, 0x8d, 0xea, 0x40, 0xdb, 0x00, 0x18, 0xfd, 0x25, 0x00, 0x6c, 0x00, 0x1c, 0x7a, 0x1b, 0x90, 0x67,
+0x05, 0x97, 0x04, 0x90, 0x00, 0xef, 0x03, 0x63, 0x60, 0x8b, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23, 0x64, 0x8b, 0x10, 0x80, 0x30, 0x00, 0x00, 0xb5, 0xfb, 0x63, 0x09, 0x62, 0x08, 0xd0, 0x44, 0x67,
+0x80, 0x9c, 0x3f, 0x6b, 0xff, 0x6e, 0x8c, 0xeb, 0x30, 0x73, 0x80, 0xf0, 0x00, 0x61, 0x62, 0xa2, 0x02, 0x6c, 0xa8, 0x43, 0xea, 0x4d, 0xa3, 0xec, 0x5e, 0x61, 0xa4, 0xa2, 0x83, 0xa2, 0x05, 0x5d,
+0x68, 0x60, 0x04, 0x0e, 0xa4, 0x35, 0xb5, 0xe6, 0xa0, 0x8d, 0xb9, 0xe6, 0x00, 0xee, 0x00, 0x65, 0x0f, 0x00, 0x91, 0x01, 0x0b, 0x00, 0x4f, 0x00, 0x5b, 0x00, 0x63, 0xb4, 0x29, 0x10, 0x1e, 0x73,
+0x18, 0x61, 0x00, 0x6b, 0xc0, 0xf2, 0x0c, 0x6d, 0xb8, 0xeb, 0x60, 0xb6, 0x12, 0xed, 0xd5, 0xe5, 0xe0, 0xf0, 0xe3, 0xa5, 0x5e, 0xb6, 0x8e, 0xef, 0x04, 0x2f, 0x40, 0xf2, 0x88, 0x45, 0xa0, 0xde,
+0x16, 0x10, 0x00, 0x6d, 0xa0, 0xde, 0x01, 0x4b, 0xff, 0x6d, 0xac, 0xeb, 0x0a, 0x5b, 0xea, 0x61, 0x40, 0x10, 0x57, 0xb3, 0x80, 0x9b, 0x3d, 0x24, 0x40, 0xf2, 0x08, 0x4c, 0x08, 0x10, 0x0a, 0x6b,
+0x78, 0xec, 0x54, 0xb3, 0x12, 0xec, 0x71, 0xe4, 0x02, 0x10, 0x53, 0xb4, 0x01, 0x10, 0x31, 0x24, 0x62, 0xa2, 0x1e, 0x73, 0x0a, 0x61, 0x62, 0xa4, 0xc1, 0xa4, 0x60, 0x33, 0x60, 0x33, 0xc0, 0x36,
+0x6d, 0xee, 0x60, 0xa4, 0x6d, 0xee, 0x63, 0xa4, 0x0b, 0x10, 0x1f, 0x73, 0x0e, 0x61, 0x66, 0xa4, 0xc5, 0xa4, 0x60, 0x33, 0x60, 0x33, 0xc0, 0x36, 0x6d, 0xee, 0x64, 0xa4, 0x6d, 0xee, 0x67, 0xa4,
+0x00, 0xf6, 0x60, 0x33, 0x6d, 0xee, 0x04, 0x6b, 0x16, 0x10, 0xc9, 0xa4, 0x68, 0xa4, 0xc0, 0x36, 0x6d, 0xee, 0x02, 0x6b, 0x10, 0x10, 0x0d, 0x73, 0x04, 0x61, 0x01, 0x6b, 0x3f, 0xb2, 0x60, 0xc2,
+0x68, 0x10, 0x0c, 0x6c, 0x8e, 0xeb, 0x65, 0x2b, 0x3c, 0xb4, 0xa0, 0xa4, 0x02, 0x25, 0x60, 0xc4, 0x60, 0x10, 0x00, 0x6b, 0xc3, 0x67, 0x81, 0xa2, 0x70, 0x33, 0x63, 0xc2, 0x10, 0x6b, 0x6b, 0xeb,
+0x8c, 0xeb, 0x61, 0xc2, 0xa0, 0x9a, 0x00, 0x18, 0xa5, 0x2e, 0x02, 0x6c, 0x54, 0x10, 0x23, 0x73, 0x52, 0x60, 0x11, 0x73, 0x30, 0x61, 0xa1, 0x9a, 0x82, 0x32, 0x42, 0x32, 0xcc, 0xea, 0x1c, 0x22,
+0xa2, 0x32, 0xcc, 0xea, 0x34, 0x5a, 0x07, 0x61, 0x1f, 0xf7, 0x01, 0x6a, 0x4b, 0xea, 0x4c, 0xed, 0x06, 0xf2, 0x00, 0x6a, 0x4d, 0xed, 0xa2, 0x32, 0xff, 0x6b, 0x6c, 0xea, 0x14, 0x5a, 0x07, 0x60,
+0x1f, 0xf7, 0x01, 0x6a, 0x4b, 0xea, 0x4c, 0xed, 0x02, 0xf4, 0x00, 0x6a, 0x4d, 0xed, 0x00, 0xf6, 0x82, 0x33, 0x23, 0xb2, 0x60, 0xc2, 0x02, 0x10, 0x21, 0xb3, 0x40, 0xc3, 0x20, 0xb2, 0x40, 0xa2,
+0xff, 0x6b, 0xff, 0x4a, 0x6c, 0xea, 0x0e, 0x5a, 0x26, 0x60, 0x01, 0x6b, 0x1d, 0xb2, 0x00, 0x18, 0x4d, 0xf4, 0x60, 0xc2, 0x20, 0x10, 0x1b, 0x73, 0x1c, 0x61, 0x82, 0x34, 0x82, 0x34, 0xcc, 0xec,
+0x03, 0x2c, 0x00, 0xf2, 0x00, 0x68, 0x02, 0x10, 0x20, 0xf2, 0x00, 0x68, 0xa0, 0xf1, 0x06, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0xb0, 0x67, 0x01, 0x6a, 0x04, 0xd2, 0x04, 0x6c, 0x12, 0xb2, 0xfa, 0x6d,
+0x22, 0xf4, 0x18, 0x6e, 0xa1, 0xf1, 0x14, 0x6f, 0x05, 0xd2, 0x20, 0x18, 0xa3, 0x30, 0x06, 0xd0, 0x02, 0x10, 0x00, 0x6a, 0x01, 0x10, 0x01, 0x6a, 0x09, 0x97, 0x08, 0x90, 0x00, 0xef, 0x05, 0x63,
+0x0a, 0xb4, 0x66, 0x17, 0x24, 0x51, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x6c, 0x07, 0x11, 0x80, 0x78, 0x51, 0x11, 0x80, 0x54, 0x4d, 0x11, 0x80, 0x00, 0x96, 0x11, 0x80, 0x66, 0x07, 0x11, 0x80,
+0x1e, 0x96, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x78, 0x4d, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0xff, 0x6d, 0x00, 0x18, 0x93, 0x8c, 0xcc, 0xed, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65,
+0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xe0, 0xf3, 0x0a, 0x72, 0x04, 0x61, 0x00, 0x18, 0xcb, 0xed, 0x00, 0x65, 0x03, 0x10, 0x00, 0x18, 0x58, 0xf5, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63,
+0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x15, 0x3a, 0x00, 0x65, 0x0c, 0xb2, 0x20, 0xf0, 0x55, 0xa2, 0x05, 0x2a, 0x80, 0xf1, 0x10, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x00, 0x6d, 0x08, 0xb2, 0x40, 0x9a,
+0x61, 0x42, 0x07, 0x23, 0x24, 0x6b, 0x78, 0xea, 0x06, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x06, 0xb3, 0x63, 0xda, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x3c, 0x95, 0x11, 0x80, 0x90, 0x04, 0x11, 0x80,
+0xb8, 0x8b, 0x11, 0x80, 0x85, 0xe1, 0x10, 0x80, 0xfa, 0x63, 0x0b, 0x62, 0x0a, 0xd1, 0x09, 0xd0, 0x44, 0xac, 0x04, 0x67, 0x01, 0x72, 0x1f, 0x61, 0x20, 0x9c, 0x02, 0x6a, 0x04, 0xd2, 0x21, 0xb2,
+0x05, 0xd2, 0x06, 0xd1, 0x41, 0x9c, 0xfa, 0x6d, 0x04, 0x6c, 0xe1, 0xf2, 0x1a, 0x6e, 0x41, 0xf5, 0x0b, 0x6f, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x3f, 0x6a, 0x2c, 0xea, 0x30, 0x72, 0x27, 0x61,
+0x41, 0xa8, 0xff, 0x6b, 0x6c, 0xea, 0x23, 0x2a, 0x17, 0xb3, 0x40, 0xdb, 0x17, 0xb3, 0x40, 0xdb, 0x17, 0xb3, 0x40, 0xdb, 0x1c, 0x10, 0x17, 0xb2, 0x20, 0xa2, 0x19, 0x29, 0x02, 0x6a, 0x04, 0xd2,
+0x10, 0xb2, 0x05, 0xd2, 0x40, 0x9c, 0xfa, 0x6d, 0x21, 0xf3, 0x1c, 0x6e, 0x06, 0xd2, 0x41, 0x9c, 0x41, 0xf5, 0x0c, 0x6f, 0x05, 0x6c, 0x20, 0x18, 0xa3, 0x30, 0x07, 0xd2, 0x0e, 0xb2, 0x40, 0xa2,
+0x06, 0x22, 0x40, 0xa0, 0x30, 0x72, 0x03, 0x60, 0x0c, 0xb2, 0x20, 0xda, 0x03, 0x10, 0x00, 0x18, 0x15, 0x31, 0x90, 0x67, 0x0b, 0x97, 0x0a, 0x91, 0x09, 0x90, 0x00, 0xef, 0x06, 0x63, 0x00, 0x65,
+0xc8, 0xe7, 0x04, 0x80, 0x54, 0x8b, 0x10, 0x80, 0x5c, 0x8b, 0x10, 0x80, 0x68, 0x8b, 0x10, 0x80, 0x67, 0x07, 0x11, 0x80, 0xd0, 0x95, 0x11, 0x80, 0x68, 0x07, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62,
+0x00, 0x18, 0xfc, 0xba, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xf7, 0x63, 0x11, 0x62, 0x10, 0xd0, 0x00, 0x18, 0x79, 0xbb, 0x04, 0x67, 0x44, 0xa8, 0x20, 0xf3, 0x01, 0x72, 0x4b, 0x61,
+0x28, 0xb2, 0x60, 0xf1, 0x50, 0xa2, 0x03, 0x72, 0x46, 0x61, 0x27, 0xb2, 0x40, 0xaa, 0x01, 0x72, 0x13, 0x61, 0x26, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x0f, 0x61, 0x25, 0xb2, 0x60, 0xaa, 0xff, 0xf7,
+0x1f, 0x6a, 0x6c, 0xea, 0xff, 0x6b, 0x01, 0x4b, 0x4c, 0xeb, 0x06, 0x23, 0xff, 0xf6, 0x1f, 0x6d, 0xac, 0x6c, 0x00, 0x18, 0x5c, 0x3b, 0x4c, 0xed, 0x1e, 0xb2, 0x40, 0xa2, 0x01, 0x72, 0x2b, 0x61,
+0x1d, 0xb2, 0x40, 0xa2, 0x28, 0x2a, 0x09, 0x6a, 0x04, 0xd2, 0x1c, 0xb2, 0x05, 0xd2, 0x1c, 0xb2, 0x80, 0xf2, 0x7e, 0xa2, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd3, 0x80, 0xf2, 0x7f, 0xa2, 0x81, 0xf2,
+0x0e, 0x6e, 0xc1, 0xf3, 0x19, 0x6f, 0x07, 0xd3, 0xa0, 0xf2, 0x60, 0xa2, 0x08, 0xd3, 0xa0, 0xf2, 0x61, 0xa2, 0x09, 0xd3, 0xa0, 0xf2, 0x62, 0xa2, 0x0a, 0xd3, 0xa0, 0xf2, 0x63, 0xa2, 0x0b, 0xd3,
+0xa0, 0xf2, 0x68, 0xa2, 0x0c, 0xd3, 0xa0, 0xf2, 0x66, 0xaa, 0x0d, 0xd3, 0xa0, 0xf2, 0x44, 0xaa, 0x20, 0x18, 0xa3, 0x30, 0x0e, 0xd2, 0x11, 0x97, 0x10, 0x90, 0x00, 0xef, 0x09, 0x63, 0x00, 0x65,
+0x2c, 0x52, 0x11, 0x80, 0x40, 0x1a, 0x11, 0x80, 0x3b, 0x1a, 0x11, 0x80, 0xac, 0x00, 0x00, 0xb6, 0xe8, 0x39, 0x11, 0x80, 0xcc, 0x3b, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0x20, 0x56, 0x11, 0x80,
+0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0xe0, 0xf1, 0x14, 0x6b, 0x6e, 0xea, 0x04, 0x2a, 0x60, 0xac, 0x05, 0xb5, 0x6d, 0xe5, 0x40, 0xc3, 0x00, 0x18, 0xde, 0x5c, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef,
+0x03, 0x63, 0x00, 0x65, 0xd8, 0x95, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x00, 0x18, 0x03, 0x8e, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0xfd, 0x63, 0x05, 0x62, 0x44, 0xac, 0x20, 0xf1,
+0x0c, 0x72, 0x0d, 0x61, 0x40, 0x9c, 0x40, 0xaa, 0x01, 0xf4, 0x03, 0x72, 0x08, 0x61, 0x08, 0xb3, 0xc0, 0xf0, 0xaa, 0xab, 0x08, 0xf0, 0x00, 0x6a, 0xad, 0xea, 0xc0, 0xf0, 0x4a, 0xcb, 0x00, 0x18,
+0x5f, 0x5d, 0x00, 0x65, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x4c, 0x00, 0x11, 0x80, 0xf1, 0x63, 0x1d, 0x62, 0x1c, 0xd1, 0x1b, 0xd0, 0x44, 0xac, 0x60, 0xf2, 0x04, 0x68, 0x4e, 0xe8,
+0x2f, 0x28, 0x71, 0xb2, 0x60, 0xf1, 0x52, 0xa2, 0xc0, 0xf0, 0x13, 0x22, 0x00, 0x1c, 0x73, 0x1b, 0x00, 0x65, 0x00, 0x18, 0xe8, 0x58, 0x22, 0x67, 0x6c, 0xb3, 0xc0, 0xf0, 0x8a, 0xab, 0x08, 0xf0,
+0x01, 0x6a, 0x4b, 0xea, 0x8c, 0xea, 0xc0, 0xf0, 0x4a, 0xcb, 0x69, 0xb2, 0x00, 0xc2, 0x69, 0xb3, 0x69, 0xb2, 0x00, 0xc2, 0x00, 0xcb, 0x00, 0x6a, 0x68, 0xb3, 0x40, 0xc3, 0x68, 0xb3, 0x40, 0xc3,
+0x01, 0x6b, 0x68, 0xb2, 0x60, 0xc2, 0x80, 0x18, 0x23, 0x29, 0x03, 0x6c, 0x00, 0x18, 0x81, 0x56, 0x00, 0x6c, 0x20, 0x18, 0xf1, 0x25, 0x00, 0x65, 0x00, 0x1c, 0x7a, 0x1b, 0x91, 0x67, 0xac, 0x10,
+0x80, 0xf4, 0x00, 0x72, 0xa0, 0xf0, 0x05, 0x61, 0x00, 0x9c, 0x64, 0xa0, 0xab, 0xa8, 0x66, 0x32, 0x13, 0x72, 0x18, 0xd5, 0x05, 0x60, 0x18, 0x72, 0x03, 0x60, 0x17, 0x72, 0x80, 0xf0, 0x05, 0x61,
+0xa4, 0xa4, 0x21, 0x9c, 0x66, 0x33, 0xba, 0xc0, 0x16, 0x04, 0x00, 0x18, 0x44, 0x97, 0x19, 0xd3, 0x19, 0x93, 0x7f, 0x73, 0x04, 0x60, 0x00, 0x6c, 0xe1, 0xf4, 0x16, 0x6f, 0x03, 0x10, 0x85, 0xa0,
+0x01, 0xf4, 0x16, 0x6f, 0x10, 0x6d, 0x44, 0xa0, 0x04, 0xd5, 0x4f, 0xb5, 0x05, 0xd5, 0x16, 0x95, 0x07, 0xd3, 0x08, 0xd4, 0x06, 0xd5, 0x99, 0xa0, 0xa2, 0x67, 0x0a, 0xd1, 0x09, 0xd4, 0x01, 0x6c,
+0x8c, 0xed, 0x0b, 0xd5, 0xab, 0xa8, 0xe0, 0xf7, 0x18, 0x6e, 0x0c, 0xd5, 0x47, 0xb5, 0x25, 0xe5, 0xa4, 0xa1, 0x0e, 0xd2, 0xac, 0xec, 0x0d, 0xd4, 0x45, 0xa0, 0x04, 0x6c, 0xfa, 0x6d, 0x0f, 0xd2,
+0x46, 0xa0, 0x10, 0xd2, 0x47, 0xa0, 0x11, 0xd2, 0x48, 0xa0, 0x12, 0xd2, 0x49, 0xa0, 0x13, 0xd2, 0x4a, 0xa0, 0x14, 0xd2, 0x4b, 0xa0, 0x19, 0xd3, 0x20, 0x18, 0xa3, 0x30, 0x15, 0xd2, 0x18, 0x92,
+0x19, 0x93, 0xff, 0x72, 0x3c, 0x60, 0xc0, 0xf2, 0x0c, 0x69, 0x38, 0xea, 0x38, 0xb2, 0x12, 0xe9, 0x25, 0xe2, 0xe0, 0xf0, 0x46, 0xa1, 0x01, 0x72, 0x32, 0x61, 0xc0, 0xf0, 0x48, 0xa1, 0x0b, 0x72,
+0x11, 0x61, 0x34, 0xb2, 0x80, 0x9a, 0x00, 0x18, 0xe8, 0x1c, 0xb0, 0x67, 0x00, 0xf2, 0x0f, 0xa1, 0x01, 0x6a, 0x4e, 0xe8, 0x41, 0x28, 0x8b, 0x99, 0x00, 0x18, 0xb8, 0x1c, 0x00, 0x6d, 0x00, 0xf2,
+0x0f, 0xc1, 0x3a, 0x10, 0x18, 0x94, 0xb0, 0x67, 0x00, 0x18, 0x58, 0xe2, 0x19, 0xd3, 0x19, 0x93, 0x17, 0x73, 0x05, 0x61, 0x18, 0x95, 0x80, 0x18, 0x08, 0x2f, 0x90, 0x67, 0x10, 0x10, 0x13, 0x73,
+0x05, 0x61, 0x18, 0x95, 0x20, 0x18, 0x05, 0x04, 0x90, 0x67, 0x09, 0x10, 0x18, 0x73, 0x07, 0x61, 0x12, 0x6a, 0xc0, 0xf0, 0x48, 0xc1, 0x18, 0x95, 0x20, 0x18, 0x58, 0x01, 0x90, 0x67, 0x1d, 0xb2,
+0x80, 0x9a, 0x00, 0x18, 0xe8, 0x1c, 0xb0, 0x67, 0x17, 0x10, 0x23, 0x72, 0x12, 0x61, 0x18, 0x93, 0xc0, 0xf2, 0x0c, 0x6a, 0x58, 0xeb, 0x16, 0xb3, 0x12, 0xea, 0x49, 0xe3, 0x60, 0xf2, 0x6e, 0xa2,
+0xff, 0x73, 0x07, 0x61, 0x60, 0xf2, 0x6d, 0xa2, 0xff, 0x73, 0x03, 0x61, 0x05, 0x6b, 0x60, 0xf2, 0x6e, 0xc2, 0x20, 0x18, 0x43, 0x24, 0x00, 0x65, 0x1d, 0x97, 0x1c, 0x91, 0x1b, 0x90, 0x00, 0xef,
+0x0f, 0x63, 0x00, 0x65, 0x2c, 0x52, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80, 0x01, 0x96, 0x11, 0x80, 0x04, 0x96, 0x11, 0x80, 0x02, 0x96, 0x11, 0x80, 0x06, 0x96, 0x11, 0x80, 0x07, 0x96, 0x11, 0x80,
+0x08, 0x96, 0x11, 0x80, 0xc8, 0xe7, 0x04, 0x80, 0xd4, 0x3b, 0x11, 0x80, 0x20, 0x56, 0x11, 0x80, 0x9c, 0x48, 0x11, 0x80, 0xf9, 0x63, 0x0d, 0x62, 0x0c, 0xd1, 0x0b, 0xd0, 0x01, 0x6b, 0x6b, 0xeb,
+0x25, 0xb2, 0x60, 0xda, 0x00, 0x68, 0x0e, 0x10, 0x0c, 0x6b, 0x78, 0xe8, 0x12, 0xeb, 0x49, 0xe3, 0x62, 0x9a, 0x07, 0x23, 0x20, 0x18, 0x9c, 0x32, 0x81, 0x9a, 0x03, 0x22, 0x1e, 0xb2, 0x00, 0xda,
+0x06, 0x10, 0x01, 0x48, 0x1d, 0xb2, 0x80, 0xf0, 0x64, 0xa2, 0x02, 0xeb, 0xed, 0x60, 0x1c, 0xb3, 0x1c, 0xb2, 0x60, 0xda, 0x1c, 0xb3, 0x7c, 0x4b, 0x1c, 0xb2, 0x78, 0x9b, 0x6c, 0xea, 0x04, 0x22,
+0x1b, 0xb2, 0x54, 0xf5, 0x0f, 0x6b, 0x60, 0xda, 0x1a, 0xb2, 0x40, 0xa2, 0xff, 0x72, 0x07, 0x61, 0x19, 0xb2, 0x40, 0xaa, 0x04, 0x2a, 0x00, 0x18, 0x74, 0x39, 0x00, 0x65, 0x01, 0x10, 0x00, 0x6a,
+0x0d, 0xb3, 0x60, 0x9b, 0x81, 0x43, 0x07, 0x2c, 0x14, 0xb3, 0x60, 0x9b, 0xc7, 0x23, 0xc6, 0x2a, 0x40, 0xeb, 0x00, 0x65, 0xc3, 0x17, 0x0c, 0x68, 0x18, 0xeb, 0x08, 0xb2, 0x04, 0x01, 0xb1, 0x67,
+0x12, 0xe8, 0x41, 0xe0, 0x20, 0x18, 0xa3, 0x32, 0x81, 0x98, 0xb8, 0x2a, 0x40, 0x98, 0x40, 0xea, 0x91, 0x67, 0xb4, 0x17, 0x2c, 0x8a, 0x11, 0x80, 0x30, 0x8a, 0x11, 0x80, 0x20, 0x4e, 0xa5, 0x01,
+0x78, 0xa0, 0x00, 0xb0, 0x4c, 0x00, 0x11, 0x80, 0x00, 0x00, 0x40, 0x00, 0xb8, 0xa0, 0x00, 0xb0, 0x6e, 0x04, 0x11, 0x80, 0x0e, 0x19, 0x11, 0x80, 0x9c, 0x86, 0x11, 0x80, 0xf6, 0x63, 0x13, 0x62,
+0x12, 0xd1, 0x11, 0xd0, 0x09, 0x6a, 0x04, 0xd2, 0x31, 0xb2, 0x05, 0xd2, 0x31, 0xb2, 0x40, 0xaa, 0x01, 0x6c, 0xfa, 0x6d, 0x06, 0xd2, 0x30, 0xb2, 0x40, 0xaa, 0x20, 0xf6, 0x12, 0x6e, 0xa1, 0xf3,
+0x16, 0x6f, 0x07, 0xd2, 0x2d, 0xb2, 0x40, 0x9a, 0x08, 0xd2, 0x2d, 0xb2, 0x40, 0xf0, 0x61, 0xa2, 0x09, 0xd3, 0x40, 0xf0, 0x60, 0xa2, 0x0a, 0xd3, 0x20, 0xf0, 0x7f, 0xa2, 0x0b, 0xd3, 0x20, 0xf0,
+0x7e, 0xa2, 0x0c, 0xd3, 0x20, 0xf0, 0x7d, 0xa2, 0x0d, 0xd3, 0x20, 0xf0, 0x5c, 0xa2, 0x20, 0x18, 0xa3, 0x30, 0x0e, 0xd2, 0x04, 0xf7, 0x10, 0x6d, 0x00, 0x18, 0xcb, 0x31, 0x01, 0x6c, 0x21, 0xb2,
+0x60, 0x9a, 0x21, 0xb2, 0x6e, 0xea, 0x11, 0x2a, 0x20, 0xb1, 0x60, 0x99, 0x20, 0xb2, 0x21, 0xb0, 0x6c, 0xea, 0x4e, 0xe8, 0x0a, 0x28, 0x00, 0xf6, 0x62, 0x33, 0x1f, 0xb2, 0x60, 0xc2, 0x3f, 0xf4,
+0x00, 0x6c, 0x00, 0x18, 0x8d, 0x8f, 0x00, 0x6d, 0x00, 0xd9, 0x1c, 0xb2, 0x80, 0x9a, 0x1c, 0xb3, 0x8e, 0xeb, 0x01, 0x2b, 0x60, 0xda, 0x1b, 0xb2, 0x80, 0x9a, 0x1b, 0xb3, 0x8e, 0xeb, 0x01, 0x2b,
+0x60, 0xda, 0x11, 0xb3, 0x0f, 0xb2, 0x60, 0xda, 0x18, 0xb2, 0x00, 0x6b, 0x60, 0xda, 0x61, 0xda, 0x62, 0xda, 0x63, 0xda, 0x00, 0x1c, 0x43, 0x1b, 0x64, 0xda, 0x80, 0x18, 0xb5, 0x3a, 0x00, 0x65,
+0x13, 0x97, 0x12, 0x91, 0x11, 0x90, 0x00, 0xef, 0x0a, 0x63, 0x00, 0x65, 0xc8, 0xe7, 0x04, 0x80, 0x44, 0x00, 0x11, 0x80, 0x46, 0x00, 0x11, 0x80, 0x68, 0x21, 0x11, 0x80, 0x4c, 0x00, 0x11, 0x80,
+0x58, 0x8b, 0x10, 0x80, 0xef, 0xbe, 0x23, 0x87, 0x5c, 0x8b, 0x10, 0x80, 0xff, 0xff, 0xff, 0x00, 0xee, 0xff, 0xc0, 0x00, 0x80, 0x07, 0x11, 0x80, 0x60, 0x8b, 0x10, 0x80, 0x32, 0x97, 0x79, 0x23,
+0x68, 0x8b, 0x10, 0x80, 0x58, 0x3b, 0x7a, 0x93, 0xd0, 0x74, 0x11, 0x80, 0xfd, 0x63, 0x05, 0x62, 0x13, 0xb3, 0x14, 0xb2, 0x60, 0xda, 0x14, 0xb2, 0x14, 0xb3, 0x63, 0xda, 0x14, 0xb3, 0x72, 0xda,
+0x14, 0xb3, 0x75, 0xda, 0x14, 0xb3, 0x69, 0xda, 0x14, 0xb3, 0x6c, 0xda, 0x14, 0xb3, 0x6f, 0xda, 0x14, 0xb3, 0x66, 0xda, 0x14, 0xb3, 0x7b, 0xda, 0x14, 0xb3, 0x60, 0xda, 0x14, 0xb3, 0x80, 0x18,
+0x95, 0x28, 0x78, 0xda, 0x13, 0xb3, 0x14, 0xb2, 0x60, 0xda, 0x00, 0x6b, 0x13, 0xb2, 0x80, 0x18, 0xe7, 0x3a, 0x60, 0xc2, 0x05, 0x97, 0x00, 0xef, 0x03, 0x63, 0x00, 0x65, 0x4d, 0xe6, 0x10, 0x80,
+0xe8, 0x1d, 0x11, 0x80, 0x30, 0x8a, 0x11, 0x80, 0x69, 0xce, 0x10, 0x80, 0xd1, 0xe8, 0x10, 0x80, 0x99, 0xe8, 0x10, 0x80, 0x89, 0xe8, 0x10, 0x80, 0x61, 0xe8, 0x10, 0x80, 0x8d, 0xe7, 0x10, 0x80,
+0x7d, 0xe7, 0x10, 0x80, 0xc9, 0xe6, 0x10, 0x80, 0x81, 0xe6, 0x10, 0x80, 0x61, 0xe6, 0x10, 0x80, 0x19, 0xe3, 0x10, 0x80, 0x64, 0x2f, 0x11, 0x80, 0x00, 0x96, 0x11, 0x80, 0x04, 0x0b, 0x0f, 0x04,
+0x0a, 0x0e, 0x08, 0x0b, 0x0f, 0x00, 0x00, 0x00, 0x1b, 0x00, 0xb7, 0x00, 0x53, 0x01, 0x36, 0x00, 0x6f, 0x01, 0xa7, 0x02, 0x53, 0x00, 0x28, 0x02, 0xfd, 0x03, 0x25, 0x00, 0x07, 0x04, 0x05, 0x01,
+0x00, 0x00, 0x00, 0x00, 0x74, 0x41, 0x01, 0x10, 0xac, 0x80, 0x01, 0xf0, 0x0a, 0x22, 0x62, 0x02, 0x4e, 0x22, 0x9a, 0x06, 0x50, 0x22, 0x9a, 0x06, 0x34, 0x21, 0xf5, 0xff, 0x36, 0x21, 0xff, 0xfe,
+0x18, 0x20, 0x0f, 0x69, 0x34, 0x20, 0x55, 0x22, 0x38, 0x20, 0xa8, 0xc0, 0x25, 0x00, 0x00, 0x72, 0x26, 0x00, 0x00, 0x72, 0x3d, 0x00, 0x00, 0xfe, 0x2e, 0x00, 0x95, 0xa7, 0x32, 0x00, 0x95, 0xa7,
+0x22, 0x00, 0x00, 0x84, 0x27, 0x00, 0xa0, 0x6a, 0x28, 0x00, 0xa0, 0x6a, 0x29, 0x00, 0x03, 0x22, 0x2a, 0x00, 0x01, 0x20, 0x2b, 0x00, 0xc9, 0xad, 0x2f, 0x00, 0xc9, 0xad, 0x33, 0x00, 0x00, 0xc0,
+0x37, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x30, 0x00, 0x23, 0x20, 0x31, 0x00, 0x2a, 0x08, 0x32, 0x00, 0x64, 0x04, 0x33, 0x00, 0x42, 0x40,
+0x34, 0x00, 0xcc, 0x27, 0x35, 0x00, 0xd0, 0x48, 0x36, 0x00, 0x00, 0x40, 0x37, 0x00, 0x10, 0x05, 0x38, 0x00, 0x0c, 0x00, 0x39, 0x00, 0x70, 0x02, 0x22, 0x00, 0x04, 0xc0, 0x2b, 0x00, 0x43, 0x00,
+0x2c, 0x00, 0x43, 0x00, 0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x30, 0x00, 0x23, 0x20, 0x31, 0x00, 0x4a, 0x08, 0x32, 0x00, 0x64, 0x04,
+0x33, 0x00, 0x84, 0xf8, 0x34, 0x00, 0x7e, 0x11, 0x35, 0x00, 0xd0, 0xf8, 0x37, 0x00, 0x90, 0x05, 0x38, 0x00, 0x08, 0x00, 0x36, 0x00, 0x00, 0x40, 0x39, 0x00, 0x70, 0x02, 0x22, 0x00, 0x04, 0xc0,
+0x2b, 0x00, 0x43, 0x00, 0x2c, 0x00, 0x43, 0x00, 0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x10, 0x3f, 0x00, 0x01, 0x00, 0x00, 0x60, 0x01, 0x00,
+0x1c, 0x00, 0x21, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x0e, 0x00, 0xe2, 0xd1, 0x35, 0x00, 0xd0, 0x4e, 0x0e, 0x00, 0xe2, 0x51, 0x24, 0x00, 0x01, 0x00, 0x00, 0x60, 0x64, 0x00, 0x0e, 0x00, 0xe2, 0xd1,
+0x35, 0x00, 0xd0, 0x48, 0x0e, 0x00, 0xe2, 0x51, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3c, 0x00, 0x15, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10,
+0x11, 0x00, 0x30, 0x00, 0x12, 0x00, 0x00, 0x04, 0x0e, 0x00, 0xe2, 0x51, 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x9b, 0x7d, 0x13, 0x00, 0x0e, 0x60, 0x13, 0x00, 0x9e, 0x5c, 0x13, 0x00, 0x0a, 0x30,
+0x13, 0x00, 0xf8, 0x2f, 0x13, 0x00, 0xc5, 0x1f, 0x13, 0x00, 0x90, 0x00, 0x19, 0x00, 0x9b, 0x7d, 0x19, 0x00, 0x0e, 0x60, 0x19, 0x00, 0x9e, 0x5c, 0x19, 0x00, 0x0a, 0x30, 0x19, 0x00, 0xf8, 0x2f,
+0x19, 0x00, 0xc5, 0x1f, 0x19, 0x00, 0x90, 0x00, 0xff, 0xff, 0xff, 0xff, 0x15, 0x00, 0x40, 0x00, 0x15, 0x00, 0xc0, 0x20, 0x15, 0x00, 0xc0, 0x41, 0x15, 0x00, 0xc0, 0x68, 0x15, 0x00, 0xc0, 0x89,
+0x15, 0x00, 0xc0, 0xb0, 0x15, 0x00, 0xc0, 0xd1, 0x15, 0x00, 0xc0, 0xf3, 0x1a, 0x00, 0x40, 0x00, 0x1a, 0x00, 0xc0, 0x20, 0x1a, 0x00, 0xc0, 0x41, 0x1a, 0x00, 0xc0, 0x68, 0x1a, 0x00, 0xc0, 0x89,
+0x1a, 0x00, 0xc0, 0xb0, 0x1a, 0x00, 0xc0, 0xd1, 0x1a, 0x00, 0xc0, 0xf3, 0xff, 0xff, 0xff, 0xff, 0x08, 0x08, 0x08, 0x08, 0x0b, 0x28, 0x2b, 0x2e, 0x6b, 0x6e, 0x8b, 0x8e, 0xce, 0xee, 0xee, 0xee,
+0xf7, 0xf7, 0xf9, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0d, 0x17, 0x18, 0x19, 0x19, 0x00, 0x00, 0x00, 0xf7, 0xf7, 0x00, 0x00, 0x19, 0x19, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0xc2, 0x10, 0x00, 0x00, 0x30, 0x11, 0x00, 0x3b, 0x00, 0x12, 0x00, 0xfc, 0xe4,
+0x18, 0x00, 0xf8, 0x39, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0xf4, 0x01, 0x00, 0x20, 0x01, 0x00,
+0x02, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x20, 0x00, 0x48, 0x42, 0x20, 0x00, 0x01, 0x44, 0x20, 0x00, 0x48, 0x46, 0x20, 0x00, 0x81, 0x48, 0x20, 0x00, 0x00, 0x4a, 0x20, 0x00, 0xf8,
+0x4c, 0x20, 0x00, 0x00, 0x4e, 0x20, 0xd8, 0x00, 0x50, 0x20, 0x90, 0xcc, 0x52, 0x20, 0x00, 0x18, 0x54, 0x20, 0x10, 0x8c, 0x56, 0x20, 0x00, 0xe0, 0x58, 0x20, 0x00, 0x50, 0x5a, 0x20, 0x00, 0x80,
+0x5c, 0x20, 0x00, 0x20, 0x5e, 0x20, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x0e, 0x20, 0x01, 0x00, 0x02, 0x20, 0x60, 0xc0, 0x00, 0x60, 0x0a, 0x00, 0x02, 0x20, 0x20, 0xc0, 0x00, 0x60, 0x0a, 0x00,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x01, 0x00, 0x02, 0x20, 0x20, 0x00, 0x0c, 0x20, 0x10, 0x00, 0x0e, 0x20, 0x00, 0x80,
+0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x11, 0x00, 0x3c, 0x00, 0x12, 0x00, 0x02, 0x87, 0x18, 0x00, 0x04, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4e, 0xfb, 0x71, 0x4c, 0x30, 0x00, 0x00, 0x62, 0xd5, 0x3d, 0x80
};
-//CheckSum = 0xc10b
+/* CheckSum = 0x078b */
const u8 Rtl8723BFwMPImgArray[Rtl8723BMPImgArrayLength] = {
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.h b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.h
index bbd0084..1b19513 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.h
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_MP.h
@@ -24,7 +24,7 @@
#ifdef CONFIG_MP_INCLUDED
#define Rtl8723BMPImgArrayLength 18396
-#define Rtl8723BFwBTImgArrayLength 19144
+#define Rtl8723BFwBTImgArrayLength 20564
#define Rtl8723B_PHYREG_Array_MPLength 4
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c
index f0809b5..a7d6e51 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.c
@@ -18,41 +18,95 @@
*
******************************************************************************/
-//#include "Mp_Precomp.h"
+
#include "../odm_precomp.h"
#if (RTL8723B_SUPPORT == 1)
static BOOLEAN
-CheckCondition(
- const u4Byte Condition,
- const u4Byte Hex
+CheckPositive(
+ IN PDM_ODM_T pDM_Odm,
+ IN const u4Byte Condition1,
+ IN const u4Byte Condition2
)
{
- u4Byte _board = (Hex & 0x000000FF);
- u4Byte _interface = (Hex & 0x0000FF00) >> 8;
- u4Byte _platform = (Hex & 0x00FF0000) >> 16;
- u4Byte cond = Condition;
-
- if ( Condition == 0xCDCDCDCD )
- return TRUE;
-
- cond = Condition & 0x000000FF;
- if ( (_board != cond) && (cond != 0xFF) )
- return FALSE;
-
- cond = Condition & 0x0000FF00;
- cond = cond >> 8;
- if ( ((_interface & cond) == 0) && (cond != 0x07) )
- return FALSE;
-
- cond = Condition & 0x00FF0000;
- cond = cond >> 16;
- if ( ((_platform & cond) == 0) && (cond != 0x0F) )
+ u1Byte _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA
+ ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA
+ ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA
+ ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA
+ ((pDM_Odm->BoardType & BIT2) >> 2) << 4; // _BT
+
+ u4Byte cond1 = Condition1, cond2 = Condition2;
+ u4Byte driver1 = pDM_Odm->CutVersion << 24 |
+ pDM_Odm->SupportPlatform << 16 |
+ pDM_Odm->PackageType << 12 |
+ pDM_Odm->SupportInterface << 8 |
+ _BoardType;
+
+ u4Byte driver2 = pDM_Odm->TypeGLNA << 0 |
+ pDM_Odm->TypeGPA << 8 |
+ pDM_Odm->TypeALNA << 16 |
+ pDM_Odm->TypeAPA << 24;
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));
+
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ (" (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE,
+ (" (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));
+
+
+ //============== Value Defined Check ===============//
+ //QFN Type [15:12] and Cut Version [27:24] need to do value check
+
+ if(((cond1 & 0x0000F000) != 0) &&((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
+ return FALSE;
+ if(((cond1 & 0x0F000000) != 0) &&((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
+ return FALSE;
+
+ //=============== Bit Defined Check ================//
+ // We don't care [31:28] and [23:20]
+ //
+ cond1 &= 0x000F0FFF;
+ driver1 &= 0x000F0FFF;
+
+ if ((cond1 & driver1) == cond1)
+ {
+ u4Byte bitMask = 0;
+ if ((cond1 & 0x0F) == 0) // BoardType is DONTCARE
+ return TRUE;
+
+ if ((cond1 & BIT0) != 0) //GLNA
+ bitMask |= 0x000000FF;
+ if ((cond1 & BIT1) != 0) //GPA
+ bitMask |= 0x0000FF00;
+ if ((cond1 & BIT2) != 0) //ALNA
+ bitMask |= 0x00FF0000;
+ if ((cond1 & BIT3) != 0) //APA
+ bitMask |= 0xFF000000;
+
+ if ((cond2 & bitMask) == (driver2 & bitMask)) // BoardType of each RF path is matched
+ return TRUE;
+ else
+ return FALSE;
+ }
+ else
+ {
return FALSE;
+ }
+}
+static BOOLEAN
+CheckNegative(
+ IN PDM_ODM_T pDM_Odm,
+ IN const u4Byte Condition1,
+ IN const u4Byte Condition2
+ )
+{
return TRUE;
}
-
/******************************************************************************
* RadioA.TXT
******************************************************************************/
@@ -81,14 +135,30 @@ u4Byte Array_MP_8723B_RadioA[] = {
0x01E, 0x00000000,
0x0DF, 0x00000780,
0x050, 0x00067435,
+ 0x80002000,0x00000000,0x40000000,0x00000000,
+ 0x051, 0x0006B10E,
+ 0x90003000,0x00000000,0x40000000,0x00000000,
+ 0x051, 0x0006B10E,
+ 0x90004000,0x00000000,0x40000000,0x00000000,
+ 0x051, 0x0006B10E,
+ 0xA0000000,0x00000000,
0x051, 0x0006B04E,
+ 0xB0000000,0x00000000,
0x052, 0x000007D2,
0x053, 0x00000000,
0x054, 0x00050400,
0x055, 0x0004026E,
0x0DD, 0x0000004C,
0x070, 0x00067435,
+ 0x80002000,0x00000000,0x40000000,0x00000000,
+ 0x071, 0x0006B10E,
+ 0x90003000,0x00000000,0x40000000,0x00000000,
+ 0x071, 0x0006B10E,
+ 0x90004000,0x00000000,0x40000000,0x00000000,
+ 0x071, 0x0006B10E,
+ 0xA0000000,0x00000000,
0x071, 0x0006B04E,
+ 0xB0000000,0x00000000,
0x072, 0x000007D2,
0x073, 0x00000000,
0x074, 0x00050400,
@@ -174,75 +244,80 @@ ODM_ReadAndConfig_MP_8723B_RadioA(
IN PDM_ODM_T pDM_Odm
)
{
- #define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)
-
- u4Byte hex = 0;
- u4Byte i = 0;
- u2Byte count = 0;
- pu4Byte ptr_array = NULL;
- u1Byte platform = pDM_Odm->SupportPlatform;
- u1Byte _interface = pDM_Odm->SupportInterface;
- u1Byte board = pDM_Odm->BoardType;
- u4Byte ArrayLen = sizeof(Array_MP_8723B_RadioA)/sizeof(u4Byte);
- pu4Byte Array = Array_MP_8723B_RadioA;
-
-
- hex += board;
- hex += _interface << 8;
- hex += platform << 16;
- hex += 0xFF000000;
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_RadioA, hex = 0x%X\n", hex));
-
- for (i = 0; i < ArrayLen; i += 2 )
- {
- u4Byte v1 = Array[i];
- u4Byte v2 = Array[i+1];
+ u4Byte i = 0;
+ u4Byte ArrayLen = sizeof(Array_MP_8723B_RadioA)/sizeof(u4Byte);
+ pu4Byte Array = Array_MP_8723B_RadioA;
- // This (offset, data) pair meets the condition.
- if ( v1 < 0xCDCDCDCD )
- {
- odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);
- continue;
- }
- else
- { // This line is the start line of branch.
- if ( !CheckCondition(Array[i], hex) )
- { // Discard the following (offset, data) pairs.
- READ_NEXT_PAIR(v1, v2, i);
- while (v2 != 0xDEAD &&
- v2 != 0xCDEF &&
- v2 != 0xCDCD && i < ArrayLen -2)
- {
- READ_NEXT_PAIR(v1, v2, i);
- }
- i -= 2; // prevent from for-loop += 2
- }
- else // Configure matched pairs and skip to end of if-else.
- {
- READ_NEXT_PAIR(v1, v2, i);
- while (v2 != 0xDEAD &&
- v2 != 0xCDEF &&
- v2 != 0xCDCD && i < ArrayLen -2)
- {
- odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);
- READ_NEXT_PAIR(v1, v2, i);
- }
-
- while (v2 != 0xDEAD && i < ArrayLen -2)
- {
- READ_NEXT_PAIR(v1, v2, i);
- }
-
- }
- }
- }
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_RadioA\n"));
+
+ for (i = 0; i < ArrayLen; i += 2 )
+ {
+ u4Byte v1 = Array[i];
+ u4Byte v2 = Array[i+1];
+
+ // This (offset, data) pair doesn't care the condition.
+ if ( v1 < 0x40000000 )
+ {
+ odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);
+ continue;
+ }
+ else
+ { // This line is the beginning of branch.
+ BOOLEAN bMatched = TRUE;
+ u1Byte cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+
+ if (cCond == COND_ELSE) { // ELSE, ENDIF
+ bMatched = TRUE;
+ READ_NEXT_PAIR(v1, v2, i);
+ } else if ( ! CheckPositive(pDM_Odm, v1, v2) ) {
+ bMatched = FALSE;
+ READ_NEXT_PAIR(v1, v2, i);
+ READ_NEXT_PAIR(v1, v2, i);
+ } else {
+ READ_NEXT_PAIR(v1, v2, i);
+ if ( ! CheckNegative(pDM_Odm, v1, v2) )
+ bMatched = FALSE;
+ else
+ bMatched = TRUE;
+ READ_NEXT_PAIR(v1, v2, i);
+ }
+
+ if ( bMatched == FALSE )
+ { // Condition isn't matched. Discard the following (offset, data) pairs.
+ while (v1 < 0x40000000 && i < ArrayLen -2)
+ READ_NEXT_PAIR(v1, v2, i);
+
+ i -= 2; // prevent from for-loop += 2
+ }
+ else // Configure matched pairs and skip to end of if-else.
+ {
+ while (v1 < 0x40000000 && i < ArrayLen-2) {
+ odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);
+ READ_NEXT_PAIR(v1, v2, i);
+ }
+
+ // Keeps reading until ENDIF.
+ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+ while (cCond != COND_ENDIF && i < ArrayLen-2) {
+ READ_NEXT_PAIR(v1, v2, i);
+ cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);
+ }
+ }
+ }
+ }
+}
+u4Byte
+ODM_GetVersion_MP_8723B_RadioA(void)
+{
+ return 11;
}
/******************************************************************************
* TxPowerTrack_AP.TXT
******************************************************************************/
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8723B[][DELTA_SWINGIDX_SIZE] = {
{0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},
{0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},
@@ -271,15 +346,17 @@ u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2,
u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_AP_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
+#endif
void
ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP(
IN PDM_ODM_T pDM_Odm
)
{
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_AP_8723B, DELTA_SWINGIDX_SIZE);
@@ -296,12 +373,14 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP(
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_AP_8723B, DELTA_SWINGIDX_SIZE*3);
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_AP_8723B, DELTA_SWINGIDX_SIZE*3);
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_AP_8723B, DELTA_SWINGIDX_SIZE*3);
+#endif
}
/******************************************************************************
* TxPowerTrack_PCIE.TXT
******************************************************************************/
+#if DEV_BUS_TYPE == RT_PCI_INTERFACE
u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8723B[][DELTA_SWINGIDX_SIZE] = {
{0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},
{0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},
@@ -330,15 +409,17 @@ u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2,
u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_PCIE_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
+#endif
void
ODM_ReadAndConfig_MP_8723B_TxPowerTrack_PCIE(
IN PDM_ODM_T pDM_Odm
)
{
+#if DEV_BUS_TYPE == RT_PCI_INTERFACE
PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_PCIE_8723B, DELTA_SWINGIDX_SIZE);
@@ -355,12 +436,14 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_PCIE(
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_PCIE_8723B, DELTA_SWINGIDX_SIZE*3);
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_PCIE_8723B, DELTA_SWINGIDX_SIZE*3);
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_PCIE_8723B, DELTA_SWINGIDX_SIZE*3);
+#endif
}
/******************************************************************************
* TxPowerTrack_SDIO.TXT
******************************************************************************/
+#if DEV_BUS_TYPE == RT_SDIO_INTERFACE
u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = {
{0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},
{0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},
@@ -389,15 +472,17 @@ u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2,
u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_SDIO_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
+#endif
void
ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO(
IN PDM_ODM_T pDM_Odm
)
{
+#if DEV_BUS_TYPE == RT_SDIO_INTERFACE
PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B, DELTA_SWINGIDX_SIZE);
@@ -414,12 +499,14 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO(
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_SDIO_8723B, DELTA_SWINGIDX_SIZE*3);
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_SDIO_8723B, DELTA_SWINGIDX_SIZE*3);
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_SDIO_8723B, DELTA_SWINGIDX_SIZE*3);
+#endif
}
/******************************************************************************
* TxPowerTrack_USB.TXT
******************************************************************************/
+#if DEV_BUS_TYPE == RT_USB_INTERFACE
u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8723B[][DELTA_SWINGIDX_SIZE] = {
{0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},
{0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14},
@@ -448,15 +535,17 @@ u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2
u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8723B[] = {0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15};
+#endif
void
ODM_ReadAndConfig_MP_8723B_TxPowerTrack_USB(
IN PDM_ODM_T pDM_Odm
)
{
+#if DEV_BUS_TYPE == RT_USB_INTERFACE
PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_MP_8723B\n"));
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8723B, DELTA_SWINGIDX_SIZE);
@@ -473,6 +562,7 @@ ODM_ReadAndConfig_MP_8723B_TxPowerTrack_USB(
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_USB_8723B, DELTA_SWINGIDX_SIZE*3);
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_USB_8723B, DELTA_SWINGIDX_SIZE*3);
ODM_MoveMemory(pDM_Odm, pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_USB_8723B, DELTA_SWINGIDX_SIZE*3);
+#endif
}
/******************************************************************************
@@ -743,8 +833,7 @@ ODM_ReadAndConfig_MP_8723B_TXPWR_LMT(
u4Byte ArrayLen = sizeof(Array_MP_8723B_TXPWR_LMT)/sizeof(pu1Byte);
pu1Byte *Array = Array_MP_8723B_TXPWR_LMT;
-
- ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ReadAndConfig_MP_8723B_TXPWR_LMT\n"));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_TXPWR_LMT\n"));
for (i = 0; i < ArrayLen; i += 7 )
{
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h
index d9f1b8b..aee0ae4 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalHWImg8723B_RF.h
@@ -22,7 +22,6 @@
#ifndef __INC_MP_RF_HW_IMG_8723B_H
#define __INC_MP_RF_HW_IMG_8723B_H
-//static BOOLEAN CheckCondition(const u4Byte Condition, const u4Byte Hex);
/******************************************************************************
* RadioA.TXT
@@ -32,6 +31,7 @@ void
ODM_ReadAndConfig_MP_8723B_RadioA( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_RadioA(void);
/******************************************************************************
* TxPowerTrack_AP.TXT
@@ -41,6 +41,7 @@ void
ODM_ReadAndConfig_MP_8723B_TxPowerTrack_AP( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_AP(void);
/******************************************************************************
* TxPowerTrack_PCIE.TXT
@@ -50,6 +51,7 @@ void
ODM_ReadAndConfig_MP_8723B_TxPowerTrack_PCIE( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_PCIE(void);
/******************************************************************************
* TxPowerTrack_SDIO.TXT
@@ -59,6 +61,7 @@ void
ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_SDIO(void);
/******************************************************************************
* TxPowerTrack_USB.TXT
@@ -68,6 +71,7 @@ void
ODM_ReadAndConfig_MP_8723B_TxPowerTrack_USB( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_TxPowerTrack_USB(void);
/******************************************************************************
* TXPWR_LMT.TXT
@@ -77,6 +81,7 @@ void
ODM_ReadAndConfig_MP_8723B_TXPWR_LMT( // TC: Test Chip, MP: MP Chip
IN PDM_ODM_T pDM_Odm
);
+u4Byte ODM_GetVersion_MP_8723B_TXPWR_LMT(void);
#endif
#endif // end of HWIMG_SUPPORT
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c b/rtl8723BS/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c
index 3433cb1..cdec248 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/HalPhyRf_8723B.c
@@ -326,7 +326,7 @@ ODM_TxPwrTrackSetPwr_8723B(
pwr += pDM_Odm->RFCalibrateInfo.PowerIndexOffset[RFPath];
PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, pwr);
TxAGC = (pwr<<16)|(pwr<<8)|(pwr);
- PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, TxAGC);
+ PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, TxAGC);
ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("ODM_TxPwrTrackSetPwr8723B: CCK Tx-rf(A) Power = 0x%x\n", TxAGC));
pwr = PHY_QueryBBReg(Adapter, rTxAGC_A_Rate18_06, 0xFF);
@@ -360,12 +360,12 @@ ODM_TxPwrTrackSetPwr_8723B(
// Adjust BB swing by OFDM IQ matrix
if (Final_OFDM_Swing_Index >= PwrTrackingLimit_OFDM)
Final_OFDM_Swing_Index = PwrTrackingLimit_OFDM;
- else if (Final_OFDM_Swing_Index < 0)
+ else if (Final_OFDM_Swing_Index <= 0)
Final_OFDM_Swing_Index = 0;
if (Final_CCK_Swing_Index >= CCK_TABLE_SIZE)
Final_CCK_Swing_Index = CCK_TABLE_SIZE-1;
- else if (pDM_Odm->BbSwingIdxCck < 0)
+ else if (pDM_Odm->BbSwingIdxCck <= 0)
Final_CCK_Swing_Index = 0;
setIqkMatrix_8723B(pDM_Odm, Final_OFDM_Swing_Index, RFPath,
@@ -400,7 +400,7 @@ ODM_TxPwrTrackSetPwr_8723B(
("******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d \n",
PwrTrackingLimit_OFDM, pDM_Odm->Remnant_OFDMSwingIdx[RFPath]));
}
- else if (Final_OFDM_Swing_Index < 0)
+ else if (Final_OFDM_Swing_Index <= 0)
{
pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index;
@@ -447,7 +447,7 @@ ODM_TxPwrTrackSetPwr_8723B(
ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
("******Path_A CCK Over Limit , PwrTrackingLimit_CCK = %d , pDM_Odm->Remnant_CCKSwingIdx = %d \n", PwrTrackingLimit_CCK, pDM_Odm->Remnant_CCKSwingIdx));
}
- else if(Final_CCK_Swing_Index < 0) // Lowest CCK Index = 0
+ else if(Final_CCK_Swing_Index <= 0) // Lowest CCK Index = 0
{
pDM_Odm->Remnant_CCKSwingIdx = Final_CCK_Swing_Index;
setCCKFilterCoefficient(pDM_Odm, 0);
@@ -566,7 +566,7 @@ phy_PathA_IQK_8723B(
IN u1Byte RF_Path
)
{
- u4Byte regEAC, regE94, regE9C, tmp/*, regEA4*/;
+ u4Byte regEAC, regE94, regE9C, tmp, Path_SEL_BB /*, regEA4*/;
u1Byte result = 0x00;
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
@@ -578,21 +578,19 @@ phy_PathA_IQK_8723B(
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
#endif
#endif
+
+
+ // Save RF Path
+ Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);
+
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A IQK!\n"));
//leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
-
- if (configPathB || (RF_Path == 0))
- // wfi switch to S1
- ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);
- else
- // wifi switch to S0
- ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
// enable path A PA in TXIQK mode
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
- ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x20000 );
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000 );
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0003f );
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xc7f87 );
// disable path B PA in TXIQK mode
@@ -610,7 +608,7 @@ phy_PathA_IQK_8723B(
ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
// ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x8214010a);
- ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x821403ea);
+ ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x821303ea);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28110000);
ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
@@ -620,7 +618,18 @@ phy_PathA_IQK_8723B(
ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x00462911);
//enter IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
+
+ //Ant switch
+ if (configPathB || (RF_Path == 0))
+ // wifi switch to S1
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);
+ else
+ // wifi switch to S0
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
+
+ //GNT_BT = 0
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);
//One shot, path A LOK & IQK
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path A LOK & IQK!\n"));
@@ -632,8 +641,13 @@ phy_PathA_IQK_8723B(
//PlatformStallExecution(IQK_DELAY_TIME_8723B*1000);
ODM_delay_ms(IQK_DELAY_TIME_8723B);
+ //restore Ant Path
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);
+ //GNT_BT = 1
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);
+
//leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
// Check failed
@@ -688,7 +702,7 @@ phy_PathA_RxIQK8723B(
IN u1Byte RF_Path
)
{
- u4Byte regEAC, regE94, regE9C, regEA4, u4tmp,tmp;
+ u4Byte regEAC, regE94, regE9C, regEA4, u4tmp,tmp, Path_SEL_BB;
u1Byte result = 0x00;
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
@@ -701,27 +715,23 @@ phy_PathA_RxIQK8723B(
#endif
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A Rx IQK!\n"));
- //leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ // Save RF Path
+ Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);
- if (configPathB || (RF_Path == 0))
- // wfi switch to S1
- ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);
- else
- // wifi switch to S0
- ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
+ //leave IQK mode
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A RX IQK:Get TXIMR setting\n"));
//1 Get TXIMR setting
//modify RXIQK mode table
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table!\n"));
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
- ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000);
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);
//LNA2 off, PA on for Dcut
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7fb7);
// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x0);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
//IQK setting
ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);
@@ -734,7 +744,7 @@ phy_PathA_RxIQK8723B(
ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
// ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82160c1f);
- ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82160ff0);
+ ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82130ff0);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28110000);
ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
@@ -744,7 +754,18 @@ phy_PathA_RxIQK8723B(
ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a911);
//enter IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
+
+ //Ant switch
+ if (configPathB || (RF_Path == 0))
+ // wifi switch to S1
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);
+ else
+ // wifi switch to S0
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
+
+ //GNT_BT = 0
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);
//One shot, path A LOK & IQK
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path A LOK & IQK!\n"));
@@ -755,9 +776,14 @@ phy_PathA_RxIQK8723B(
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME_8723B));
//PlatformStallExecution(IQK_DELAY_TIME_8723B*1000);
ODM_delay_ms(IQK_DELAY_TIME_8723B);
-
+
+ //restore Ant Path
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);
+ //GNT_BT = 1
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);
+
//leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
// Check failed
regEAC = ODM_GetBBReg(pDM_Odm, rRx_Power_After_IQK_A_2, bMaskDWord);
@@ -796,9 +822,9 @@ phy_PathA_RxIQK8723B(
//modify RXIQK mode table
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table 2!\n"));
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
- ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000 );
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000 );
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f );
//LAN2 on, PA off for Dcut
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7d77 );
@@ -820,7 +846,7 @@ phy_PathA_RxIQK8723B(
ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82110000);
// ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x281604c2);
- ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x2816001f);
+ ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x2813001f);
ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
@@ -829,7 +855,18 @@ phy_PathA_RxIQK8723B(
ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a8d1);
//enter IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
+
+ //Ant switch
+ if (configPathB || (RF_Path == 0))
+ // wifi switch to S1
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000000);
+ else
+ // wifi switch to S0
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
+
+ //GNT_BT = 0
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);
//One shot, path A LOK & IQK
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path A LOK & IQK!\n"));
@@ -841,8 +878,13 @@ phy_PathA_RxIQK8723B(
//PlatformStallExecution(IQK_DELAY_TIME_8723B*1000);
ODM_delay_ms(IQK_DELAY_TIME_8723B);
+ //restore Ant Path
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);
+ //GNT_BT = 1
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);
+
//leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
// Check failed
regEAC = ODM_GetBBReg(pDM_Odm, rRx_Power_After_IQK_A_2, bMaskDWord);
@@ -855,7 +897,7 @@ phy_PathA_RxIQK8723B(
// PA/PAD controlled by 0x0
//leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xdf, bRFRegOffsetMask, 0x780 );
#if 0
@@ -897,7 +939,7 @@ phy_PathB_IQK_8723B(
#endif
)
{
- u4Byte regEAC, regE94, regE9C, tmp/*, regEC4, regECC*/;
+ u4Byte regEAC, regE94, regE9C, tmp, Path_SEL_BB/*, regEC4, regECC, Path_SEL_BB*/;
u1Byte result = 0x00;
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
@@ -910,12 +952,11 @@ phy_PathB_IQK_8723B(
#endif
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B IQK!\n"));
- //leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ // Save RF Path
+ Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);
- //switch to path B
- ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
-// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0 );
+ //leave IQK mode
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
// in TXIQK mode
// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1 );
@@ -924,7 +965,7 @@ phy_PathB_IQK_8723B(
// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xc7f87 );
// enable path B PA in TXIQK mode
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x20, 0x1);
- ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x40fc1);
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x30fc1);
@@ -939,9 +980,8 @@ phy_PathB_IQK_8723B(
ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
-
// ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82140114);
- ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x821403ea);
+ ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x821303ea);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28110000);
ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
@@ -950,9 +990,15 @@ phy_PathB_IQK_8723B(
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LO calibration setting!\n"));
ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x00462911);
-
//enter IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
+
+ //switch to path B
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
+// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0);
+
+ //GNT_BT = 0
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);
//One shot, path B LOK & IQK
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path B LOK & IQK!\n"));
@@ -964,8 +1010,13 @@ phy_PathB_IQK_8723B(
//PlatformStallExecution(IQK_DELAY_TIME_88E*1000);
ODM_delay_ms(IQK_DELAY_TIME_8723B);
+ //restore Ant Path
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);
+ //GNT_BT = 1
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);
+
//leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0x948 = 0x%x\n", ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord)));
@@ -1019,7 +1070,7 @@ phy_PathB_RxIQK8723B(
IN BOOLEAN configPathB
)
{
- u4Byte regE94, regE9C, regEA4, regEAC, u4tmp, tmp;
+ u4Byte regE94, regE9C, regEA4, regEAC, u4tmp, tmp, Path_SEL_BB;
u1Byte result = 0x00;
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
@@ -1032,8 +1083,10 @@ phy_PathB_RxIQK8723B(
#endif
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B Rx IQK!\n"));
+ // Save RF Path
+ Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);
//leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
//switch to path B
ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
@@ -1043,12 +1096,12 @@ phy_PathB_RxIQK8723B(
//modify RXIQK mode table
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table!\n"));
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1 );
- ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000 );
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000 );
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f );
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7fb7 );
//open PA S1 & SMIXER
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x20, 0x1 );
- ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x60fed );
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x30fcd );
//IQK setting
@@ -1063,7 +1116,7 @@ phy_PathB_RxIQK8723B(
ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
// ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82160c1f );
- ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82160ff0);
+ ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82130ff0);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28110000);
ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
@@ -1073,7 +1126,15 @@ phy_PathB_RxIQK8723B(
ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a911);
//enter IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
+
+ //switch to path B
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
+// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0);
+
+ //GNT_BT = 0
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);
+
//One shot, path B TXIQK @ RXIQK
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path B LOK & IQK!\n"));
ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
@@ -1084,9 +1145,14 @@ phy_PathB_RxIQK8723B(
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME_88E));
//PlatformStallExecution(IQK_DELAY_TIME_88E*1000);
ODM_delay_ms(IQK_DELAY_TIME_8723B);
-
+
+ //restore Ant Path
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);
+ //GNT_BT = 1
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);
+
//leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
// Check failed
regEAC = ODM_GetBBReg(pDM_Odm, rRx_Power_After_IQK_A_2, bMaskDWord);
@@ -1127,16 +1193,16 @@ phy_PathB_RxIQK8723B(
//modify RXIQK mode table
//<20121009, Kordan> RF Mode = 3
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
- ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000);
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7d77);
// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x0);
//open PA S1 & close SMIXER
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x20, 0x1);
- ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x60fbd);
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x30ebd);
//PA, PAD setting
// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xdf, bRFRegOffsetMask, 0xf80);
@@ -1155,7 +1221,7 @@ phy_PathB_RxIQK8723B(
ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82110000);
// ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x281604c2);
- ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x2816001f);
+ ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x2813001f);
ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
@@ -1164,7 +1230,14 @@ phy_PathB_RxIQK8723B(
ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x0046a8d1);
//enter IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
+
+ //switch to path B
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, 0x00000280);
+// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0);
+
+ //GNT_BT = 0
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00000800);
//One shot, path B LOK & IQK
// ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path B LOK & IQK!\n"));
@@ -1176,8 +1249,13 @@ phy_PathB_RxIQK8723B(
//PlatformStallExecution(IQK_DELAY_TIME_88E*1000);
ODM_delay_ms(IQK_DELAY_TIME_8723B);
+ //restore Ant Path
+ ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord,Path_SEL_BB);
+ //GNT_BT = 1
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, 0x00001800);
+
//leave IQK mode
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
// Check failed
regEAC = ODM_GetBBReg(pDM_Odm, rRx_Power_After_IQK_A_2, bMaskDWord);
@@ -1191,7 +1269,7 @@ phy_PathB_RxIQK8723B(
// PA/PAD controlled by 0x0
//leave IQK mode
-// ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+// ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x00000000);
// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xdf, bRFRegOffsetMask, 0x180 );
@@ -1706,12 +1784,12 @@ _PHY_PathAStandBy8723B(
#endif
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A standby mode!\n"));
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x0);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x0);
//Allen
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bMaskDWord, 0x10000);
//ODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x00010000);
//
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
}
VOID
@@ -1996,7 +2074,7 @@ if( pAdapter->registrypriv.mp_mode == 1 && pAdapter->mppriv.mode == 3 )
#endif
//save RF path for 8723B
- Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);
+// Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);
// Path_SEL_RF = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, 0xfffff);
//MAC settings
@@ -2044,7 +2122,7 @@ if( pAdapter->registrypriv.mp_mode == 1 && pAdapter->mppriv.mode == 3 )
//RX IQ calibration setting for 8723B D cut large current issue when leaving IPS
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000);
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);
@@ -2072,7 +2150,7 @@ if( pAdapter->registrypriv.mp_mode == 1 && pAdapter->mppriv.mode == 3 )
// if(PathAOK == 0x03){
if(PathAOK == 0x01){
// Path A Tx IQK Success
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_A] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x8, bRFRegOffsetMask);
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A Tx IQK Success!!\n"));
@@ -2150,7 +2228,7 @@ if( pAdapter->registrypriv.mp_mode == 1 && pAdapter->mppriv.mode == 3 )
// if(PathBOK == 0x03){
if(PathBOK == 0x01){
// Path B Tx IQK Success
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_B] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x8, bRFRegOffsetMask);
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B Tx IQK Success!!\n"));
@@ -2204,7 +2282,7 @@ for(i = 0 ; i < retryCount ; i++){
//Back to BB mode, load original value
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK:Back to BB mode, load original value!\n"));
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0);
if(t!=0)
{
@@ -2237,7 +2315,7 @@ for(i = 0 ; i < retryCount ; i++){
//Reload RF path
- ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, Path_SEL_BB);
+// ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, Path_SEL_BB);
// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, 0xfffff, Path_SEL_RF);
//Allen initial gain 0xc50
@@ -2563,7 +2641,7 @@ phy_APCalibrate_8723B(
}
//page-B1
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);
//path A
offset = rPdp_AntA;
@@ -2574,7 +2652,7 @@ phy_APCalibrate_8723B(
offset += 0x04;
}
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
}
else if(path == ODM_RF_PATH_B)
{
@@ -2607,7 +2685,7 @@ phy_APCalibrate_8723B(
}
//page-B1
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);
//path B
offset = 0xb60;
@@ -2618,7 +2696,7 @@ phy_APCalibrate_8723B(
offset += 0x04;
}
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0);
}
//save RF default value
@@ -2740,7 +2818,7 @@ phy_APCalibrate_8723B(
i = 0;
do
{
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x800000);
{
ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[0]);
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8188E() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord)));
@@ -2750,7 +2828,7 @@ phy_APCalibrate_8723B(
ODM_delay_ms(20);
}
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
if(path == ODM_RF_PATH_A)
tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0x03E00000);
@@ -2887,9 +2965,10 @@ PHY_IQCalibrate_8723B(
rOFDM0_XATxIQImbalance, rOFDM0_XBTxIQImbalance,
rOFDM0_XCTxAFE, rOFDM0_XDTxAFE,
rOFDM0_RxIQExtAnta};
- u4Byte Path_SEL_BB = 0;
-// u4Byte Path_SEL_BB = 0, Path_SEL_RF = 0;
-
+// u4Byte Path_SEL_BB = 0;
+ u4Byte GNT_BT_default;
+ u4Byte StartTime;
+ s4Byte ProgressingTime;
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE) )
if (ODM_CheckPowerStatus(pAdapter) == FALSE)
@@ -3001,16 +3080,18 @@ PHY_IQCalibrate_8723B(
#endif
return;
}
+ StartTime = ODM_GetCurrentTime( pDM_Odm);
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK:Start!!!\n"));
-
+ //save default GNT_BT
+ GNT_BT_default = ODM_GetBBReg(pDM_Odm, 0x764, bMaskDWord);
// Save RF Path
- Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);
+// Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord);
// Path_SEL_RF = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, 0xfffff);
//set GNT_BT=0, pause BT traffic
- ODM_SetBBReg(pDM_Odm, 0x764, BIT12, 0x0);
- ODM_SetBBReg(pDM_Odm, 0x764, BIT11, 0x1);
+// ODM_SetBBReg(pDM_Odm, 0x764, BIT12, 0x0);
+// ODM_SetBBReg(pDM_Odm, 0x764, BIT11, 0x1);
for(i = 0; i < 8; i++)
@@ -3173,13 +3254,23 @@ PHY_IQCalibrate_8723B(
_PHY_SaveADDARegisters8723B(pDM_Odm, IQK_BB_REG_92C, pDM_Odm->RFCalibrateInfo.IQK_BB_backup_recover, IQK_BB_REG_NUM);
#endif
+ //restore GNT_BT
+ ODM_SetBBReg(pDM_Odm, 0x764, bMaskDWord, GNT_BT_default);
// Restore RF Path
- ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, Path_SEL_BB);
+// ODM_SetBBReg(pDM_Odm, 0x948, bMaskDWord, Path_SEL_BB);
// ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xb0, 0xfffff, Path_SEL_RF);
+ //Resotr RX mode table parameter
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1 );
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000 );
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f );
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xe6177 );
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x20, 0x1 );
+ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x300bd );
+
//set GNT_BT= HW control
- ODM_SetBBReg(pDM_Odm, 0x764, BIT12, 0x0);
- ODM_SetBBReg(pDM_Odm, 0x764, BIT11, 0x0);
+// ODM_SetBBReg(pDM_Odm, 0x764, BIT12, 0x0);
+// ODM_SetBBReg(pDM_Odm, 0x764, BIT11, 0x0);
if (Is2ant) {
if (RF_Path == 0x0) //S1
@@ -3193,6 +3284,8 @@ PHY_IQCalibrate_8723B(
ODM_ReleaseSpinLock(pDM_Odm, RT_IQK_SPINLOCK);
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK finished\n"));
+ ProgressingTime = ODM_GetProgressingTime( pDM_Odm, StartTime);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK ProgressingTime = %d\n", ProgressingTime));
}
@@ -3205,6 +3298,8 @@ PHY_LCCalibrate_8723B(
{
BOOLEAN bStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE;
u4Byte timeout = 2000, timecount = 0;
+ u4Byte StartTime;
+ s4Byte ProgressingTime;
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
PADAPTER pAdapter = pDM_Odm->Adapter;
@@ -3241,7 +3336,8 @@ PHY_LCCalibrate_8723B(
// 20120213<Kordan> Turn on when continuous Tx to pass lab testing. (required by Edlu)
if(bSingleTone || bCarrierSuppression)
return;
-
+
+ StartTime = ODM_GetCurrentTime( pDM_Odm);
while(*(pDM_Odm->pbScanInProcess) && timecount < timeout)
{
ODM_delay_ms(50);
@@ -3257,7 +3353,8 @@ PHY_LCCalibrate_8723B(
pDM_Odm->RFCalibrateInfo.bLCKInProgress = FALSE;
ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LCK:Finish!!!interface %d\n", pDM_Odm->InterfaceIndex));
-
+ ProgressingTime = ODM_GetProgressingTime( pDM_Odm, StartTime);
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LCK ProgressingTime = %d\n", ProgressingTime));
}
VOID
@@ -3494,9 +3591,9 @@ phy_DigitalPredistortion8723B(
// PA gain = 11 & PAD2 => tx_agc 10~0e
// PA gain = 01 => tx_agc 0b~0d
// PA gain = 00 => tx_agc 0a~00
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);
ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
//do inner loopback DPK 3 times
for(i = 0; i < 3; i++)
@@ -3567,8 +3664,8 @@ phy_DigitalPredistortion8723B(
{
ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x02017098);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
ODM_delay_ms(1);
ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0);
ODM_delay_ms(1);
@@ -3594,7 +3691,7 @@ phy_DigitalPredistortion8723B(
ODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x776d9f84);
ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87);
ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00880000);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);
for(i=rPdp_AntA; i<=0xb3c; i+=4)
{
@@ -3614,7 +3711,7 @@ phy_DigitalPredistortion8723B(
//TX_AGC boundary
ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
}
else
{
@@ -3633,9 +3730,9 @@ phy_DigitalPredistortion8723B(
// PA gain = 11 & PAD2, => tx_agc 10 ~0e
// PA gain = 01 => tx_agc 0b ~0d
// PA gain = 00 => tx_agc 0a ~00
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);
ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
//do inner loopback DPK 3 times
for(i = 0; i < 3; i++)
@@ -3706,8 +3803,8 @@ phy_DigitalPredistortion8723B(
{
ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x800000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
ODM_delay_ms(1);
ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0);
ODM_delay_ms(1);
@@ -3734,7 +3831,7 @@ phy_DigitalPredistortion8723B(
ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87);
ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x400000);
for(i=0xb60; i<=0xb9c; i+=4)
{
ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000);
@@ -3753,7 +3850,7 @@ phy_DigitalPredistortion8723B(
// tx_agc boundary
ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f);
- ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
+ ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
}
else
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.c b/rtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.c
index e2ae8a7..a81a00d 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.c
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.c
@@ -567,30 +567,6 @@ odm_CCKRSSI_8723B(
return rx_pwr_all;
}
-s1Byte
-odm_RSSIOFDM_8723B(
- IN s1Byte rx_pwr_new)
-{
- s1Byte rx_pwr_all=0;
-
- if(rx_pwr_new >=63)
- rx_pwr_all =rx_pwr_new -120+10;
- else if(rx_pwr_all >=54)
- rx_pwr_all=rx_pwr_new-120+6;
- else if(rx_pwr_all >=43)
- rx_pwr_all=rx_pwr_new-120+8;
- else if(rx_pwr_all >=33)
- rx_pwr_all=rx_pwr_new-120+8;
- else if(rx_pwr_all >=23)
- rx_pwr_all=rx_pwr_new-120+10;
- else
- rx_pwr_all=rx_pwr_new-120+7;
-
-
- return rx_pwr_all;
-
-}
-
#endif // end if RTL8723B
diff --git a/rtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.h b/rtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.h
index f544f21..dd5da85 100755
--- a/rtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.h
+++ b/rtl8723BS/hal/OUTSRC/rtl8723b/odm_RTL8723B.h
@@ -31,11 +31,6 @@ odm_CCKRSSI_8723B(
IN u1Byte VGA_idx
);
-s1Byte
-odm_RSSIOFDM_8723B(
- IN s1Byte rx_pwr_new
- );
-
#endif
diff --git a/rtl8723BS/hal/hal_btcoex.c b/rtl8723BS/hal/hal_btcoex.c
index 2d843d3..650b1b7 100755
--- a/rtl8723BS/hal/hal_btcoex.c
+++ b/rtl8723BS/hal/hal_btcoex.c
@@ -64,17 +64,17 @@ const char *const h2cStaString[] =
const char *const ioStaString[] =
{
- "IO_STATUS_SUCCESS",
- "IO_STATUS_FAIL_CANNOT_IO",
- "IO_STATUS_FAIL_RF_OFF",
- "IO_STATUS_FAIL_FW_READ_CLEAR_TIMEOUT",
- "IO_STATUS_FAIL_WAIT_IO_EVENT_TIMEOUT",
- "IO_STATUS_INVALID_LEN",
- "IO_STATUS_IO_IDLE_QUEUE_EMPTY",
- "IO_STATUS_IO_INSERT_WAIT_QUEUE_FAIL",
- "IO_STATUS_UNKNOWN_FAIL",
- "IO_STATUS_WRONG_LEVEL",
- "IO_STATUS_H2C_STOPPED",
+ "success",
+ "can not IO",
+ "rf off",
+ "fw not read",
+ "wait io timeout",
+ "invalid len",
+ "idle Q empty",
+ "insert waitQ fail",
+ "unknown fail",
+ "wrong level",
+ "h2c stopped",
};
BTC_COEXIST GLBtCoexist;
@@ -499,7 +499,7 @@ static u8 halbtcoutsrc_GetWifiScanAPNum(PADAPTER padapter)
pmlmepriv = &padapter->mlmepriv;
pmlmeext = &padapter->mlmeextpriv;
- if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) == _FALSE) {
+ if (GLBtcWiFiInScanState == _FALSE) {
if (pmlmeext->sitesurvey_res.bss_cnt > 0xFF)
scan_AP_num = 0xFF;
else
@@ -629,6 +629,17 @@ u8 halbtcoutsrc_Get(void *pBtcContext, u8 getType, void *pOutBuf)
*pu8 = _FALSE;
break;
+ case BTC_GET_BL_WIFI_IS_IN_MP_MODE:
+ if (padapter->registrypriv.mp_mode == 0)
+ {
+ *pu8 = _FALSE;
+ }
+ else
+ {
+ *pu8 = _TRUE;
+ }
+ break;
+
case BTC_GET_BL_EXT_SWITCH:
*pu8 = _FALSE;
break;
@@ -766,6 +777,11 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf)
case BTC_SET_BL_INC_SCAN_DEV_NUM:
pBtCoexist->btInfo.bIncreaseScanDevNum = *pu8;
+ break;
+
+ case BTC_SET_BL_BT_TX_RX_MASK:
+ pBtCoexist->btInfo.bBtTxRxMask = *pu8;
+ break;
// set some u8 type variables.
case BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON:
@@ -877,7 +893,21 @@ u8 halbtcoutsrc_Set(void *pBtcContext, u8 setType, void *pInBuf)
ret = _FALSE;
#endif
break;
-
+ case BTC_SET_ACT_CTRL_8723B_ANT:
+#if 0
+ {
+ u1Byte dataLen=*pU1Tmp;
+ u1Byte tmpBuf[20];
+ if(dataLen)
+ {
+ PlatformMoveMemory(&tmpBuf[0], pU1Tmp+1, dataLen);
+ }
+ BT_Set8723bAnt(Adapter, dataLen, &tmpBuf[0]);
+ }
+#else
+ ret = _FALSE;
+#endif
+ break;
//=====================
default:
ret = _FALSE;
@@ -909,14 +939,24 @@ void halbtcoutsrc_DisplayCoexStatistics(PBTC_COEXIST pBtCoexist)
CL_PRINTF(cliBuf);
}
}
-
+#else
+ for(i=0; i<IO_STATUS_MAX; i++)
+ {
+ if(Adapter->ioComStr.ioH2cStatistics[i])
+ {
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s] = %d", "H2C statistics", \
+ ioStaString[i], Adapter->ioComStr.ioH2cStatistics[i]);
+ CL_PRINTF(cliBuf);
+ }
+ }
+#endif
+#if 0
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "lastHMEBoxNum", \
pHalData->LastHMEBoxNum);
CL_PRINTF(cliBuf);
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x / 0x%x", "LastSuccessFwEid/FirstfailedFwEid", \
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x / 0x%x", "LastOkH2c/FirstFailH2c(fwNotRead)", \
pHalData->lastSuccessH2cEid, pHalData->firstFailedH2cEid);
CL_PRINTF(cliBuf);
-#endif
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "c2hIsr/c2hIntr/clr1AF/noRdy/noBuf", \
pHalData->InterruptLog.nIMR_C2HCMD, DBG_Var.c2hInterruptCnt, DBG_Var.c2hClrReadC2hCnt,
@@ -926,12 +966,13 @@ void halbtcoutsrc_DisplayCoexStatistics(PBTC_COEXIST pBtCoexist)
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "c2hPacket", \
DBG_Var.c2hPacketCnt);
CL_PRINTF(cliBuf);
-
+#endif
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Periodical/ DbgCtrl", \
pBtCoexist->statistics.cntPeriodical, pBtCoexist->statistics.cntDbgCtrl);
CL_PRINTF(cliBuf);
- CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "InitHw/InitCoexDm/", \
- pBtCoexist->statistics.cntInitHwConfig, pBtCoexist->statistics.cntInitCoexDm);
+ CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d", "PowerOn/InitHw/InitCoexDm/RfStatus", \
+ pBtCoexist->statistics.cntPowerOn, pBtCoexist->statistics.cntInitHwConfig, pBtCoexist->statistics.cntInitCoexDm,
+ pBtCoexist->statistics.cntRfStatusNotify);
CL_PRINTF(cliBuf);
CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d", "Ips/Lps/Scan/Connect/Mstatus", \
pBtCoexist->statistics.cntIpsNotify, pBtCoexist->statistics.cntLpsNotify,
@@ -1092,6 +1133,21 @@ void halbtcoutsrc_Write4Byte(void *pBtcContext, u32 RegAddr, u32 Data)
rtw_write32(padapter, RegAddr, Data);
}
+void halbtcoutsrc_WriteLocalReg1Byte(void *pBtcContext, u32 RegAddr, u8 Data)
+{
+ PBTC_COEXIST pBtCoexist=(PBTC_COEXIST)pBtcContext;
+ PADAPTER Adapter=pBtCoexist->Adapter;
+
+ if(BTC_INTF_SDIO == pBtCoexist->chipInterface)
+ {
+ rtw_write8(Adapter, SDIO_LOCAL_BASE | RegAddr, Data);
+ }
+ else
+ {
+ rtw_write8(Adapter, RegAddr, Data);
+ }
+}
+
void halbtcoutsrc_SetBbReg(void *pBtcContext, u32 RegAddr, u32 BitMask, u32 Data)
{
PBTC_COEXIST pBtCoexist;
@@ -1174,6 +1230,12 @@ void halbtcoutsrc_SetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr, u32 Data)
}
}
+u32 halbtcoutsrc_GetBtReg(void *pBtcContext, u8 RegType, u32 RegAddr)
+{
+ /* To be implemented. Always return 0 temporarily */
+ return 0;
+}
+
void halbtcoutsrc_FillH2cCmd(void *pBtcContext, u8 elementId, u32 cmdLen, u8 *pCmdBuffer)
{
PBTC_COEXIST pBtCoexist;
@@ -1242,20 +1304,47 @@ u8 halbtcoutsrc_UnderIps(PBTC_COEXIST pBtCoexist)
//====================================
// Extern functions called by other module
//====================================
+u8 EXhalbtcoutsrc_BindBtCoexWithAdapter(void *padapter)
+{
+ PBTC_COEXIST pBtCoexist=&GLBtCoexist;
+ u1Byte antNum=2, chipType;
+
+ if(pBtCoexist->bBinded)
+ return _FALSE;
+ else
+ pBtCoexist->bBinded = _TRUE;
+
+ pBtCoexist->statistics.cntBind++;
+
+ pBtCoexist->Adapter = padapter;
+
+ pBtCoexist->stackInfo.bProfileNotified = _FALSE;
+
+ pBtCoexist->btInfo.bBtCtrlAggBufSize = _FALSE;
+ pBtCoexist->btInfo.aggBufSize = 5;
+
+ pBtCoexist->btInfo.bIncreaseScanDevNum = _FALSE;
+
+#if 0
+ chipType = HALBT_GetBtChipType(Adapter);
+ EXhalbtcoutsrc_SetChipType(chipType);
+ antNum = HALBT_GetPgAntNum(Adapter);
+ EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum);
+#endif
+ // set default antenna position to main port
+ pBtCoexist->boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+
+ return _TRUE;
+}
+
u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
{
PBTC_COEXIST pBtCoexist = &GLBtCoexist;
-
- pBtCoexist->statistics.cntBind++;
+ //pBtCoexist->statistics.cntBind++;
halbtcoutsrc_DbgInit();
- if (pBtCoexist->bBinded)
- return _FALSE;
- else
- pBtCoexist->bBinded = _TRUE;
-
#ifdef CONFIG_PCI_HCI
pBtCoexist->chipInterface = BTC_INTF_PCI;
#elif defined(CONFIG_USB_HCI)
@@ -1266,12 +1355,7 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
pBtCoexist->chipInterface = BTC_INTF_UNKNOWN;
#endif
- if (NULL == pBtCoexist->Adapter)
- {
- pBtCoexist->Adapter = padapter;
- }
-
- pBtCoexist->stackInfo.bProfileNotified = _FALSE;
+ EXhalbtcoutsrc_BindBtCoexWithAdapter(padapter);
pBtCoexist->fBtcRead1Byte = halbtcoutsrc_Read1Byte;
pBtCoexist->fBtcWrite1Byte = halbtcoutsrc_Write1Byte;
@@ -1280,6 +1364,7 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
pBtCoexist->fBtcWrite2Byte = halbtcoutsrc_Write2Byte;
pBtCoexist->fBtcRead4Byte = halbtcoutsrc_Read4Byte;
pBtCoexist->fBtcWrite4Byte = halbtcoutsrc_Write4Byte;
+ pBtCoexist->fBtcWriteLocalReg1Byte = halbtcoutsrc_WriteLocalReg1Byte;
pBtCoexist->fBtcSetBbReg = halbtcoutsrc_SetBbReg;
pBtCoexist->fBtcGetBbReg = halbtcoutsrc_GetBbReg;
@@ -1287,21 +1372,18 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
pBtCoexist->fBtcSetRfReg = halbtcoutsrc_SetRfReg;
pBtCoexist->fBtcGetRfReg = halbtcoutsrc_GetRfReg;
- pBtCoexist->fBtcSetBtReg = halbtcoutsrc_SetBtReg;
-
pBtCoexist->fBtcFillH2c = halbtcoutsrc_FillH2cCmd;
pBtCoexist->fBtcDispDbgMsg = halbtcoutsrc_DisplayDbgMsg;
pBtCoexist->fBtcGet = halbtcoutsrc_Get;
pBtCoexist->fBtcSet = halbtcoutsrc_Set;
+ pBtCoexist->fBtcGetBtReg = halbtcoutsrc_GetBtReg;
+ pBtCoexist->fBtcSetBtReg = halbtcoutsrc_SetBtReg;
- pBtCoexist->cliBuf = GLBtcDbgBuf;
-
- pBtCoexist->btInfo.bBtCtrlAggBufSize = _FALSE;
- pBtCoexist->btInfo.aggBufSize = 5;
-
- pBtCoexist->btInfo.bIncreaseScanDevNum = _FALSE;
+ pBtCoexist->cliBuf = &GLBtcDbgBuf[0];
+ pBtCoexist->boardInfo.singleAntPath = 0;
+
GLBtcWiFiInScanState = _FALSE;
GLBtcWiFiInIQKState = _FALSE;
@@ -1309,7 +1391,22 @@ u8 EXhalbtcoutsrc_InitlizeVariables(void *padapter)
return _TRUE;
}
-void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist)
+void EXhalbtcoutsrc_PowerOnSetting(PBTC_COEXIST pBtCoexist)
+{
+ if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
+ return;
+
+ /* Power on setting function is only added in 8723B currently */
+ if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
+ {
+ if (pBtCoexist->boardInfo.btdmAntNum == 2)
+ EXhalbtc8723b2ant_PowerOnSetting(pBtCoexist);
+ else if (pBtCoexist->boardInfo.btdmAntNum == 1)
+ EXhalbtc8723b1ant_PowerOnSetting(pBtCoexist);
+ }
+}
+
+void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist, u8 bWifiOnly)
{
if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
return;
@@ -1319,45 +1416,45 @@ void EXhalbtcoutsrc_InitHwConfig(PBTC_COEXIST pBtCoexist)
if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
{
if (pBtCoexist->boardInfo.btdmAntNum == 2)
- EXhalbtc8821a2ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8821a2ant_InitHwConfig(pBtCoexist, bWifiOnly);
else if (pBtCoexist->boardInfo.btdmAntNum == 1)
- EXhalbtc8821a1ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8821a1ant_InitHwConfig(pBtCoexist, bWifiOnly);
}
else if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
{
if (pBtCoexist->boardInfo.btdmAntNum == 2)
- EXhalbtc8723b2ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8723b2ant_InitHwConfig(pBtCoexist, bWifiOnly);
else if (pBtCoexist->boardInfo.btdmAntNum == 1)
- EXhalbtc8723b1ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8723b1ant_InitHwConfig(pBtCoexist, bWifiOnly);
}
else if (IS_HARDWARE_TYPE_8723A(pBtCoexist->Adapter))
{
if (pBtCoexist->boardInfo.btdmAntNum == 2)
- EXhalbtc8723a2ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8723a2ant_InitHwConfig(pBtCoexist, bWifiOnly);
}
else if (IS_HARDWARE_TYPE_8192C(pBtCoexist->Adapter))
{
if (pBtCoexist->boardInfo.btdmAntNum == 2)
- EXhalbtc8188c2ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8188c2ant_InitHwConfig(pBtCoexist, bWifiOnly);
}
else if (IS_HARDWARE_TYPE_8192D(pBtCoexist->Adapter))
{
if (pBtCoexist->boardInfo.btdmAntNum == 2)
- EXhalbtc8192d2ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8192d2ant_InitHwConfig(pBtCoexist, bWifiOnly);
}
else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))
{
if (pBtCoexist->boardInfo.btdmAntNum == 2)
- EXhalbtc8192e2ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8192e2ant_InitHwConfig(pBtCoexist, bWifiOnly);
else if (pBtCoexist->boardInfo.btdmAntNum == 1)
- EXhalbtc8192e1ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8192e1ant_InitHwConfig(pBtCoexist, bWifiOnly);
}
else if (IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))
{
if (pBtCoexist->boardInfo.btdmAntNum == 2)
- EXhalbtc8812a2ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8812a2ant_InitHwConfig(pBtCoexist, bWifiOnly);
else if (pBtCoexist->boardInfo.btdmAntNum == 1)
- EXhalbtc8812a1ant_InitHwConfig(pBtCoexist);
+ EXhalbtc8812a1ant_InitHwConfig(pBtCoexist, bWifiOnly);
}
}
@@ -1874,6 +1971,32 @@ void EXhalbtcoutsrc_BtInfoNotify(PBTC_COEXIST pBtCoexist, u8 *tmpBuf, u8 length)
// halbtcoutsrc_NormalLowPower(pBtCoexist);
}
+VOID
+EXhalbtcoutsrc_RfStatusNotify(
+ IN PBTC_COEXIST pBtCoexist,
+ IN u1Byte type
+ )
+{
+ if(!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
+ return;
+ pBtCoexist->statistics.cntRfStatusNotify++;
+
+ if(IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
+ {
+ }
+ else if(IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
+ {
+ if(pBtCoexist->boardInfo.btdmAntNum == 1)
+ EXhalbtc8723b1ant_RfStatusNotify(pBtCoexist, type);
+ }
+ else if(IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))
+ {
+ }
+ else if(IS_HARDWARE_TYPE_8812(pBtCoexist->Adapter))
+ {
+ }
+}
+
void EXhalbtcoutsrc_StackOperationNotify(PBTC_COEXIST pBtCoexist, u8 type)
{
#if 0
@@ -1961,9 +2084,11 @@ void EXhalbtcoutsrc_HaltNotify(PBTC_COEXIST pBtCoexist)
else if (pBtCoexist->boardInfo.btdmAntNum == 1)
EXhalbtc8812a1ant_HaltNotify(pBtCoexist);
}
+
+ pBtCoexist->bBinded = FALSE;
}
-void EXhalbtcoutsrc_SwitchGntBt(PBTC_COEXIST pBtCoexist)
+void EXhalbtcoutsrc_SwitchBtTRxMask(PBTC_COEXIST pBtCoexist)
{
if (IS_HARDWARE_TYPE_8723B(pBtCoexist->Adapter))
{
@@ -1992,11 +2117,15 @@ void EXhalbtcoutsrc_PnpNotify(PBTC_COEXIST pBtCoexist, u8 pnpState)
{
if (pBtCoexist->boardInfo.btdmAntNum == 1)
EXhalbtc8723b1ant_PnpNotify(pBtCoexist,pnpState);
+ else if(pBtCoexist->boardInfo.btdmAntNum == 2)
+ EXhalbtc8723b2ant_PnpNotify(pBtCoexist,pnpState);
}
else if (IS_HARDWARE_TYPE_8821(pBtCoexist->Adapter))
{
if (pBtCoexist->boardInfo.btdmAntNum == 1)
EXhalbtc8821a1ant_PnpNotify(pBtCoexist,pnpState);
+ else if(pBtCoexist->boardInfo.btdmAntNum == 2)
+ EXhalbtc8821a2ant_PnpNotify(pBtCoexist,pnpState);
}
else if (IS_HARDWARE_TYPE_8192E(pBtCoexist->Adapter))
{
@@ -2010,7 +2139,7 @@ void EXhalbtcoutsrc_PnpNotify(PBTC_COEXIST pBtCoexist, u8 pnpState)
}
}
-void EXhalbtcoutsrc_CoexDmSwitch(PBTC_COEXIST pBtCoexist, BOOLEAN antInverse)
+void EXhalbtcoutsrc_CoexDmSwitch(PBTC_COEXIST pBtCoexist)
{
if (!halbtcoutsrc_IsBtCoexistAvailable(pBtCoexist))
return;
@@ -2024,8 +2153,8 @@ void EXhalbtcoutsrc_CoexDmSwitch(PBTC_COEXIST pBtCoexist, BOOLEAN antInverse)
{
pBtCoexist->bStopCoexDm = TRUE;
EXhalbtc8723b1ant_CoexDmReset(pBtCoexist);
- EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_DETECTED, 2, antInverse);
- EXhalbtc8723b2ant_InitHwConfig(pBtCoexist);
+ EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_DETECTED, 2);
+ EXhalbtc8723b2ant_InitHwConfig(pBtCoexist, FALSE);
EXhalbtc8723b2ant_InitCoexDm(pBtCoexist);
pBtCoexist->bStopCoexDm = FALSE;
}
@@ -2219,11 +2348,12 @@ void EXhalbtcoutsrc_SetBtPatchVersion(u16 btHciVersion, u16 btPatchVersion)
pBtCoexist->btInfo.btHciVer = btHciVersion;
}
+#if 0
void EXhalbtcoutsrc_SetBtExist(u8 bBtExist)
{
GLBtCoexist.boardInfo.bBtExist = bBtExist;
}
-
+#endif
void EXhalbtcoutsrc_SetChipType(u8 chipType)
{
switch(chipType)
@@ -2253,13 +2383,13 @@ void EXhalbtcoutsrc_SetChipType(u8 chipType)
}
}
-void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum, BOOLEAN antInverse)
+void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum)
{
if (BT_COEX_ANT_TYPE_PG == type)
{
GLBtCoexist.boardInfo.pgAntNum = antNum;
GLBtCoexist.boardInfo.btdmAntNum = antNum;
-
+#if 0
//The antenna position: Main (default) or Aux for pgAntNum=2 && btdmAntNum =1
//The antenna position should be determined by auto-detect mechanism
// The following is assumed to main, and those must be modified if y auto-detect mechanism is ready
@@ -2267,22 +2397,26 @@ void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum, BOOLEAN antInverse)
GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
else
GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+#endif
}
else if (BT_COEX_ANT_TYPE_ANTDIV == type)
{
GLBtCoexist.boardInfo.btdmAntNum = antNum;
- GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+ //GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
}
else if (BT_COEX_ANT_TYPE_DETECTED == type)
{
GLBtCoexist.boardInfo.btdmAntNum = antNum;
- GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
+ //GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
}
+}
- if (antInverse == _TRUE)
- {
- GLBtCoexist.boardInfo.btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
- }
+//
+// Currently used by 8723b only, S0 or S1
+//
+void EXhalbtcoutsrc_SetSingleAntPath(u8 singleAntPath)
+{
+ GLBtCoexist.boardInfo.singleAntPath = singleAntPath;
}
void EXhalbtcoutsrc_DisplayBtCoexInfo(PBTC_COEXIST pBtCoexist)
@@ -2405,7 +2539,7 @@ void hal_btcoex_SetBTCoexist(PADAPTER padapter, u8 bBtExist)
pHalData = GET_HAL_DATA(padapter);
pHalData->bt_coexist.bBtExist = bBtExist;
- EXhalbtcoutsrc_SetBtExist(bBtExist);
+ //EXhalbtcoutsrc_SetBtExist(bBtExist);
}
/*
@@ -2456,7 +2590,7 @@ u8 hal_btcoex_GetChipType(PADAPTER padapter)
return pHalData->bt_coexist.btChipType;
}
-void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum, BOOLEAN antInverse)
+void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum)
{
PHAL_DATA_TYPE pHalData;
@@ -2464,7 +2598,7 @@ void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum, BOOLEAN antInverse)
pHalData = GET_HAL_DATA(padapter);
pHalData->bt_coexist.btTotalAntNum = antNum;
- EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum, antInverse);
+ EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum);
}
u8 hal_btcoex_GetPgAntNum(PADAPTER padapter)
@@ -2477,6 +2611,11 @@ u8 hal_btcoex_GetPgAntNum(PADAPTER padapter)
return pHalData->bt_coexist.btTotalAntNum;
}
+void hal_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath)
+{
+ EXhalbtcoutsrc_SetSingleAntPath(singleAntPath);
+}
+
u8 hal_btcoex_Initialize(PADAPTER padapter)
{
u8 ret1;
@@ -2490,7 +2629,12 @@ u8 hal_btcoex_Initialize(PADAPTER padapter)
return ret2;
}
-void hal_btcoex_InitHwConfig(PADAPTER padapter)
+void hal_btcoex_PowerOnSetting(PADAPTER padapter)
+{
+ EXhalbtcoutsrc_PowerOnSetting(&GLBtCoexist);
+}
+
+void hal_btcoex_InitHwConfig(PADAPTER padapter, u8 bWifiOnly)
{
if (!hal_btcoex_IsBtExist(padapter))
return;
@@ -2504,7 +2648,7 @@ void hal_btcoex_InitHwConfig(PADAPTER padapter)
halbt_InitHwConfig92D(padapter);
}
- EXhalbtcoutsrc_InitHwConfig(&GLBtCoexist);
+ EXhalbtcoutsrc_InitHwConfig(&GLBtCoexist, bWifiOnly);
EXhalbtcoutsrc_InitCoexDm(&GLBtCoexist);
}
@@ -2566,9 +2710,9 @@ void hal_btcoex_HaltNotify(PADAPTER padapter)
EXhalbtcoutsrc_HaltNotify(&GLBtCoexist);
}
-void hal_btcoex_SwitchGntBt(PADAPTER padapter)
+void hal_btcoex_SwitchBtTRxMask(PADAPTER padapter)
{
- EXhalbtcoutsrc_SwitchGntBt(&GLBtCoexist);
+ EXhalbtcoutsrc_SwitchBtTRxMask(&GLBtCoexist);
}
void hal_btcoex_Hanlder(PADAPTER padapter)
diff --git a/rtl8723BS/hal/hal_com.c b/rtl8723BS/hal/hal_com.c
index 20b7f19..5c7dceb 100755
--- a/rtl8723BS/hal/hal_com.c
+++ b/rtl8723BS/hal/hal_com.c
@@ -20,9 +20,40 @@
#define _HAL_COM_C_
#include <drv_types.h>
+#include "hal_com_h2c.h"
#include "../hal/OUTSRC/odm_precomp.h"
+u8 rtw_hal_data_init(_adapter *padapter)
+{
+ if(is_primary_adapter(padapter)) //if(padapter->isprimary)
+ {
+ padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
+ padapter->HalData = rtw_zvmalloc(padapter->hal_data_sz);
+ if(padapter->HalData == NULL){
+ DBG_8192C("cant not alloc memory for HAL DATA \n");
+ return _FAIL;
+ }
+ }
+ return _SUCCESS;
+}
+
+void rtw_hal_data_deinit(_adapter *padapter)
+{
+ if(is_primary_adapter(padapter)) //if(padapter->isprimary)
+ {
+ if (padapter->HalData)
+ {
+ #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
+ phy_free_filebuf(padapter);
+ #endif
+ rtw_vmfree(padapter->HalData, padapter->hal_data_sz);
+ padapter->HalData = NULL;
+ padapter->hal_data_sz = 0;
+ }
+ }
+}
+
void dump_chip_info(HAL_VERSION ChipVersion)
{
@@ -436,7 +467,7 @@ _TwoOutPipeMapping(
// BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
//{ 0, 1, 0, 1, 0, 0, 0, 0, 0 };
- //0:H, 1:N
+ //0:ep_0 num, 1:ep_1 num
pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];//VO
pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI
@@ -454,7 +485,7 @@ _TwoOutPipeMapping(
//BK, BE, VI, VO, BCN, CMD,MGT,HIGH,HCCA
//{ 1, 1, 0, 0, 0, 0, 0, 0, 0 };
- //0:H, 1:N
+ //0:ep_0 num, 1:ep_1 num
pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];//VO
pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];//VI
@@ -1019,6 +1050,58 @@ _func_enter_;
case HW_VAR_PORT_SWITCH:
hw_var_port_switch(adapter);
break;
+ case HW_VAR_INIT_RTS_RATE:
+ {
+ u16 brate_cfg = *((u16*)val);
+ u8 rate_index = 0;
+ HAL_VERSION *hal_ver = &hal_data->VersionID;
+
+ if (IS_81XXC(*hal_ver) ||IS_92D(*hal_ver) || IS_8723_SERIES(*hal_ver) || IS_8188E(*hal_ver)) {
+
+ while (brate_cfg > 0x1) {
+ brate_cfg = (brate_cfg >> 1);
+ rate_index++;
+ }
+ rtw_write8(adapter, REG_INIRTS_RATE_SEL, rate_index);
+ } else {
+ rtw_warn_on(1);
+ }
+ }
+ break;
+ case HW_VAR_SEC_CFG:
+ {
+ #if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
+ // enable tx enc and rx dec engine, and no key search for MC/BC
+ rtw_write8(adapter, REG_SECCFG, SCR_NoSKMC|SCR_RxDecEnable|SCR_TxEncEnable);
+ #elif defined(DYNAMIC_CAMID_ALLOC)
+ u16 reg_scr;
+
+ reg_scr = rtw_read16(adapter, REG_SECCFG);
+ rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
+ #else
+ rtw_write8(adapter, REG_SECCFG, *((u8*)val));
+ #endif
+ }
+ break;
+ case HW_VAR_SEC_DK_CFG:
+ {
+ struct security_priv *sec = &adapter->securitypriv;
+ u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
+
+ if (val) /* Enable default key related setting */
+ {
+ reg_scr |= SCR_TXBCUSEDK;
+ if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
+ reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
+ }
+ else /* Disable default key related setting */
+ {
+ reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
+ }
+
+ rtw_write8(adapter, REG_SECCFG, reg_scr);
+ }
+ break;
case HW_VAR_DM_FLAG:
odm->SupportAbility = *((u32*)val);
break;
@@ -1192,39 +1275,141 @@ GetHalDefVar(_adapter *adapter, HAL_DEF_VARIABLE variable, void *value)
u8 bResult = _SUCCESS;
switch(variable) {
- case HW_DEF_ODM_DBG_FLAG:
- *((u8Byte*)value) = odm->DebugComponents;
- break;
- case HW_DEF_ODM_DBG_LEVEL:
- *((u4Byte*)value) = odm->DebugLevel;
- break;
- case HAL_DEF_DBG_DM_FUNC:
- *(( u32*)value) =hal_data->odmpriv.SupportAbility;
- break;
- case HAL_DEF_DBG_DUMP_RXPKT:
- *((u8*)value) = hal_data->bDumpRxPkt;
- break;
- case HAL_DEF_DBG_DUMP_TXPKT:
- *((u8*)value) = hal_data->bDumpTxPkt;
- break;
- case HAL_DEF_ANT_DETECT:
- *((u8 *)value) = hal_data->AntDetection;
- break;
- case HAL_DEF_MACID_SLEEP:
- *(u8*)value = _FALSE;
- break;
- case HAL_DEF_TX_PAGE_SIZE:
- *(( u32*)value) = PAGE_SIZE_128;
- break;
- default:
- DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
- bResult = _FAIL;
- break;
+ case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
+ {
+ struct mlme_priv *pmlmepriv;
+ struct sta_priv *pstapriv;
+ struct sta_info *psta;
+
+ pmlmepriv = &adapter->mlmepriv;
+ pstapriv = &adapter->stapriv;
+ psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress);
+ if (psta)
+ {
+ *((int*)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;
+ }
+ }
+ break;
+ case HW_DEF_ODM_DBG_FLAG:
+ *((u8Byte*)value) = odm->DebugComponents;
+ break;
+ case HW_DEF_ODM_DBG_LEVEL:
+ *((u4Byte*)value) = odm->DebugLevel;
+ break;
+ case HAL_DEF_DBG_DM_FUNC:
+ *(( u32*)value) =hal_data->odmpriv.SupportAbility;
+ break;
+ case HAL_DEF_DBG_DUMP_RXPKT:
+ *((u8*)value) = hal_data->bDumpRxPkt;
+ break;
+ case HAL_DEF_DBG_DUMP_TXPKT:
+ *((u8*)value) = hal_data->bDumpTxPkt;
+ break;
+ case HAL_DEF_ANT_DETECT:
+ *((u8 *)value) = hal_data->AntDetection;
+ break;
+ case HAL_DEF_MACID_SLEEP:
+ *(u8*)value = _FALSE;
+ break;
+ case HAL_DEF_TX_PAGE_SIZE:
+ *(( u32*)value) = PAGE_SIZE_128;
+ break;
+ default:
+ DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __FUNCTION__, variable);
+ bResult = _FAIL;
+ break;
}
return bResult;
}
+void GetHalODMVar(
+ PADAPTER Adapter,
+ HAL_ODM_VARIABLE eVariable,
+ PVOID pValue1,
+ PVOID pValue2)
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PDM_ODM_T podmpriv = &pHalData->odmpriv;
+ switch(eVariable){
+#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+ case HAL_ODM_NOISE_MONITOR:
+ {
+ u8 chan = *(u8*)pValue1;
+ *(s16 *)pValue2 = pHalData->noise[chan];
+ #ifdef DBG_NOISE_MONITOR
+ DBG_8192C("### Noise monitor chan(%d)-noise:%d (dBm) ###\n",
+ chan,pHalData->noise[chan]);
+ #endif
+
+ }
+ break;
+#endif//#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+ default:
+ break;
+ }
+}
+
+void SetHalODMVar(
+ PADAPTER Adapter,
+ HAL_ODM_VARIABLE eVariable,
+ PVOID pValue1,
+ BOOLEAN bSet)
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
+ PDM_ODM_T podmpriv = &pHalData->odmpriv;
+ //_irqL irqL;
+ switch(eVariable){
+ case HAL_ODM_STA_INFO:
+ {
+ struct sta_info *psta = (struct sta_info *)pValue1;
+ if(bSet){
+ DBG_8192C("### Set STA_(%d) info ###\n",psta->mac_id);
+ ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,psta);
+ }
+ else{
+ DBG_8192C("### Clean STA_(%d) info ###\n",psta->mac_id);
+ //_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
+ ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,NULL);
+
+ //_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
+ }
+ }
+ break;
+ case HAL_ODM_P2P_STATE:
+ ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DIRECT,bSet);
+ break;
+ case HAL_ODM_WIFI_DISPLAY_STATE:
+ ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DISPLAY,bSet);
+ break;
+ #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+ case HAL_ODM_NOISE_MONITOR:
+ {
+ struct noise_info *pinfo = (struct noise_info *)pValue1;
+
+ #ifdef DBG_NOISE_MONITOR
+ DBG_8192C("### Noise monitor chan(%d)-bPauseDIG:%d,IGIValue:0x%02x,max_time:%d (ms) ###\n",
+ pinfo->chan,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);
+ #endif
+
+ pHalData->noise[pinfo->chan] = ODM_InbandNoise_Monitor(podmpriv,pinfo->bPauseDIG,pinfo->IGIValue,pinfo->max_time);
+ DBG_871X("chan_%d, noise = %d (dBm)\n",pinfo->chan,pHalData->noise[pinfo->chan]);
+ #ifdef DBG_NOISE_MONITOR
+ DBG_871X("noise_a = %d, noise_b = %d noise_all:%d \n",
+ podmpriv->noise_level.noise[ODM_RF_PATH_A],
+ podmpriv->noise_level.noise[ODM_RF_PATH_B],
+ podmpriv->noise_level.noise_all);
+ #endif
+ }
+ break;
+ #endif//#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+
+ default:
+ break;
+ }
+}
+
+
BOOLEAN
eqNByte(
u8* str1,
@@ -1631,3 +1816,395 @@ void rtw_store_phy_info(_adapter *padapter, union recv_frame *prframe)
}
}
#endif
+
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+int check_phy_efuse_tx_power_info_valid(PADAPTER padapter) {
+ EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+ u8* pContent = pEEPROM->efuse_eeprom_data;
+ int index = 0;
+ u16 tx_index_offset = 0x0000;
+
+ switch(padapter->chip_type) {
+ case RTL8723B:
+ tx_index_offset = EEPROM_TX_PWR_INX_8723B;
+ break;
+ case RTL8188E:
+ tx_index_offset = EEPROM_TX_PWR_INX_88E;
+ break;
+ case RTL8192E:
+ tx_index_offset = EEPROM_TX_PWR_INX_8192E;
+ break;
+ default:
+ tx_index_offset = 0x0010;
+ break;
+ }
+ for (index = 0 ; index < 12 ; index++) {
+ if (pContent[tx_index_offset + index] == 0xFF) {
+ return _FALSE;
+ } else {
+ DBG_871X("0x%02x ,", pContent[EEPROM_TX_PWR_INX_88E+index]);
+ }
+ }
+ DBG_871X("\n");
+ return _TRUE;
+}
+
+int check_phy_efuse_macaddr_info_valid(PADAPTER padapter) {
+
+ u8 val = 0;
+ u16 addr_offset = 0x0000;
+
+ switch(padapter->chip_type) {
+ case RTL8723B:
+ if (padapter->interface_type == RTW_USB) {
+ addr_offset = EEPROM_MAC_ADDR_8723BU;
+ DBG_871X("%s: interface is USB\n", __func__);
+ } else if (padapter->interface_type == RTW_SDIO) {
+ addr_offset = EEPROM_MAC_ADDR_8723BS;
+ DBG_871X("%s: interface is SDIO\n", __func__);
+ } else if (padapter->interface_type == RTW_PCIE) {
+ addr_offset = EEPROM_MAC_ADDR_8723BE;
+ DBG_871X("%s: interface is PCIE\n", __func__);
+ } else if (padapter->interface_type == RTW_GSPI) {
+ //addr_offset = EEPROM_MAC_ADDR_8723BS;
+ DBG_871X("%s: interface is GSPI\n", __func__);
+ }
+ break;
+ case RTL8188E:
+ if (padapter->interface_type == RTW_USB) {
+ addr_offset = EEPROM_MAC_ADDR_88EU;
+ DBG_871X("%s: interface is USB\n", __func__);
+ } else if (padapter->interface_type == RTW_SDIO) {
+ addr_offset = EEPROM_MAC_ADDR_88ES;
+ DBG_871X("%s: interface is SDIO\n", __func__);
+ } else if (padapter->interface_type == RTW_PCIE) {
+ addr_offset = EEPROM_MAC_ADDR_88EE;
+ DBG_871X("%s: interface is PCIE\n", __func__);
+ } else if (padapter->interface_type == RTW_GSPI) {
+ //addr_offset = EEPROM_MAC_ADDR_8723BS;
+ DBG_871X("%s: interface is GSPI\n", __func__);
+ }
+ break;
+ }
+
+ if (addr_offset == 0x0000) {
+ DBG_871X("phy efuse MAC addr offset is 0!!\n");
+ return _FALSE;
+ } else {
+ rtw_efuse_map_read(padapter, addr_offset, 1, &val);
+ }
+
+ if (val == 0xFF) {
+ return _FALSE;
+ } else {
+ DBG_871X("phy efuse with valid MAC addr\n");
+ return _TRUE;
+ }
+}
+
+u32 Hal_readPGDataFromConfigFile(
+ PADAPTER padapter,
+ struct file *fp)
+{
+ u32 i;
+ mm_segment_t fs;
+ u8 temp[3];
+ loff_t pos = 0;
+ EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+ u8 *PROMContent = pEEPROM->efuse_eeprom_data;
+
+ temp[2] = 0; // add end of string '\0'
+
+ fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ for (i = 0 ; i < HWSET_MAX_SIZE ; i++) {
+ vfs_read(fp, temp, 2, &pos);
+ PROMContent[i] = simple_strtoul(temp, NULL, 16);
+ if ((i % EFUSE_FILE_COLUMN_NUM) == (EFUSE_FILE_COLUMN_NUM - 1)) {
+ //Filter the lates space char.
+ vfs_read(fp, temp, 1, &pos);
+ if (strchr(temp, ' ') == NULL) {
+ pos--;
+ vfs_read(fp, temp, 2, &pos);
+ }
+ } else {
+ pos += 1; // Filter the space character
+ }
+ }
+
+ set_fs(fs);
+ pEEPROM->bloadfile_fail_flag = _FALSE;
+
+#ifdef CONFIG_DEBUG
+ DBG_871X("Efuse configure file:\n");
+ for (i=0; i<HWSET_MAX_SIZE; i++)
+ {
+ if (i % 16 == 0)
+ printk("\n");
+
+ printk("%02X ", PROMContent[i]);
+ }
+ printk("\n");
+#endif
+
+ return _SUCCESS;
+}
+
+void Hal_ReadMACAddrFromFile(
+ PADAPTER padapter,
+ struct file *fp)
+{
+ u32 i;
+ mm_segment_t fs;
+ u8 source_addr[18];
+ loff_t pos = 0;
+ u32 curtime = rtw_get_current_time();
+ EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
+ u8 *head, *end;
+
+ _rtw_memset(source_addr, 0, 18);
+ _rtw_memset(pEEPROM->mac_addr, 0, ETH_ALEN);
+
+ fs = get_fs();
+ set_fs(KERNEL_DS);
+
+ DBG_871X("wifi mac address:\n");
+ vfs_read(fp, source_addr, 18, &pos);
+ source_addr[17] = ':';
+
+ head = end = source_addr;
+ for (i=0; i<ETH_ALEN; i++) {
+ while (end && (*end != ':') )
+ end++;
+
+ if (end && (*end == ':') )
+ *end = '\0';
+
+ pEEPROM->mac_addr[i] = simple_strtoul(head, NULL, 16 );
+
+ if (end) {
+ end++;
+ head = end;
+ }
+ }
+
+ set_fs(fs);
+ pEEPROM->bloadmac_fail_flag = _FALSE;
+
+ if (rtw_check_invalid_mac_address(pEEPROM->mac_addr) == _TRUE) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+ get_random_bytes(pEEPROM->mac_addr, ETH_ALEN);
+ pEEPROM->mac_addr[0] = 0x00;
+ pEEPROM->mac_addr[1] = 0xe0;
+ pEEPROM->mac_addr[2] = 0x4c;
+#else
+ pEEPROM->mac_addr[0] = 0x00;
+ pEEPROM->mac_addr[1] = 0xe0;
+ pEEPROM->mac_addr[2] = 0x4c;
+ pEEPROM->mac_addr[3] = (u8)(curtime & 0xff) ;
+ pEEPROM->mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
+ pEEPROM->mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
+#endif
+ DBG_871X("MAC Address from wifimac error is invalid, assign random MAC !!!\n");
+ }
+
+ DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
+ __func__, pEEPROM->mac_addr[0], pEEPROM->mac_addr[1],
+ pEEPROM->mac_addr[2], pEEPROM->mac_addr[3],
+ pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]);
+}
+
+void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr) {
+ int i = 0;
+ u16 addr_offset = 0x0000;
+
+ switch(padapter->chip_type) {
+ case RTL8723B:
+ if (padapter->interface_type == RTW_USB) {
+ addr_offset = EEPROM_MAC_ADDR_8723BU;
+ DBG_871X("%s: interface is USB\n", __func__);
+ } else if (padapter->interface_type == RTW_SDIO) {
+ addr_offset = EEPROM_MAC_ADDR_8723BS;
+ DBG_871X("%s: interface is SDIO\n", __func__);
+ } else if (padapter->interface_type == RTW_PCIE) {
+ addr_offset = EEPROM_MAC_ADDR_8723BE;
+ DBG_871X("%s: interface is PCIE\n", __func__);
+ } else if (padapter->interface_type == RTW_GSPI){
+ //addr_offset = EEPROM_MAC_ADDR_8723BS;
+ DBG_871X("%s: interface is GSPI\n", __func__);
+ }
+ break;
+ case RTL8188E:
+ if (padapter->interface_type == RTW_USB) {
+ addr_offset = EEPROM_MAC_ADDR_88EU;
+ DBG_871X("%s: interface is USB\n", __func__);
+ } else if (padapter->interface_type == RTW_SDIO) {
+ addr_offset = EEPROM_MAC_ADDR_88ES;
+ DBG_871X("%s: interface is SDIO\n", __func__);
+ } else if (padapter->interface_type == RTW_PCIE) {
+ addr_offset = EEPROM_MAC_ADDR_88EE;
+ DBG_871X("%s: interface is PCIE\n", __func__);
+ } else if (padapter->interface_type == RTW_GSPI){
+ //addr_offset = EEPROM_MAC_ADDR_8723BS;
+ DBG_871X("%s: interface is GSPI\n", __func__);
+ }
+ break;
+ }
+
+ rtw_efuse_map_read(padapter, addr_offset, ETH_ALEN, mac_addr);
+
+ if (rtw_check_invalid_mac_address(mac_addr) == _TRUE) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))
+ get_random_bytes(mac_addr, ETH_ALEN);
+ mac_addr[0] = 0x00;
+ mac_addr[1] = 0xe0;
+ mac_addr[2] = 0x4c;
+#else
+ mac_addr[0] = 0x00;
+ mac_addr[1] = 0xe0;
+ mac_addr[2] = 0x4c;
+ mac_addr[3] = (u8)(curtime & 0xff) ;
+ mac_addr[4] = (u8)((curtime>>8) & 0xff) ;
+ mac_addr[5] = (u8)((curtime>>16) & 0xff) ;
+#endif
+ DBG_871X("MAC Address from phy efuse error, assign random MAC !!!\n");
+ }
+
+ DBG_871X("%s: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
+ __func__, mac_addr[0], mac_addr[1], mac_addr[2],
+ mac_addr[3], mac_addr[4], mac_addr[5]);
+}
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
+#ifdef CONFIG_RF_GAIN_OFFSET
+u32 Array_kfreemap[] = {
+0xf8,0xe,
+0xf6,0xc,
+0xf4,0xa,
+0xf2,0x8,
+0xf0,0x6,
+0xf3,0x4,
+0xf5,0x2,
+0xf7,0x0,
+0xf9,0x0,
+0xfc,0x0,
+};
+
+void rtw_bb_rf_gain_offset(_adapter *padapter)
+{
+ u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
+ u8 tmp = 0x3e;
+ u32 res,i=0;
+ u4Byte ArrayLen = sizeof(Array_kfreemap)/sizeof(u32);
+ pu4Byte Array = Array_kfreemap;
+ u4Byte v1=0,v2=0,target=0;
+ //DBG_871X("+%s value: 0x%02x+\n", __func__, value);
+#if defined(CONFIG_RTL8723A)
+ if (value & BIT0) {
+ DBG_871X("Offset RF Gain.\n");
+ DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal);
+ if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){
+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xd, 0xffffffff);
+ DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
+ res &= 0xfff87fff;
+
+ res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
+ DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
+
+ rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET_CCK, RF_GAIN_OFFSET_MASK, res);
+
+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xe, 0xffffffff);
+ DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
+ res &= 0xfffffff0;
+
+ res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f);
+ DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
+
+ rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET_OFDM, RF_GAIN_OFFSET_MASK, res);
+ }
+ else
+ {
+ DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal);
+ }
+ } else {
+ DBG_871X("Using the default RF gain.\n");
+ }
+#elif defined(CONFIG_RTL8723B)
+ if (value & BIT4) {
+ DBG_871X("Offset RF Gain.\n");
+ DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal);
+ if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){
+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
+ res &= 0xfff87fff;
+ DBG_871X("Offset RF Gain. before reg 0x7f=0x%08x\n",res);
+ //res &= 0xfff87fff;
+ for (i = 0; i < ArrayLen; i += 2 )
+ {
+ v1 = Array[i];
+ v2 = Array[i+1];
+ if ( v1 == padapter->eeprompriv.EEPROMRFGainVal )
+ {
+ DBG_871X("Offset RF Gain. got v1 =0x%x ,v2 =0x%x \n",v1,v2);
+ target=v2;
+ break;
+ }
+ }
+ DBG_871X("padapter->eeprompriv.EEPROMRFGainVal=0x%x ,Gain offset Target Value=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal,target);
+ PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
+
+ //res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
+ //rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
+ DBG_871X("Offset RF Gain. After reg 0x7f=0x%08x\n",res);
+ }
+ else
+ {
+ DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal);
+ }
+ } else {
+ DBG_871X("Using the default RF gain.\n");
+ }
+
+#elif defined(CONFIG_RTL8188E)
+ if (value & BIT4) {
+ DBG_871X("8188ES Offset RF Gain.\n");
+ DBG_871X("8188ES Offset RF Gain. EEPROMRFGainVal=0x%x\n",
+ padapter->eeprompriv.EEPROMRFGainVal);
+
+ if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) {
+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A,
+ REG_RF_BB_GAIN_OFFSET, 0xffffffff);
+
+ DBG_871X("Offset RF Gain. reg 0x55=0x%x\n",res);
+ res &= 0xfff87fff;
+
+ res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f) << 15;
+ DBG_871X("Offset RF Gain. res=0x%x\n",res);
+
+ rtw_hal_write_rfreg(padapter, RF_PATH_A,
+ REG_RF_BB_GAIN_OFFSET,
+ RF_GAIN_OFFSET_MASK, res);
+ } else {
+ DBG_871X("Offset RF Gain. EEPROMRFGainVal=0x%x == 0xff, didn't run Kfree\n",
+ padapter->eeprompriv.EEPROMRFGainVal);
+ }
+ } else {
+ DBG_871X("Using the default RF gain.\n");
+ }
+#else
+ if (!(value & 0x01)) {
+ //DBG_871X("Offset RF Gain.\n");
+ res = rtw_hal_read_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, 0xffffffff);
+ value &= tmp;
+ res = value << 14;
+ rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
+ } else {
+ DBG_871X("Using the default RF gain.\n");
+ }
+#endif
+
+}
+#endif //CONFIG_RF_GAIN_OFFSET
+
+
diff --git a/rtl8723BS/hal/hal_com_phycfg.c b/rtl8723BS/hal/hal_com_phycfg.c
index 8bb2747..30803a9 100755
--- a/rtl8723BS/hal/hal_com_phycfg.c
+++ b/rtl8723BS/hal/hal_com_phycfg.c
@@ -404,7 +404,7 @@ PHY_GetRateSectionIndexOfTxPowerByRate(
case rTxAGC_A_Rate54_24: index = 1; break;
case rTxAGC_A_CCK1_Mcs32: index = 6; break;
case rTxAGC_B_CCK11_A_CCK2_11:
- if ( BitMask == 0xffffff00 )
+ if ( BitMask == bMaskH3Bytes )
index = 7;
else if ( BitMask == 0x000000ff )
index = 15;
@@ -2341,7 +2341,7 @@ PHY_GetTxPowerIndex(
u8 txPower = 0x3E;
if (IS_HARDWARE_TYPE_8813A(pAdapter)) {
-//#if (RTL8813A_SUPPORT==1)
+//#if (RTL8814A_SUPPORT==1)
// txPower = PHY_GetTxPowerIndex_8813A( pAdapter, PowerIndex, RFPath, Rate );
//#endif
}
@@ -2378,7 +2378,7 @@ PHY_SetTxPowerIndex(
)
{
if (IS_HARDWARE_TYPE_8813A(pAdapter)) {
-//#if (RTL8813A_SUPPORT==1)
+//#if (RTL8814A_SUPPORT==1)
// PHY_SetTxPowerIndex_8813A( pAdapter, PowerIndex, RFPath, Rate );
//#endif
}
@@ -2605,7 +2605,7 @@ phy_ConfigMACWithParaFile(
if (rlen > 0)
{
rtStatus = _SUCCESS;
- pHalData->mac_reg = rtw_zmalloc(rlen);
+ pHalData->mac_reg = rtw_zvmalloc(rlen);
if(pHalData->mac_reg) {
_rtw_memcpy(pHalData->mac_reg, pHalData->para_file_buf, rlen);
pHalData->mac_reg_len = rlen;
@@ -2704,7 +2704,7 @@ phy_ConfigBBWithParaFile(
if (rlen > 0)
{
rtStatus = _SUCCESS;
- pBuf = rtw_zmalloc(rlen);
+ pBuf = rtw_zvmalloc(rlen);
if(pBuf) {
_rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);
*pBufLen = rlen;
@@ -3157,7 +3157,7 @@ phy_ConfigBBWithPgParaFile(
if (rlen > 0)
{
rtStatus = _SUCCESS;
- pHalData->bb_phy_reg_pg = rtw_zmalloc(rlen);
+ pHalData->bb_phy_reg_pg = rtw_zvmalloc(rlen);
if(pHalData->bb_phy_reg_pg) {
_rtw_memcpy(pHalData->bb_phy_reg_pg, pHalData->para_file_buf, rlen);
pHalData->bb_phy_reg_pg_len = rlen;
@@ -3220,7 +3220,7 @@ phy_ConfigBBWithMpParaFile(
if (rlen > 0)
{
rtStatus = _SUCCESS;
- pHalData->bb_phy_reg_mp = rtw_zmalloc(rlen);
+ pHalData->bb_phy_reg_mp = rtw_zvmalloc(rlen);
if(pHalData->bb_phy_reg_mp) {
_rtw_memcpy(pHalData->bb_phy_reg_mp, pHalData->para_file_buf, rlen);
pHalData->bb_phy_reg_mp_len = rlen;
@@ -3356,7 +3356,7 @@ PHY_ConfigRFWithParaFile(
if (rlen > 0)
{
rtStatus = _SUCCESS;
- pBuf = rtw_zmalloc(rlen);
+ pBuf = rtw_zvmalloc(rlen);
if(pBuf) {
_rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);
*pBufLen = rlen;
@@ -3634,7 +3634,7 @@ PHY_ConfigRFWithTxPwrTrackParaFile(
if (rlen > 0)
{
rtStatus = _SUCCESS;
- pHalData->rf_tx_pwr_track = rtw_zmalloc(rlen);
+ pHalData->rf_tx_pwr_track = rtw_zvmalloc(rlen);
if(pHalData->rf_tx_pwr_track) {
_rtw_memcpy(pHalData->rf_tx_pwr_track, pHalData->para_file_buf, rlen);
pHalData->rf_tx_pwr_track_len = rlen;
@@ -4003,7 +4003,7 @@ PHY_ConfigRFWithPowerLimitTableParaFile(
if (rlen > 0)
{
rtStatus = _SUCCESS;
- pHalData->rf_tx_pwr_lmt = rtw_zmalloc(rlen);
+ pHalData->rf_tx_pwr_lmt = rtw_zvmalloc(rlen);
if(pHalData->rf_tx_pwr_lmt) {
_rtw_memcpy(pHalData->rf_tx_pwr_lmt, pHalData->para_file_buf, rlen);
pHalData->rf_tx_pwr_lmt_len = rlen;
@@ -4037,6 +4037,30 @@ PHY_ConfigRFWithPowerLimitTableParaFile(
return rtStatus;
}
-#endif
+void phy_free_filebuf(_adapter *padapter)
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
+
+ if(pHalData->mac_reg)
+ rtw_vmfree(pHalData->mac_reg, pHalData->mac_reg_len);
+ if(pHalData->bb_phy_reg)
+ rtw_vmfree(pHalData->bb_phy_reg, pHalData->bb_phy_reg_len);
+ if(pHalData->bb_agc_tab)
+ rtw_vmfree(pHalData->bb_agc_tab, pHalData->bb_agc_tab_len);
+ if(pHalData->bb_phy_reg_pg)
+ rtw_vmfree(pHalData->bb_phy_reg_pg, pHalData->bb_phy_reg_pg_len);
+ if(pHalData->bb_phy_reg_mp)
+ rtw_vmfree(pHalData->bb_phy_reg_mp, pHalData->bb_phy_reg_mp_len);
+ if(pHalData->rf_radio_a)
+ rtw_vmfree(pHalData->rf_radio_a, pHalData->rf_radio_a_len);
+ if(pHalData->rf_radio_b)
+ rtw_vmfree(pHalData->rf_radio_b, pHalData->rf_radio_b_len);
+ if(pHalData->rf_tx_pwr_track)
+ rtw_vmfree(pHalData->rf_tx_pwr_track, pHalData->rf_tx_pwr_track_len);
+ if(pHalData->rf_tx_pwr_lmt)
+ rtw_vmfree(pHalData->rf_tx_pwr_lmt, pHalData->rf_tx_pwr_lmt_len);
+
+}
+#endif
diff --git a/rtl8723BS/hal/hal_intf.c b/rtl8723BS/hal/hal_intf.c
index f099c05..9bbacbe 100755
--- a/rtl8723BS/hal/hal_intf.c
+++ b/rtl8723BS/hal/hal_intf.c
@@ -49,6 +49,9 @@ void rtw_hal_def_value_init(_adapter *padapter)
}
void rtw_hal_free_data(_adapter *padapter)
{
+ //free HAL Data
+ rtw_hal_data_deinit(padapter);
+
if (is_primary_adapter(padapter))
if(padapter->HalFunc.free_hal_data)
padapter->HalFunc.free_hal_data(padapter);
@@ -153,26 +156,29 @@ uint rtw_hal_init(_adapter *padapter)
rtw_hal_init_opmode(padapter);
- for (i = 0; i<dvobj->iface_nums; i++) {
- padapter = dvobj->padapters[i];
- padapter->hw_init_completed = _TRUE;
- }
+ for (i = 0; i<dvobj->iface_nums; i++)
+ dvobj->padapters[i]->hw_init_completed = _TRUE;
if (padapter->registrypriv.notch_filter == 1)
rtw_hal_notch_filter(padapter, 1);
rtw_hal_reset_security_engine(padapter);
- rtw_sec_restore_wep_key(padapter);
+
+ for (i = 0; i<dvobj->iface_nums; i++)
+ rtw_sec_restore_wep_key(dvobj->padapters[i]);
rtw_led_control(padapter, LED_CTL_POWER_ON);
init_hw_mlme_ext(padapter);
+
+#ifdef CONFIG_RF_GAIN_OFFSET
+ rtw_bb_rf_gain_offset(padapter);
+#endif //CONFIG_RF_GAIN_OFFSET
+
}
else{
- for (i = 0; i<dvobj->iface_nums; i++) {
- padapter = dvobj->padapters[i];
- padapter->hw_init_completed = _FALSE;
- }
+ for (i = 0; i<dvobj->iface_nums; i++)
+ dvobj->padapters[i]->hw_init_completed = _FALSE;
DBG_871X("rtw_hal_init: hal__init fail\n");
}
@@ -246,10 +252,10 @@ void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID p
if(padapter->HalFunc.SetHalODMVarHandler)
padapter->HalFunc.SetHalODMVarHandler(padapter,eVariable,pValue1,bSet);
}
-void rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet)
+void rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2)
{
if(padapter->HalFunc.GetHalODMVarHandler)
- padapter->HalFunc.GetHalODMVarHandler(padapter,eVariable,pValue1,bSet);
+ padapter->HalFunc.GetHalODMVarHandler(padapter,eVariable,pValue1,pValue2);
}
void rtw_hal_enable_interrupt(_adapter *padapter)
diff --git a/rtl8723BS/hal/rtl8723b/rtl8723b_cmd.c b/rtl8723BS/hal/rtl8723b/rtl8723b_cmd.c
index 8abbd59..635a419 100755
--- a/rtl8723BS/hal/rtl8723b/rtl8723b_cmd.c
+++ b/rtl8723BS/hal/rtl8723b/rtl8723b_cmd.c
@@ -1491,21 +1491,14 @@ static void rtl8723b_set_FwRemoteWakeCtrl_Cmd(PADAPTER padapter, u8 benable)
DBG_871X("%s(): Enable=%d\n", __func__, benable);
-#ifdef CONFIG_PNO_SUPPORT
- SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(u1H2CRemoteWakeCtrlParm, benable);
- SET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, benable);
-#endif
-
if (!ppwrpriv->wowlan_pno_enable) {
SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(u1H2CRemoteWakeCtrlParm, benable);
SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, 1);
#ifdef CONFIG_GTK_OL
- if(psecuritypriv->binstallKCK_KEK == _TRUE && psecuritypriv->dot11PrivacyAlgrthm == _AES_)
- {
+ if (psecuritypriv->binstallKCK_KEK == _TRUE &&
+ psecuritypriv->dot11PrivacyAlgrthm == _AES_) {
SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, 1);
- }
- else
- {
+ } else {
DBG_871X("no kck or security is not AES\n");
SET_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, 0);
}
@@ -1513,15 +1506,20 @@ static void rtl8723b_set_FwRemoteWakeCtrl_Cmd(PADAPTER padapter, u8 benable)
SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN(u1H2CRemoteWakeCtrlParm, 1);
- if ((psecuritypriv->dot11PrivacyAlgrthm == _AES_) || (psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_))
+ if ((psecuritypriv->dot11PrivacyAlgrthm == _AES_) ||
+ (psecuritypriv->dot11PrivacyAlgrthm == _NO_PRIVACY_))
{
SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(u1H2CRemoteWakeCtrlParm, 0);
- }
- else
- {
+ } else {
SET_H2CCMD_REMOTE_WAKE_CTRL_ARP_ACTION(u1H2CRemoteWakeCtrlParm, 1);
}
}
+#ifdef CONFIG_PNO_SUPPORT
+ else {
+ SET_H2CCMD_REMOTE_WAKECTRL_ENABLE(u1H2CRemoteWakeCtrlParm, benable);
+ SET_H2CCMD_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(u1H2CRemoteWakeCtrlParm, benable);
+ }
+#endif
exit:
RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CRemoteWakeCtrlParm:", u1H2CRemoteWakeCtrlParm, H2C_REMOTE_WAKE_CTRL_LEN);
FillH2CCmd8723B(padapter, H2C_8723B_REMOTE_WAKE_CTRL,
@@ -2142,7 +2140,7 @@ static void rtl8723b_set_FwRsvdPagePkt(PADAPTER padapter, BOOLEAN bDLFinished)
#endif //CONFIG_WOWLAN
{
#ifdef CONFIG_PNO_SUPPORT
- if (pwrctl->pno_in_resume == _FALSE) {
+ if (pwrctl->pno_in_resume == _FALSE && pwrctl->pno_inited == _TRUE) {
//Probe Request
RsvdPageLoc.LocProbePacket = TotalPageNum;
ConstructProbeReq(
diff --git a/rtl8723BS/hal/rtl8723b/rtl8723b_dm.c b/rtl8723BS/hal/rtl8723b/rtl8723b_dm.c
index 19d4ed5..df708cc 100755
--- a/rtl8723BS/hal/rtl8723b/rtl8723b_dm.c
+++ b/rtl8723BS/hal/rtl8723b/rtl8723b_dm.c
@@ -323,6 +323,7 @@ static void Update_ODM_ComInfo_8723b(PADAPTER Adapter)
| ODM_BB_RSSI_MONITOR
| ODM_BB_CCK_PD
| ODM_BB_PWR_SAVE
+ | ODM_BB_CFO_TRACKING
| ODM_MAC_EDCA_TURBO
| ODM_RF_TX_PWR_TRACK
| ODM_RF_CALIBRATION
@@ -417,7 +418,9 @@ rtl8723b_InitHalDm(
pdmpriv->InitDMFlag = pdmpriv->DMFlag;
Update_ODM_ComInfo_8723b(Adapter);
- ODM_DMInit(pDM_Odm);
+
+ if (Adapter->registrypriv.mp_mode == 0)
+ ODM_DMInit(pDM_Odm);
}
@@ -572,6 +575,7 @@ if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP p
{
u8 bLinked=_FALSE;
u8 bsta_state=_FALSE;
+ u8 bBtDisabled = _TRUE;
if(rtw_linked_check(Adapter)){
bLinked = _TRUE;
@@ -590,8 +594,13 @@ if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP p
ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);
ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);
- FindMinimumRSSI_8723b(Adapter);
- ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);
+ //FindMinimumRSSI_8723b(Adapter);
+ //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);
+
+#ifdef CONFIG_BT_COEXIST
+ bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);
+#endif // CONFIG_BT_COEXIST
+ ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == _TRUE)?_FALSE:_TRUE));
ODM_DMWatchdog(&pHalData->odmpriv);
}
diff --git a/rtl8723BS/hal/rtl8723b/rtl8723b_hal_init.c b/rtl8723BS/hal/rtl8723b/rtl8723b_hal_init.c
index 3c0c74d..ebfecce 100755
--- a/rtl8723BS/hal/rtl8723b/rtl8723b_hal_init.c
+++ b/rtl8723BS/hal/rtl8723b/rtl8723b_hal_init.c
@@ -456,6 +456,14 @@ int _WriteBTFWtoTxPktBuf8723B(
#else
TotalPktLen = FwBufLen+pHalData->HWDescHeadLength;
#endif
+
+ if((TotalPktLen+TXDESC_OFFSET) > MAX_CMDBUF_SZ)
+ {
+ DBG_871X(" WARNING %s => Total packet len = %d > MAX_CMDBUF_SZ:%d \n"
+ ,__FUNCTION__,(TotalPktLen+TXDESC_OFFSET),MAX_CMDBUF_SZ);
+ return _FAIL;
+ }
+
pGenBufReservedPagePacket = rtw_zmalloc(TotalPktLen);//GetGenTempBuffer (Adapter, TotalPktLen);
if (!pGenBufReservedPagePacket)
return _FAIL;
@@ -557,9 +565,9 @@ int _WriteBTFWtoTxPktBuf8723B(
/*---------------------------------------------------------
tx reserved_page_packet
----------------------------------------------------------*/
- if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL) {
- rtStatus = _FAIL;
- goto exit;
+ if ((pmgntframe = rtw_alloc_cmdxmitframe(pxmitpriv)) == NULL) {
+ rtStatus = _FAIL;
+ goto exit;
}
//update attribute
pattrib = &pmgntframe->attrib;
@@ -571,10 +579,14 @@ int _WriteBTFWtoTxPktBuf8723B(
//_rtw_memset(pmgntframe->buf_addr, 0, TotalPktLen+txdesc_size);
//pmgntframe->buf_addr = ReservedPagePacket ;
- _rtw_memcpy( (u8*) (pmgntframe->buf_addr + txdesc_offset), ReservedPagePacket, FwBufLen);
- DBG_871X("[%d]===>TotalPktLen + TXDESC_OFFSET TotalPacketLen:%d \n", DLBcnCount, (FwBufLen + txdesc_offset));
-
- dump_mgntframe(Adapter, pmgntframe);
+ _rtw_memcpy( (u8*) (pmgntframe->buf_addr + txdesc_offset), ReservedPagePacket, FwBufLen);
+ DBG_871X("[%d]===>TotalPktLen + TXDESC_OFFSET TotalPacketLen:%d \n", DLBcnCount, (FwBufLen + txdesc_offset));
+
+#ifdef CONFIG_PCI_HCI
+ dump_mgntframe(Adapter, pmgntframe);
+#else
+ dump_mgntframe_and_wait(Adapter, pmgntframe, 100);
+#endif
#endif
#if 1
@@ -698,17 +710,17 @@ _CheckWLANFwPatchBTFwReady(
//---------------------------------------------------------
do{
u1bTmp = PlatformEFIORead1Byte(Adapter, REG_HMEBOX_DBG_0_8723B);
- if(u1bTmp&BIT(7))
+ if((u1bTmp&BIT6) || (u1bTmp&BIT7))
{
ret = _SUCCESS;
break;
}
count++;
- RT_TRACE(_module_mp_, _drv_info_,("0x81=%x, wait for 50 ms (%d) times.\n",
+ RT_TRACE(_module_mp_, _drv_info_,("0x88=%x, wait for 50 ms (%d) times.\n",
u1bTmp, count));
rtw_msleep_os(50); // 50ms
- }while(!(u1bTmp&BIT(7)) && count < 50);
+ }while(!((u1bTmp&BIT6) || (u1bTmp&BIT7)) && count < 50);
RT_TRACE(_module_mp_, _drv_notice_,("_CheckWLANFwPatchBTFwReady():"
" Polling ready bit 0x88[7] for %d times.\n", count));
@@ -748,15 +760,9 @@ _CheckWLANFwPatchBTFwReady(
#endif
// Clear CR[8] or beacon packet will not be send to TxBuf anymore.
-#if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE)
- u1bTmp = PlatformEFIORead1Byte(Adapter, REG_CR+1);
- PlatformEFIOWrite1Byte(Adapter, REG_CR+1, (u1bTmp&(~BIT0)));
-#else
- // Remove for temparaily because of the code on v2002 is not sync to MERGE_TMEP for USB/SDIO.
- // De not remove this part on MERGE_TEMP. by tynli.
- //pHalData->RegCR_1 &= (~BIT0);
- //PlatformEFIOWrite1Byte(Adapter, REG_CR+1, pHalData->RegCR_1);
-#endif
+ u1bTmp = PlatformEFIORead1Byte(Adapter, REG_CR_8723B+1);
+ PlatformEFIOWrite1Byte(Adapter, REG_CR_8723B+1, (u1bTmp&(~BIT0)));
+
return ret;
}
@@ -1220,10 +1226,7 @@ SetFwRelatedForWoWLAN8723b(
static void rtl8723b_free_hal_data(PADAPTER padapter)
{
_func_enter_;
- if (padapter->HalData) {
- rtw_vmfree(padapter->HalData, sizeof(HAL_DATA_TYPE));
- padapter->HalData = NULL;
- }
+
_func_exit_;
}
@@ -3059,14 +3062,13 @@ void rtl8723b_GetHalODMVar(
PADAPTER Adapter,
HAL_ODM_VARIABLE eVariable,
PVOID pValue1,
- BOOLEAN bSet)
+ PVOID pValue2)
{
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T podmpriv = &pHalData->odmpriv;
switch(eVariable){
- case HAL_ODM_STA_INFO:
- break;
default:
+ GetHalODMVar(Adapter,eVariable,pValue1,pValue2);
break;
}
}
@@ -3079,35 +3081,9 @@ void rtl8723b_SetHalODMVar(
{
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T podmpriv = &pHalData->odmpriv;
- switch(eVariable){
- case HAL_ODM_STA_INFO:
- {
- struct sta_info *psta = (struct sta_info *)pValue1;
- #ifdef CONFIG_CONCURRENT_MODE
- //get Primary adapter's odmpriv
- if(Adapter->adapter_type > PRIMARY_ADAPTER && Adapter->pbuddy_adapter){
- pHalData = GET_HAL_DATA(Adapter->pbuddy_adapter);
- podmpriv = &pHalData->odmpriv;
- }
- #endif
-
- if(bSet){
- DBG_8192C("Set STA_(%d) info\n",psta->mac_id);
- ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,psta);
- }
- else{
- DBG_8192C("Clean STA_(%d) info\n",psta->mac_id);
- ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS,psta->mac_id,NULL);
- }
- }
- break;
- case HAL_ODM_P2P_STATE:
- ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DIRECT,bSet);
- break;
- case HAL_ODM_WIFI_DISPLAY_STATE:
- ODM_CmnInfoUpdate(podmpriv,ODM_CMNINFO_WIFI_DISPLAY,bSet);
- break;
+ switch(eVariable){
default:
+ SetHalODMVar(Adapter,eVariable,pValue1,bSet);
break;
}
}
@@ -3969,7 +3945,7 @@ Hal_EEValueCheck(
u8 *pIn, *pOut;
pIn = (u8*)pInValue;
pOut = (u8*)pOutValue;
- if(*pIn >= 0 && *pIn <= 63)
+ if(*pIn <= 63)
{
*pOut = *pIn;
}
@@ -4217,7 +4193,6 @@ Hal_EfuseParseBTCoexistInfo_8723B(
u8 tempval;
u32 tmpu4;
-
// RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("%s(): AutoLoadFail = %d\n", __func__, AutoLoadFail));
if (!AutoLoadFail)
{
@@ -4230,13 +4205,36 @@ Hal_EfuseParseBTCoexistInfo_8723B(
pHalData->EEPROMBluetoothType = BT_RTL8723B;
tempval = hwinfo[EEPROM_RF_BT_SETTING_8723B];
- pHalData->EEPROMBluetoothAntNum = tempval & BIT(0);
+ if(tempval !=0xFF){
+ pHalData->EEPROMBluetoothAntNum = tempval & BIT(0);
+ #ifdef CONFIG_USB_HCI
+ //if(padapter->interface_type == RTW_USB)
+ pHalData->ant_path =ODM_RF_PATH_B;//s0
+ #else //SDIO or PCIE
+ // EFUSE_0xC3[6] == 0, S1(Main)-ODM_RF_PATH_A;
+ // EFUSE_0xC3[6] == 1, S0(Aux)-ODM_RF_PATH_B
+ pHalData->ant_path = (tempval & BIT(6))?ODM_RF_PATH_B:ODM_RF_PATH_A;
+ #endif
+ }
+ else{
+ pHalData->EEPROMBluetoothAntNum = Ant_x1;
+ #ifdef CONFIG_USB_HCI
+ pHalData->ant_path = ODM_RF_PATH_B;//s0
+ #else
+ pHalData->ant_path = ODM_RF_PATH_A;
+ #endif
+ }
}
else
{
pHalData->EEPROMBluetoothCoexist = _FALSE;
pHalData->EEPROMBluetoothType = BT_RTL8723B;
- pHalData->EEPROMBluetoothAntNum = Ant_x2;
+ pHalData->EEPROMBluetoothAntNum = Ant_x1;
+ #ifdef CONFIG_USB_HCI
+ pHalData->ant_path = ODM_RF_PATH_B;//s0
+ #else
+ pHalData->ant_path = ODM_RF_PATH_A;
+ #endif
}
#ifdef CONFIG_BT_COEXIST
@@ -4262,11 +4260,11 @@ Hal_EfuseParseBTCoexistInfo_8723B(
rtw_btcoex_SetBTCoexist(padapter, pHalData->EEPROMBluetoothCoexist);
rtw_btcoex_SetChipType(padapter, pHalData->EEPROMBluetoothType);
-#if defined(CONFIG_USB_HCI)
- rtw_btcoex_SetPGAntNum(padapter, pHalData->EEPROMBluetoothAntNum==Ant_x2?2:1, _TRUE); /* Set antInverse for 8723BU */
-#else
- rtw_btcoex_SetPGAntNum(padapter, pHalData->EEPROMBluetoothAntNum==Ant_x2?2:1, _FALSE);
-#endif
+ rtw_btcoex_SetPGAntNum(padapter, pHalData->EEPROMBluetoothAntNum==Ant_x2?2:1);
+ if (pHalData->EEPROMBluetoothAntNum == Ant_x1)
+ {
+ rtw_btcoex_SetSingleAntPath(padapter, pHalData->ant_path);
+ }
#endif // CONFIG_BT_COEXIST
DBG_8192C("%s: %s BT-coex, ant_num=%d\n",
@@ -4400,9 +4398,39 @@ Hal_EfuseParseAntennaDiversity_8723B(
IN BOOLEAN AutoLoadFail
)
{
-#if 0
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
-
+#ifdef CONFIG_ANTENNA_DIVERSITY
+ HAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
+ struct registry_priv *registry_par = &pAdapter->registrypriv;
+
+ if (pHalData->EEPROMBluetoothAntNum == Ant_x1){
+ pHalData->AntDivCfg = 0;
+ }
+ else{
+ if(registry_par->antdiv_cfg == 2)// 0:OFF , 1:ON, 2:By EFUSE
+ pHalData->AntDivCfg = 0;
+ else
+ pHalData->AntDivCfg = registry_par->antdiv_cfg;
+ }
+
+ //if (REGISTRY(pAdapter,bEfusePriorityAuto) == TRUE)
+ if(registry_par->antdiv_type == 0)// If TRxAntDivType is AUTO in advanced setting, use EFUSE value instead.
+ {
+ pHalData->TRxAntDivType = hwinfo[EEPROM_RFE_OPTION_8723B];
+ if (pHalData->TRxAntDivType == 0xFF)
+ pHalData->TRxAntDivType = S0S1_SW_ANTDIV;//GetRegAntDivType(pAdapter);
+ else if (pHalData->TRxAntDivType == 0x10)
+ pHalData->TRxAntDivType = S0S1_SW_ANTDIV; //intrnal switch S0S1
+ else if (pHalData->TRxAntDivType == 0x11)
+ pHalData->TRxAntDivType = S0S1_SW_ANTDIV; //intrnal switch S0S1
+ //pHalData->TRxAntDivType = CG_TRX_HW_ANTDIV; //DPDT
+
+ }
+ else{
+ pHalData->TRxAntDivType = registry_par->antdiv_type ;//GetRegAntDivType(pAdapter);
+ }
+
+
+/*
if(!AutoLoadFail)
{
// Antenna Diversity setting.
@@ -4417,9 +4445,10 @@ Hal_EfuseParseAntennaDiversity_8723B(
pHalData->AntDivCfg = 0;
pHalData->ReverseDPDT = 1;
}
-
+
RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("EEPROM SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n",
pHalData->AntDivCfg, pHalData->TRxAntDivType));
+*/
#endif
}
@@ -4767,7 +4796,7 @@ static void rtl8723b_fill_default_txdesc(
{
ptxdesc->agg_en = 1; // AGG EN
ptxdesc->max_agg_num = 0x1f;
- ptxdesc->ampdu_density = pHalData->AMPDUDensity;
+ ptxdesc->ampdu_density = pattrib->ampdu_spacing;
}
else
ptxdesc->bk = 1; // AGG BK
@@ -5359,7 +5388,7 @@ static void hw_var_set_macaddr(PADAPTER padapter, u8 variable, u8 *val)
for (idx = 0 ; idx < 6; idx++)
{
- rtw_write8(padapter, (reg_macid+idx), val[idx]);
+ rtw_write8(GET_PRIMARY_ADAPTER(padapter), (reg_macid+idx), val[idx]);
}
}
@@ -6217,42 +6246,41 @@ _func_enter_;
break;
case HW_VAR_BASIC_RATE:
- {
- u16 BrateCfg = 0;
- u8 RateIndex = 0;
-
- // 2007.01.16, by Emily
- // Select RRSR (in Legacy-OFDM and CCK)
- // For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate.
- // We do not use other rates.
- HalSetBrateCfg(padapter, val, &BrateCfg);
-
- //2011.03.30 add by Luke Lee
- //CCK 2M ACK should be disabled for some BCM and Atheros AP IOT
- //because CCK 2M has poor TXEVM
- //CCK 5.5M & 11M ACK should be enabled for better performance
-
- pHalData->BasicRateSet = BrateCfg = (BrateCfg |0xd) & 0x15d;
- BrateCfg |= 0x01; // default enable 1M ACK rate
-#ifdef CONFIG_CMCC_TEST
- BrateCfg |= 0x0D; /* use 11M to send ACK */
- BrateCfg |= BIT(6) | BIT(7) | BIT(8); //CMCC_OFDM_ACK 12/18/24M
-#endif
- DBG_8192C("HW_VAR_BASIC_RATE: BrateCfg(%#x)\n", BrateCfg);
-
- // Set RRSR rate table.
- rtw_write8(padapter, REG_RRSR, BrateCfg&0xff);
- rtw_write8(padapter, REG_RRSR+1, (BrateCfg>>8)&0xff);
+ {
+ struct mlme_ext_info *mlmext_info = &padapter->mlmeextpriv.mlmext_info;
+ u16 input_b = 0, masked = 0, ioted = 0, BrateCfg = 0;
+ u16 rrsr_2g_force_mask = (RRSR_11M|RRSR_5_5M|RRSR_1M);
+ u16 rrsr_2g_allow_mask = (RRSR_24M|RRSR_12M|RRSR_6M|RRSR_CCK_RATES);
+
+ HalSetBrateCfg(padapter, val, &BrateCfg);
+ input_b = BrateCfg;
+
+ /* apply force and allow mask */
+ BrateCfg |= rrsr_2g_force_mask;
+ BrateCfg &= rrsr_2g_allow_mask;
+ masked = BrateCfg;
+
+ #ifdef CONFIG_CMCC_TEST
+ BrateCfg |= (RRSR_11M|RRSR_5_5M|RRSR_1M); /* use 11M to send ACK */
+ BrateCfg |= (RRSR_24M|RRSR_18M|RRSR_12M); //CMCC_OFDM_ACK 12/18/24M
+ #endif
- // Set RTS initial rate
- while (BrateCfg > 0x1)
- {
- BrateCfg = (BrateCfg >> 1);
- RateIndex++;
- }
- // Ziv - Check
- rtw_write8(padapter, REG_INIRTS_RATE_SEL, RateIndex);
+ /* IOT consideration */
+ if (mlmext_info->assoc_AP_vendor == HT_IOT_PEER_CISCO) {
+ /* if peer is cisco and didn't use ofdm rate, we enable 6M ack */
+ if((BrateCfg & (RRSR_24M|RRSR_12M|RRSR_6M)) == 0)
+ BrateCfg |= RRSR_6M;
}
+ ioted = BrateCfg;
+
+ pHalData->BasicRateSet = BrateCfg;
+
+ DBG_8192C("HW_VAR_BASIC_RATE: %#x -> %#x -> %#x\n", input_b, masked, ioted);
+
+ // Set RRSR rate table.
+ rtw_write16(padapter, REG_RRSR, BrateCfg);
+ rtw_write8(padapter, REG_RRSR+2, rtw_read8(padapter, REG_RRSR+2)&0xf0);
+ }
break;
case HW_VAR_TXPAUSE:
@@ -6373,14 +6401,6 @@ _func_enter_;
}
break;
- case HW_VAR_SEC_CFG:
-#ifdef CONFIG_CONCURRENT_MODE
- rtw_write8(padapter, REG_SECCFG, 0x0c|BIT(5));// enable tx enc and rx dec engine, and no key search for MC/BC
-#else
- rtw_write8(padapter, REG_SECCFG, *val);
-#endif
- break;
-
case HW_VAR_CAM_EMPTY_ENTRY:
{
u8 ucIndex = *val;
@@ -6470,15 +6490,6 @@ _func_enter_;
}
break;
- case HW_VAR_AMPDU_MIN_SPACE:
- {
- u8 MinSpacingToSet;
-
- MinSpacingToSet = *val;
- pHalData->AMPDUDensity = MinSpacingToSet;
- }
- break;
-
case HW_VAR_AMPDU_FACTOR:
{
u32 AMPDULen = (*((u8 *)val));
diff --git a/rtl8723BS/hal/rtl8723b/rtl8723b_mp.c b/rtl8723BS/hal/rtl8723b/rtl8723b_mp.c
index 2357a93..80b3eea 100755
--- a/rtl8723BS/hal/rtl8723b/rtl8723b_mp.c
+++ b/rtl8723BS/hal/rtl8723b/rtl8723b_mp.c
@@ -442,12 +442,12 @@ void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower)
// rf-A cck tx power
write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]);
tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A];
- write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
+ write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, tmpval);
// rf-B cck tx power
write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]);
tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B];
- write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval);
+ write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, bMaskH3Bytes, tmpval);
RT_TRACE(_module_mp_, _drv_notice_,
("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n",
@@ -554,12 +554,12 @@ mpt_SetTxPower(
pwr = pTxPower[ODM_RF_PATH_A];
TxAGC = (pwr<<16)|(pwr<<8)|(pwr);
PHY_SetBBReg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, pTxPower[ODM_RF_PATH_A]);
- PHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, TxAGC);
+ PHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, TxAGC);
pwr = pTxPower[ODM_RF_PATH_B];
TxAGC = (pwr<<16)|(pwr<<8)|(pwr);
PHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, pTxPower[ODM_RF_PATH_B]);
- PHY_SetBBReg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, TxAGC);
+ PHY_SetBBReg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, bMaskH3Bytes, TxAGC);
} break;
@@ -647,9 +647,9 @@ void Hal_SetTxPower(PADAPTER pAdapter)
void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)
{
+#if 0
u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC;
- return ;
TxAGCOffset_B = (ulTxAGCOffset&0x000000ff);
TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8);
@@ -658,6 +658,7 @@ void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)
tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B);
write_bbreg(pAdapter, rFPGA0_TxGainStage,
(bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC);
+#endif
}
void Hal_SetDataRate(PADAPTER pAdapter)
@@ -826,7 +827,7 @@ s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther)
void Hal_TriggerRFThermalMeter(PADAPTER pAdapter)
{
- PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x42, BIT17 | BIT16, 0x03);
+ PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_T_METER_8723B, BIT17 | BIT16, 0x03);
// RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" ));
}
@@ -834,7 +835,7 @@ u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter)
{
u32 ThermalValue = 0;
- ThermalValue = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, 0x42, 0xfc00); // 0x42: RF Reg[15:10]
+ ThermalValue = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_T_METER_8723B, 0xfc00); // 0x42: RF Reg[15:10]
return (u8)ThermalValue;
}
@@ -912,13 +913,13 @@ void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart)
{
case ANTENNA_A:
default:
- rfPath = RF_PATH_A;
+ pMptCtx->MptRfPath = rfPath = RF_PATH_A;
break;
case ANTENNA_B:
- rfPath = RF_PATH_B;
+ pMptCtx->MptRfPath = rfPath = RF_PATH_B;
break;
case ANTENNA_C:
- rfPath = RF_PATH_C;
+ pMptCtx->MptRfPath = rfPath = RF_PATH_C;
break;
}
diff --git a/rtl8723BS/hal/rtl8723b/rtl8723b_phycfg.c b/rtl8723BS/hal/rtl8723b/rtl8723b_phycfg.c
index 785dcfe..a366205 100755
--- a/rtl8723BS/hal/rtl8723b/rtl8723b_phycfg.c
+++ b/rtl8723BS/hal/rtl8723b/rtl8723b_phycfg.c
@@ -1059,7 +1059,14 @@ PHY_SetTxPowerLevel8723B(
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
- u8 RFPath = ( (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ODM_RF_PATH_A : ODM_RF_PATH_B);
+ u8 RFPath = ODM_RF_PATH_A;
+
+ if(pHalData->AntDivCfg){// antenna diversity Enable
+ RFPath = ( (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ODM_RF_PATH_A : ODM_RF_PATH_B);
+ }
+ else{ // antenna diversity disable
+ RFPath = pHalData->ant_path;
+ }
RT_TRACE(_module_hal_init_c_, _drv_info_,("==>PHY_SetTxPowerLevel8723B()\n"));
diff --git a/rtl8723BS/hal/rtl8723b/rtl8723b_rxdesc.c b/rtl8723BS/hal/rtl8723b/rtl8723b_rxdesc.c
index 9686aaf..6962cb6 100755
--- a/rtl8723BS/hal/rtl8723b/rtl8723b_rxdesc.c
+++ b/rtl8723BS/hal/rtl8723b/rtl8723b_rxdesc.c
@@ -21,18 +21,6 @@
#include <rtl8723b_hal.h>
-static s32 translate2dbm(u8 signal_strength_idx)
-{
- s32 signal_power; // in dBm.
-
-
- // Translate to dBm (x=0.5y-95).
- signal_power = (s32)((signal_strength_idx + 1) >> 1);
- signal_power -= 95;
-
- return signal_power;
-}
-
static void process_rssi(_adapter *padapter,union recv_frame *prframe)
{
u32 last_rssi, tmp_val;
@@ -75,10 +63,10 @@ static void process_rssi(_adapter *padapter,union recv_frame *prframe)
if(padapter->recvpriv.is_signal_dbg) {
padapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg;
- padapter->recvpriv.rssi=(s8)translate2dbm((u8)padapter->recvpriv.signal_strength_dbg);
+ padapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(padapter->recvpriv.signal_strength_dbg);
} else {
padapter->recvpriv.signal_strength= tmp_val;
- padapter->recvpriv.rssi=(s8)translate2dbm((u8)tmp_val);
+ padapter->recvpriv.rssi=(s8)translate_percentage_to_dbm(tmp_val);
}
RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\n", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num));
diff --git a/rtl8723BS/hal/rtl8723b/sdio/rtl8723bs_recv.c b/rtl8723BS/hal/rtl8723b/sdio/rtl8723bs_recv.c
index e86aa10..fd92aff 100755
--- a/rtl8723BS/hal/rtl8723b/sdio/rtl8723bs_recv.c
+++ b/rtl8723BS/hal/rtl8723b/sdio/rtl8723bs_recv.c
@@ -160,6 +160,7 @@ void update_recvframe_phyinfo(
//rtl8723b_query_rx_phy_status(precvframe, pphy_status);
//_enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
ODM_PhyStatusQuery(&pHalData->odmpriv,pPHYInfo,(u8 *)pphy_status,&(pkt_info));
+ if(psta) psta->rssi = pattrib->phy_info.RecvSignalPower;
//_exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL);
precvframe->u.hdr.psta = NULL;
if (pkt_info.bPacketMatchBSSID &&
@@ -394,8 +395,11 @@ static void rtl8723bs_recv_tasklet(void *priv)
padapter->mppriv.rx_crcerrpktcount++;
}
}
+ else
#endif
- DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
+ {
+ DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
+ }
rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue);
}
else
@@ -652,8 +656,11 @@ static void rtl8723bs_recv_tasklet(void *priv)
padapter->mppriv.rx_crcerrpktcount++;
}
}
+ else
#endif
- DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
+ {
+ DBG_8192C("%s: crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err);
+ }
rtw_free_recvframe(precvframe, &precvpriv->free_recv_queue);
}
else
diff --git a/rtl8723BS/hal/rtl8723b/sdio/rtl8723bs_xmit.c b/rtl8723BS/hal/rtl8723b/sdio/rtl8723bs_xmit.c
index b79353c..e84a094 100755
--- a/rtl8723BS/hal/rtl8723b/sdio/rtl8723bs_xmit.c
+++ b/rtl8723BS/hal/rtl8723b/sdio/rtl8723bs_xmit.c
@@ -618,7 +618,9 @@ s32 rtl8723bs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe)
if(GetFrameSubType(pframe)==WIFI_BEACON) //dump beacon directly
{
- rtw_write_port(padapter, pdvobjpriv->Queue2Pipe[pxmitbuf->ff_hwaddr], pxmitbuf->len, (u8 *)pxmitbuf);
+ ret = rtw_write_port(padapter, pdvobjpriv->Queue2Pipe[pxmitbuf->ff_hwaddr], pxmitbuf->len, (u8 *)pxmitbuf);
+ if (ret != _SUCCESS)
+ rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_WRITE_PORT_ERR);
rtw_free_xmitbuf(pxmitpriv, pxmitbuf);
}
@@ -627,9 +629,6 @@ s32 rtl8723bs_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe)
enqueue_pending_xmitbuf(pxmitpriv, pxmitbuf);
}
- if (ret != _SUCCESS)
- rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN);
-
return ret;
}
diff --git a/rtl8723BS/hal/rtl8723b/sdio/sdio_halinit.c b/rtl8723BS/hal/rtl8723b/sdio/sdio_halinit.c
index e6cd16d..ed19877 100755
--- a/rtl8723BS/hal/rtl8723b/sdio/sdio_halinit.c
+++ b/rtl8723BS/hal/rtl8723b/sdio/sdio_halinit.c
@@ -188,6 +188,7 @@ u8 _InitPowerOn_8723BS(PADAPTER padapter)
// bMacPwrCtrlOn = _TRUE;
// rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
+ rtw_write8(padapter, REG_CR, 0x00);
// Enable MAC DMA/WMAC/SCHEDULE/SEC block
value16 = rtw_read16(padapter, REG_CR);
value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN
@@ -195,28 +196,7 @@ u8 _InitPowerOn_8723BS(PADAPTER padapter)
rtw_write16(padapter, REG_CR, value16);
#ifdef CONFIG_BT_COEXIST
- // Fix Antenna at BT side between power on and BT-Coex init HW
- // enable BB power
- rtw_write8(padapter, 0x67, 0x20);
- value8 = rtw_read8(padapter, REG_SYS_FUNC_EN);
- value8 |= FEN_BBRSTB | FEN_BB_GLB_RSTn;
- rtw_write8(padapter, REG_SYS_FUNC_EN, value8);
-// DBG_8192C("%s: 0x2=0x%02X\n", __FUNCTION__, rtw_read8(padapter, 0x2));
-
- // internal switch BT->S1
- // 0x948[12:0] = 0x280
- value32 = rtw_read32(padapter, 0x948);
- value32 &= ~0x1FFF;
- value32 |= 0x280;
- rtw_write32(padapter, 0x948, value32);
-// DBG_8192C("%s: 0x948=0x%04X\n", __FUNCTION__, rtw_read16(padapter, 0x948));
-
- // mask wlan_act to low
- // 0x76e[3] = 0
- value8 = rtw_read8(padapter, 0x76e);
- value8 &= ~BIT(3);
- rtw_write8(padapter, 0x76e, value8);
-// DBG_8192C("%s: 0x76e=0x%02X\n", __FUNCTION__, rtw_read8(padapter, 0x76e));
+ rtw_btcoex_PowerOnSetting(padapter);
// external switch to S1
// 0x38[11] = 0x1
@@ -237,7 +217,6 @@ u8 _InitPowerOn_8723BS(PADAPTER padapter)
value8 &= ~BIT(0); // BIT_SW_DPDT_SEL_DATA, DPDT_SEL default configuration
rtw_write8(padapter, REG_PAD_CTRL1_8723B, value8);
// DBG_8192C("%s: REG_PAD_CTRL1(0x%x)=0x%02X\n", __FUNCTION__, REG_PAD_CTRL1_8723B, rtw_read8(padapter, REG_PAD_CTRL1_8723B));
- rtw_write8(padapter, 0x765, 0x18);
#endif // CONFIG_BT_COEXIST
#ifdef CONFIG_GPIO_WAKEUP
@@ -830,25 +809,6 @@ void _InitOperationMode(PADAPTER padapter)
rtw_write8(padapter, REG_BWOPMODE, regBwOpMode);
- // For Min Spacing configuration.
- switch(pHalData->rf_type)
- {
- case RF_1T2R:
- case RF_1T1R:
- RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("Initializepadapter: RF_Type%s\n", (pHalData->rf_type==RF_1T1R? "(1T1R)":"(1T2R)")));
-// padapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_1T<<3);
- MinSpaceCfg = (MAX_MSS_DENSITY_1T << 3);
- break;
- case RF_2T2R:
- case RF_2T2R_GREEN:
- RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("Initializepadapter:RF_Type(2T2R)\n"));
-// padapter->MgntInfo.MinSpaceCfg = (MAX_MSS_DENSITY_2T<<3);
- MinSpaceCfg = (MAX_MSS_DENSITY_2T << 3);
- break;
- }
-
-// rtw_write8(padapter, REG_AMPDU_MIN_SPACE, padapter->MgntInfo.MinSpaceCfg);
- rtw_write8(padapter, REG_AMPDU_MIN_SPACE, MinSpaceCfg);
}
void _InitInterrupt(PADAPTER padapter)
@@ -1050,7 +1010,9 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
pHalData->LastHMEBoxNum = 0;
#ifdef CONFIG_BT_COEXIST
- rtw_btcoex_HAL_Initialize(padapter);
+ rtw_btcoex_HAL_Initialize(padapter, _FALSE);
+#else
+ rtw_btcoex_HAL_Initialize(padapter, _TRUE);
#endif // CONFIG_BT_COEXIST
return _SUCCESS;
@@ -1106,7 +1068,9 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
#ifdef CONFIG_BT_COEXIST
- rtw_btcoex_HAL_Initialize(padapter);
+ rtw_btcoex_HAL_Initialize(padapter, _FALSE);
+#else
+ rtw_btcoex_HAL_Initialize(padapter, _TRUE);
#endif // CONFIG_BT_COEXIST
#ifdef DBG_CHECK_FW_PS_STATE
@@ -1155,27 +1119,14 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
rtw_write8(padapter, REG_EARLY_MODE_CONTROL, 0);
- /*
- To inform FW about:
- bit0: "0" for no antenna inverse; "1" for antenna inverse
- bit1: "0" for internal switch; "1" for external switch
- bit2: "0" for one antenna; "1" for two antenna
- */
- u1bTmp = 0;
- if (pHalData->EEPROMBluetoothAntNum == Ant_x2)
- {
- u1bTmp |= BIT(2); /* two antenna case */
- }
- rtw_write8(padapter, SDIO_LOCAL_BASE |0x60, u1bTmp);
-
#if (MP_DRIVER == 1)
if (padapter->registrypriv.mp_mode == 1)
{
_InitRxSetting(padapter);
}
- else
+
#endif
- {
+
ret = rtl8723b_FirmwareDownload(padapter, _FALSE);
if (ret != _SUCCESS) {
RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("%s: Download Firmware failed!!\n", __FUNCTION__));
@@ -1187,7 +1138,6 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
padapter->bFWReady = _TRUE;
pHalData->fw_ractrl = _TRUE;
}
- }
rtl8723b_InitializeFirmwareVars(padapter);
@@ -1245,8 +1195,6 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
pHalData->RfRegChnlVal[0] = PHY_QueryRFReg(padapter, (RF_PATH)0, RF_CHNLBW, bRFRegOffsetMask);
pHalData->RfRegChnlVal[1] = PHY_QueryRFReg(padapter, (RF_PATH)1, RF_CHNLBW, bRFRegOffsetMask);
- rtw_write8(padapter, REG_CR, 0);
- rtw_write8(padapter, REG_CR, 0xff);
//if (!pHalData->bMACFuncEnable) {
_InitQueueReservedPage(padapter);
@@ -1412,7 +1360,7 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
#endif
restore_iqk_rst = (pwrpriv->bips_processing==_TRUE)?_TRUE:_FALSE;
b2Ant = pHalData->EEPROMBluetoothAntNum==Ant_x2?_TRUE:_FALSE;
- PHY_IQCalibrate_8723B(padapter, _FALSE, restore_iqk_rst, b2Ant, 0);
+ PHY_IQCalibrate_8723B(padapter, _FALSE, restore_iqk_rst, b2Ant, pHalData->ant_path);
pHalData->odmpriv.RFCalibrateInfo.bIQKInitialized = _TRUE;
#ifdef CONFIG_BT_COEXIST
rtw_btcoex_IQKNotify(padapter, _FALSE);
@@ -1428,17 +1376,9 @@ static u32 rtl8723bs_hal_init(PADAPTER padapter)
#ifdef CONFIG_BT_COEXIST
// Init BT hw config.
- rtw_btcoex_HAL_Initialize(padapter);
- rtw_btcoex_SwitchGntBt(padapter);
+ rtw_btcoex_HAL_Initialize(padapter, _FALSE);
#else
- u4Tmp = rtw_read32(padapter, REG_BT_WIFI_ANTENNA_SWITCH_8723B); //Ant select enable
- u4Tmp |= BIT11;
- rtw_write32(padapter, REG_BT_WIFI_ANTENNA_SWITCH_8723B, u4Tmp);
-
- rtw_write8(padapter, 0x974, 0xff);
- //pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);
- rtw_write8(padapter, 0x930, 0x77);
- rtw_write8(padapter, 0x92c, 0x2);
+ rtw_btcoex_HAL_Initialize(padapter, _TRUE);
#endif
RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("-%s\n", __FUNCTION__));
@@ -1798,49 +1738,6 @@ Hal_EfuseParseBoardType_8723BS(
}
#ifdef CONFIG_EFUSE_CONFIG_FILE
-static u32 Hal_readPGDataFromConfigFile(
- PADAPTER padapter,
- u8 *PROMContent)
-{
- u32 i;
- struct file *fp;
- mm_segment_t fs;
- u8 temp[3];
- loff_t pos = 0;
-
-
- temp[2] = 0; // add end of string '\0'
-
- fp = filp_open("/system/etc/wifi/rtk_efuse_8723bs.map", O_RDONLY, 0);
- if (IS_ERR(fp)) {
- RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Error, Efuse configure file doesn't exist.\n"));
- return _FAIL;
- }
-
- fs = get_fs();
- set_fs(KERNEL_DS);
-
- DBG_871X("Efuse configure file: /system/etc/wifi/rtk_efuse_8723bs.map\n");
- for (i=0; i<HWSET_MAX_SIZE_8723B; i++) {
-
- vfs_read(fp, temp, 2, &pos);
- PROMContent[i] = simple_strtoul(temp, NULL, 16 );
- pos += 1; // Filter the space character
-#ifdef CONFIG_DEBUG
- if (i % 16 == 0)
- printk("\n");
- printk("%02X ", PROMContent[i]);
-#endif
- }
- printk("\n");
- DBG_871X("\n");
- set_fs(fs);
-
- filp_close(fp, NULL);
-
- return _SUCCESS;
-}
-
static void
Hal_ReadMACAddrFromFile_8723BS(
PADAPTER padapter
@@ -1918,26 +1815,57 @@ _ReadEfuseInfo8723BS(
)
{
EEPROM_EFUSE_PRIV *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
- u8 hwinfo[HWSET_MAX_SIZE_8723B];
+ u8* hwinfo = NULL;
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+ struct file *fp;
+#endif //CONFIG_EFUSE_CONFIG_FILE
RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("====>_ReadEfuseInfo8723BS()\n"));
//
// This part read and parse the eeprom/efuse content
//
-#ifdef CONFIG_EFUSE_CONFIG_FILE
- Hal_readPGDataFromConfigFile(padapter, hwinfo);
-#else
+
+ if (sizeof(pEEPROM->efuse_eeprom_data) < HWSET_MAX_SIZE_8723B)
+ DBG_871X("[WARNING] size of efuse_eeprom_data is less than HWSET_MAX_SIZE_8723B!\n");
+
+ hwinfo = pEEPROM->efuse_eeprom_data;
+
Hal_InitPGData(padapter, hwinfo);
-#endif
+
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+ if (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) {
+ fp = filp_open(EFUSE_MAP_PATH, O_RDONLY, 0);
+ if (fp == NULL || IS_ERR(fp)) {
+ DBG_871X("[WARNING] invalid phy efuse and no efuse file, use driver default!!\n");
+ } else {
+ Hal_readPGDataFromConfigFile(padapter, fp);
+ filp_close(fp, NULL);
+ }
+ }
+#endif //CONFIG_EFUSE_CONFIG_FILE
Hal_EfuseParseIDCode(padapter, hwinfo);
Hal_EfuseParseEEPROMVer_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
+
#ifdef CONFIG_EFUSE_CONFIG_FILE
- Hal_ReadMACAddrFromFile_8723BS(padapter);
-#else
+ if (check_phy_efuse_macaddr_info_valid(padapter) == _TRUE) {
+ DBG_871X("using phy efuse mac\n");
+ Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
+ } else {
+ fp = filp_open(WIFIMAC_PATH, O_RDONLY, 0);
+ if (fp == NULL || IS_ERR(fp)) {
+ DBG_871X("wifimac does not exist!!\n");
+ Hal_GetPhyEfuseMACAddr(padapter, pEEPROM->mac_addr);
+ } else {
+ Hal_ReadMACAddrFromFile(padapter, fp);
+ filp_close(fp, NULL);
+ }
+ }
+#else //CONFIG_EFUSE_CONFIG_FILE
Hal_EfuseParseMACAddr_8723BS(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
#endif
+
Hal_EfuseParseTxPowerInfo_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
Hal_EfuseParseBoardType_8723BS(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
@@ -1962,15 +1890,6 @@ _ReadEfuseInfo8723BS(
Hal_ReadRFGainOffset(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
#endif //CONFIG_RF_GAIN_OFFSET
- if( sizeof(hwinfo)<= sizeof(pEEPROM->efuse_eeprom_data))
- {
- _rtw_memcpy(pEEPROM->efuse_eeprom_data, hwinfo, HWSET_MAX_SIZE_8723B); //restore to pEEPROM array for efuse_get drvmap
- }
- else
- {
- DBG_871X("memcpy hwinfo size to efuse_eeprom_data fail!!!.");
-
- }
RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("<==== _ReadEfuseInfo8723BS()\n"));
}
@@ -2026,6 +1945,7 @@ _InitOtherVariable(
//
static s32 _ReadAdapterInfo8723BS(PADAPTER padapter)
{
+ u8 val8;
u32 start;
RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("+_ReadAdapterInfo8723BS\n"));
@@ -2034,6 +1954,13 @@ static s32 _ReadAdapterInfo8723BS(PADAPTER padapter)
if(padapter->hw_init_completed == _FALSE)
_InitPowerOn_8723BS(padapter);
+
+ val8 = rtw_read8(padapter, 0x4e);
+ MSG_8192C("%s, 0x4e=0x%x\n", __func__, val8);
+ val8 |= BIT(6);
+ rtw_write8(padapter, 0x4e, val8);
+
+
start = rtw_get_current_time();
_EfuseCellSel(padapter);
@@ -2042,7 +1969,10 @@ static s32 _ReadAdapterInfo8723BS(PADAPTER padapter)
_InitOtherVariable(padapter);
if(padapter->hw_init_completed == _FALSE)
+ {
+ rtw_write8(padapter, 0x67, 0x00); // for BT, Switch Ant control to BT
CardDisableRTL8723BSdio(padapter);//for the power consumption issue, wifi ko module is loaded during booting, but wifi GUI is off
+ }
MSG_8192C("<==== _ReadAdapterInfo8723BS in %d ms\n", rtw_get_passing_time_ms(start));
@@ -2136,10 +2066,12 @@ _func_enter_;
case WOWLAN_ENABLE:
DBG_871X_LEVEL(_drv_always_, "WOWLAN_ENABLE\n");
+ #ifndef DYNAMIC_CAMID_ALLOC
val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)? 0xcc: 0xcf;
rtw_write8(padapter, REG_SECCFG, val8);
- DBG_871X_LEVEL(_drv_always_, "REG_SECCFG: %02x\n",
- rtw_read8(padapter, REG_SECCFG));
+ DBG_871X_LEVEL(_drv_always_, "REG_SECCFG: %02x\n", rtw_read8(padapter, REG_SECCFG));
+ #endif
+
//backup data rate to register 0x8b for wowlan FW
rtw_write8(padapter, 0x8d, 1);
rtw_write8(padapter, 0x8c, 0);
@@ -2241,9 +2173,11 @@ _func_enter_;
rtl8723b_set_FwMediaStatusRpt_cmd(padapter, RT_MEDIA_DISCONNECT, psta->mac_id);
else
DBG_871X("psta is null\n");
-
+
+ #ifndef DYNAMIC_CAMID_ALLOC
rtw_write8(padapter, REG_SECCFG, 0x0c|BIT(5));// enable tx enc and rx dec engine, and no key search for MC/BC
DBG_871X_LEVEL(_drv_always_, "REG_SECCFG: %02x\n", rtw_read8(padapter, REG_SECCFG));
+ #endif
// 1. Read wakeup reason
pwrctl->wowlan_wake_reason = rtw_read8(padapter, REG_WOWLAN_WAKE_REASON);
@@ -2572,9 +2506,6 @@ GetHalDefVar8723BSDIO(
switch(eVariable)
{
- case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
- *((int *)pValue) = pHalData->dmpriv.UndecoratedSmoothedPWDB;
- break;
case HAL_DEF_IS_SUPPORT_ANT_DIV:
#ifdef CONFIG_ANTENNA_DIVERSITY
*((u8 *)pValue) = (IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))?_FALSE:_TRUE;
@@ -2628,20 +2559,6 @@ void rtl8723bs_set_hal_ops(PADAPTER padapter)
_func_enter_;
-
-#ifdef CONFIG_CONCURRENT_MODE
- if(padapter->isprimary)
-#endif //CONFIG_CONCURRENT_MODE
- {
- //set hardware operation functions
- padapter->HalData = rtw_zvmalloc(sizeof(HAL_DATA_TYPE));
- if(padapter->HalData == NULL){
- DBG_8192C("cant not alloc memory for HAL DATA \n");
- }
- }
-
- padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
-
rtl8723b_set_hal_ops(pHalFunc);
pHalFunc->hal_init = &rtl8723bs_hal_init;
diff --git a/rtl8723BS/hal/rtl8723b/sdio/sdio_ops.c b/rtl8723BS/hal/rtl8723b/sdio/sdio_ops.c
index e29b003..ed0d7f1 100755
--- a/rtl8723BS/hal/rtl8723b/sdio/sdio_ops.c
+++ b/rtl8723BS/hal/rtl8723b/sdio/sdio_ops.c
@@ -1543,18 +1543,13 @@ static void sd_rxhandler(PADAPTER padapter, struct recv_buf *precvbuf)
precvpriv = &padapter->recvpriv;
ppending_queue = &precvpriv->recv_buf_pending_queue;
- if (_rtw_queue_empty(ppending_queue) == _TRUE)
- {
- //3 1. enqueue recvbuf
- rtw_enqueue_recvbuf(precvbuf, ppending_queue);
+ //3 1. enqueue recvbuf
+ rtw_enqueue_recvbuf(precvbuf, ppending_queue);
- //3 2. schedule tasklet
+ //3 2. schedule tasklet
#ifdef PLATFORM_LINUX
- tasklet_schedule(&precvpriv->recv_tasklet);
+ tasklet_schedule(&precvpriv->recv_tasklet);
#endif
- } else
- rtw_enqueue_recvbuf(precvbuf, ppending_queue);
-
}
void sd_int_dpc(PADAPTER padapter)
diff --git a/rtl8723BS/include/Hal8188EPhyReg.h b/rtl8723BS/include/Hal8188EPhyReg.h
index 763ccea..2ef34ed 100755
--- a/rtl8723BS/include/Hal8188EPhyReg.h
+++ b/rtl8723BS/include/Hal8188EPhyReg.h
@@ -1059,6 +1059,7 @@
#define bMaskHWord 0xffff0000
#define bMaskLWord 0x0000ffff
#define bMaskDWord 0xffffffff
+#define bMaskH3Bytes 0xffffff00
#define bMask12Bits 0xfff
#define bMaskH4Bits 0xf0000000
#define bMaskOFDM_D 0xffc00000
diff --git a/rtl8723BS/include/Hal8192CPhyReg.h b/rtl8723BS/include/Hal8192CPhyReg.h
index e4e977c..1c7cd5d 100755
--- a/rtl8723BS/include/Hal8192CPhyReg.h
+++ b/rtl8723BS/include/Hal8192CPhyReg.h
@@ -1082,6 +1082,7 @@
#define bMaskHWord 0xffff0000
#define bMaskLWord 0x0000ffff
#define bMaskDWord 0xffffffff
+#define bMaskH3Bytes 0xffffff00
#define bMask12Bits 0xfff
#define bMaskH4Bits 0xf0000000
#define bMaskOFDM_D 0xffc00000
diff --git a/rtl8723BS/include/Hal8192DPhyReg.h b/rtl8723BS/include/Hal8192DPhyReg.h
index fb32eac..b5af827 100755
--- a/rtl8723BS/include/Hal8192DPhyReg.h
+++ b/rtl8723BS/include/Hal8192DPhyReg.h
@@ -482,7 +482,7 @@
#define RF_TX_G3 0x22 //
#define RF_TX_BB1 0x23 //
-
+#define RF_T_METER_92D 0x42
#define RF_T_METER 0x42 //
#define RF_SYN_G1 0x25 // RF TX Power control
@@ -1112,6 +1112,7 @@
#define bMaskHWord 0xffff0000
#define bMaskLWord 0x0000ffff
#define bMaskDWord 0xffffffff
+#define bMaskH3Bytes 0xffffff00
#define bMask12Bits 0xfff
#define bMaskH4Bits 0xf0000000
#define bMaskOFDM_D 0xffc00000
diff --git a/rtl8723BS/include/Hal8192EPhyReg.h b/rtl8723BS/include/Hal8192EPhyReg.h
index 0621fb9..02a3f86 100755
--- a/rtl8723BS/include/Hal8192EPhyReg.h
+++ b/rtl8723BS/include/Hal8192EPhyReg.h
@@ -425,10 +425,8 @@
#define RF_TX_BB1 0x23 //
-//#if HARDWARE_TYPE_IS_RTL8192D == 1
-#define RF_T_METER_92D 0x42 //
-//#else
-#define RF_T_METER_88E 0x42 //
+#define RF_T_METER_8192E 0x42 //
+#define RF_T_METER_88E 0x42 //
#define RF_T_METER 0x24 //
//#endif
@@ -1065,6 +1063,7 @@
#define bMaskHWord 0xffff0000
#define bMaskLWord 0x0000ffff
#define bMaskDWord 0xffffffff
+#define bMaskH3Bytes 0xffffff00
#define bMask12Bits 0xfff
#define bMaskH4Bits 0xf0000000
#define bMaskOFDM_D 0xffc00000
diff --git a/rtl8723BS/include/Hal8812PhyReg.h b/rtl8723BS/include/Hal8812PhyReg.h
index 5125e22..fde6f33 100755
--- a/rtl8723BS/include/Hal8812PhyReg.h
+++ b/rtl8723BS/include/Hal8812PhyReg.h
@@ -420,6 +420,8 @@
#define rFPGA0_AdDaClockEn 0x888 // enable ad/da clock1 for dual-phy
#define rFPGA0_AnalogParameter4 0x88c
#define rFPGA0_XB_LSSIReadBack 0x8a4
+#define rFPGA0_XCD_RFPara 0x8b4
+
//
// 4. Page9(0x900)
//
@@ -717,6 +719,7 @@
#define bMaskHWord 0xffff0000
#define bMaskLWord 0x0000ffff
#define bMaskDWord 0xffffffff
+#define bMaskH3Bytes 0xffffff00
#define bMask12Bits 0xfff
#define bMaskH4Bits 0xf0000000
#define bMaskOFDM_D 0xffc00000
diff --git a/rtl8723BS/include/autoconf.h b/rtl8723BS/include/autoconf.h
index 59da087..e7de13f 100755
--- a/rtl8723BS/include/autoconf.h
+++ b/rtl8723BS/include/autoconf.h
@@ -53,7 +53,7 @@
#define CONFIG_80211N_HT
#define CONFIG_RECV_REORDERING_CTRL
-#define CONFIG_IOCTL_CFG80211
+//#define CONFIG_IOCTL_CFG80211
#if defined(CONFIG_PLATFORM_SPRD) && !defined(ANDROID_2X)
#ifndef CONFIG_IOCTL_CFG80211
@@ -68,7 +68,7 @@
* version < 3.2 but already apply cfg80211 patch,
* RTW_USE_CFG80211_STA_EVENT must be defiend!
*/
- #define RTW_USE_CFG80211_STA_EVENT
+ //#define RTW_USE_CFG80211_STA_EVENT
#define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER
//#define CONFIG_DEBUG_CFG80211
#define CONFIG_SET_SCAN_DENY_TIMER
@@ -96,7 +96,7 @@
#endif
//#define CONFIG_DBG_P2P
#define CONFIG_P2P_PS
- #define CONFIG_P2P_IPS
+ //#define CONFIG_P2P_IPS
#define CONFIG_P2P_OP_CHK_SOCIAL_CH
#define CONFIG_CFG80211_ONECHANNEL_UNDER_CONCURRENT //replace CONFIG_P2P_CHK_INVITE_CH_LIST flag
#define CONFIG_P2P_INVITE_IOT
@@ -168,7 +168,7 @@
#endif
-#define CONFIG_CONCURRENT_MODE
+//#define CONFIG_CONCURRENT_MODE
#ifdef CONFIG_CONCURRENT_MODE
#define CONFIG_TSF_RESET_OFFLOAD 1 // For 2 PORT TSF SYNC.
//#define CONFIG_HWPORT_SWAP //Port0->Sec , Port1 -> Pri
@@ -264,6 +264,8 @@
* Outsource Related Config
*/
+#define TESTCHIP_SUPPORT 0
+
#define RTL8192CE_SUPPORT 0
#define RTL8192CU_SUPPORT 0
#define RTL8192C_SUPPORT (RTL8192CE_SUPPORT|RTL8192CU_SUPPORT)
@@ -277,33 +279,18 @@
#define RTL8723AU_SUPPORT 0
#define RTL8723AE_SUPPORT 0
#define RTL8723A_SUPPORT (RTL8723AU_SUPPORT|RTL8723AS_SUPPORT|RTL8723AE_SUPPORT)
-
-
#define RTL8723_FPGA_VERIFICATION 0
-#define RTL8188EE_SUPPORT 0
-#define RTL8188EU_SUPPORT 0
-#define RTL8188ES_SUPPORT 0
-#define RTL8188E_SUPPORT (RTL8188EE_SUPPORT|RTL8188EU_SUPPORT|RTL8188ES_SUPPORT)
-
-#define RTL8812E_SUPPORT 0
-#define RTL8812AU_SUPPORT 0
-#define RTL8812A_SUPPORT (RTL8812E_SUPPORT|RTL8812AU_SUPPORT)
-
+#define RTL8188E_SUPPORT 0
+#define RTL8812A_SUPPORT 0
#define RTL8821A_SUPPORT 0
-
#define RTL8723B_SUPPORT 1
-
#define RTL8192E_SUPPORT 0
+#define RTL8814A_SUPPORT 0
-#define RTL8813A_SUPPORT 0
-
-#define TESTCHIP_SUPPORT 0
-
-//#if (RTL8188E_SUPPORT==1)
#define RATE_ADAPTIVE_SUPPORT 0
#define POWER_TRAINING_ACTIVE 0
-//#endif
+
//#define CONFIG_HW_ANTENNA_DIVERSITY
diff --git a/rtl8723BS/include/drv_conf.h b/rtl8723BS/include/drv_conf.h
index 1b1aa72..37f432f 100755
--- a/rtl8723BS/include/drv_conf.h
+++ b/rtl8723BS/include/drv_conf.h
@@ -46,6 +46,7 @@
#define CONFIG_SIGNAL_DISPLAY_DBM
#endif
+/*
#if defined(CONFIG_HAS_EARLYSUSPEND) && defined (CONFIG_RESUME_IN_WORKQUEUE)
#warning "You have CONFIG_HAS_EARLYSUSPEND enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically"
#undef CONFIG_RESUME_IN_WORKQUEUE
@@ -55,6 +56,7 @@
#warning "You have CONFIG_ANDROID_POWER enabled in your system, we disable CONFIG_RESUME_IN_WORKQUEUE automatically"
#undef CONFIG_RESUME_IN_WORKQUEUE
#endif
+*/
#ifdef CONFIG_RESUME_IN_WORKQUEUE //this can be removed, because there is no case for this...
#if !defined( CONFIG_WAKELOCK) && !defined(CONFIG_ANDROID_POWER)
@@ -73,6 +75,11 @@
#define CONFIG_USB_VENDOR_REQ_MUTEX
#endif
+#define DYNAMIC_CAMID_ALLOC
+
+#ifndef CONFIG_RTW_HIQ_FILTER
+ #define CONFIG_RTW_HIQ_FILTER 1
+#endif
//#include <rtl871x_byteorder.h>
diff --git a/rtl8723BS/include/drv_types.h b/rtl8723BS/include/drv_types.h
index d54e4b2..2d3b191 100755
--- a/rtl8723BS/include/drv_types.h
+++ b/rtl8723BS/include/drv_types.h
@@ -34,7 +34,10 @@
#include <wlan_bssdef.h>
#include <wifi.h>
#include <ieee80211.h>
-
+#ifdef CONFIG_ARP_KEEP_ALIVE
+#include <net/neighbour.h>
+#include <net/arp.h>
+#endif
#ifdef PLATFORM_OS_XP
#include <drv_types_xp.h>
@@ -57,8 +60,6 @@ enum _NIC_VERSION {
};
-#define CONFIG_SUSPEND_REFINE
-
typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
#include <rtw_debug.h>
@@ -112,6 +113,10 @@ typedef struct _ADAPTER _adapter, ADAPTER,*PADAPTER;
#include <rtw_version.h>
#include <rtw_odm.h>
+#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
+#include <rtw_mem.h>
+#endif
+
#ifdef CONFIG_P2P
#include <rtw_p2p.h>
#endif // CONFIG_P2P
@@ -320,6 +325,8 @@ struct registry_priv
u8 ext_iface_num;//primary/secondary iface is excluded
#endif
u8 qos_opt_enable;
+
+ u8 hiq_filter;
};
@@ -360,6 +367,131 @@ enum _IFACE_ID {
IFACE_ID_MAX,
};
+#ifdef CONFIG_DBG_COUNTER
+
+struct rx_logs {
+ u32 intf_rx;
+ u32 intf_rx_err_recvframe;
+ u32 intf_rx_err_skb;
+ u32 intf_rx_report;
+ u32 core_rx;
+ u32 core_rx_pre;
+ u32 core_rx_pre_ver_err;
+ u32 core_rx_pre_mgmt;
+ u32 core_rx_pre_mgmt_err_80211w;
+ u32 core_rx_pre_mgmt_err;
+ u32 core_rx_pre_ctrl;
+ u32 core_rx_pre_ctrl_err;
+ u32 core_rx_pre_data;
+ u32 core_rx_pre_data_wapi_seq_err;
+ u32 core_rx_pre_data_wapi_key_err;
+ u32 core_rx_pre_data_handled;
+ u32 core_rx_pre_data_err;
+ u32 core_rx_pre_data_unknown;
+ u32 core_rx_pre_unknown;
+ u32 core_rx_enqueue;
+ u32 core_rx_dequeue;
+ u32 core_rx_post;
+ u32 core_rx_post_decrypt;
+ u32 core_rx_post_decrypt_wep;
+ u32 core_rx_post_decrypt_tkip;
+ u32 core_rx_post_decrypt_aes;
+ u32 core_rx_post_decrypt_wapi;
+ u32 core_rx_post_decrypt_hw;
+ u32 core_rx_post_decrypt_unknown;
+ u32 core_rx_post_decrypt_err;
+ u32 core_rx_post_defrag_err;
+ u32 core_rx_post_portctrl_err;
+ u32 core_rx_post_indicate;
+ u32 core_rx_post_indicate_in_oder;
+ u32 core_rx_post_indicate_reoder;
+ u32 core_rx_post_indicate_err;
+ u32 os_indicate;
+ u32 os_indicate_ap_mcast;
+ u32 os_indicate_ap_forward;
+ u32 os_indicate_ap_self;
+ u32 os_indicate_err;
+ u32 os_netif_ok;
+ u32 os_netif_err;
+};
+
+struct tx_logs {
+ u32 os_tx;
+ u32 os_tx_err_up;
+ u32 os_tx_err_xmit;
+ u32 os_tx_m2u;
+ u32 os_tx_m2u_ignore_fw_linked;
+ u32 os_tx_m2u_ignore_self;
+ u32 os_tx_m2u_entry;
+ u32 os_tx_m2u_entry_err_xmit;
+ u32 os_tx_m2u_entry_err_skb;
+ u32 os_tx_m2u_stop;
+ u32 core_tx;
+ u32 core_tx_err_pxmitframe;
+ u32 core_tx_err_brtx;
+ u32 core_tx_upd_attrib;
+ u32 core_tx_upd_attrib_adhoc;
+ u32 core_tx_upd_attrib_sta;
+ u32 core_tx_upd_attrib_ap;
+ u32 core_tx_upd_attrib_unknown;
+ u32 core_tx_upd_attrib_dhcp;
+ u32 core_tx_upd_attrib_icmp;
+ u32 core_tx_upd_attrib_active;
+ u32 core_tx_upd_attrib_err_ucast_sta;
+ u32 core_tx_upd_attrib_err_ucast_ap_link;
+ u32 core_tx_upd_attrib_err_sta;
+ u32 core_tx_upd_attrib_err_link;
+ u32 core_tx_upd_attrib_err_sec;
+ u32 core_tx_ap_enqueue_warn_fwstate;
+ u32 core_tx_ap_enqueue_warn_sta;
+ u32 core_tx_ap_enqueue_warn_nosta;
+ u32 core_tx_ap_enqueue_warn_link;
+ u32 core_tx_ap_enqueue_warn_trigger;
+ u32 core_tx_ap_enqueue_mcast;
+ u32 core_tx_ap_enqueue_ucast;
+ u32 core_tx_ap_enqueue;
+ u32 intf_tx;
+ u32 intf_tx_pending_ac;
+ u32 intf_tx_pending_fw_under_survey;
+ u32 intf_tx_pending_fw_under_linking;
+ u32 intf_tx_pending_xmitbuf;
+ u32 intf_tx_enqueue;
+ u32 core_tx_enqueue;
+ u32 core_tx_enqueue_class;
+ u32 core_tx_enqueue_class_err_sta;
+ u32 core_tx_enqueue_class_err_nosta;
+ u32 core_tx_enqueue_class_err_fwlink;
+ u32 intf_tx_direct;
+ u32 intf_tx_direct_err_coalesce;
+ u32 intf_tx_dequeue;
+ u32 intf_tx_dequeue_err_coalesce;
+ u32 intf_tx_dump_xframe;
+ u32 intf_tx_dump_xframe_err_txdesc;
+ u32 intf_tx_dump_xframe_err_port;
+};
+
+struct int_logs {
+ u32 all;
+ u32 err;
+ u32 tbdok;
+ u32 tbder;
+ u32 bcnderr;
+ u32 bcndma;
+ u32 bcndma_e;
+ u32 rx;
+ u32 rx_rdu;
+ u32 rx_fovw;
+ u32 txfovw;
+ u32 mgntok;
+ u32 highdok;
+ u32 bkdok;
+ u32 bedok;
+ u32 vidok;
+ u32 vodok;
+};
+
+#endif // CONFIG_DBG_COUNTER
+
struct debug_priv {
u32 dbg_sdio_free_irq_error_cnt;
u32 dbg_sdio_alloc_irq_error_cnt;
@@ -418,6 +550,11 @@ struct rtw_traffic_statistics {
u32 cur_rx_tp; // Rx throughput in MBps.
};
+struct cam_ctl_t {
+ _lock lock;
+ u64 bitmap;
+};
+
struct cam_entry_cache {
u16 ctrl;
u8 mac[ETH_ALEN];
@@ -460,7 +597,8 @@ struct dvobj_priv
_adapter *padapters[IFACE_ID_MAX];
u8 iface_nums; // total number of ifaces used runtime
- struct cam_entry_cache cam_cache[32];
+ struct cam_ctl_t cam_ctl;
+ struct cam_entry_cache cam_cache[TOTAL_CAM_ENTRY];
//For 92D, DMDP have 2 interface.
u8 InterfaceNumber;
@@ -869,9 +1007,20 @@ struct _ADAPTER{
PLOOPBACKDATA ploopback;
#endif
+ //for debug purpose
u8 fix_rate;
+ u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense for tx
+ u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
+ u8 driver_ampdu_spacing;//driver control AMPDU Density for peer sta's rx
+ u8 driver_rx_ampdu_factor;//0xff: disable drv ctrl, 0:8k, 1:16k, 2:32k, 3:64k;
unsigned char in_cta_test;
+
+#ifdef CONFIG_DBG_COUNTER
+ struct rx_logs rx_logs;
+ struct tx_logs tx_logs;
+ struct int_logs int_logs;
+#endif
};
#define adapter_to_dvobj(adapter) (adapter->dvobj)
@@ -928,6 +1077,17 @@ void rtw_dev_pno_debug(struct net_device *net);
#endif //CONFIG_PNO_SET_DEBUG
#endif //CONFIG_PNO_SUPPORT
+#ifdef CONFIG_GPIO_API
+int rtw_get_gpio(struct net_device *netdev, int gpio_num);
+int rtw_set_gpio_output_value(struct net_device *netdev, int gpio_num, BOOLEAN isHigh);
+int rtw_config_gpio(struct net_device *netdev, int gpio_num, BOOLEAN isOutput);
+#endif
+
+#ifdef CONFIG_WOWLAN
+int rtw_suspend_wow(_adapter *padapter);
+int rtw_resume_process_wow(_adapter *padapter);
+#endif
+
__inline static u8 *myid(struct eeprom_priv *peepriv)
{
return (peepriv->mac_addr);
diff --git a/rtl8723BS/include/hal_btcoex.h b/rtl8723BS/include/hal_btcoex.h
index 206fcb7..f12d655 100755
--- a/rtl8723BS/include/hal_btcoex.h
+++ b/rtl8723BS/include/hal_btcoex.h
@@ -39,11 +39,13 @@ u8 hal_btcoex_IsBtExist(PADAPTER padapter);
u8 hal_btcoex_IsBtDisabled(PADAPTER);
void hal_btcoex_SetChipType(PADAPTER padapter, u8 chipType);
u8 hal_btcoex_GetChipType(PADAPTER padapter);
-void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum, BOOLEAN antInverse);
+void hal_btcoex_SetPgAntNum(PADAPTER padapter, u8 antNum);
u8 hal_btcoex_GetPgAntNum(PADAPTER padapter);
+void hal_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath);
u8 hal_btcoex_Initialize(PADAPTER padapter);
-void hal_btcoex_InitHwConfig(PADAPTER padapter);
+void hal_btcoex_PowerOnSetting(PADAPTER padapter);
+void hal_btcoex_InitHwConfig(PADAPTER padapter, u8 bWifiOnly);
void hal_btcoex_IpsNotify(PADAPTER padapter, u8 type);
void hal_btcoex_LpsNotify(PADAPTER padapter, u8 type);
@@ -55,7 +57,7 @@ void hal_btcoex_IQKNotify(PADAPTER padapter, u8 state);
void hal_btcoex_BtInfoNotify(PADAPTER padapter, u8 length, u8 *tmpBuf);
void hal_btcoex_SuspendNotify(PADAPTER padapter, u8 state);
void hal_btcoex_HaltNotify(PADAPTER padapter);
-void hal_btcoex_SwitchGntBt(PADAPTER padapter);
+void hal_btcoex_SwitchBtTRxMask(PADAPTER padapter);
void hal_btcoex_Hanlder(PADAPTER padapter);
diff --git a/rtl8723BS/include/hal_com.h b/rtl8723BS/include/hal_com.h
index 8b01a58..d9680a8 100755
--- a/rtl8723BS/include/hal_com.h
+++ b/rtl8723BS/include/hal_com.h
@@ -204,6 +204,9 @@ typedef enum _FIRMWARE_SOURCE {
#define PageNum(_Len, _Size) (u32)(((_Len)/(_Size)) + ((_Len)&((_Size) - 1) ? 1:0))
+u8 rtw_hal_data_init(_adapter *padapter);
+void rtw_hal_data_deinit(_adapter *padapter);
+
void dump_chip_info(HAL_VERSION ChipVersion);
u8 //return the final channel plan decision
@@ -321,5 +324,41 @@ void rtw_get_raw_rssi_info(void *sel, _adapter *padapter);
void rtw_store_phy_info(_adapter *padapter, union recv_frame *prframe);
void rtw_dump_raw_rssi_info(_adapter *padapter);
#endif
+
+#define HWSET_MAX_SIZE 512
+#ifdef CONFIG_EFUSE_CONFIG_FILE
+#define EFUSE_FILE_COLUMN_NUM 16
+u32 Hal_readPGDataFromConfigFile(PADAPTER padapter, struct file *fp);
+void Hal_ReadMACAddrFromFile(PADAPTER padapter, struct file *fp);
+void Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8* mac_addr);
+int check_phy_efuse_tx_power_info_valid(PADAPTER padapter);
+int check_phy_efuse_macaddr_info_valid(PADAPTER padapter);
+#endif //CONFIG_EFUSE_CONFIG_FILE
+
+#ifdef CONFIG_RF_GAIN_OFFSET
+void rtw_bb_rf_gain_offset(_adapter *padapter);
+#endif //CONFIG_RF_GAIN_OFFSET
+
+void GetHalODMVar(
+ PADAPTER Adapter,
+ HAL_ODM_VARIABLE eVariable,
+ PVOID pValue1,
+ PVOID pValue2);
+void SetHalODMVar(
+ PADAPTER Adapter,
+ HAL_ODM_VARIABLE eVariable,
+ PVOID pValue1,
+ BOOLEAN bSet);
+
+#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+struct noise_info
+{
+ u8 bPauseDIG;
+ u8 IGIValue;
+ u32 max_time;//ms
+ u8 chan;
+};
+#endif
+
#endif //__HAL_COMMON_H__
diff --git a/rtl8723BS/include/hal_com_h2c.h b/rtl8723BS/include/hal_com_h2c.h
index c6ca8d2..7983e4b 100755
--- a/rtl8723BS/include/hal_com_h2c.h
+++ b/rtl8723BS/include/hal_com_h2c.h
@@ -292,6 +292,7 @@ typedef struct _RSVDPAGE_LOC {
#endif
void dump_TX_FIFO(PADAPTER padapter, u8 page_num, u16 page_size);
+u8 rtw_check_invalid_mac_address (u8 *mac_addr);
#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
void rtw_get_current_ip_address(PADAPTER padapter, u8 *pcurrentip);
void rtw_get_sec_iv(PADAPTER padapter, u8*pcur_dot11txpn, u8 *StaAddr);
diff --git a/rtl8723BS/include/hal_com_phycfg.h b/rtl8723BS/include/hal_com_phycfg.h
index 6aaf8ec..19276ea 100755
--- a/rtl8723BS/include/hal_com_phycfg.h
+++ b/rtl8723BS/include/hal_com_phycfg.h
@@ -285,7 +285,9 @@ int PHY_ConfigRFWithParaFile(IN PADAPTER Adapter, IN char* pFileName, IN u8 eRFP
int PHY_ConfigRFWithTxPwrTrackParaFile(IN PADAPTER Adapter, IN char* pFileName);
int PHY_ConfigRFWithPowerLimitTableParaFile(IN PADAPTER Adapter, IN char* pFileName);
-#endif
+
+void phy_free_filebuf(_adapter *padapter);
+#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE
#endif //__HAL_COMMON_H__
diff --git a/rtl8723BS/include/hal_com_reg.h b/rtl8723BS/include/hal_com_reg.h
index cadd99d..7c5e631 100755
--- a/rtl8723BS/include/hal_com_reg.h
+++ b/rtl8723BS/include/hal_com_reg.h
@@ -267,6 +267,7 @@
#define REG_PKT_BE_BK_LIFE_TIME 0x04C2
#define REG_STBC_SETTING 0x04C4
#define REG_QUEUE_CTRL 0x04C6
+#define REG_SINGLE_AMPDU_CTRL 0x04c7
#define REG_PROT_MODE_CTRL 0x04C8
#define REG_MAX_AGGR_NUM 0x04CA
#define REG_RTS_MAX_AGGR_NUM 0x04CB
@@ -638,6 +639,9 @@ Default: 00b.
#define RRSR_MCS6 BIT18
#define RRSR_MCS7 BIT19
+#define RRSR_CCK_RATES (RRSR_11M|RRSR_5_5M|RRSR_2M|RRSR_1M)
+#define RRSR_OFDM_RATES (RRSR_54M|RRSR_48M|RRSR_36M|RRSR_24M|RRSR_18M|RRSR_12M|RRSR_9M|RRSR_6M)
+
// WOL bit information
#define HAL92C_WOL_PTK_UPDATE_EVENT BIT0
#define HAL92C_WOL_GTK_UPDATE_EVENT BIT1
@@ -762,10 +766,6 @@ Default: 00b.
#define CAM_READ 0x00000000
#define CAM_POLLINIG BIT31
-#define SCR_UseDK 0x01
-#define SCR_TxSecEnable 0x02
-#define SCR_RxSecEnable 0x04
-
//
// 10. Power Save Control Registers
//
@@ -1514,6 +1514,7 @@ Current IOREG MAP
#define SCR_NoSKMC BIT(5) //No Key Search Multicast
#define SCR_TXBCUSEDK BIT(6) // Force Tx Broadcast packets Use Default Key
#define SCR_RXBCUSEDK BIT(7) // Force Rx Broadcast packets Use Default Key
+#define SCR_CHK_KEYID BIT(8)
//-----------------------------------------------------
//
diff --git a/rtl8723BS/include/hal_data.h b/rtl8723BS/include/hal_data.h
index 2b7014d..191caf3 100755
--- a/rtl8723BS/include/hal_data.h
+++ b/rtl8723BS/include/hal_data.h
@@ -364,18 +364,18 @@ typedef struct hal_com_data
u8 TxPwrLevelCck[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];
u8 TxPwrLevelHT40_1S[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
u8 TxPwrLevelHT40_2S[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER]; // For HT 40MHZ pwr
- u8 TxPwrHt20Diff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
+ s8 TxPwrHt20Diff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// HT 20<->40 Pwr diff
u8 TxPwrLegacyHtDiff[RF_PATH_MAX_92C_88E][CHANNEL_MAX_NUMBER];// For HT<->legacy pwr diff
// Power Limit Table for 2.4G
- u8 TxPwrLimit_2_4G[MAX_REGULATION_NUM]
+ s8 TxPwrLimit_2_4G[MAX_REGULATION_NUM]
[MAX_2_4G_BANDWITH_NUM]
[MAX_RATE_SECTION_NUM]
[CHANNEL_MAX_NUMBER_2G]
[MAX_RF_PATH_NUM];
// Power Limit Table for 5G
- u8 TxPwrLimit_5G[MAX_REGULATION_NUM]
+ s8 TxPwrLimit_5G[MAX_REGULATION_NUM]
[MAX_5G_BANDWITH_NUM]
[MAX_RATE_SECTION_NUM]
[CHANNEL_MAX_NUMBER_5G]
@@ -468,6 +468,7 @@ typedef struct hal_com_data
u8 AntDivCfg;
u8 AntDetection;
u8 TRxAntDivType;
+ u8 ant_path; //for 8723B s0/s1 selection
u8 u1ForcedIgiLb; // forced IGI lower bound
@@ -495,7 +496,7 @@ typedef struct hal_com_data
u8 p2p_ps_offload;
#endif
- u8 AMPDUDensity;
+ //u8 AMPDUDensity;
// Auto FSM to Turn On, include clock, isolation, power control for MAC only
u8 bMacPwrCtrlOn;
@@ -593,6 +594,8 @@ typedef struct hal_com_data
u8 bInterruptMigration;
u8 bDisableTxInt;
+
+ u16 RxTag;
#endif //CONFIG_PCI_HCI
struct dm_priv dmpriv;
@@ -678,6 +681,11 @@ typedef struct hal_com_data
char *rf_tx_pwr_lmt;
u32 rf_tx_pwr_lmt_len;
#endif
+
+#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+ s16 noise[ODM_MAX_CHANNEL_NUM];
+#endif
+
} HAL_DATA_COMMON, *PHAL_DATA_COMMON;
diff --git a/rtl8723BS/include/hal_gspi.h b/rtl8723BS/include/hal_gspi.h
new file mode 100755
index 0000000..f5880e2
--- a/dev/null
+++ b/rtl8723BS/include/hal_gspi.h
@@ -0,0 +1,32 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+#ifndef __HAL_GSPI_H_
+#define __HAL_GSPI_H_
+
+#define ffaddr2deviceId(pdvobj, addr) (pdvobj->Queue2Pipe[addr])
+
+u8 rtw_hal_gspi_max_txoqt_free_space(_adapter *padapter);
+u8 rtw_hal_gspi_query_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);
+void rtw_hal_gspi_update_tx_freepage(_adapter *padapter, u8 PageIdx, u8 RequiredPageNum);
+void rtw_hal_set_gspi_tx_max_length(PADAPTER padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ);
+u32 rtw_hal_get_gspi_tx_max_length(PADAPTER padapter, u8 queue_idx);
+
+#endif
+
diff --git a/rtl8723BS/include/hal_intf.h b/rtl8723BS/include/hal_intf.h
index 340f9a6..37acfcf 100755
--- a/rtl8723BS/include/hal_intf.h
+++ b/rtl8723BS/include/hal_intf.h
@@ -65,6 +65,7 @@ typedef enum _HW_VARIABLES{
HW_VAR_RESP_SIFS,
HW_VAR_ACK_PREAMBLE,
HW_VAR_SEC_CFG,
+ HW_VAR_SEC_DK_CFG,
HW_VAR_BCN_VALID,
HW_VAR_RF_TYPE,
HW_VAR_DM_FLAG,
@@ -186,6 +187,7 @@ typedef enum _HAL_ODM_VARIABLE{
HAL_ODM_STA_INFO,
HAL_ODM_P2P_STATE,
HAL_ODM_WIFI_DISPLAY_STATE,
+ HAL_ODM_NOISE_MONITOR,
}HAL_ODM_VARIABLE;
typedef enum _HAL_INTF_PS_FUNC{
@@ -252,7 +254,7 @@ struct hal_ops {
u8 (*GetHalDefVarHandler)(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
u8 (*SetHalDefVarHandler)(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
- void (*GetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
+ void (*GetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2);
void (*SetHalODMVarHandler)(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
void (*UpdateRAMaskHandler)(_adapter *padapter, u32 mac_id, u8 rssi_level);
@@ -411,6 +413,11 @@ typedef enum _HARDWARE_TYPE{
#define IS_HARDWARE_TYPE_8188E(_Adapter) \
(IS_HARDWARE_TYPE_8188EE(_Adapter) || IS_HARDWARE_TYPE_8188EU(_Adapter) || IS_HARDWARE_TYPE_8188ES(_Adapter))
+
+#define IS_HARDWARE_TYPE_8188E_before(_Adapter) \
+(IS_HARDWARE_TYPE_8192C(_Adapter) ||IS_HARDWARE_TYPE_8192D(_Adapter) ||IS_HARDWARE_TYPE_8723A(_Adapter))
+
+
#define IS_HARDWARE_TYPE_OLDER_THAN_8812A(_Adapter) \
(IS_HARDWARE_TYPE_8192D(_Adapter) || IS_HARDWARE_TYPE_8192C(_Adapter) ||\
IS_HARDWARE_TYPE_8723AE(_Adapter) || IS_HARDWARE_TYPE_8723AU(_Adapter) || IS_HARDWARE_TYPE_8723AS(_Adapter) ||\
@@ -529,7 +536,7 @@ u8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pVa
u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue);
void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
-void rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet);
+void rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2);
void rtw_hal_enable_interrupt(_adapter *padapter);
void rtw_hal_disable_interrupt(_adapter *padapter);
diff --git a/rtl8723BS/include/ioctl_cfg80211.h b/rtl8723BS/include/ioctl_cfg80211.h
index 2cae2c5..6fe9f86 100755
--- a/rtl8723BS/include/ioctl_cfg80211.h
+++ b/rtl8723BS/include/ioctl_cfg80211.h
@@ -117,6 +117,7 @@ void rtw_wdev_unregister(struct wireless_dev *wdev);
void rtw_cfg80211_init_wiphy(_adapter *padapter);
+void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork);
void rtw_cfg80211_surveydone_event_callback(_adapter *padapter);
struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork);
int rtw_cfg80211_check_bss(_adapter *padapter);
diff --git a/rtl8723BS/include/osdep_intf.h b/rtl8723BS/include/osdep_intf.h
index 7a61a13..d67d06c 100755
--- a/rtl8723BS/include/osdep_intf.h
+++ b/rtl8723BS/include/osdep_intf.h
@@ -129,11 +129,6 @@ extern int rtw_ioctl(struct ifnet * ifp, u_long cmd, caddr_t data);
void rtw_ips_dev_unload(_adapter *padapter);
-#ifdef CONFIG_RF_GAIN_OFFSET
-void rtw_bb_rf_gain_offset(_adapter *padapter);
-#endif //CONFIG_RF_GAIN_OFFSET
-
-
#ifdef CONFIG_IPS
int rtw_ips_pwr_up(_adapter *padapter);
void rtw_ips_pwr_down(_adapter *padapter);
@@ -155,11 +150,12 @@ void rtw_drv_free_vir_ifaces(struct dvobj_priv *dvobj);
int rtw_drv_register_netdev(_adapter *padapter);
void rtw_ndev_destructor(_nic_hdl ndev);
-#ifdef CONFIG_SUSPEND_REFINE
-int rtw_suspend_common(_adapter *padapter);
-int rtw_resume_common(_adapter *padapter);
+#ifdef CONFIG_ARP_KEEP_ALIVE
+int rtw_gw_addr_query(_adapter *padapter);
#endif
+int rtw_suspend_common(_adapter *padapter);
+int rtw_resume_common(_adapter *padapter);
#endif //_OSDEP_INTF_H_
diff --git a/rtl8723BS/include/pci_hal.h b/rtl8723BS/include/pci_hal.h
index 3180a4c..a37040b 100755
--- a/rtl8723BS/include/pci_hal.h
+++ b/rtl8723BS/include/pci_hal.h
@@ -36,6 +36,10 @@ void rtl8188ee_set_hal_ops(_adapter * padapter);
void rtl8812ae_set_hal_ops(_adapter * padapter);
#endif
+#if defined(CONFIG_RTL8192E)
+void rtl8192ee_set_hal_ops(_adapter * padapter);
+#endif
+
#ifdef CONFIG_RTL8723B
void rtl8723be_set_hal_ops(_adapter * padapter);
#endif
diff --git a/rtl8723BS/include/pci_ops.h b/rtl8723BS/include/pci_ops.h
index 75de6de..cc2f45d 100755
--- a/rtl8723BS/include/pci_ops.h
+++ b/rtl8723BS/include/pci_ops.h
@@ -68,6 +68,16 @@ void rtl8812ae_prepare_bcn_tasklet(void *priv);
void rtl8812ae_set_intf_ops(struct _io_ops *pops);
#endif
+#ifdef CONFIG_RTL8192E
+u32 rtl8192ee_init_desc_ring(_adapter * padapter);
+u32 rtl8192ee_free_desc_ring(_adapter * padapter);
+void rtl8192ee_reset_desc_ring(_adapter * padapter);
+void rtl8192ee_recv_tasklet(void *priv);
+void rtl8192ee_prepare_bcn_tasklet(void *priv);
+int rtl8192ee_interrupt(PADAPTER Adapter);
+void rtl8192ee_set_intf_ops(struct _io_ops *pops);
+#endif
+
#ifdef CONFIG_RTL8723B
u32 rtl8723be_init_desc_ring(_adapter * padapter);
u32 rtl8723be_free_desc_ring(_adapter * padapter);
diff --git a/rtl8723BS/include/rtl8188e_hal.h b/rtl8723BS/include/rtl8188e_hal.h
index d203258..df06a09 100755
--- a/rtl8723BS/include/rtl8188e_hal.h
+++ b/rtl8723BS/include/rtl8188e_hal.h
@@ -208,8 +208,6 @@ typedef struct _RT_8188E_FIRMWARE_HDR
//
#define EFUSE_OOB_PROTECT_BYTES 15 // PG data exclude header, dummy 6 bytes frome CP test and reserved 1byte.
-#define HWSET_MAX_SIZE_88E 512
-
#define EFUSE_REAL_CONTENT_LEN_88E 256
#define EFUSE_MAP_LEN_88E 512
#define EFUSE_MAX_SECTION_88E 64
@@ -279,6 +277,10 @@ void Hal_DetectWoWMode(PADAPTER pAdapter);
//void rtl8723a_ReadBluetoothCoexistInfo(PADAPTER padapter, u8 *PROMContent, BOOLEAN AutoloadFail);
void Hal_InitChannelPlan(PADAPTER padapter);
+#ifdef CONFIG_RF_GAIN_OFFSET
+void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);
+#endif //CONFIG_RF_GAIN_OFFSET
+
void rtl8188e_set_hal_ops(struct hal_ops *pHalFunc);
// register
@@ -295,6 +297,13 @@ void _InitTransferPageSize(PADAPTER padapter);
void SetHwReg8188E(PADAPTER padapter, u8 variable, u8 *val);
void GetHwReg8188E(PADAPTER padapter, u8 variable, u8 *val);
-
+void ResumeTxBeacon(PADAPTER padapter);
+void StopTxBeacon(PADAPTER padapter);
+u8
+GetHalDefVar8188E(
+ IN PADAPTER Adapter,
+ IN HAL_DEF_VARIABLE eVariable,
+ IN PVOID pValue
+ );
#endif //__RTL8188E_HAL_H__
diff --git a/rtl8723BS/include/rtl8188e_spec.h b/rtl8723BS/include/rtl8188e_spec.h
index 0fb93b5..535862c 100755
--- a/rtl8723BS/include/rtl8188e_spec.h
+++ b/rtl8723BS/include/rtl8188e_spec.h
@@ -99,6 +99,11 @@
// 0x0600h ~ 0x07FFh WMAC Configuration
//
//-----------------------------------------------------
+#ifdef CONFIG_RF_GAIN_OFFSET
+#define EEPROM_RF_GAIN_OFFSET 0xC1
+#define EEPROM_RF_GAIN_VAL 0xF6
+#define EEPROM_THERMAL_OFFSET 0xF5
+#endif //CONFIG_RF_GAIN_OFFSET
//----------------------------------------------------------------------------
// 88E Driver Initialization Offload REG_FDHM0(Offset 0x88, 8 bits)
//----------------------------------------------------------------------------
diff --git a/rtl8723BS/include/rtl8188e_xmit.h b/rtl8723BS/include/rtl8188e_xmit.h
index 3a711c1..ef88d94 100755
--- a/rtl8723BS/include/rtl8188e_xmit.h
+++ b/rtl8723BS/include/rtl8188e_xmit.h
@@ -249,7 +249,10 @@ struct txrpt_ccx_88e {
#define txrpt_ccx_sw_88e(txrpt_ccx) ((txrpt_ccx)->sw0 + ((txrpt_ccx)->sw1<<8))
#define txrpt_ccx_qtime_88e(txrpt_ccx) ((txrpt_ccx)->ccx_qtime0+((txrpt_ccx)->ccx_qtime1<<8))
-void rtl8188e_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull);
+#define SET_TX_DESC_SEC_TYPE_8188E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 22, 2, __Value)
+
+void rtl8188e_fill_fake_txdesc(PADAPTER padapter,u8*pDesc,u32 BufferLen,
+ u8 IsPsPoll,u8 IsBTQosNull, u8 bDataFrame);
#ifdef CONFIG_SDIO_HCI
s32 rtl8188es_init_xmit_priv(PADAPTER padapter);
void rtl8188es_free_xmit_priv(PADAPTER padapter);
@@ -278,10 +281,10 @@ s32 rtl8188eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv
#ifdef CONFIG_PCI_HCI
s32 rtl8188ee_init_xmit_priv(PADAPTER padapter);
void rtl8188ee_free_xmit_priv(PADAPTER padapter);
-struct xmit_buf *rtl8188ee_dequeue_xmitbuf(struct rtw_tx_ring *ring);
void rtl8188ee_xmitframe_resume(_adapter *padapter);
s32 rtl8188ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);
s32 rtl8188ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);
+s32 rtl8188ee_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
void rtl8188ee_xmit_tasklet(void *priv);
#endif
diff --git a/rtl8723BS/include/rtl8192c_hal.h b/rtl8723BS/include/rtl8192c_hal.h
index 795e396..5387d97 100755
--- a/rtl8723BS/include/rtl8192c_hal.h
+++ b/rtl8723BS/include/rtl8192c_hal.h
@@ -402,7 +402,7 @@ void rtl8192c_EfuseParseChnlPlan(PADAPTER padapter, u8 *hwinfo, BOOLEAN AutoLoad
HAL_VERSION rtl8192c_ReadChipVersion(IN PADAPTER Adapter);
void rtl8192c_ReadBluetoothCoexistInfo(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);
-//void rtl8192c_free_hal_data(_adapter * padapter);
+
VOID rtl8192c_EfuseParseIDCode(PADAPTER pAdapter, u8 *hwinfo);
void rtl8192c_set_hal_ops(struct hal_ops *pHalFunc);
diff --git a/rtl8723BS/include/rtl8192c_recv.h b/rtl8723BS/include/rtl8192c_recv.h
index 85716b4..71d9974 100755
--- a/rtl8723BS/include/rtl8192c_recv.h
+++ b/rtl8723BS/include/rtl8192c_recv.h
@@ -26,6 +26,7 @@
#if defined(CONFIG_USB_HCI)
+#ifndef MAX_RECVBUF_SZ
#ifdef PLATFORM_OS_CE
#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
#else
@@ -43,6 +44,7 @@
#define MAX_RECVBUF_SZ (4000) // about 4K
#endif
#endif
+#endif //!MAX_RECVBUF_SZ
#elif defined(CONFIG_PCI_HCI)
//#ifndef CONFIG_MINIMAL_MEMORY_USAGE
diff --git a/rtl8723BS/include/rtl8192d_cmd.h b/rtl8723BS/include/rtl8192d_cmd.h
index 3896b7d..151f2d5 100755
--- a/rtl8723BS/include/rtl8192d_cmd.h
+++ b/rtl8723BS/include/rtl8192d_cmd.h
@@ -28,24 +28,24 @@
// User Define Message [31:8]
//_SETPWRMODE_PARM
-#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
//JOINBSSRPT_PARM
-#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
//_RSVDPAGE_LOC
-#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
-#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_CTW(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA0(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
+#define SET_H2CCMD_P2P_PS_OFFLOAD_NOA1(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
#define SET_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
#define SET_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 6, 1, __Value)
@@ -53,13 +53,13 @@
// Fisrt constructed by tynli. 2009.10.09.
typedef enum _RTL8192D_H2C_CMD
{
- H2C_AP_OFFLOAD = 0, /*0*/
+ H2C_92D_AP_OFFLOAD = 0, /*0*/
H2C_SETPWRMODE = 1, /*1*/
H2C_JOINBSSRPT = 2, /*2*/
H2C_RSVDPAGE = 3,
H2C_RSSI_REPORT = 5,
H2C_RA_MASK = 6,
- H2C_P2P_PS_OFFLOAD = 8,
+ H2C_92D_P2P_PS_OFFLOAD = 8,
H2C_MAC_MODE_SEL = 9,
H2C_PWRM=15,
H2C_P2P_PS_CTW_CMD = 24,
diff --git a/rtl8723BS/include/rtl8192d_recv.h b/rtl8723BS/include/rtl8192d_recv.h
index eff00fe..8ebdfdf 100755
--- a/rtl8723BS/include/rtl8192d_recv.h
+++ b/rtl8723BS/include/rtl8192d_recv.h
@@ -27,6 +27,7 @@
#if defined(CONFIG_USB_HCI)
+#ifndef MAX_RECVBUF_SZ
#ifdef PLATFORM_OS_CE
#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
#else
@@ -43,6 +44,7 @@
#define MAX_RECVBUF_SZ (4000) // about 4K
#endif
#endif
+#endif //!MAX_RECVBUF_SZ
#elif defined(CONFIG_PCI_HCI)
//#ifndef CONFIG_MINIMAL_MEMORY_USAGE
diff --git a/rtl8723BS/include/rtl8192e_cmd.h b/rtl8723BS/include/rtl8192e_cmd.h
index 5450245..f765795 100755
--- a/rtl8723BS/include/rtl8192e_cmd.h
+++ b/rtl8723BS/include/rtl8192e_cmd.h
@@ -114,22 +114,22 @@ typedef struct _RSVDPAGE_LOC_92E {
//_SETPWRMODE_PARM
-#define SET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
-#define SET_8192E_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)
-#define GET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd) LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8192E_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)
+#define GET_8192E_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd) LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
//_P2P_PS_OFFLOAD
#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ROLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
-#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 3, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 4, 1, __Value)
+#define SET_8192E_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 5, 1, __Value)
// host message to firmware cmd
diff --git a/rtl8723BS/include/rtl8192e_hal.h b/rtl8723BS/include/rtl8192e_hal.h
index 2b76b8c..2d72c68 100755
--- a/rtl8723BS/include/rtl8192e_hal.h
+++ b/rtl8723BS/include/rtl8192e_hal.h
@@ -137,39 +137,34 @@ typedef struct _RT_FIRMWARE_8192E {
#define TX_TOTAL_PAGE_NUMBER_8192E 243 //0x00~0xF3 totoal pages: F4
-#define TX_PAGE_BOUNDARY_8192E (TX_TOTAL_PAGE_NUMBER_8192E + 1)//0xF4,Rserved 12 pages for BCN/PS-POLL..
+#define TX_PAGE_BOUNDARY_8192E (TX_TOTAL_PAGE_NUMBER_8192E + 1)//0xF4 ~0xFF ,Rserved 12 pages for BCN/PS-POLL..
#define TX_PAGE_LOAD_FW_BOUNDARY_8192E 0x47 //0xA5
#define TX_PAGE_BOUNDARY_WOWLAN_8192E 0xE0
// For Normal Chip Setting
// (HPQ + LPQ + NPQ + PUBQ) shall be TX_TOTAL_PAGE_NUMBER_92C
-#define NORMAL_PAGE_NUM_PUBQ_8192E 0xE0
-#define NORMAL_PAGE_NUM_LPQ_8192E 0x0C
-#define NORMAL_PAGE_NUM_HPQ_8192E 0x08
-#define NORMAL_PAGE_NUM_NPQ_8192E 0x00
-#define NORMAL_PAGE_NUM_EPQ_8192E 0x00
+#define NORMAL_PAGE_NUM_HPQ_8192E 0x10
+#define NORMAL_PAGE_NUM_LPQ_8192E 0x10
+#define NORMAL_PAGE_NUM_NPQ_8192E 0x10
+#define NORMAL_PAGE_NUM_EPQ_8192E 0x00
//Note: For WMM Normal Chip Setting ,modify later
-#define WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E TX_PAGE_BOUNDARY_8192E
-#define WMM_NORMAL_TX_PAGE_BOUNDARY_8192E (WMM_NORMAL_TX_TOTAL_PAGE_NUMBER_8192E + 1)
-
-#define WMM_NORMAL_PAGE_NUM_PUBQ_8192E NORMAL_PAGE_NUM_PUBQ_8192E
#define WMM_NORMAL_PAGE_NUM_HPQ_8192E NORMAL_PAGE_NUM_HPQ_8192E
#define WMM_NORMAL_PAGE_NUM_LPQ_8192E NORMAL_PAGE_NUM_LPQ_8192E
#define WMM_NORMAL_PAGE_NUM_NPQ_8192E NORMAL_PAGE_NUM_NPQ_8192E
-#define USB_JAGUAR_DUMMY_OFFSET_8192EU 2
-#define USB_JAGUAR_DUMMY_UNIT_8192EU 8
-#define USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU (USB_JAGUAR_DUMMY_OFFSET_8192EU * USB_JAGUAR_DUMMY_UNIT_8192EU)
-#define USB_HWDESC_HEADER_LEN_8192EU (TX_DESC_SIZE_8192E + USB_JAGUAR_ALL_DUMMY_LENGTH_8192EU)
-
//-------------------------------------------------------------------------
// Chip specific
//-------------------------------------------------------------------------
+// pic buffer descriptor
+#define RTL8192EE_SEG_NUM TX_BUFFER_SEG_NUM
+#define TX_DESC_NUM_92E 128
+#define RX_DESC_NUM_92E 128
+
//-------------------------------------------------------------------------
// Channel Plan
//-------------------------------------------------------------------------
@@ -291,5 +286,11 @@ void SetBcnCtrlReg(PADAPTER padapter, u8 SetBits, u8 ClearBits);
void rtl8192e_start_thread(_adapter *padapter);
void rtl8192e_stop_thread(_adapter *padapter);
+
+#ifdef CONFIG_PCI_HCI
+BOOLEAN InterruptRecognized8192EE(PADAPTER Adapter);
+u16 get_txdesc_buf_addr(u16 ff_hwaddr);
+#endif
+
#endif //__RTL8192E_HAL_H__
diff --git a/rtl8723BS/include/rtl8192e_recv.h b/rtl8723BS/include/rtl8192e_recv.h
index a840484..4dc9769 100755
--- a/rtl8723BS/include/rtl8192e_recv.h
+++ b/rtl8723BS/include/rtl8192e_recv.h
@@ -22,19 +22,25 @@
#if defined(CONFIG_USB_HCI)
+#ifndef MAX_RECVBUF_SZ
#ifdef PLATFORM_OS_CE
#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
#else
#ifdef CONFIG_MINIMAL_MEMORY_USAGE
#define MAX_RECVBUF_SZ (4000) // about 4K
#else
+ #ifdef CONFIG_PLATFORM_MSTAR
+ #define MAX_RECVBUF_SZ (8192) // 8K
+ #else
#define MAX_RECVBUF_SZ (32768) // 32k
+ #endif
//#define MAX_RECVBUF_SZ (20480) //20K
//#define MAX_RECVBUF_SZ (10240) //10K
//#define MAX_RECVBUF_SZ (16384) // 16k - 92E RX BUF :16K
//#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
#endif
#endif
+#endif //!MAX_RECVBUF_SZ
#elif defined(CONFIG_PCI_HCI)
//#ifndef CONFIG_MINIMAL_MEMORY_USAGE
@@ -55,7 +61,28 @@
#define Rx_Smooth_Factor (20)
//=============
+// [1] Rx Buffer Descriptor (for PCIE) buffer descriptor architecture
+//DWORD 0
+#define SET_RX_BUFFER_DESC_DATA_LENGTH_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)
+#define SET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc,__Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 15, 1, __Value)
+#define SET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 1, __Value)
+#define SET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 16, 15, __Value)
+
+#define GET_RX_BUFFER_DESC_OWN_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)
+#define GET_RX_BUFFER_DESC_LS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 15, 1)
+#define GET_RX_BUFFER_DESC_FS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 1)
+#define GET_RX_BUFFER_DESC_TOTAL_LENGTH_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 16, 15)
+
+//DWORD 1
+#define SET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+4, 0, 32, __Value)
+#define GET_RX_BUFFER_PHYSICAL_LOW_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc+4, 0, 32)
+
+//DWORD 2
+#define SET_RX_BUFFER_PHYSICAL_HIGH_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc+8, 0, 32, __Value)
+
+//=============
+// [2] Rx Descriptor
//DWORD 0
#define GET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 0, 14)
#define GET_RX_STATUS_DESC_CRC32_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 14, 1)
@@ -67,6 +94,12 @@
#define GET_RX_STATUS_DESC_PHY_STATUS_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 26, 1)
#define GET_RX_STATUS_DESC_SWDEC_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 27, 1)
#define GET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 30, 1)
+#define GET_RX_STATUS_DESC_OWN_92E(__pRxStatusDesc) LE_BITS_TO_4BYTE( __pRxStatusDesc, 31, 1)
+
+
+#define SET_RX_STATUS_DESC_PKT_LEN_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 0, 14, __Value)
+#define SET_RX_STATUS_DESC_EOR_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 30, 1, __Value)
+#define SET_RX_STATUS_DESC_OWN_92E(__pRxStatusDesc, __Value) SET_BITS_TO_LE_4BYTE( __pRxStatusDesc, 31, 1, __Value)
//DWORD 1
#define GET_RX_STATUS_DESC_MACID_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+4, 0, 7)
@@ -116,8 +149,6 @@
#define GET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+24, 0, 32)
#define GET_RX_STATUS_DESC_BUFF_ADDR64_92E(__pRxDesc) LE_BITS_TO_4BYTE(__pRxDesc+28, 0, 32)
-#define SET_RX_STATUS_DESC_BUFF_ADDR_92E(__pRxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pRxDesc+24, 0, 32, __Value)
-
#ifdef CONFIG_SDIO_HCI
s32 rtl8812s_init_recv_priv(PADAPTER padapter);
diff --git a/rtl8723BS/include/rtl8192e_spec.h b/rtl8723BS/include/rtl8192e_spec.h
index c3f9316..7e5a17e 100755
--- a/rtl8723BS/include/rtl8192e_spec.h
+++ b/rtl8723BS/include/rtl8192e_spec.h
@@ -35,6 +35,8 @@
// 0x0000h ~ 0x00FFh System Configuration
//
//-----------------------------------------------------
+#define REG_SYS_SWR_CTRL1_8192E 0x0010 // 1 Byte
+#define REG_SYS_SWR_CTRL2_8192E 0x0014 // 1 Byte
#define REG_AFE_CTRL1_8192E 0x0024
#define REG_AFE_CTRL2_8192E 0x0028
#define REG_AFE_CTRL3_8192E 0x002c
@@ -79,6 +81,8 @@
// 0x0200h ~ 0x027Fh TXDMA Configuration
//
//-----------------------------------------------------
+#define REG_DWBCN0_CTRL 0x0208
+#define REG_DWBCN1_CTRL 0x0228
//-----------------------------------------------------
//
@@ -98,7 +102,62 @@
// 0x0300h ~ 0x03FFh PCIe
//
//-----------------------------------------------------
-#define REG_PCIE_MULTIFET_CTRL_8192E 0x036A //PCIE Multi-Fethc Control
+#define REG_PCIE_CTRL_REG_8192E 0x0300
+#define REG_INT_MIG_8192E 0x0304 // Interrupt Migration
+#define REG_BCNQ_TXBD_DESA_8192E 0x0308 // TX Beacon Descriptor Address
+#define REG_MGQ_TXBD_DESA_8192E 0x0310 // TX Manage Queue Descriptor Address
+#define REG_VOQ_TXBD_DESA_8192E 0x0318 // TX VO Queue Descriptor Address
+#define REG_VIQ_TXBD_DESA_8192E 0x0320 // TX VI Queue Descriptor Address
+#define REG_BEQ_TXBD_DESA_8192E 0x0328 // TX BE Queue Descriptor Address
+#define REG_BKQ_TXBD_DESA_8192E 0x0330 // TX BK Queue Descriptor Address
+#define REG_RXQ_RXBD_DESA_8192E 0x0338 // RX Queue Descriptor Address
+#define REG_HI0Q_TXBD_DESA_8192E 0x0340
+#define REG_HI1Q_TXBD_DESA_8192E 0x0348
+#define REG_HI2Q_TXBD_DESA_8192E 0x0350
+#define REG_HI3Q_TXBD_DESA_8192E 0x0358
+#define REG_HI4Q_TXBD_DESA_8192E 0x0360
+#define REG_HI5Q_TXBD_DESA_8192E 0x0368
+#define REG_HI6Q_TXBD_DESA_8192E 0x0370
+#define REG_HI7Q_TXBD_DESA_8192E 0x0378
+#define REG_MGQ_TXBD_NUM_8192E 0x0380
+#define REG_RX_RXBD_NUM_8192E 0x0382
+#define REG_VOQ_TXBD_NUM_8192E 0x0384
+#define REG_VIQ_TXBD_NUM_8192E 0x0386
+#define REG_BEQ_TXBD_NUM_8192E 0x0388
+#define REG_BKQ_TXBD_NUM_8192E 0x038A
+#define REG_HI0Q_TXBD_NUM_8192E 0x038C
+#define REG_HI1Q_TXBD_NUM_8192E 0x038E
+#define REG_HI2Q_TXBD_NUM_8192E 0x0390
+#define REG_HI3Q_TXBD_NUM_8192E 0x0392
+#define REG_HI4Q_TXBD_NUM_8192E 0x0394
+#define REG_HI5Q_TXBD_NUM_8192E 0x0396
+#define REG_HI6Q_TXBD_NUM_8192E 0x0398
+#define REG_HI7Q_TXBD_NUM_8192E 0x039A
+#define REG_TSFTIMER_HCI_8192E 0x039C
+
+//Read Write Point
+#define REG_VOQ_TXBD_IDX_8192E 0x03A0
+#define REG_VIQ_TXBD_IDX_8192E 0x03A4
+#define REG_BEQ_TXBD_IDX_8192E 0x03A8
+#define REG_BKQ_TXBD_IDX_8192E 0x03AC
+#define REG_MGQ_TXBD_IDX_8192E 0x03B0
+#define REG_RXQ_TXBD_IDX_8192E 0x03B4
+#define REG_HI0Q_TXBD_IDX_8192E 0x03B8
+#define REG_HI1Q_TXBD_IDX_8192E 0x03BC
+#define REG_HI2Q_TXBD_IDX_8192E 0x03C0
+#define REG_HI3Q_TXBD_IDX_8192E 0x03C4
+#define REG_HI4Q_TXBD_IDX_8192E 0x03C8
+#define REG_HI5Q_TXBD_IDX_8192E 0x03CC
+#define REG_HI6Q_TXBD_IDX_8192E 0x03D0
+#define REG_HI7Q_TXBD_IDX_8192E 0x03D4
+
+#define REG_PCIE_HCPWM_8192EE 0x03D8 // ??????
+#define REG_PCIE_HRPWM_8192EE 0x03DC //PCIe RPWM // ??????
+#define REG_DBI_WDATA_V1_8192E 0x03E8
+#define REG_DBI_RDATA_V1_8192E 0x03EC
+#define REG_DBI_FLAG_V1_8192E 0x03F0
+#define REG_MDIO_V1_8192E 0x3F4
+#define REG_PCIE_MIX_CFG_8192E 0x3F8
//-----------------------------------------------------
//
@@ -106,14 +165,18 @@
//
//-----------------------------------------------------
#define REG_TXBF_CTRL_8192E 0x042C
+#define REG_ARFR0_8192E 0x0444
#define REG_ARFR1_8192E 0x044C
#define REG_CCK_CHECK_8192E 0x0454
#define REG_AMPDU_MAX_TIME_8192E 0x0456
#define REG_BCNQ1_BDNY_8192E 0x0457
#define REG_AMPDU_MAX_LENGTH_8192E 0x0458
+#define REG_WMAC_LBK_BUF_HD_8192E 0x045D
#define REG_NDPA_OPT_CTRL_8192E 0x045F
#define REG_DATA_SC_8192E 0x0483
+#define REG_ARFR2_8192E 0x048C
+#define REG_ARFR3_8192E 0x0494
#define REG_TXRPT_START_OFFSET 0x04AC
#define REG_AMPDU_BURST_MODE_8192E 0x04BC
#define REG_HT_SINGLE_AMPDU_8192E 0x04C7
diff --git a/rtl8723BS/include/rtl8192e_xmit.h b/rtl8723BS/include/rtl8192e_xmit.h
index 200a111..91fc018 100755
--- a/rtl8723BS/include/rtl8192e_xmit.h
+++ b/rtl8723BS/include/rtl8192e_xmit.h
@@ -207,16 +207,48 @@ typedef struct txdescriptor_8192e
#define USB_TXAGG_NUM_SHT 24
+//=====Tx Desc Buffer content
-//=====Desc content
+// config element for each tx buffer
+/*
+#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 0, 16, __Valeu)
+#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16), 31, 1, __Valeu)
+#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+4, 0, 32, __Valeu)
+#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu)
+*/
+#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 0, 16, __Valeu)
+#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8), 31, 1, __Valeu)
+#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*8)+4, 0, 32, __Valeu)
+#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pTxDesc, __Offset, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc+(__Offset*16)+8, 0, 32, __Valeu)
+
+
+// Dword 0
+#define SET_TX_BUFF_DESC_LEN_0_92E(__pTxDesc, __Valeu) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 14, __Valeu)
+#define SET_TX_BUFF_DESC_PSB_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 15, __Value)
+#define SET_TX_BUFF_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)
+// Dword 1
+#define SET_TX_BUFF_DESC_ADDR_LOW_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 32, __Value)
+#define GET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc+4, 0,32)
+
+
+// Dword 2
+#define SET_TX_BUFF_DESC_ADDR_HIGH_0_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+8, 0, 32, __Value)
+// Dword 3, RESERVED
+
+
+//=====Tx Desc content
// Dword 0
#define SET_TX_DESC_PKT_SIZE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 0, 16, __Value)
#define SET_TX_DESC_OFFSET_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 16, 8, __Value)
#define SET_TX_DESC_BMC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 24, 1, __Value)
#define SET_TX_DESC_HTC_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 25, 1, __Value)
+#define SET_TX_DESC_LAST_SEG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 26, 1, __Value)
+#define SET_TX_DESC_FIRST_SEG_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 27, 1, __Value)
#define SET_TX_DESC_LINIP_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 28, 1, __Value)
#define SET_TX_DESC_NO_ACM_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 29, 1, __Value)
#define SET_TX_DESC_GF_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 30, 1, __Value)
+#define SET_TX_DESC_OWN_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc, 31, 1, __Value)
+#define GET_TX_DESC_OWN_92E(__pTxDesc) LE_BITS_TO_4BYTE(__pTxDesc, 31, 1)
// Dword 1
#define SET_TX_DESC_MACID_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+4, 0, 7, __Value)
@@ -324,12 +356,7 @@ typedef struct txdescriptor_8192e
#define SET_TX_DESC_TXBF_PATH_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 11, 1, __Value)
#define SET_TX_DESC_SEQ_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 12, 12, __Value)
#define SET_TX_DESC_FINAL_DATA_RATE_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+36, 24, 8, __Value)
-// Dword 10
-#define SET_TX_DESC_TX_BUFFER_ADDRESS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+40, 0, 32, __Value)
-
-// Dword 11
-#define SET_TX_DESC_NEXT_DESC_ADDRESS_92E(__pTxDesc, __Value) SET_BITS_TO_LE_4BYTE(__pTxDesc+48, 0, 32, __Value)
#define SET_EARLYMODE_PKTNUM_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 0, 4, __Value)
#define SET_EARLYMODE_LEN0_92E(__pAddr, __Value) SET_BITS_TO_LE_4BYTE(__pAddr, 4, 15, __Value)
@@ -358,6 +385,7 @@ s32 rtl8192eu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv
s32 rtl8192ee_init_xmit_priv(PADAPTER padapter);
void rtl8192ee_free_xmit_priv(PADAPTER padapter);
struct xmit_buf *rtl8192ee_dequeue_xmitbuf(struct rtw_tx_ring *ring);
+s32 rtl8192ee_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe);
void rtl8192ee_xmitframe_resume(_adapter *padapter);
s32 rtl8192ee_hal_xmit(PADAPTER padapter, struct xmit_frame *pxmitframe);
s32 rtl8192ee_mgnt_xmit(PADAPTER padapter, struct xmit_frame *pmgntframe);
diff --git a/rtl8723BS/include/rtl8723a_cmd.h b/rtl8723BS/include/rtl8723a_cmd.h
index 43523d4..ced4a49 100755
--- a/rtl8723BS/include/rtl8723a_cmd.h
+++ b/rtl8723BS/include/rtl8723a_cmd.h
@@ -21,7 +21,7 @@
#define __RTL8723A_CMD_H__
-#define H2C_BT_FW_PATCH_LEN 3
+#define H2C_8723A_BT_FW_PATCH_LEN 3
#define H2C_BT_PWR_FORCE_LEN 3
enum cmd_msg_element_id
@@ -49,11 +49,11 @@ enum cmd_msg_element_id
BT_PTA_MANAGER_UPDATE_ENABLE_EID = 38,
DAC_SWING_VALUE_EID = 41,
TRADITIONAL_TDMA_EN_EID = 51,
- H2C_BT_FW_PATCH = 54,
+ H2C_8723A_BT_FW_PATCH = 54,
B_TYPE_TDMA_EID = 58,
SCAN_EN_EID = 59,
LOWPWR_LPS_EID = 71,
- H2C_RESET_TSF = 75,
+ H2C_8723A_RESET_TSF = 75,
MAX_CMDMSG_EID
};
diff --git a/rtl8723BS/include/rtl8723a_xmit.h b/rtl8723BS/include/rtl8723a_xmit.h
index a4bc48d..0613b87 100755
--- a/rtl8723BS/include/rtl8723a_xmit.h
+++ b/rtl8723BS/include/rtl8723a_xmit.h
@@ -48,7 +48,7 @@
//OFFSET 8
#define AGG_EN BIT(29)
-
+#define AMPDU_DENSITY_SHT 20
//OFFSET 12
#define SEQ_SHT 16
diff --git a/rtl8723BS/include/rtl8723b_cmd.h b/rtl8723BS/include/rtl8723b_cmd.h
index c7727c4..79a1261 100755
--- a/rtl8723BS/include/rtl8723b_cmd.h
+++ b/rtl8723BS/include/rtl8723b_cmd.h
@@ -156,38 +156,38 @@ enum h2c_cmd_8723B{
//---------------------------------- H2C CMD CONTENT --------------------------------------------------//
//---------------------------------------------------------------------------------------------------------//
//_RSVDPAGE_LOC_CMD_0x00
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_PSPOLL(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8723B_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
//_MEDIA_STATUS_RPT_PARM_CMD_0x01
-#define SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_OPMODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_IND(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_MSRRPT_PARM_MACID_END(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
//_KEEP_ALIVE_CMD_0x03
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
-#define SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_ADOPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_PKT_TYPE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 2, 1, __Value)
+#define SET_8723B_H2CCMD_KEEPALIVE_PARM_CHECK_PERIOD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
//_DISCONNECT_DECISION_CMD_0x04
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+1, 0, 8, __Value)
-#define SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ENABLE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 1, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_ADOPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 1, 1, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_CHECK_PERIOD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+1, 0, 8, __Value)
+#define SET_8723B_H2CCMD_DISCONDECISION_PARM_TRY_PKT_NUM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd+2, 0, 8, __Value)
// _PWR_MOD_CMD_0x20
-#define SET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value)
-#define SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+4, 0, 8, __Value)
+#define SET_8723B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+5, 0, 8, __Value)
#define GET_8723B_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd) LE_BITS_TO_1BYTE(__pH2CCmd, 0, 8)
diff --git a/rtl8723BS/include/rtl8812a_cmd.h b/rtl8723BS/include/rtl8812a_cmd.h
index 31b7809..0dfc257 100755
--- a/rtl8723BS/include/rtl8812a_cmd.h
+++ b/rtl8723BS/include/rtl8812a_cmd.h
@@ -105,7 +105,7 @@ struct H2C_SS_RFOFF_PARAM{
//_SETPWRMODE_PARM
#define SET_8812_H2CCMD_PWRMODE_PARM_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT(__pH2CCmd, 0, 8, __Value)
-#define SET_8812_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
+#define SET_8812_H2CCMD_PWRMODE_PARM_RLBM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 0, 4, __Value)
#define SET_8812_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value)
#define SET_8812_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+2, 0, 8, __Value)
#define SET_8812_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE_8BIT((__pH2CCmd)+3, 0, 8, __Value)
diff --git a/rtl8723BS/include/rtl8812a_recv.h b/rtl8723BS/include/rtl8812a_recv.h
index d1c2029..1ad222d 100755
--- a/rtl8723BS/include/rtl8812a_recv.h
+++ b/rtl8723BS/include/rtl8812a_recv.h
@@ -22,11 +22,16 @@
#if defined(CONFIG_USB_HCI)
+#ifndef MAX_RECVBUF_SZ
#ifdef PLATFORM_OS_CE
#define MAX_RECVBUF_SZ (8192+1024) // 8K+1k
#else
#ifndef CONFIG_MINIMAL_MEMORY_USAGE
+ #ifdef CONFIG_PLATFORM_MSTAR
+ #define MAX_RECVBUF_SZ (8192) // 8K
+ #else
#define MAX_RECVBUF_SZ (32768) // 32k
+ #endif
//#define MAX_RECVBUF_SZ (24576) // 24k
//#define MAX_RECVBUF_SZ (20480) //20K
//#define MAX_RECVBUF_SZ (10240) //10K
@@ -36,6 +41,7 @@
#define MAX_RECVBUF_SZ (4000) // about 4K
#endif
#endif
+#endif //!MAX_RECVBUF_SZ
#elif defined(CONFIG_PCI_HCI)
//#ifndef CONFIG_MINIMAL_MEMORY_USAGE
diff --git a/rtl8723BS/include/rtw_android.h b/rtl8723BS/include/rtw_android.h
index 5f3892c..5c2c49f 100755
--- a/rtl8723BS/include/rtw_android.h
+++ b/rtl8723BS/include/rtw_android.h
@@ -45,6 +45,9 @@ enum ANDROID_WIFI_CMD {
ANDROID_WIFI_CMD_P2P_GET_NOA,
ANDROID_WIFI_CMD_P2P_SET_PS,
ANDROID_WIFI_CMD_SET_AP_WPS_P2P_IE,
+
+ ANDROID_WIFI_CMD_MIRACAST,
+
#ifdef CONFIG_PNO_SUPPORT
ANDROID_WIFI_CMD_PNOSSIDCLR_SET,
ANDROID_WIFI_CMD_PNOSETUP_SET,
@@ -76,6 +79,12 @@ enum ANDROID_WIFI_CMD {
int rtw_android_cmdstr_to_num(char *cmdstr);
int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd);
+#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))
+int rtw_android_pno_enable(struct net_device *net, int pno_enable);
+int rtw_android_cfg80211_pno_setup(struct net_device *net,
+ struct cfg80211_ssid *ssid, int n_ssids, int interval);
+#endif
+
#if defined(RTW_ENABLE_WIFI_CONTROL_FUNC)
int rtw_android_wifictrl_func_add(void);
void rtw_android_wifictrl_func_del(void);
diff --git a/rtl8723BS/include/rtw_bt_mp.h b/rtl8723BS/include/rtw_bt_mp.h
index 7a1fa0d..9ede51a 100755
--- a/rtl8723BS/include/rtw_bt_mp.h
+++ b/rtl8723BS/include/rtw_bt_mp.h
@@ -75,7 +75,7 @@ typedef enum _MP_BT_PAYLOAD_TYPE{
MP_BT_PAYLOAD_ALL_0 = 2,
MP_BT_PAYLOAD_11110000 = 3,
MP_BT_PAYLOAD_PRBS9 = 4,
- MP_BT_PAYLOAD_MAX
+ MP_BT_PAYLOAD_MAX = 8,
}MP_BT_PAYLOAD_TYPE,*PMP_BT_PAYLOAD_TYPE;
diff --git a/rtl8723BS/include/rtw_btcoex.h b/rtl8723BS/include/rtw_btcoex.h
index dc3e623..9086a61 100755
--- a/rtl8723BS/include/rtw_btcoex.h
+++ b/rtl8723BS/include/rtw_btcoex.h
@@ -29,7 +29,8 @@
#define PACKET_EAPOL 3
void rtw_btcoex_Initialize(PADAPTER);
-void rtw_btcoex_HAL_Initialize(PADAPTER padapter);
+void rtw_btcoex_PowerOnSetting(PADAPTER padapter);
+void rtw_btcoex_HAL_Initialize(PADAPTER padapter, u8 bWifiOnly);
void rtw_btcoex_IpsNotify(PADAPTER, u8 type);
void rtw_btcoex_LpsNotify(PADAPTER, u8 type);
void rtw_btcoex_ScanNotify(PADAPTER, u8 type);
@@ -40,7 +41,7 @@ void rtw_btcoex_IQKNotify(PADAPTER padapter, u8 state);
void rtw_btcoex_BtInfoNotify(PADAPTER, u8 length, u8 *tmpBuf);
void rtw_btcoex_SuspendNotify(PADAPTER, u8 state);
void rtw_btcoex_HaltNotify(PADAPTER);
-void rtw_btcoex_SwitchGntBt(PADAPTER);
+void rtw_btcoex_SwitchBtTRxMask(PADAPTER);
void rtw_btcoex_Switch(PADAPTER, u8 enable);
u8 rtw_btcoex_IsBtDisabled(PADAPTER);
void rtw_btcoex_Handler(PADAPTER);
@@ -54,8 +55,9 @@ u8 rtw_btcoex_RpwmVal(PADAPTER);
u8 rtw_btcoex_LpsVal(PADAPTER);
void rtw_btcoex_SetBTCoexist(PADAPTER, u8 bBtExist);
void rtw_btcoex_SetChipType(PADAPTER, u8 chipType);
-void rtw_btcoex_SetPGAntNum(PADAPTER, u8 antNum, u8 antInverse);
+void rtw_btcoex_SetPGAntNum(PADAPTER, u8 antNum);
u8 rtw_btcoex_GetPGAntNum(PADAPTER);
+void rtw_btcoex_SetSingleAntPath(PADAPTER padapter, u8 singleAntPath);
u32 rtw_btcoex_GetRaMask(PADAPTER);
void rtw_btcoex_RecordPwrMode(PADAPTER, u8 *pCmdBuf, u8 cmdLen);
void rtw_btcoex_DisplayBtCoexInfo(PADAPTER, u8 *pbuf, u32 bufsize);
diff --git a/rtl8723BS/include/rtw_cmd.h b/rtl8723BS/include/rtw_cmd.h
index ae1ace1..154cf40 100755
--- a/rtl8723BS/include/rtw_cmd.h
+++ b/rtl8723BS/include/rtw_cmd.h
@@ -69,7 +69,8 @@
u32 cmd_issued_cnt;
u32 cmd_done_cnt;
u32 rsp_cnt;
- u8 cmdthd_running;
+ ATOMIC_T cmdthd_running;
+ //u8 cmdthd_running;
u8 stop_req;
_adapter *padapter;
_mutex sctx_mutex;
@@ -221,6 +222,7 @@ enum rtw_drvextra_cmd_id
DM_RA_MSK_WK_CID, //add for STA update RAMask when bandwith change.
BEAMFORMING_WK_CID,
LPS_CHANGE_DTIM_CID,
+ BTINFO_WK_CID,
MAX_WK_CID
};
@@ -386,7 +388,7 @@ when shared key ==> algorithm/keyid
struct set_stakey_parm {
u8 addr[ETH_ALEN];
u8 algorithm;
- u8 id;// currently for erasing cam entry if algorithm == _NO_PRIVACY_
+ u8 keyid;
u8 key[16];
};
@@ -982,8 +984,11 @@ extern u8 rtw_createbss_cmd(_adapter *padapter);
extern u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz);
u8 rtw_startbss_cmd(_adapter *padapter, int flags);
extern u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch);
-extern u8 rtw_setstakey_cmd(_adapter *padapter, u8 *psta, u8 unicast_key, bool enqueue);
-extern u8 rtw_clearstakey_cmd(_adapter *padapter, u8 *psta, u8 entry, u8 enqueue);
+
+struct sta_info;
+extern u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 unicast_key, bool enqueue);
+extern u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue);
+
extern u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork);
u8 rtw_disassoc_cmd(_adapter *padapter, u32 deauth_timeout_ms, bool enqueue);
extern u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype, bool enqueue);
@@ -1027,6 +1032,10 @@ extern u8 rtw_ps_cmd(_adapter*padapter);
u8 rtw_chk_hi_queue_cmd(_adapter*padapter);
#endif
+#ifdef CONFIG_BT_COEXIST
+u8 rtw_btinfo_cmd(PADAPTER padapter, u8 *pbuf, u16 length);
+#endif
+
u8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue);
extern u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan, u8 enqueue, u8 swconfig);
extern u8 rtw_led_blink_cmd(_adapter*padapter, PVOID pLed);
diff --git a/rtl8723BS/include/rtw_debug.h b/rtl8723BS/include/rtw_debug.h
index 09490bc..c954541 100755
--- a/rtl8723BS/include/rtw_debug.h
+++ b/rtl8723BS/include/rtw_debug.h
@@ -317,6 +317,12 @@ extern void rtl871x_cedbg(const char *fmt, ...);
#endif /* defined(_dbgdump) */
#endif /* CONFIG_DEBUG_RTL871X */
+#ifdef CONFIG_DBG_COUNTER
+#define DBG_COUNTER(counter) counter++
+#else
+#define DBG_COUNTER(counter)
+#endif
+
void dump_drv_version(void *sel);
void dump_log_level(void *sel);
@@ -417,6 +423,17 @@ ssize_t proc_set_odm_dbg_level(struct file *file, const char __user *buffer, siz
int proc_get_odm_adaptivity(struct seq_file *m, void *v);
ssize_t proc_set_odm_adaptivity(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data);
+#ifdef CONFIG_DBG_COUNTER
+int proc_get_rx_logs(struct seq_file *m, void *v);
+int proc_get_tx_logs(struct seq_file *m, void *v);
+int proc_get_int_logs(struct seq_file *m, void *v);
+#endif
+
+#ifdef CONFIG_PCI_HCI
+int proc_get_rx_ring(struct seq_file *m, void *v);
+int proc_get_tx_ring(struct seq_file *m, void *v);
+#endif
+
#endif /* CONFIG_PROC_DEBUG */
#endif //__RTW_DEBUG_H__
diff --git a/rtl8723BS/include/rtw_eeprom.h b/rtl8723BS/include/rtw_eeprom.h
index 2c0b919..7705adc 100755
--- a/rtl8723BS/include/rtw_eeprom.h
+++ b/rtl8723BS/include/rtw_eeprom.h
@@ -124,8 +124,8 @@ struct eeprom_priv
u8 adjuseVoltageVal;
#ifdef CONFIG_RF_GAIN_OFFSET
- u8 EEPROMRFGainOffset;
- u8 EEPROMRFGainVal;
+ u8 EEPROMRFGainOffset;
+ u8 EEPROMRFGainVal;
#endif //CONFIG_RF_GAIN_OFFSET
#ifdef CONFIG_SDIO_HCI
diff --git a/rtl8723BS/include/rtw_event.h b/rtl8723BS/include/rtw_event.h
index e2c6324..2fb9503 100755
--- a/rtl8723BS/include/rtw_event.h
+++ b/rtl8723BS/include/rtw_event.h
@@ -82,6 +82,10 @@ struct addba_event
unsigned int tid;
};
+struct wmm_event
+{
+ unsigned char wmm;
+};
#ifdef CONFIG_H2CLBK
struct c2hlbk_event{
diff --git a/rtl8723BS/include/rtw_ht.h b/rtl8723BS/include/rtw_ht.h
index fb9948a..40269af 100755
--- a/rtl8723BS/include/rtw_ht.h
+++ b/rtl8723BS/include/rtw_ht.h
@@ -32,6 +32,8 @@ struct ht_priv
u32 tx_amsdu_maxlen; // 1: 8k, 0:4k ; default:8k, for tx
u32 rx_ampdu_maxlen; //for rx reordering ctrl win_sz, updated when join_callback.
+ u8 rx_ampdu_min_spacing;
+
u8 ch_offset;//PRIME_CHNL_OFFSET
u8 sgi_20m;
u8 sgi_40m;
diff --git a/rtl8723BS/include/rtw_mem.h b/rtl8723BS/include/rtw_mem.h
new file mode 100755
index 0000000..5283d77
--- a/dev/null
+++ b/rtl8723BS/include/rtw_mem.h
@@ -0,0 +1,38 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+#ifndef __RTW_MEM_H__
+#define __RTW_MEM_H__
+
+#include <drv_conf.h>
+#include <basic_types.h>
+#include <osdep_service.h>
+
+
+#ifndef MAX_RECVBUF_SZ
+#define MAX_RECVBUF_SZ (32768-RECVBUFF_ALIGN_SZ) // 32k
+#endif
+
+struct u8* rtw_alloc_revcbuf_premem(void);
+struct sk_buff *rtw_alloc_skb_premem(void);
+int rtw_free_skb_premem(struct sk_buff *pskb);
+
+
+#endif //__RTW_MEM_H__
+
diff --git a/rtl8723BS/include/rtw_mlme.h b/rtl8723BS/include/rtw_mlme.h
index a0f6e7e..891bdaf 100755
--- a/rtl8723BS/include/rtw_mlme.h
+++ b/rtl8723BS/include/rtw_mlme.h
@@ -619,6 +619,8 @@ struct mlme_priv {
u8 scanning_via_buddy_intf;
#endif
+ u8 NumOfBcnInfoChkFail;
+ u32 timeBcnInfoChkStart;
};
#define rtw_mlme_set_auto_scan_int(adapter, ms) \
@@ -654,6 +656,7 @@ extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf);
extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf);
extern void rtw_atimdone_event_callback(_adapter *adapter, u8 *pbuf);
extern void rtw_cpwm_event_callback(_adapter *adapter, u8 *pbuf);
+extern void rtw_wmm_event_callback(PADAPTER padapter, u8 *pbuf);
extern void rtw_join_timeout_handler(RTW_TIMER_HDL_ARGS);
extern void _rtw_scan_timeout_handler(RTW_TIMER_HDL_ARGS);
diff --git a/rtl8723BS/include/rtw_mlme_ext.h b/rtl8723BS/include/rtw_mlme_ext.h
index 53bdd2c..31be126 100755
--- a/rtl8723BS/include/rtw_mlme_ext.h
+++ b/rtl8723BS/include/rtw_mlme_ext.h
@@ -104,6 +104,15 @@
#define _48M_RATE_ 10
#define _54M_RATE_ 11
+/********************************************************
+MCS rate definitions
+*********************************************************/
+#define MCS_RATE_1R (0x000000ff)
+#define MCS_RATE_2R (0x0000ffff)
+#define MCS_RATE_3R (0x00ffffff)
+#define MCS_RATE_4R (0xffffffff)
+#define MCS_RATE_2R_13TO15_OFF (0x00001fff)
+
extern unsigned char RTW_WPA_OUI[];
extern unsigned char WMM_OUI[];
@@ -553,6 +562,9 @@ struct mlme_ext_priv
struct p2p_channels channel_list;
unsigned char basicrate[NumRates];
unsigned char datarate[NumRates];
+#ifdef CONFIG_80211N_HT
+ unsigned char default_supported_mcs_set[16];
+#endif
struct ss_res sitesurvey_res;
struct mlme_ext_info mlmext_info;//for sta/adhoc mode, including current scanning/connecting/connected related info.
@@ -600,6 +612,7 @@ struct mlme_ext_priv
};
+void init_mlme_default_rate_set(_adapter* padapter);
int init_mlme_ext_priv(_adapter* padapter);
int init_hw_mlme_ext(_adapter *padapter);
void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext);
@@ -615,6 +628,7 @@ unsigned char networktype_to_raid_ex(_adapter *adapter, struct sta_info *psta);
u8 judge_network_type(_adapter *padapter, unsigned char *rate, int ratelen);
void get_rate_set(_adapter *padapter, unsigned char *pbssrate, int *bssrate_len);
+void set_mcs_rate_by_mask(u8 *mcs_set, u32 mask);
void UpdateBrateTbl(_adapter *padapter,u8 *mBratesOS);
void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen);
void change_band_update_ie(_adapter *padapter, WLAN_BSSID_EX *pnetwork);
@@ -725,7 +739,11 @@ unsigned int is_ap_in_tkip(_adapter *padapter);
unsigned int is_ap_in_wep(_adapter *padapter);
unsigned int should_forbid_n_rate(_adapter * padapter);
-extern uint rtw_get_camid(uint macid);
+s16 rtw_get_camid(_adapter *adapter, struct sta_info* sta, s16 kid);
+s16 rtw_camid_search(_adapter *adapter, u8 *addr, s16 kid);
+s16 rtw_camid_alloc(_adapter *adapter, struct sta_info *sta, u8 kid);
+void rtw_camid_free(_adapter *adapter, u8 cam_id);
+
extern void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta);
extern void rtw_release_macid(_adapter *padapter, struct sta_info *psta);
extern u8 rtw_search_max_mac_id(_adapter *padapter);
@@ -736,6 +754,7 @@ void report_surveydone_event(_adapter *padapter);
void report_del_sta_event(_adapter *padapter, unsigned char* MacAddr, unsigned short reason);
void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx);
bool rtw_port_switch_chk(_adapter *adapter);
+void report_wmm_edca_update(_adapter *padapter);
void beacon_timing_control(_adapter *padapter);
u8 chk_bmc_sleepq_cmd(_adapter* padapter);
@@ -853,6 +872,7 @@ extern void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);
extern void correct_TSF(_adapter *padapter, struct mlme_ext_priv *pmlmeext);
extern void adaptive_early_32k(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len);
extern u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer);
+extern void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer);
#ifdef CONFIG_CONCURRENT_MODE
sint check_buddy_mlmeinfo_state(_adapter *padapter, u32 state);
@@ -1049,6 +1069,7 @@ enum rtw_c2h_event
GEN_EVT_CODE(_C2HBCN),
GEN_EVT_CODE(_ReportPwrState), //filen: only for PCIE, USB
GEN_EVT_CODE(_CloseRF), //filen: only for PCIE, work around ASPM
+ GEN_EVT_CODE(_WMM), /*25*/
MAX_C2HEVT
};
@@ -1083,6 +1104,8 @@ static struct fwevent wlanevents[] =
{0, NULL},
{0, &rtw_cpwm_event_callback},
{0, NULL},
+ {0, &rtw_wmm_event_callback},
+
};
#endif//_RTL8192C_CMD_C_
diff --git a/rtl8723BS/include/rtw_mp.h b/rtl8723BS/include/rtw_mp.h
index 8167898..2663a22 100755
--- a/rtl8723BS/include/rtw_mp.h
+++ b/rtl8723BS/include/rtw_mp.h
@@ -347,6 +347,9 @@ enum {
CTA_TEST,
MP_DISABLE_BT_COEXIST,
MP_PwrCtlDM,
+#ifdef CONFIG_WOWLAN
+ MP_WOW_ENABLE,
+#endif
#ifdef CONFIG_AP_WOWLAN
MP_AP_WOW_ENABLE,
#endif
@@ -379,7 +382,7 @@ struct mp_priv
u32 rx_pktcount_filter_out;
u32 rx_crcerrpktcount;
u32 rx_pktloss;
-
+ BOOLEAN rx_bindicatePkt;
struct recv_stat rxstat;
//RF/BB relative
@@ -681,6 +684,9 @@ typedef enum _MPT_TXPWR_DEF{
#elif defined(CONFIG_RTL8723B)
#define REG_RF_BB_GAIN_OFFSET 0x7f
#define RF_GAIN_OFFSET_MASK 0xfffff
+#elif defined(CONFIG_RTL8188E)
+ #define REG_RF_BB_GAIN_OFFSET 0x55
+ #define RF_GAIN_OFFSET_MASK 0xfffff
#else
#define REG_RF_BB_GAIN_OFFSET 0x55
#define RF_GAIN_OFFSET_MASK 0xfffff
@@ -783,7 +789,7 @@ extern u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter);
extern void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart);
extern void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart);
extern void Hal_ProSetCrystalCap (PADAPTER pAdapter , u32 CrystalCapVal);
-extern void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv);
+//extern void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv);
extern void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter ,BOOLEAN bMain);
extern ULONG mpt_ProQueryCalTxPower(PADAPTER pAdapter,u8 RfPath);
extern void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart);
diff --git a/rtl8723BS/include/rtw_mp_phy_regdef.h b/rtl8723BS/include/rtw_mp_phy_regdef.h
index 781bb82..340015c 100755
--- a/rtl8723BS/include/rtw_mp_phy_regdef.h
+++ b/rtl8723BS/include/rtw_mp_phy_regdef.h
@@ -1014,11 +1014,12 @@
#define bMaskByte1 0xff00
#define bMaskByte2 0xff0000
#define bMaskByte3 0xff000000
-#define bMaskHWord 0xffff0000
+#define bMaskHWord 0xffff0000
#define bMaskLWord 0x0000ffff
-#define bMaskDWord 0xffffffff
-#define bMaskH4Bits 0xf0000000
-#define bMaskOFDM_D 0xffc00000
+#define bMaskDWord 0xffffffff
+#define bMaskH4Bits 0xf0000000
+#define bMaskH3Bytes 0xffffff00
+#define bMaskOFDM_D 0xffc00000
#define bMaskCCK 0x3f3f3f3f
#define bMask12Bits 0xfff
diff --git a/rtl8723BS/include/rtw_pwrctrl.h b/rtl8723BS/include/rtw_pwrctrl.h
index a843e30..8b3f3ab 100755
--- a/rtl8723BS/include/rtw_pwrctrl.h
+++ b/rtl8723BS/include/rtw_pwrctrl.h
@@ -324,6 +324,7 @@ struct pwrctrl_priv
u8 wowlan_pno_enable;
#ifdef CONFIG_PNO_SUPPORT
u8 pno_in_resume;
+ u8 pno_inited;
pno_nlo_info_t *pnlo_info;
pno_scan_info_t *pscan_info;
pno_ssid_list_t *pno_ssid_list;
@@ -402,8 +403,6 @@ extern void cpwm_int_hdl(PADAPTER padapter, struct reportpwrstate_parm *preportp
extern void LPS_Leave_check(PADAPTER padapter);
#endif
-extern void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg);
-extern void rtw_set_rpwm(_adapter * padapter, u8 val8);
extern void LeaveAllPowerSaveMode(PADAPTER Adapter);
extern void LeaveAllPowerSaveModeDirect(PADAPTER Adapter);
#ifdef CONFIG_IPS
@@ -429,7 +428,9 @@ int rtw_fw_ps_state(PADAPTER padapter);
s32 LPS_RF_ON_check(PADAPTER padapter, u32 delay_ms);
void LPS_Enter(PADAPTER padapter, const char *msg);
void LPS_Leave(PADAPTER padapter, const char *msg);
-void traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets);
+void traffic_check_for_leave_lps(PADAPTER padapter, u8 tx, u32 tx_packets);
+void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg);
+void rtw_set_rpwm(_adapter * padapter, u8 val8);
#endif
#ifdef CONFIG_RESUME_IN_WORKQUEUE
diff --git a/rtl8723BS/include/rtw_recv.h b/rtl8723BS/include/rtw_recv.h
index 271a787..ce01eb1 100755
--- a/rtl8723BS/include/rtw_recv.h
+++ b/rtl8723BS/include/rtw_recv.h
@@ -206,8 +206,8 @@ struct rx_raw_rssi
u8 mimo_singal_strength[4];// in 0~100 index
u8 mimo_singal_quality[4];
- s8 ofdm_pwr[4];
- u8 ofdm_snr[4];
+ s8 ofdm_pwr[4];
+ u8 ofdm_snr[4];
};
#endif
@@ -278,7 +278,16 @@ struct rx_pkt_attrib {
#define RECVBUFF_ALIGN_SZ 8
+#if defined (CONFIG_RTL8192E)
+ #ifdef CONFIG_PCI_HCI
+ #define RXDESC_SIZE 16
+ #define RX_WIFI_INFO_SIZE 24
+ #else
+ #define RXDESC_SIZE 24
+ #endif
+#else
#define RXDESC_SIZE 24
+#endif
#define RXDESC_OFFSET RXDESC_SIZE
struct recv_stat
@@ -287,10 +296,13 @@ struct recv_stat
unsigned int rxdw1;
+#if !(defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI)) //exclude 8192ee
unsigned int rxdw2;
unsigned int rxdw3;
+#endif
+#ifndef BUF_DESC_ARCH
unsigned int rxdw4;
unsigned int rxdw5;
@@ -300,6 +312,7 @@ struct recv_stat
unsigned int rxdw7;
#endif
+#endif //if BUF_DESC_ARCH is defined, rx_buf_desc occupy 4 double words
};
#define EOR BIT(30)
@@ -397,9 +410,6 @@ struct recv_priv
struct ifqueue rx_indicate_queue;
#endif // CONFIG_RX_INDICATE_QUEUE
-#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
- _queue recv_buf_pending_queue;
-#endif // CONFIG_USE_USB_BUFFER_ALLOC_RX
#endif //defined(PLATFORM_LINUX) || defined(PLATFORM_FREEBSD)
u8 *pallocated_recv_buf;
@@ -407,7 +417,7 @@ struct recv_priv
_queue free_recv_buf_queue;
u32 free_recv_buf_queue_cnt;
-#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
+#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) || defined(CONFIG_USB_HCI)
_queue recv_buf_pending_queue;
#endif
@@ -429,7 +439,7 @@ struct recv_priv
struct rx_raw_rssi raw_rssi_info;
#endif
//s8 rxpwdb;
- u8 noise;
+ s16 noise;
//int RxSNRdB[2];
//s8 RxRssi[2];
//int FalseAlmCnt_all;
@@ -825,9 +835,14 @@ __inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex)
{
s32 SignalPower; // in dBm.
+#ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+ // Translate to dBm (x=y-100)
+ SignalPower = SignalStrengthIndex - 100;
+#else
// Translate to dBm (x=0.5y-95).
SignalPower = (s32)((SignalStrengthIndex + 1) >> 1);
SignalPower -= 95;
+#endif
return SignalPower;
}
diff --git a/rtl8723BS/include/rtw_security.h b/rtl8723BS/include/rtw_security.h
index f89e643..00b08fd 100755
--- a/rtl8723BS/include/rtw_security.h
+++ b/rtl8723BS/include/rtw_security.h
@@ -209,6 +209,30 @@ struct security_priv
//u8 szCapability[256]; // For WPA2-PSK using zero-config, by Annie, 2005-09-20.
u8 bWepDefaultKeyIdxSet;
+
+#define DBG_SW_SEC_CNT
+#ifdef DBG_SW_SEC_CNT
+ u64 wep_sw_enc_cnt_bc;
+ u64 wep_sw_enc_cnt_mc;
+ u64 wep_sw_enc_cnt_uc;
+ u64 wep_sw_dec_cnt_bc;
+ u64 wep_sw_dec_cnt_mc;
+ u64 wep_sw_dec_cnt_uc;
+
+ u64 tkip_sw_enc_cnt_bc;
+ u64 tkip_sw_enc_cnt_mc;
+ u64 tkip_sw_enc_cnt_uc;
+ u64 tkip_sw_dec_cnt_bc;
+ u64 tkip_sw_dec_cnt_mc;
+ u64 tkip_sw_dec_cnt_uc;
+
+ u64 aes_sw_enc_cnt_bc;
+ u64 aes_sw_enc_cnt_mc;
+ u64 aes_sw_enc_cnt_uc;
+ u64 aes_sw_dec_cnt_bc;
+ u64 aes_sw_dec_cnt_mc;
+ u64 aes_sw_dec_cnt_uc;
+#endif /* DBG_SW_SEC_CNT */
};
struct sha256_state {
diff --git a/rtl8723BS/include/rtw_version.h b/rtl8723BS/include/rtw_version.h
index 3ef01a9..bba04f3 100755
--- a/rtl8723BS/include/rtw_version.h
+++ b/rtl8723BS/include/rtw_version.h
@@ -1,2 +1,2 @@
-#define DRIVERVERSION "v4.3.0_10579.20140221_BTCOEX20140110-4940"
-#define BTCOEXVERSION "BTCOEX20140110-4940"
+#define DRIVERVERSION "v4.3.5_11545.20140603_BTCOEX20140507-4E40"
+#define BTCOEXVERSION "BTCOEX20140507-4E40"
diff --git a/rtl8723BS/include/rtw_wifi_regd.h b/rtl8723BS/include/rtw_wifi_regd.h
index 46cba1b..8b28be3 100755
--- a/rtl8723BS/include/rtw_wifi_regd.h
+++ b/rtl8723BS/include/rtw_wifi_regd.h
@@ -20,9 +20,9 @@ enum country_code_type_t {
};
int rtw_regd_init(_adapter *padapter,
- int (*reg_notifier)(struct wiphy *wiphy,
+ void (*reg_notifier)(struct wiphy *wiphy,
struct regulatory_request *request));
-int rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
+void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
#endif
diff --git a/rtl8723BS/include/rtw_xmit.h b/rtl8723BS/include/rtw_xmit.h
index 363ee61..f9806ca 100755
--- a/rtl8723BS/include/rtw_xmit.h
+++ b/rtl8723BS/include/rtw_xmit.h
@@ -79,7 +79,7 @@
#define MAX_XMIT_EXTBUF_SZ (1536)
#define NR_XMIT_EXTBUFF (32)
-#define MAX_CMDBUF_SZ (4096)
+#define MAX_CMDBUF_SZ (5120) //(4096)
#define MAX_NUMBLKS (1)
@@ -144,8 +144,24 @@ do{\
#define HWXMIT_ENTRY 4
-#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8192E) || defined(CONFIG_RTL8723B)
+// For Buffer Descriptor ring architecture
+#ifdef BUF_DESC_ARCH
+#if defined (CONFIG_RTL8192E)
+#define TX_BUFFER_SEG_NUM 1 // 0:2 seg, 1: 4 seg, 2: 8 seg.
+#endif
+#endif
+
+#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)|| defined(CONFIG_RTL8723B)
#define TXDESC_SIZE 40
+//8192EE_TODO
+#elif defined (CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
+ #ifdef CONFIG_PCI_HCI
+ #define TXDESC_SIZE ((TX_BUFFER_SEG_NUM ==0)?16: ((TX_BUFFER_SEG_NUM ==1)? 32:64) )
+ #define TX_WIFI_INFO_SIZE 40
+ #else //USB or SDIO
+ #define TXDESC_SIZE 40
+ #endif
+//8192EE_TODO
#else
#define TXDESC_SIZE 32
#endif
@@ -169,9 +185,13 @@ do{\
#endif
#ifdef CONFIG_PCI_HCI
+#if defined(CONFIG_RTL8192E) // this section is defined for buffer descriptor ring architecture
+#define TXDESC_OFFSET TX_WIFI_INFO_SIZE
+#else
#define TXDESC_OFFSET 0
+#endif
#define TX_DESC_NEXT_DESC_OFFSET (TXDESC_SIZE + 8)
-#endif
+#endif //CONFIG_PCI_HCI
enum TXDESC_SC{
SC_DONT_CARE = 0x00,
@@ -186,6 +206,20 @@ enum TXDESC_SC{
#define TXDESC_40_BYTES
#endif
+#if defined(CONFIG_RTL8192E) && defined(CONFIG_PCI_HCI) //8192ee
+//8192EE_TODO
+struct tx_desc
+{
+ unsigned int txdw0;
+ unsigned int txdw1;
+ unsigned int txdw2;
+ unsigned int txdw3;
+ unsigned int txdw4;
+ unsigned int txdw5;
+ unsigned int txdw6;
+ unsigned int txdw7;
+};
+#else
struct tx_desc
{
unsigned int txdw0;
@@ -216,7 +250,7 @@ struct tx_desc
unsigned int txdw15;
#endif
};
-
+#endif
union txdesc {
struct tx_desc txdesc;
@@ -227,12 +261,13 @@ union txdesc {
#define PCI_MAX_TX_QUEUE_COUNT 8
struct rtw_tx_ring {
+ unsigned char qid;
struct tx_desc *desc;
- dma_addr_t dma;
- unsigned int idx;
- unsigned int entries;
- _queue queue;
- u32 qlen;
+ dma_addr_t dma;
+ unsigned int idx;
+ unsigned int entries;
+ _queue queue;
+ u32 qlen;
};
#endif
@@ -331,6 +366,7 @@ struct pkt_attrib
u8 ch_offset;//PRIME_CHNL_OFFSET
u8 sgi;//short GI
u8 ampdu_en;//tx ampdu enable
+ u8 ampdu_spacing; //ampdu_min_spacing for peer sta's rx
u8 mdata;//more data bit
u8 pctrl;//per packet txdesc control enable
u8 triggered;//for ap mode handling Power Saving sta
@@ -491,6 +527,10 @@ struct xmit_buf
#endif
#endif
+#ifdef CONFIG_PCI_HCI
+ struct tx_desc *desc;
+#endif
+
#if defined(DBG_XMIT_BUF )|| defined(DBG_XMIT_BUF_EXT)
u8 no;
#endif
@@ -587,6 +627,12 @@ struct agg_pkt_info{
u16 pkt_len;
};
+enum cmdbuf_type {
+ CMDBUF_BEACON = 0x00,
+ CMDBUF_RSVD,
+ CMDBUF_MAX
+};
+
struct xmit_priv {
_lock lock;
@@ -697,7 +743,7 @@ struct xmit_priv {
u8 *pxmit_extbuf;
uint free_xmit_extbuf_cnt;
- struct xmit_buf pcmd_xmitbuf;
+ struct xmit_buf pcmd_xmitbuf[CMDBUF_MAX];
u16 nqos_ssn;
#ifdef CONFIG_TX_EARLY_MODE
@@ -720,9 +766,10 @@ struct xmit_priv {
_lock lock_sctx;
};
-extern struct xmit_frame *rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv);
-extern struct xmit_buf *rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv);
-extern s32 rtw_free_cmd_xmitbuf(struct xmit_priv *pxmitpriv);
+extern struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
+ enum cmdbuf_type buf_type);
+#define rtw_alloc_cmdxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_RSVD)
+#define rtw_alloc_bcnxmitframe(p) __rtw_alloc_cmdxmitframe(p, CMDBUF_BEACON)
extern struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv);
extern s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf);
@@ -733,7 +780,7 @@ extern s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitb
void rtw_count_tx_stats(_adapter *padapter, struct xmit_frame *pxmitframe, int sz);
extern void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len);
static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
-static void update_attrib_phy_info(struct pkt_attrib *pattrib, struct sta_info *psta);
+static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta);
extern s32 rtw_make_wlanhdr(_adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib);
extern s32 rtw_put_snap(u8 *data, u16 h_proto);
@@ -776,7 +823,7 @@ void rtw_free_hwxmits(_adapter *padapter);
s32 rtw_xmit(_adapter *padapter, _pkt **pkt);
-
+bool xmitframe_hiq_filter(struct xmit_frame *xmitframe);
#if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe);
void stop_sta_xmit(_adapter *padapter, struct sta_info *psta);
diff --git a/rtl8723BS/include/wifi.h b/rtl8723BS/include/wifi.h
index d73aa1b..dff95b4 100755
--- a/rtl8723BS/include/wifi.h
+++ b/rtl8723BS/include/wifi.h
@@ -48,6 +48,7 @@
#define WLAN_MIN_ETHFRM_LEN 60
#define WLAN_MAX_ETHFRM_LEN 1514
#define WLAN_ETHHDR_LEN 14
+#define WLAN_WMM_LEN 24
#define P80211CAPTURE_VERSION 0x80211001
diff --git a/rtl8723BS/os_dep/linux/ioctl_cfg80211.c b/rtl8723BS/os_dep/linux/ioctl_cfg80211.c
index e9fb5c3..a5425fa 100755
--- a/rtl8723BS/os_dep/linux/ioctl_cfg80211.c
+++ b/rtl8723BS/os_dep/linux/ioctl_cfg80211.c
@@ -28,7 +28,7 @@
#define RTW_MAX_MGMT_TX_CNT (8)
#define RTW_SCAN_IE_LEN_MAX 2304
-#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 3000 //ms
+#define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 5000 //ms
#define RTW_MAX_NUM_PMKIDS 4
#define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */
@@ -350,6 +350,19 @@ static int rtw_ieee80211_channel_to_frequency(int chan, int band)
}
}
+static u64 rtw_get_systime_us(void)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39))
+ struct timespec ts;
+ get_monotonic_boottime(&ts);
+ return ((u64)ts.tv_sec*1000000) + ts.tv_nsec / 1000;
+#else
+ struct timeval tv;
+ do_gettimeofday(&tv);
+ return ((u64)tv.tv_sec*1000000) + tv.tv_usec;
+#endif
+}
+
#define MAX_BSSINFO_LEN 1000
struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_network *pnetwork)
{
@@ -481,13 +494,14 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
notify_channel = ieee80211_get_channel(wiphy, freq);
- //rtw_get_timestampe_from_ie()
- notify_timestamp = jiffies_to_msecs(jiffies)*1000; /* uSec */
+ if (0)
+ notify_timestamp = le64_to_cpu(*(u64*)rtw_get_timestampe_from_ie(pnetwork->network.IEs));
+ else
+ notify_timestamp = rtw_get_systime_us();
notify_interval = le16_to_cpu(*(u16*)rtw_get_beacon_interval_from_ie(pnetwork->network.IEs));
notify_capability = le16_to_cpu(*(u16*)rtw_get_capability_from_ie(pnetwork->network.IEs));
-
notify_ie = pnetwork->network.IEs+_FIXED_IE_LENGTH_;
notify_ielen = pnetwork->network.IELength-_FIXED_IE_LENGTH_;
@@ -505,7 +519,7 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
DBG_8192C("Capability: %X\n", notify_capability);
DBG_8192C("Beacon interval: %d\n", notify_interval);
DBG_8192C("Signal: %d\n", notify_signal);
- DBG_8192C("notify_timestamp: %#018llx\n", notify_timestamp);
+ DBG_8192C("notify_timestamp: %llu\n", notify_timestamp);
#endif
pbuf = buf;
@@ -535,13 +549,14 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net
_rtw_memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength);
len += pnetwork->network.IELength;
+ *((u64*)pbuf) = cpu_to_le64(notify_timestamp);
+
//#ifdef CONFIG_P2P
//if(rtw_get_p2p_ie(pnetwork->network.IEs+12, pnetwork->network.IELength-12, NULL, NULL))
//{
// DBG_8192C("%s, got p2p_ie\n", __func__);
//}
//#endif
-
#if 1
bss = cfg80211_inform_bss_frame(wiphy, notify_channel, (struct ieee80211_mgmt *)buf,
@@ -627,6 +642,12 @@ int rtw_cfg80211_check_bss(_adapter *padapter)
pnetwork->Ssid.SsidLength,
WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
+ cfg80211_put_bss(padapter->rtw_wdev->wiphy, bss);
+#else
+ cfg80211_put_bss(bss);
+#endif
+
return (bss!=NULL);
}
@@ -1274,7 +1295,7 @@ _func_enter_;
//DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len));
DBG_871X(" ~~~~set sta key:unicastkey\n");
- rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE, _TRUE);
+ rtw_setstakey_cmd(padapter, psta, _TRUE, _TRUE);
}
else//group key
{
@@ -1288,14 +1309,7 @@ _func_enter_;
DBG_871X(" ~~~~set sta key:groupkey\n");
padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx;
-#ifdef CONFIG_CONCURRENT_MODE
- if (padapter->adapter_type == PRIMARY_ADAPTER)
- rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1, _TRUE);
- else
- DBG_871X_LEVEL(_drv_always_, "second interface do not set cam.\n");
-#else
rtw_set_key(padapter,&padapter->securitypriv,param->u.crypt.idx, 1, _TRUE);
-#endif
}
#ifdef CONFIG_IEEE80211W
else if(strcmp(param->u.crypt.alg, "BIP") == 0)
@@ -1541,6 +1555,12 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len);
#endif
}
+ else if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE
+ || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)
+ {
+ //DBG_8192C("@@@@@@@@@@ fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype);
+ ret = rtw_cfg80211_set_encryption(ndev, param, param_len);
+ }
else
{
DBG_8192C("error! fw_state=0x%x, iftype=%d\n", pmlmepriv->fw_state, rtw_wdev->iftype);
@@ -1897,6 +1917,30 @@ void rtw_cfg80211_indicate_scan_done(_adapter *adapter, bool aborted)
_exit_critical_bh(&pwdev_priv->scan_req_lock, &irqL);
}
+void rtw_cfg80211_unlink_bss(_adapter *padapter, struct wlan_network *pnetwork)
+{
+ struct wireless_dev *pwdev = padapter->rtw_wdev;
+ struct wiphy *wiphy = pwdev->wiphy;
+ struct cfg80211_bss *bss = NULL;
+ WLAN_BSSID_EX select_network = pnetwork->network;
+
+ bss = cfg80211_get_bss(wiphy, NULL/*notify_channel*/,
+ select_network.MacAddress, select_network.Ssid.Ssid,
+ select_network.Ssid.SsidLength, 0/*WLAN_CAPABILITY_ESS*/,
+ 0/*WLAN_CAPABILITY_ESS*/);
+
+ if (bss) {
+ cfg80211_unlink_bss(wiphy, bss);
+ DBG_8192C("%s(): cfg80211_unlink %s!! () ",__func__,select_network.Ssid.Ssid );
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
+ cfg80211_put_bss(padapter->rtw_wdev->wiphy, bss);
+#else
+ cfg80211_put_bss(bss);
+#endif
+ }
+ return;
+}
+
void rtw_cfg80211_surveydone_event_callback(_adapter *padapter)
{
_irqL irqL;
@@ -2296,18 +2340,15 @@ if (padapter->registrypriv.mp_mode == 1)
#endif /* CONFIG_CONCURRENT_MODE */
#ifdef CONFIG_P2P
- if( pwdinfo->driver_interface == DRIVER_CFG80211 )
+ if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
{
- if(!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE))
- {
- rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
- rtw_free_network_queue(padapter, _TRUE);
+ rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
+ rtw_free_network_queue(padapter, _TRUE);
- if(social_channel == 0)
- rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
- else
- rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);
- }
+ if(social_channel == 0)
+ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
+ else
+ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_SOCIAL_LAST);
}
#endif //CONFIG_P2P
@@ -4021,7 +4062,7 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev,
WLAN_BSSID_EX *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network;
if(0)
- DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%d), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter),
+ DBG_871X(FUNC_ADPT_FMT" ssid:(%s,%zu), from ie:(%s,%d)\n", FUNC_ADPT_ARG(adapter),
settings->ssid, settings->ssid_len,
pbss_network->Ssid.Ssid, pbss_network->Ssid.SsidLength);
@@ -4167,14 +4208,53 @@ static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *n
return 0;
}
+struct sta_info *rtw_sta_info_get_by_idx(const int idx, struct sta_priv *pstapriv)
+
+{
+ _list *phead, *plist;
+ struct sta_info *psta = NULL;
+ int i = 0;
+
+ phead = &pstapriv->asoc_list;
+ plist = get_next(phead);
+
+ //check asoc_queue
+ while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
+ {
+ if(idx == i) psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list);
+ plist = get_next(plist);
+ i++;
+ }
+ return psta;
+}
+
static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev,
int idx, u8 *mac, struct station_info *sinfo)
{
- DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
- //TODO: dump scanned queue
+ int ret = 0;
+ _irqL irqL;
+ _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
+ struct sta_info *psta = NULL;
+ struct sta_priv *pstapriv = &padapter->stapriv;
+ DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
- return -ENOENT;
+ _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
+ psta = rtw_sta_info_get_by_idx(idx, pstapriv);
+ _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
+ if(NULL == psta)
+ {
+ DBG_871X("Station is not found\n");
+ ret = -ENOENT;
+ goto exit;
+ }
+ _rtw_memcpy(mac, psta->hwaddr, ETH_ALEN);
+ sinfo->filled = 0;
+ sinfo->filled |= STATION_INFO_SIGNAL;
+ sinfo->signal = psta->rssi;
+
+exit:
+ return ret;
}
static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev,
@@ -5283,12 +5363,61 @@ static int cfg80211_rtw_tdls_oper(struct wiphy *wiphy,
case NL80211_TDLS_ENABLE_LINK:
break;
case NL80211_TDLS_DISABLE_LINK:
- break;
+ break;
}
return 0;
}
#endif /* CONFIG_TDLS */
+#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))
+static int cfg80211_rtw_sched_scan_start(struct wiphy *wiphy,
+ struct net_device *dev,
+ struct cfg80211_sched_scan_request *request) {
+
+ _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+ struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
+ u8 ret;
+
+ if (padapter->bup == _FALSE) {
+ DBG_871X("%s: net device is down.\n", __func__);
+ return -EIO;
+ }
+
+ if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE ||
+ check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE ||
+ check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) {
+ DBG_871X("%s: device is busy.\n", __func__);
+ rtw_scan_abort(padapter);
+ }
+
+ if (request == NULL) {
+ DBG_871X("%s: invalid cfg80211_requests parameters.\n", __func__);
+ return -EINVAL;
+ }
+
+ ret = rtw_android_cfg80211_pno_setup(dev, request->ssids,
+ request->n_ssids, request->interval);
+
+ if (ret < 0) {
+ DBG_871X("%s ret: %d\n", __func__, ret);
+ goto exit;
+ }
+
+ ret = rtw_android_pno_enable(dev, _TRUE);
+ if (ret < 0) {
+ DBG_871X("%s ret: %d\n", __func__, ret);
+ goto exit;
+ }
+exit:
+ return ret;
+}
+
+static int cfg80211_rtw_sched_scan_stop(struct wiphy *wiphy,
+ struct net_device *dev) {
+ return rtw_android_pno_enable(dev, _FALSE);
+}
+#endif /* CONFIG_PNO_SUPPORT */
+
static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, int len)
{
int ret = 0;
@@ -5832,6 +5961,13 @@ static void rtw_cfg80211_preinit_wiphy(_adapter *padapter, struct wiphy *wiphy)
#endif
#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))
+ wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
+#ifdef CONFIG_PNO_SUPPORT
+ wiphy->max_sched_scan_ssids = MAX_PNO_LIST_COUNT;
+#endif
+#endif
+
+#if defined(CONFIG_PM) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0))
wiphy->wowlan = wowlan_stub;
#endif
@@ -5912,6 +6048,11 @@ static struct cfg80211_ops rtw_cfg80211_ops = {
.tdls_mgmt = cfg80211_rtw_tdls_mgmt,
.tdls_oper = cfg80211_rtw_tdls_oper,
#endif /* CONFIG_TDLS */
+
+#if defined(CONFIG_PNO_SUPPORT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))
+ .sched_scan_start = cfg80211_rtw_sched_scan_start,
+ .sched_scan_stop = cfg80211_rtw_sched_scan_stop,
+#endif /* CONFIG_PNO_SUPPORT */
};
int rtw_wdev_alloc(_adapter *padapter, struct device *dev)
diff --git a/rtl8723BS/os_dep/linux/ioctl_linux.c b/rtl8723BS/os_dep/linux/ioctl_linux.c
index 184420c..6225157 100755
--- a/rtl8723BS/os_dep/linux/ioctl_linux.c
+++ b/rtl8723BS/os_dep/linux/ioctl_linux.c
@@ -40,6 +40,10 @@
#define iwe_stream_add_point(a, b, c, d, e) iwe_stream_add_point(b, c, d, e)
#endif
+#ifdef CONFIG_80211N_HT
+extern int rtw_ht_enable;
+#endif
+
#define RTL_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30
@@ -718,7 +722,12 @@ static char *translate_scan(_adapter *padapter,
/* Add quality statistics */
iwe.cmd = IWEVQUAL;
- iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID
+ iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED
+ #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+ | IW_QUAL_NOISE_UPDATED
+ #else
+ | IW_QUAL_NOISE_INVALID
+ #endif
#ifdef CONFIG_SIGNAL_DISPLAY_DBM
| IW_QUAL_DBM
#endif
@@ -737,15 +746,33 @@ static char *translate_scan(_adapter *padapter,
#ifdef CONFIG_SIGNAL_DISPLAY_DBM
iwe.u.qual.level = (u8) translate_percentage_to_dbm(ss);//dbm
#else
+ #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+ {
+ /* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
+
+ HAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);
+
+ iwe.u.qual.level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, ss);
+ }
+ #else
iwe.u.qual.level = (u8)ss;//%
#endif
+ #endif
iwe.u.qual.qual = (u8)sq; // signal quality
#ifdef CONFIG_PLATFORM_ROCKCHIPS
iwe.u.qual.noise = -100; // noise level suggest by zhf@rockchips
#else
+ #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+ {
+ s16 tmp_noise=0;
+ rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(pnetwork->network.Configuration.DSConfig), &(tmp_noise));
+ iwe.u.qual.noise = tmp_noise ;
+ }
+ #else
iwe.u.qual.noise = 0; // noise level
+ #endif
#endif //CONFIG_PLATFORM_ROCKCHIPS
//DBG_871X("iqual=%d, ilevel=%d, inoise=%d, iupdated=%d\n", iwe.u.qual.qual, iwe.u.qual.level , iwe.u.qual.noise, iwe.u.qual.updated);
@@ -994,7 +1021,7 @@ _func_enter_;
//DEBUG_ERR((" param->u.crypt.key_len=%d\n",param->u.crypt.key_len));
DBG_871X(" ~~~~set sta key:unicastkey\n");
- rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE, _TRUE);
+ rtw_setstakey_cmd(padapter, psta, _TRUE, _TRUE);
}
else//group key
{
@@ -5220,7 +5247,14 @@ static int rtw_p2p_connect(struct net_device *dev,
DBG_871X( "[%s] WiFi Direct is disable!\n", __FUNCTION__ );
return ret;
}
-
+
+#ifdef CONFIG_INTEL_WIDI
+ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
+ DBG_871X( "[%s] WiFi is under survey!\n", __FUNCTION__ );
+ return ret;
+ }
+#endif //CONFIG_INTEL_WIDI
+
if ( pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO )
{
return -1;
@@ -5309,6 +5343,19 @@ static int rtw_p2p_connect(struct net_device *dev,
else
{
DBG_871X( "[%s] Not Found in Scanning Queue~\n", __FUNCTION__ );
+#ifdef CONFIG_INTEL_WIDI
+ _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
+ rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
+ rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
+ rtw_free_network_queue(padapter, _TRUE);
+ /**
+ * For WiDi, if we can't find candidate device in scanning queue,
+ * driver will do scanning itself
+ */
+ _enter_critical_bh(&pmlmepriv->lock, &irqL);
+ rtw_sitesurvey_cmd(padapter, NULL, 0, NULL, 0);
+ _exit_critical_bh(&pmlmepriv->lock, &irqL);
+#endif //CONFIG_INTEL_WIDI
ret = -1;
}
exit:
@@ -5988,7 +6035,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
else
{
#ifdef CONFIG_INTEL_WIDI
- if(check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE){
+ if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE) {
DBG_871X( "[%s] WiFi is under survey!\n", __FUNCTION__ );
return ret;
}
@@ -6202,6 +6249,7 @@ static int rtw_p2p_prov_disc(struct net_device *dev,
{
DBG_871X( "[%s] NOT Found in the Scanning Queue!\n", __FUNCTION__ );
#ifdef CONFIG_INTEL_WIDI
+ _cancel_timer_ex( &pwdinfo->restore_p2p_state_timer );
rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
rtw_p2p_findphase_ex_set(pwdinfo, P2P_FINDPHASE_EX_NONE);
rtw_free_network_queue(padapter, _TRUE);
@@ -7074,6 +7122,26 @@ static int rtw_dbg_port(struct net_device *dev,
printk("%s ==> max_mac_id = %d \n",__FUNCTION__,max_mac_id);
}
break;
+ case 0x0b: //Enable=1, Disable=0 driver control vrtl_carrier_sense.
+ {
+ //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
+ //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
+
+ if(arg == 0){
+ DBG_871X("disable driver ctrl vcs\n");
+ padapter->driver_vcs_en = 0;
+ }
+ else if(arg == 1){
+ DBG_871X("enable driver ctrl vcs = %d\n", extra_arg);
+ padapter->driver_vcs_en = 1;
+
+ if(extra_arg>2)
+ padapter->driver_vcs_type = 1;
+ else
+ padapter->driver_vcs_type = extra_arg;
+ }
+ }
+ break;
case 0x0c://dump rx/tx packet
{
if(arg == 0){
@@ -7098,6 +7166,23 @@ static int rtw_dbg_port(struct net_device *dev,
}
break;
#endif
+ case 0x0e:
+ {
+ if(arg == 0){
+ DBG_871X("disable driver ctrl rx_ampdu_factor\n");
+ padapter->driver_rx_ampdu_factor = 0xFF;
+ }
+ else if(arg == 1){
+
+ DBG_871X("enable driver ctrl rx_ampdu_factor = %d\n", extra_arg);
+
+ if((extra_arg & 0x03) > 0x03)
+ padapter->driver_rx_ampdu_factor = 0xFF;
+ else
+ padapter->driver_rx_ampdu_factor = extra_arg;
+ }
+ }
+ break;
#ifdef DBG_CONFIG_ERROR_DETECT
case 0x0f:
{
@@ -7194,6 +7279,120 @@ static int rtw_dbg_port(struct net_device *dev,
rtw_hal_set_hwreg(padapter, HW_VAR_USB_MODE, (u8 *)&extra_arg);
}
break;
+#ifdef CONFIG_80211N_HT
+ case 0x19:
+ {
+ struct registry_priv *pregistrypriv = &padapter->registrypriv;
+ // extra_arg :
+ // BIT0: Enable VHT LDPC Rx, BIT1: Enable VHT LDPC Tx,
+ // BIT4: Enable HT LDPC Rx, BIT5: Enable HT LDPC Tx
+ if(arg == 0){
+ DBG_871X("driver disable LDPC\n");
+ pregistrypriv->ldpc_cap = 0x00;
+ }
+ else if(arg == 1){
+ DBG_871X("driver set LDPC cap = 0x%x\n", extra_arg);
+ pregistrypriv->ldpc_cap = (u8)(extra_arg&0x33);
+ }
+ }
+ break;
+ case 0x1a:
+ {
+ struct registry_priv *pregistrypriv = &padapter->registrypriv;
+ // extra_arg :
+ // BIT0: Enable VHT STBC Rx, BIT1: Enable VHT STBC Tx,
+ // BIT4: Enable HT STBC Rx, BIT5: Enable HT STBC Tx
+ if(arg == 0){
+ DBG_871X("driver disable STBC\n");
+ pregistrypriv->stbc_cap = 0x00;
+ }
+ else if(arg == 1){
+ DBG_871X("driver set STBC cap = 0x%x\n", extra_arg);
+ pregistrypriv->stbc_cap = (u8)(extra_arg&0x33);
+ }
+ }
+ break;
+#endif //CONFIG_80211N_HT
+ case 0x1b:
+ {
+ struct registry_priv *pregistrypriv = &padapter->registrypriv;
+
+ if(arg == 0){
+ DBG_871X("disable driver ctrl max_rx_rate, reset to default_rate_set\n");
+ init_mlme_default_rate_set(padapter);
+#ifdef CONFIG_80211N_HT
+ pregistrypriv->ht_enable = (u8)rtw_ht_enable;
+#endif //CONFIG_80211N_HT
+ }
+ else if(arg == 1){
+
+ int i;
+ u8 max_rx_rate;
+
+ DBG_871X("enable driver ctrl max_rx_rate = 0x%x\n", extra_arg);
+
+ max_rx_rate = (u8)extra_arg;
+
+ if(max_rx_rate < 0xc) // max_rx_rate < MSC0 -> B or G -> disable HT
+ {
+#ifdef CONFIG_80211N_HT
+ pregistrypriv->ht_enable = 0;
+#endif //CONFIG_80211N_HT
+ for(i=0; i<NumRates; i++)
+ {
+ if(pmlmeext->datarate[i] > max_rx_rate)
+ pmlmeext->datarate[i] = 0xff;
+ }
+
+ }
+#ifdef CONFIG_80211N_HT
+ else if(max_rx_rate < 0x1c) // mcs0~mcs15
+ {
+ u32 mcs_bitmap=0x0;
+
+ for(i=0; i<((max_rx_rate+1)-0xc); i++)
+ mcs_bitmap |= BIT(i);
+
+ set_mcs_rate_by_mask(pmlmeext->default_supported_mcs_set, mcs_bitmap);
+ }
+#endif //CONFIG_80211N_HT
+ }
+ }
+ break;
+ case 0x1c: //enable/disable driver control AMPDU Density for peer sta's rx
+ {
+ if(arg == 0){
+ DBG_871X("disable driver ctrl ampdu density\n");
+ padapter->driver_ampdu_spacing = 0xFF;
+ }
+ else if(arg == 1){
+
+ DBG_871X("enable driver ctrl ampdu density = %d\n", extra_arg);
+
+ if((extra_arg & 0x07) > 0x07)
+ padapter->driver_ampdu_spacing = 0xFF;
+ else
+ padapter->driver_ampdu_spacing = extra_arg;
+ }
+ }
+ break;
+#ifdef CONFIG_BACKGROUND_NOISE_MONITOR
+ case 0x1e:
+ {
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
+ PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
+ u8 chan = rtw_get_oper_ch(padapter);
+ DBG_871X("===========================================\n");
+ ODM_InbandNoise_Monitor(pDM_Odm,_TRUE,0x1e,100);
+ DBG_871X("channel(%d),noise_a = %d, noise_b = %d , noise_all:%d \n",
+ chan,pDM_Odm->noise_level.noise[ODM_RF_PATH_A],
+ pDM_Odm->noise_level.noise[ODM_RF_PATH_B],
+ pDM_Odm->noise_level.noise_all);
+ DBG_871X("===========================================\n");
+
+ }
+ break;
+#endif
case 0x23:
{
DBG_871X("turn %s the bNotifyChannelChange Variable\n",(extra_arg==1)?"on":"off");
@@ -7208,6 +7407,46 @@ static int rtw_dbg_port(struct net_device *dev,
#endif // CONFIG_P2P
break;
}
+#ifdef CONFIG_GPIO_API
+ case 0x25: //Get GPIO register
+ {
+ /*
+ * dbg 0x7f250000 [gpio_num], Get gpio value, gpio_num:0~7
+ */
+
+ int value;
+ DBG_871X("Read GPIO Value extra_arg = %d\n",extra_arg);
+ value = rtw_get_gpio(dev,extra_arg);
+ DBG_871X("Read GPIO Value = %d\n",value);
+ break;
+ }
+ case 0x26: //Set GPIO direction
+ {
+
+ /* dbg 0x7f26000x [y], Set gpio direction,
+ * x: gpio_num,4~7 y: indicate direction, 0~1
+ */
+
+ int value;
+ DBG_871X("Set GPIO Direction! arg = %d ,extra_arg=%d\n",arg ,extra_arg);
+ value = rtw_config_gpio(dev, arg, extra_arg);
+ DBG_871X("Set GPIO Direction %s \n",(value==-1)?"Fail!!!":"Success");
+ break;
+ }
+ case 0x27: //Set GPIO output direction value
+ {
+ /*
+ * dbg 0x7f27000x [y], Set gpio output direction value,
+ * x: gpio_num,4~7 y: indicate direction, 0~1
+ */
+
+ int value;
+ DBG_871X("Set GPIO Value! arg = %d ,extra_arg=%d\n",arg ,extra_arg);
+ value = rtw_set_gpio_output_value(dev,arg,extra_arg);
+ DBG_871X("Set GPIO Value %s \n",(value==-1)?"Fail!!!":"Success");
+ break;
+ }
+#endif
case 0xaa:
{
if((extra_arg & 0x7F)> 0x3F) extra_arg = 0xFF;
@@ -8744,6 +8983,79 @@ FREE_EXT:
return ret;
}
+#ifdef CONFIG_WOWLAN
+static int rtw_wowlan_ctrl(struct net_device *dev,
+ struct iw_request_info *info,
+ union iwreq_data *wrqu, char *extra)
+{
+ _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+ struct wowlan_ioctl_param poidparam;
+ struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ struct net_device *pnetdev = padapter->pnetdev;
+#ifdef CONFIG_CONCURRENT_MODE
+ struct net_device *pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;
+#endif
+ struct sta_info *psta = NULL;
+ int ret = 0;
+ u32 start_time = rtw_get_current_time();
+ poidparam.subcode = 0;
+
+ DBG_871X("+rtw_wowlan_ctrl: %s\n", extra);
+
+ if(pwrctrlpriv->bSupportRemoteWakeup==_FALSE){
+ ret = -EPERM;
+ DBG_871X("+rtw_wowlan_ctrl: Device didn't support the remote wakeup!!\n");
+ goto _rtw_wowlan_ctrl_exit_free;
+ }
+
+ if (!check_fwstate(pmlmepriv, _FW_LINKED) &&
+ check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
+ DBG_871X("[%s] WARNING: Please Connect With AP First!!\n", __func__);
+ goto _rtw_wowlan_ctrl_exit_free;
+ }
+
+ if (_rtw_memcmp( extra, "enable", 6 )) {
+
+ padapter->registrypriv.mp_mode = 1;
+
+ while (pwrctrlpriv->bips_processing == _TRUE)
+ rtw_msleep_os(1);
+
+ rtw_ps_deny(padapter, PS_DENY_SUSPEND);
+
+ rtw_cancel_all_timer(padapter);
+
+#ifdef CONFIG_CONCURRENT_MODE
+ if (padapter->pbuddy_adapter){
+ rtw_cancel_all_timer(padapter->pbuddy_adapter);
+ }
+#endif // CONFIG_CONCURRENT_MODE
+
+ LeaveAllPowerSaveModeDirect(padapter);
+
+ rtw_stop_cmd_thread(padapter);
+
+ rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);
+
+ rtw_suspend_wow(padapter);
+
+ } else if (_rtw_memcmp( extra, "disable", 6 )) {
+ rtw_resume_process_wow(padapter);
+ padapter->registrypriv.mp_mode = 0;
+ } else {
+ DBG_871X("[%s] Invalid Parameter.\n", __func__);
+ goto _rtw_wowlan_ctrl_exit_free;
+ }
+ //mutex_lock(&ioctl_mutex);
+_rtw_wowlan_ctrl_exit_free:
+ DBG_871X("-rtw_wowlan_ctrl( subcode = %d)\n", poidparam.subcode);
+ DBG_871X_LEVEL(_drv_always_, "%s in %d ms\n", __func__,
+ rtw_get_passing_time_ms(start_time));
+_rtw_wowlan_ctrl_exit:
+ return ret;
+}
+#endif //CONFIG_WOWLAN
#ifdef CONFIG_AP_WOWLAN
static int rtw_ap_wowlan_ctrl(struct net_device *dev,
@@ -10587,29 +10899,21 @@ static int rtw_mp_start(struct net_device *dev,
struct dm_priv *pdmpriv = &pHalData->dmpriv;
struct hal_ops *pHalFunc = &padapter->HalFunc;
+ rtw_pm_set_ips(padapter,IPS_NONE);
+ LeaveAllPowerSaveMode(padapter);
+
if(padapter->registrypriv.mp_mode ==0)
{
- #if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B))
- DBG_871X("_rtw_mp_xmit_priv for Download BT patch FW\n");
- _rtw_mp_xmit_priv(&padapter->xmitpriv);
- #endif
-
- padapter->registrypriv.mp_mode =1;
-
- rtw_pm_set_ips(padapter,IPS_NONE);
- LeaveAllPowerSaveMode(padapter);
- MPT_InitializeAdapter(padapter, 1);
#ifdef CONFIG_BT_COEXIST
- rtw_btcoex_HaltNotify(padapter);
- rtw_btcoex_SetManualControl(padapter, _TRUE);
pdmpriv->DMFlag &= ~DYNAMIC_FUNC_BT;
- // Force to switch Antenna to WiFi
- padapter->registrypriv.mp_mode=0;
+#endif
+ pHalFunc->hal_deinit(padapter);
+ padapter->registrypriv.mp_mode =1;
pHalFunc->hal_init(padapter);
- padapter->registrypriv.mp_mode=1;
- //rtw_btcoex_HaltNotify(padapter);
-#endif
+
+ rtw_pm_set_ips(padapter,IPS_NONE);
+ LeaveAllPowerSaveMode(padapter);
}
if (padapter->registrypriv.mp_mode == 0)
@@ -10623,6 +10927,15 @@ static int rtw_mp_start(struct net_device *dev,
}
padapter->mppriv.bmac_filter = _FALSE;
#ifdef CONFIG_RTL8723B
+#ifdef CONFIG_USB_HCI
+ rtw_write32(padapter, 0x765, 0x0000);
+ rtw_write32(padapter, 0x948, 0x0280);
+#else
+ rtw_write32(padapter, 0x765, 0x0000);
+ rtw_write32(padapter, 0x948, 0x0000);
+#endif
+#endif
+#ifdef CONFIG_RTL8723B
rtw_write8(padapter, 0x66, 0x27); //Open BT uart Log
rtw_write8(padapter, 0xc50, 0x20); //for RX init Gain
#endif
@@ -10640,10 +10953,6 @@ static int rtw_mp_stop(struct net_device *dev,
if(padapter->registrypriv.mp_mode ==1)
{
- #if (defined(CONFIG_RTL8723A) || defined(CONFIG_RTL8723B))
- DBG_871X("_rtw_mp_xmit_priv reinit for normal mode\n");
- _rtw_mp_xmit_priv(&padapter->xmitpriv);
- #endif
MPT_DeInitAdapter(padapter);
pHalFunc->hal_deinit(padapter);
@@ -11007,8 +11316,8 @@ static int rtw_mp_ctx(struct net_device *dev,
//DBG_871X("%s: cotuTx %d\n", __func__, bStartTest);
if (bStartTest != 0){
sprintf( extra, "Start continuous DA=ffffffffffff len=1500 \n infinite=yes.");
- }
- Hal_SetContinuousTx(padapter, (u8)bStartTest);
+ }
+ Hal_SetContinuousTx(padapter, (u8)bStartTest);
break;
case MP_CARRIER_SUPPRISSION_TX:
@@ -11119,7 +11428,7 @@ static int rtw_mp_arx(struct net_device *dev,
u32 mac_cck_err=0, mac_ofdm_err=0, mac_ht_err=0, mac_vht_err=0;
u8 input[wrqu->length];
char *pch, *ptmp, *token, *tmp[2]={0x00,0x00};
- u32 i=0,ii=0,jj=0,kk=0,cnts=0;
+ u32 i=0,ii=0,jj=0,kk=0,cnts=0,bmon=0;
PADAPTER padapter = rtw_netdev_priv(dev);
struct mp_priv *pmppriv = &padapter->mppriv;
@@ -11135,7 +11444,7 @@ static int rtw_mp_arx(struct net_device *dev,
bSetBssid = (strncmp(input, "setbssid=", 8)==0)?1:0; // strncmp TRUE is 0
//bfilter_init = (strncmp(input, "filter_init",11)==0)?1:0;
bmac_filter = (strncmp(input, "accept_mac",10)==0)?1:0;
-
+ bmon = (strncmp(input, "mon=",4)==0)?1:0;
if(bSetBssid==1){
pch = input;
@@ -11200,8 +11509,7 @@ static int rtw_mp_arx(struct net_device *dev,
else if(bQueryPhy)
{
- //if (IS_HARDWARE_TYPE_JAGUAR(padapter))
- #ifdef CONFIG_RTL8188A
+ if (IS_HARDWARE_TYPE_JAGUAR(padapter))
{
cckok = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF); // [13:0]
ofdmok = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF); // [13:0]
@@ -11211,22 +11519,31 @@ static int rtw_mp_arx(struct net_device *dev,
cckcrc = PHY_QueryBBReg(padapter, 0xF04, 0x3FFF0000); // [29:16]
ofdmcrc = PHY_QueryBBReg(padapter, 0xF14, 0x3FFF0000); // [29:16]
htcrc = PHY_QueryBBReg(padapter, 0xF10, 0x3FFF0000); // [29:16]
- vht_err = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF0000); // [29:16]
+ vht_err = PHY_QueryBBReg(padapter, 0xF0C, 0x3FFF0000); // [29:16]
+
+ CCK_FA = PHY_QueryBBReg(padapter, 0xa5c, bMaskLWord);
+ OFDM_FA = PHY_QueryBBReg(padapter, 0xF48, bMaskLWord);
}
- #else
+ else
{
cckok = PHY_QueryBBReg(padapter, 0xF88, bMaskDWord);
ofdmok = PHY_QueryBBReg(padapter, 0xF94, bMaskLWord);
- htok = PHY_QueryBBReg(padapter, 0xF90, bMaskLWord);
+ htok = PHY_QueryBBReg(padapter, 0xF90, bMaskLWord);
vht_ok = 0;
cckcrc = PHY_QueryBBReg(padapter, 0xF84, bMaskDWord);
ofdmcrc = PHY_QueryBBReg(padapter, 0xF94, bMaskHWord);
htcrc = PHY_QueryBBReg(padapter, 0xF90, bMaskHWord);
vht_err = 0;
- }
- #endif
+
+ OFDM_FA = PHY_QueryBBReg(padapter, 0xCF0, bMaskLWord) + PHY_QueryBBReg(padapter, 0xCF2, bMaskLWord) +
+ PHY_QueryBBReg(padapter, 0xDA2, bMaskLWord)+ PHY_QueryBBReg(padapter, 0xDA4, bMaskLWord) +
+ PHY_QueryBBReg(padapter, 0xDA6, bMaskLWord) + PHY_QueryBBReg(padapter, 0xDA8, bMaskLWord);
+
CCK_FA=(rtw_read8(padapter, 0xa5b )<<8 ) | (rtw_read8(padapter, 0xa5c));
+ }
+ DBG_871X("%s: OFDM_FA =%d\n", __FUNCTION__, OFDM_FA);
+ DBG_871X("%s: CCK_FA =%d\n", __FUNCTION__, CCK_FA);
sprintf( extra, "Phy Received packet OK:%d CRC error:%d FA Counter: %d",cckok+ofdmok+htok+vht_ok,cckcrc+ofdmcrc+htcrc+vht_err,OFDM_FA+CCK_FA);
}
else if(bQueryMac)
@@ -11253,12 +11570,25 @@ static int rtw_mp_arx(struct net_device *dev,
DropPacket = rtw_read32(padapter, 0x664)& 0x0000FFFF;
}
- sprintf( extra, "Mac Received packet OK: %d , CRC error: %d , FA Counter: %d , Drop Packets: %d\n",
- mac_cck_ok+mac_ofdm_ok+mac_ht_ok+mac_vht_ok,mac_cck_err+mac_ofdm_err+mac_ht_err+mac_vht_err,OFDM_FA+CCK_FA,DropPacket);
+ sprintf( extra, "Mac Received packet OK: %d , CRC error: %d , Drop Packets: %d\n",
+ mac_cck_ok+mac_ofdm_ok+mac_ht_ok+mac_vht_ok,mac_cck_err+mac_ofdm_err+mac_ht_err+mac_vht_err,DropPacket);
}
- wrqu->length = strlen(extra) + 1;
+ if( bmon==1 ) {
+ sscanf(input, "mon=%d", &bmon);
+
+ if(bmon==1)
+ {
+ pmppriv->rx_bindicatePkt= _TRUE;
+ sprintf( extra, "Indicating Receive Packet to network start\n");
+ }else {
+ pmppriv->rx_bindicatePkt= _FALSE;
+ sprintf( extra, "Indicating Receive Packet to network Stop\n");
+ }
+ }
+ wrqu->length = strlen(extra) + 1;
+
return 0;
}
@@ -11312,11 +11642,11 @@ static int rtw_mp_pwrtrk(struct net_device *dev,
}
else if (sscanf(input, "ther=%d", &thermal)) {
pHalData->TxPowerTrackControl = _TRUE;
- ret = Hal_SetThermalMeter(padapter, (u8)thermal);
- if (ret == _FAIL) return -EPERM;
+ ret = Hal_SetThermalMeter(padapter, (u8)thermal);
+ if (ret == _FAIL) return -EPERM;
sprintf(extra, "mp tx power tracking start,target value=%d ok ",thermal);
- }else {
- return -EINVAL;
+ }else{
+ return -EINVAL;
}
}
@@ -11435,12 +11765,26 @@ static int rtw_mp_reset_stats(struct net_device *dev,
{
write_bbreg(padapter, 0xB58, BIT0, 0x1);
write_bbreg(padapter, 0xB58, BIT0, 0x0);
+
+ write_bbreg(padapter, 0x9A4, BIT17, 0x1);//reset OFDA FA counter
+ write_bbreg(padapter, 0x9A4, BIT17, 0x0);
+
+ write_bbreg(padapter, 0xA5C, BIT15, 0x0);//reset CCK FA counter
+ write_bbreg(padapter, 0xA5C, BIT15, 0x1);
}
else
{
write_bbreg(padapter, 0xF14, BIT16, 0x1);
rtw_msleep_os(10);
write_bbreg(padapter, 0xF14, BIT16, 0x0);
+
+ write_bbreg(padapter, 0xD00, BIT27, 0x1);//reset OFDA FA counter
+ write_bbreg(padapter, 0xC0C, BIT31, 0x1);//reset OFDA FA counter
+ write_bbreg(padapter, 0xD00, BIT27, 0x0);
+ write_bbreg(padapter, 0xC0C, BIT31, 0x0);
+
+ write_bbreg(padapter, 0xA2C, BIT15, 0x0);//reset CCK FA counter
+ write_bbreg(padapter, 0xA2C, BIT15, 0x1);
}
//reset mac counter
PHY_SetMacReg(padapter, 0x664, BIT27, 0x1);
@@ -11702,12 +12046,6 @@ static int rtw_mp_SetBT(struct net_device *dev,
}
if ( strncmp(extra, "dlfw", 4) == 0)
{
- #ifdef CONFIG_BT_COEXIST
- rtw_btcoex_HaltNotify(padapter);
- //DBG_871X("SetBT bt1ant !\n");
- //hal_btcoex1ant_SetAntPath(padapter);
- rtw_btcoex_SetManualControl(padapter, _TRUE);
- #endif
pHalData->LastHMEBoxNum=0;
padapter->bBTFWReady = _FALSE;
rtw_write8(padapter, 0xa3, 0x05);
@@ -11755,6 +12093,12 @@ static int rtw_mp_SetBT(struct net_device *dev,
#endif
DBG_871X("Wait for FirmwareDownloadBT fw boot!\n");
rtw_msleep_os(1000);
+#ifdef CONFIG_BT_COEXIST
+ rtw_btcoex_HaltNotify(padapter);
+ DBG_871X("SetBT btcoex HaltNotify !\n");
+ //hal_btcoex1ant_SetAntPath(padapter);
+ rtw_btcoex_SetManualControl(padapter, _TRUE);
+#endif
_rtw_memset(extra,'\0', wrqu->data.length);
BtReq.opCodeVer = 1;
BtReq.OpCode = 0;
@@ -11773,7 +12117,7 @@ static int rtw_mp_SetBT(struct net_device *dev,
else
{
#ifdef CONFIG_BT_COEXIST
- rtw_btcoex_SwitchGntBt(padapter);
+ rtw_btcoex_SwitchBtTRxMask(padapter);
#endif
rtw_msleep_os(200);
sprintf(extra, "download FW OK.\n");
@@ -11784,9 +12128,15 @@ static int rtw_mp_SetBT(struct net_device *dev,
if ( strncmp(extra, "down", 4) == 0){
DBG_871X("SetBT down for to hal_init !\n");
- mp_stop_test(padapter);
+#ifdef CONFIG_BT_COEXIST
+ rtw_btcoex_SetManualControl(padapter, _FALSE);
+ rtw_btcoex_Initialize(padapter);
+#endif
+ pHalFunc->read_adapter_info(padapter);
+ pHalFunc->hal_deinit(padapter);
pHalFunc->hal_init(padapter);
- mp_start_test(padapter);
+ rtw_pm_set_ips(padapter,IPS_NONE);
+ LeaveAllPowerSaveMode(padapter);
MPT_PwrCtlDM(padapter,0);
rtw_write32(padapter, 0xcc, (rtw_read32(padapter, 0xcc)| 0x00000004));
rtw_write32(padapter, 0x6b, (rtw_read32(padapter, 0x6b)& 0xFFFFFFEF));
@@ -12032,6 +12382,12 @@ static int rtw_mp_set(struct net_device *dev,
DBG_871X("set case MP_DISABLE_BT_COEXIST \n");
rtw_mp_disable_bt_coexist(dev, info, wdata, extra);
break;
+#ifdef CONFIG_WOWLAN
+ case MP_WOW_ENABLE:
+ DBG_871X("set case MP_WOW_ENABLE: %s \n", extra);
+ rtw_wowlan_ctrl(dev, info, wdata, extra);
+ break;
+#endif
#ifdef CONFIG_AP_WOWLAN
case MP_AP_WOW_ENABLE:
DBG_871X("set case MP_AP_WOW_ENABLE: %s \n", extra);
@@ -13929,8 +14285,11 @@ static const struct iw_priv_args rtw_private_args[] = {
#endif
{ CTA_TEST, IW_PRIV_TYPE_CHAR | 1024, 0, "cta_test"},
#endif
+#ifdef CONFIG_WOWLAN
+ { MP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "wow_mode" }, //set
+#endif
#ifdef CONFIG_AP_WOWLAN
- { MP_AP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "ap_wow_enable" }, //set
+ { MP_AP_WOW_ENABLE , IW_PRIV_TYPE_CHAR | 1024, 0, "ap_wow_mode" }, //set
#endif
};
@@ -14015,12 +14374,40 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev)
#ifdef CONFIG_SIGNAL_DISPLAY_DBM
tmp_level = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);
#else
+ #ifdef CONFIG_SKIP_SIGNAL_SCALE_MAPPING
+ {
+ /* Do signal scale mapping when using percentage as the unit of signal strength, since the scale mapping is skipped in odm */
+
+ HAL_DATA_TYPE *pHal = GET_HAL_DATA(padapter);
+
+ tmp_level = (u8)odm_SignalScaleMapping(&pHal->odmpriv, padapter->recvpriv.signal_strength);
+ }
+ #else
tmp_level = padapter->recvpriv.signal_strength;
#endif
+ #endif
tmp_qual = padapter->recvpriv.signal_qual;
- tmp_noise =padapter->recvpriv.noise;
- //DBG_871X("level:%d, qual:%d, noise:%d, rssi (%d)\n", tmp_level, tmp_qual, tmp_noise,padapter->recvpriv.rssi);
+#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
+ if(rtw_linked_check(padapter)){
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+ struct noise_info info;
+ info.bPauseDIG = _TRUE;
+ info.IGIValue = 0x1e;
+ info.max_time = 100;//ms
+ info.chan = pmlmeext->cur_channel ;//rtw_get_oper_ch(padapter);
+ rtw_ps_deny(padapter, PS_DENY_IOCTL);
+ LeaveAllPowerSaveModeDirect(padapter);
+
+ rtw_hal_set_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&info, _FALSE);
+ //ODM_InbandNoise_Monitor(podmpriv,_TRUE,0x20,100);
+ rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);
+ rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR,&(info.chan), &(padapter->recvpriv.noise));
+ DBG_871X("chan:%d,noise_level:%d\n",info.chan,padapter->recvpriv.noise);
+ }
+#endif
+ tmp_noise = padapter->recvpriv.noise;
+ DBG_871X("level:%d, qual:%d, noise:%d, rssi (%d)\n", tmp_level, tmp_qual, tmp_noise,padapter->recvpriv.rssi);
piwstats->qual.level = tmp_level;
piwstats->qual.qual = tmp_qual;
@@ -14121,7 +14508,7 @@ static int rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_
_rtw_memcpy(&wdata, wrq_data, sizeof(wdata));
- input_len = wdata.data.length;
+ input_len = 2048;
input = rtw_zmalloc(input_len);
if (NULL == input)
return -ENOMEM;
@@ -14130,7 +14517,7 @@ static int rtw_ioctl_wext_private(struct net_device *dev, union iwreq_data *wrq_
goto exit;
}
ptr = input;
- len = input_len;
+ len = strlen(input);
sscanf(ptr, "%16s", cmdname);
cmdlen = strlen(cmdname);
diff --git a/rtl8723BS/os_dep/linux/mlme_linux.c b/rtl8723BS/os_dep/linux/mlme_linux.c
index 78ea101..c2cc56d 100755
--- a/rtl8723BS/os_dep/linux/mlme_linux.c
+++ b/rtl8723BS/os_dep/linux/mlme_linux.c
@@ -285,39 +285,41 @@ _func_enter_;
if(authmode==_WPA_IE_ID_)
{
RT_TRACE(_module_mlme_osdep_c_,_drv_info_,("rtw_report_sec_ie, authmode=%d\n", authmode));
-
- buff = rtw_malloc(IW_CUSTOM_MAX);
-
- _rtw_memset(buff,0,IW_CUSTOM_MAX);
-
- p=buff;
-
+
+ buff = rtw_zmalloc(IW_CUSTOM_MAX);
+ if (NULL == buff) {
+ DBG_871X(FUNC_ADPT_FMT ": alloc memory FAIL!!\n",
+ FUNC_ADPT_ARG(adapter));
+ return;
+ }
+ p = buff;
+
p+=sprintf(p,"ASSOCINFO(ReqIEs=");
len = sec_ie[1]+2;
- len = (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX;
+ len = (len < IW_CUSTOM_MAX) ? len:IW_CUSTOM_MAX;
for(i=0;i<len;i++){
p+=sprintf(p,"%02x",sec_ie[i]);
}
p+=sprintf(p,")");
-
+
_rtw_memset(&wrqu,0,sizeof(wrqu));
-
+
wrqu.data.length=p-buff;
-
+
wrqu.data.length = (wrqu.data.length<IW_CUSTOM_MAX) ? wrqu.data.length:IW_CUSTOM_MAX;
-
+
#ifndef CONFIG_IOCTL_CFG80211
wireless_send_event(adapter->pnetdev,IWEVCUSTOM,&wrqu,buff);
#endif
- if(buff)
- rtw_mfree(buff, IW_CUSTOM_MAX);
-
+ rtw_mfree(buff, IW_CUSTOM_MAX);
}
+exit:
+
_func_exit_;
}
diff --git a/rtl8723BS/os_dep/linux/os_intfs.c b/rtl8723BS/os_dep/linux/os_intfs.c
index d35617b..4ee5593 100755
--- a/rtl8723BS/os_dep/linux/os_intfs.c
+++ b/rtl8723BS/os_dep/linux/os_intfs.c
@@ -107,9 +107,9 @@ int rtw_ht_enable = 1;
// 0x21 means enable 2.4G 40MHz & 5G 80MHz
int rtw_bw_mode = 0x21;
int rtw_cbw40_enable = 3; // 0 :diable, bit(0): enable 2.4g, bit(1): enable 5g
-int rtw_ampdu_enable = 1;//for enable tx_ampdu
+int rtw_ampdu_enable = 1;//for enable tx_ampdu ,// 0: disable, 0x1:enable (but wifi_spec should be 0), 0x2: force enable (don't care wifi_spec)
int rtw_rx_stbc = 1;// 0: disable, bit(0):enable 2.4g, bit(1):enable 5g, default is set to enable 2.4GHZ for IOT issue with bufflao's AP at 5GHZ
-int rtw_ampdu_amsdu = 0;// 0: disabled, 1:enabled, 2:auto
+int rtw_ampdu_amsdu = 0;// 0: disabled, 1:enabled, 2:auto . There is an IOT issu with DLINK DIR-629 when the flag turn on
// Short GI support Bit Map
// BIT0 - 20MHz, 0: non-support, 1: support
// BIT1 - 40MHz, 0: non-support, 1: support
@@ -316,6 +316,10 @@ uint rtw_notch_filter = RTW_NOTCH_FILTER;
module_param(rtw_notch_filter, uint, 0644);
MODULE_PARM_DESC(rtw_notch_filter, "0:Disable, 1:Enable, 2:Enable only for P2P");
+uint rtw_hiq_filter = CONFIG_RTW_HIQ_FILTER;
+module_param(rtw_hiq_filter, uint, 0644);
+MODULE_PARM_DESC(rtw_hiq_filter, "0:allow all, 1:allow special, 2:deny all");
+
#if defined(CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY) //eFuse: Regulatory selection=1
int rtw_tx_pwr_lmt_enable = 1;
int rtw_tx_pwr_by_rate = 1;
@@ -323,8 +327,13 @@ int rtw_tx_pwr_by_rate = 1;
int rtw_tx_pwr_lmt_enable = 0;
int rtw_tx_pwr_by_rate = 1;
#else //eFuse: Regulatory selection=2
+#ifdef CONFIG_PCI_HCI
+int rtw_tx_pwr_lmt_enable = 2; // 2- Depend on efuse
+int rtw_tx_pwr_by_rate = 2;// 2- Depend on efuse
+#else // USB & SDIO
int rtw_tx_pwr_lmt_enable = 0;
int rtw_tx_pwr_by_rate = 0;
+#endif
#endif
module_param(rtw_tx_pwr_lmt_enable, int, 0644);
@@ -528,6 +537,7 @@ _func_enter_;
#endif
registry_par->qos_opt_enable = (u8)rtw_qos_opt_enable;
+ registry_par->hiq_filter = (u8)rtw_hiq_filter;
_func_exit_;
return status;
@@ -1014,7 +1024,10 @@ u8 rtw_init_default_value(_adapter *padapter)
padapter->bShowGetP2PState = 1;
#endif
+ //for debug purpose
padapter->fix_rate = 0xFF;
+ padapter->driver_ampdu_spacing = 0xFF;
+ padapter->driver_rx_ampdu_factor = 0xFF;
return ret;
}
@@ -2212,10 +2225,6 @@ int _netdev_open(struct net_device *pnetdev)
DBG_871X("MAC Address = "MAC_FMT"\n", MAC_ARG(pnetdev->dev_addr));
-#ifdef CONFIG_RF_GAIN_OFFSET
- rtw_bb_rf_gain_offset(padapter);
-#endif //CONFIG_RF_GAIN_OFFSET
-
status=rtw_start_drv_threads(padapter);
if(status ==_FAIL)
{
@@ -2292,6 +2301,13 @@ int netdev_open(struct net_device *pnetdev)
{
int ret;
_adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
+ struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
+
+ if (pwrctrlpriv->bInSuspend == _TRUE)
+ {
+ DBG_871X("+871x_drv - drv_open, bInSuspend=%d\n", pwrctrlpriv->bInSuspend);
+ return 0;
+ }
_enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
ret = _netdev_open(pnetdev);
@@ -2322,10 +2338,6 @@ int ips_netdrv_open(_adapter *padapter)
goto netdev_open_error;
}
-#ifdef CONFIG_RF_GAIN_OFFSET
- rtw_bb_rf_gain_offset(padapter);
-#endif //CONFIG_RF_GAIN_OFFSET
-
if (padapter->intf_start)
{
padapter->intf_start(padapter);
@@ -2417,120 +2429,22 @@ void rtw_ips_dev_unload(_adapter *padapter)
}
-#ifdef CONFIG_RF_GAIN_OFFSET
-u32 Array_kfreemap[] = {
-0xf8,0xe,
-0xf6,0xc,
-0xf4,0xa,
-0xf2,0x8,
-0xf0,0x6,
-0xf3,0x4,
-0xf5,0x2,
-0xf7,0x0,
-0xf9,0x0,
-0xfc,0x0,
-};
-
-void rtw_bb_rf_gain_offset(_adapter *padapter)
-{
- u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
- u8 tmp = 0x3e;
- u32 res,i=0;
- u4Byte ArrayLen = sizeof(Array_kfreemap)/sizeof(u32);
- pu4Byte Array = Array_kfreemap;
- u4Byte v1=0,v2=0,target=0;
- //DBG_871X("+%s value: 0x%02x+\n", __func__, value);
-#if defined(CONFIG_RTL8723A)
- if (value & BIT0) {
- DBG_871X("Offset RF Gain.\n");
- DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal);
- if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){
- res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xd, 0xffffffff);
- DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
- res &= 0xfff87fff;
-
- res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
- DBG_871X("Offset RF Gain. reg 0xd=0x%x\n",res);
-
- rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET_CCK, RF_GAIN_OFFSET_MASK, res);
-
- res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0xe, 0xffffffff);
- DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
- res &= 0xfffffff0;
-
- res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f);
- DBG_871X("Offset RF Gain. reg 0xe=0x%x\n",res);
-
- rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET_OFDM, RF_GAIN_OFFSET_MASK, res);
- }
- else
- {
- DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal);
- }
- } else {
- DBG_871X("Using the default RF gain.\n");
- }
-#elif defined(CONFIG_RTL8723B)
- if (value & BIT4) {
- DBG_871X("Offset RF Gain.\n");
- DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal);
- if(padapter->eeprompriv.EEPROMRFGainVal != 0xff){
- res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
- res &= 0xfff87fff;
- DBG_871X("Offset RF Gain. before reg 0x7f=0x%08x\n",res);
- //res &= 0xfff87fff;
- for (i = 0; i < ArrayLen; i += 2 )
- {
- v1 = Array[i];
- v2 = Array[i+1];
- if ( v1 == padapter->eeprompriv.EEPROMRFGainVal )
- {
- DBG_871X("Offset RF Gain. got v1 =0x%x ,v2 =0x%x \n",v1,v2);
- target=v2;
- break;
- }
- }
- DBG_871X("padapter->eeprompriv.EEPROMRFGainVal=0x%x ,Gain offset Target Value=0x%x\n",padapter->eeprompriv.EEPROMRFGainVal,target);
- PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
-
- //res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15;
- //rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
- res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
- DBG_871X("Offset RF Gain. After reg 0x7f=0x%08x\n",res);
- }
- else
- {
- DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal=0x%x != 0xff, didn't run Kfree\n",padapter->eeprompriv.EEPROMRFGainVal);
- }
- } else {
- DBG_871X("Using the default RF gain.\n");
- }
-#else
- if (!(value & 0x01)) {
- //DBG_871X("Offset RF Gain.\n");
- res = rtw_hal_read_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, 0xffffffff);
- value &= tmp;
- res = value << 14;
- rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res);
- } else {
- DBG_871X("Using the default RF gain.\n");
- }
-#endif
-
-}
-#endif //CONFIG_RF_GAIN_OFFSET
-
int pm_netdev_open(struct net_device *pnetdev,u8 bnormal)
{
int status = 0;
+ _adapter *padapter = (_adapter *)rtw_netdev_priv(pnetdev);
if (_TRUE == bnormal)
- status = netdev_open(pnetdev);
+ {
+ _enter_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
+ status = _netdev_open(pnetdev);
+ _exit_critical_mutex(&(adapter_to_dvobj(padapter)->hw_init_mutex), NULL);
+ }
#ifdef CONFIG_IPS
else
- status = (_SUCCESS == ips_netdrv_open((_adapter *)rtw_netdev_priv(pnetdev)))?(0):(-1);
+ status = (_SUCCESS == ips_netdrv_open(padapter))?(0):(-1);
#endif
return status;
@@ -2635,12 +2549,291 @@ void rtw_ndev_destructor(struct net_device *ndev)
free_netdev(ndev);
}
+#ifdef CONFIG_ARP_KEEP_ALIVE
+struct route_info {
+ struct in_addr dst_addr;
+ struct in_addr src_addr;
+ struct in_addr gateway;
+ unsigned int dev_index;
+};
+
+static void parse_routes(struct nlmsghdr *nl_hdr, struct route_info *rt_info)
+{
+ struct rtmsg *rt_msg;
+ struct rtattr *rt_attr;
+ int rt_len;
+
+ rt_msg = (struct rtmsg *) NLMSG_DATA(nl_hdr);
+ if ((rt_msg->rtm_family != AF_INET) || (rt_msg->rtm_table != RT_TABLE_MAIN))
+ return;
+
+ rt_attr = (struct rtattr *) RTM_RTA(rt_msg);
+ rt_len = RTM_PAYLOAD(nl_hdr);
+
+ for (; RTA_OK(rt_attr, rt_len); rt_attr = RTA_NEXT(rt_attr, rt_len))
+ {
+ switch (rt_attr->rta_type) {
+ case RTA_OIF:
+ rt_info->dev_index = *(int *) RTA_DATA(rt_attr);
+ break;
+ case RTA_GATEWAY:
+ rt_info->gateway.s_addr = *(u_int *) RTA_DATA(rt_attr);
+ break;
+ case RTA_PREFSRC:
+ rt_info->src_addr.s_addr = *(u_int *) RTA_DATA(rt_attr);
+ break;
+ case RTA_DST:
+ rt_info->dst_addr.s_addr = *(u_int *) RTA_DATA(rt_attr);
+ break;
+ }
+ }
+}
+
+static int route_dump(u32 *gw_addr ,int* gw_index)
+{
+ int err = 0;
+ struct socket *sock;
+ struct {
+ struct nlmsghdr nlh;
+ struct rtgenmsg g;
+ } req;
+ struct msghdr msg;
+ struct iovec iov;
+ struct sockaddr_nl nladdr;
+ mm_segment_t oldfs;
+ char *pg;
+ int size = 0;
+
+ err = sock_create(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE, &sock);
+ if (err)
+ {
+ printk( ": Could not create a datagram socket, error = %d\n", -ENXIO);
+ return err;
+ }
+
+ memset(&nladdr, 0, sizeof(nladdr));
+ nladdr.nl_family = AF_NETLINK;
+
+ req.nlh.nlmsg_len = sizeof(req);
+ req.nlh.nlmsg_type = RTM_GETROUTE;
+ req.nlh.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
+ req.nlh.nlmsg_pid = 0;
+ req.g.rtgen_family = AF_INET;
+
+ iov.iov_base = &req;
+ iov.iov_len = sizeof(req);
+
+ msg.msg_name = &nladdr;
+ msg.msg_namelen = sizeof(nladdr);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ msg.msg_flags = MSG_DONTWAIT;
+
+ oldfs = get_fs(); set_fs(KERNEL_DS);
+ err = sock_sendmsg(sock, &msg, sizeof(req));
+ set_fs(oldfs);
+
+ if (size < 0)
+ goto out_sock;
+
+ pg = (char *) __get_free_page(GFP_KERNEL);
+ if (pg == NULL) {
+ err = -ENOMEM;
+ goto out_sock;
+ }
+
+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
+restart:
+#endif
+
+ for (;;)
+ {
+ struct nlmsghdr *h;
+
+ iov.iov_base = pg;
+ iov.iov_len = PAGE_SIZE;
+
+ oldfs = get_fs(); set_fs(KERNEL_DS);
+ err = sock_recvmsg(sock, &msg, PAGE_SIZE, MSG_DONTWAIT);
+ set_fs(oldfs);
+
+ if (err < 0)
+ goto out_sock_pg;
+
+ if (msg.msg_flags & MSG_TRUNC) {
+ err = -ENOBUFS;
+ goto out_sock_pg;
+ }
+
+ h = (struct nlmsghdr*) pg;
+
+ while (NLMSG_OK(h, err))
+ {
+ struct route_info rt_info;
+ if (h->nlmsg_type == NLMSG_DONE) {
+ err = 0;
+ goto done;
+ }
+
+ if (h->nlmsg_type == NLMSG_ERROR) {
+ struct nlmsgerr *errm = (struct nlmsgerr*) NLMSG_DATA(h);
+ err = errm->error;
+ printk( "NLMSG error: %d\n", errm->error);
+ goto done;
+ }
+
+ if (h->nlmsg_type == RTM_GETROUTE)
+ {
+ printk( "RTM_GETROUTE: NLMSG: %d\n", h->nlmsg_type);
+ }
+ if (h->nlmsg_type != RTM_NEWROUTE) {
+ printk( "NLMSG: %d\n", h->nlmsg_type);
+ err = -EINVAL;
+ goto done;
+ }
+
+ memset(&rt_info, 0, sizeof(struct route_info));
+ parse_routes(h, &rt_info);
+ if(!rt_info.dst_addr.s_addr && rt_info.gateway.s_addr && rt_info.dev_index)
+ {
+ *gw_addr = rt_info.gateway.s_addr;
+ *gw_index = rt_info.dev_index;
+
+ }
+ h = NLMSG_NEXT(h, err);
+ }
+
+ if (err)
+ {
+ printk( "!!!Remnant of size %d %d %d\n", err, h->nlmsg_len, h->nlmsg_type);
+ err = -EINVAL;
+ break;
+ }
+ }
+
+done:
+#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
+ if (!err && req.g.rtgen_family == AF_INET) {
+ req.g.rtgen_family = AF_INET6;
+
+ iov.iov_base = &req;
+ iov.iov_len = sizeof(req);
+
+ msg.msg_name = &nladdr;
+ msg.msg_namelen = sizeof(nladdr);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ msg.msg_flags=MSG_DONTWAIT;
+
+ oldfs = get_fs(); set_fs(KERNEL_DS);
+ err = sock_sendmsg(sock, &msg, sizeof(req));
+ set_fs(oldfs);
+
+ if (err > 0)
+ goto restart;
+ }
+#endif
+
+out_sock_pg:
+ free_page((unsigned long) pg);
+
+out_sock:
+ sock_release(sock);
+ return err;
+}
+
+static int arp_query(unsigned char *haddr, u32 paddr,
+ struct net_device *dev)
+{
+ struct neighbour *neighbor_entry;
+ int ret = 0;
+
+ neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev);
+
+ if (neighbor_entry != NULL) {
+ neighbor_entry->used = jiffies;
+ if (neighbor_entry->nud_state & NUD_VALID) {
+ _rtw_memcpy(haddr, neighbor_entry->ha, dev->addr_len);
+ ret = 1;
+ }
+ neigh_release(neighbor_entry);
+ }
+ return ret;
+}
+
+static int get_defaultgw(u32 *ip_addr ,char mac[])
+{
+ int gw_index = 0; // oif device index
+ struct net_device *gw_dev = NULL; //oif device
+
+ route_dump(ip_addr, &gw_index);
+
+ if( !(*ip_addr) || !gw_index )
+ {
+ //DBG_871X("No default GW \n");
+ return -1;
+ }
+
+ gw_dev = dev_get_by_index(&init_net, gw_index);
+
+ if(gw_dev == NULL)
+ {
+ //DBG_871X("get Oif Device Fail \n");
+ return -1;
+ }
+
+ if(!arp_query(mac, *ip_addr, gw_dev))
+ {
+ //DBG_871X( "arp query failed\n");
+ dev_put(gw_dev);
+ return -1;
+
+ }
+ dev_put(gw_dev);
+
+ return 0;
+}
+
+int rtw_gw_addr_query(_adapter *padapter)
+{
+ struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ u32 gw_addr = 0; // default gw address
+ unsigned char gw_mac[32] = {0}; // default gw mac
+ int i;
+ int res;
+
+ res = get_defaultgw(&gw_addr, gw_mac);
+ if(!res)
+ {
+ pmlmepriv->gw_ip[0] = gw_addr&0xff;
+ pmlmepriv->gw_ip[1] = (gw_addr&0xff00)>>8;
+ pmlmepriv->gw_ip[2] = (gw_addr&0xff0000)>>16;
+ pmlmepriv->gw_ip[3] = (gw_addr&0xff000000)>>24;
+ _rtw_memcpy(pmlmepriv->gw_mac_addr, gw_mac, 6);
+ DBG_871X("%s Gateway Mac:\t" MAC_FMT "\n", __FUNCTION__, MAC_ARG(pmlmepriv->gw_mac_addr));
+ DBG_871X("%s Gateway IP:\t" IP_FMT "\n", __FUNCTION__, IP_ARG(pmlmepriv->gw_ip));
+ }
+ else
+ {
+ DBG_871X("Get Gateway IP/MAC fail!\n");
+ }
+
+ return res;
+}
+#endif
+
void rtw_dev_unload(PADAPTER padapter)
{
struct net_device *pnetdev = (struct net_device*)padapter->pnetdev;
struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
struct dvobj_priv *pobjpriv = padapter->dvobj;
struct debug_priv *pdbgpriv = &pobjpriv->drv_dbg;
+ struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
+ u8 cnt = 0;
RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+%s\n",__FUNCTION__));
@@ -2661,7 +2854,18 @@ void rtw_dev_unload(PADAPTER padapter)
if (!pwrctl->bInternalAutoSuspend)
rtw_stop_drv_threads(padapter);
-
+
+ while(ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _TRUE){
+ if (cnt > 5) {
+ DBG_871X("stop cmdthd timeout\n");
+ break;
+ } else {
+ cnt ++;
+ DBG_871X("cmdthd is running(%d)\n", cnt);
+ rtw_msleep_os(10);
+ }
+ }
+
RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("@ %s: stop thread complete!\n",__FUNCTION__));
//check the status of IPS
@@ -2675,6 +2879,9 @@ void rtw_dev_unload(PADAPTER padapter)
if (padapter->bSurpriseRemoved == _FALSE)
{
+#ifdef CONFIG_BT_COEXIST
+ rtw_btcoex_IpsNotify(padapter, pwrctl->ips_mode_req);
+#endif
#ifdef CONFIG_WOWLAN
if (pwrctl->bSupportRemoteWakeup == _TRUE &&
pwrctl->wowlan_mode ==_TRUE) {
@@ -2702,7 +2909,6 @@ void rtw_dev_unload(PADAPTER padapter)
RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("-%s\n",__FUNCTION__));
}
-#ifdef CONFIG_SUSPEND_REFINE
int rtw_suspend_free_assoc_resource(_adapter *padapter)
{
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
@@ -2777,12 +2983,7 @@ int rtw_suspend_wow(_adapter *padapter)
int ret = _SUCCESS;
DBG_871X("==> "FUNC_ADPT_FMT" entry....\n", FUNC_ADPT_ARG(padapter));
-
- if (check_fwstate(pmlmepriv, _FW_LINKED)) {
- pwrpriv->wowlan_mode = _TRUE;
- } else if (pwrpriv->wowlan_pno_enable == _TRUE) {
- pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;
- }
+
DBG_871X("wowlan_mode: %d\n", pwrpriv->wowlan_mode);
DBG_871X("wowlan_pno_enable: %d\n", pwrpriv->wowlan_pno_enable);
@@ -2809,7 +3010,7 @@ int rtw_suspend_wow(_adapter *padapter)
}
#endif // CONFIG_CONCURRENT_MODE
- //#ifdef CONFIG_POWER_SAVING
+ //#ifdef CONFIG_LPS
//rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
//#endif
@@ -2878,56 +3079,18 @@ int rtw_suspend_wow(_adapter *padapter)
rtw_suspend_free_assoc_resource(padapter->pbuddy_adapter);
}
#endif
-
- #ifdef CONFIG_POWER_SAVING
+
if(pwrpriv->wowlan_pno_enable)
DBG_871X_LEVEL(_drv_always_, "%s: pno: %d\n", __func__, pwrpriv->wowlan_pno_enable);
+ #ifdef CONFIG_LPS
else
rtw_set_ps_mode(padapter, PS_MODE_DTIM, 0, 0, "WOWLAN");
- #endif
+ #endif //#ifdef CONFIG_LPS
}
else
{
- if(pnetdev){
- netif_carrier_off(pnetdev);
- rtw_netif_stop_queue(pnetdev);
- }
- #ifdef CONFIG_CONCURRENT_MODE
- if(pbuddy_netdev){
- netif_carrier_off(pbuddy_netdev);
- rtw_netif_stop_queue(pbuddy_netdev);
- }
- #endif//CONFIG_CONCURRENT_MODE
-
- rtw_suspend_free_assoc_resource(padapter);
-
- #ifdef CONFIG_CONCURRENT_MODE
- if(rtw_buddy_adapter_up(padapter)){
- rtw_suspend_free_assoc_resource(padapter->pbuddy_adapter);
- }
- #endif//CONFIG_CONCURRENT_MODE
- rtw_led_control(padapter, LED_CTL_POWER_OFF);
-
-
- if ((rtw_hal_check_ips_status(padapter) == _TRUE)
- || (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))
- {
- DBG_871X_LEVEL(_drv_always_, "%s: ### ERROR #### driver in IPS ####ERROR###!!!\n", __FUNCTION__);
-
- }
-
-
- #ifdef CONFIG_CONCURRENT_MODE
- if(rtw_buddy_adapter_up(padapter)){
- rtw_dev_unload(padapter->pbuddy_adapter);
- }
- #endif
- rtw_dev_unload(padapter);
-
- //sdio_deinit(adapter_to_dvobj(padapter));
- if(padapter->intf_deinit)
- padapter->intf_deinit(adapter_to_dvobj(padapter));
+ DBG_871X_LEVEL(_drv_always_, "%s: ### ERROR ### wowlan_mode=%d\n", __FUNCTION__, pwrpriv->wowlan_mode);
}
DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
return ret;
@@ -2942,9 +3105,9 @@ int rtw_suspend_ap_wow(_adapter *padapter)
struct net_device *pnetdev = padapter->pnetdev;
#ifdef CONFIG_CONCURRENT_MODE
struct net_device *pbuddy_netdev;
- #endif
+ #endif
struct dvobj_priv *psdpriv = padapter->dvobj;
- struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+ struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
struct wowlan_ioctl_param poidparam;
u8 ps_mode;
@@ -2957,7 +3120,7 @@ int rtw_suspend_ap_wow(_adapter *padapter)
DBG_871X("wowlan_ap_mode: %d\n", pwrpriv->wowlan_ap_mode);
if(pnetdev)
- rtw_netif_stop_queue(pnetdev);
+ rtw_netif_stop_queue(pnetdev);
#ifdef CONFIG_CONCURRENT_MODE
if (rtw_buddy_adapter_up(padapter)) {
pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;
@@ -2977,11 +3140,12 @@ int rtw_suspend_ap_wow(_adapter *padapter)
padapter->pbuddy_adapter->bDriverStopped = _FALSE; //for 32k command
}
#endif // CONFIG_CONCURRENT_MODE
-
- //#ifdef CONFIG_POWER_SAVING
+
+ //#ifdef CONFIG_LPS
//rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
//#endif
+#ifdef CONFIG_SDIO_HCI
// 2. disable interrupt
rtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K.
@@ -2994,6 +3158,7 @@ int rtw_suspend_ap_wow(_adapter *padapter)
// 2.1 clean interupt
if (padapter->HalFunc.clear_interrupt)
padapter->HalFunc.clear_interrupt(padapter);
+#endif //CONFIG_SDIO_HCI
// 2.2 free irq
//sdio_free_irq(adapter_to_dvobj(padapter));
@@ -3005,14 +3170,14 @@ int rtw_suspend_ap_wow(_adapter *padapter)
DBG_871X(" ### PORT SWITCH ### \n");
rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);
}
- #endif
-
+ #endif
+
poidparam.subcode = WOWLAN_AP_ENABLE;
padapter->HalFunc.SetHwRegHandler(padapter,
HW_VAR_AP_WOWLAN,(u8 *)&poidparam);
DBG_871X_LEVEL(_drv_always_, "%s: wowmode suspending\n", __func__);
-
+
#ifdef CONFIG_CONCURRENT_MODE
if (check_buddy_fwstate(padapter, WIFI_AP_STATE) == _TRUE) {
if (rtw_get_ch_setting_union(padapter->pbuddy_adapter, &ch, &bw, &offset) != 0) {
@@ -3037,11 +3202,11 @@ int rtw_suspend_ap_wow(_adapter *padapter)
}
#endif
-#ifdef CONFIG_POWER_SAVING
+
#ifdef CONFIG_LPS
rtw_set_ps_mode(padapter, PS_MODE_MIN, 0, 0, "AP-WOWLAN");
#endif
- #endif
+
DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
return ret;
@@ -3080,6 +3245,14 @@ int rtw_suspend_normal(_adapter *padapter)
}
#endif
rtw_led_control(padapter, LED_CTL_POWER_OFF);
+
+ if ((rtw_hal_check_ips_status(padapter) == _TRUE)
+ || (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))
+ {
+ DBG_871X_LEVEL(_drv_always_, "%s: ### ERROR #### driver in IPS ####ERROR###!!!\n", __FUNCTION__);
+
+ }
+
#ifdef CONFIG_CONCURRENT_MODE
if(rtw_buddy_adapter_up(padapter)){
rtw_dev_unload(padapter->pbuddy_adapter);
@@ -3167,8 +3340,18 @@ int rtw_suspend_common(_adapter *padapter)
#endif
) {
#ifdef CONFIG_WOWLAN
+ if (check_fwstate(pmlmepriv, _FW_LINKED)) {
+ pwrpriv->wowlan_mode = _TRUE;
+ } else if (pwrpriv->wowlan_pno_enable == _TRUE) {
+ pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;
+ }
+
+ if (pwrpriv->wowlan_mode == _TRUE)
rtw_suspend_wow(padapter);
- #else
+ else
+ rtw_suspend_normal(padapter);
+
+ #else //CONFIG_WOWLAN
rtw_suspend_normal(padapter);
#endif //CONFIG_WOWLAN
} else if (check_fwstate(pmlmepriv,WIFI_AP_STATE) == _TRUE
@@ -3208,6 +3391,8 @@ exit:
int rtw_resume_process_wow(_adapter *padapter)
{
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
struct net_device *pnetdev = padapter->pnetdev;
#ifdef CONFIG_CONCURRENT_MODE
struct net_device *pbuddy_netdev;
@@ -3231,16 +3416,22 @@ _func_enter_;
goto exit;
}
+ if (padapter->bDriverStopped || padapter->bSurpriseRemoved) {
+ DBG_871X("%s pdapter %p bDriverStopped %d bSurpriseRemoved %d\n",
+ __FUNCTION__, padapter, padapter->bDriverStopped,
+ padapter->bSurpriseRemoved);
+ goto exit;
+ }
+
#ifdef CONFIG_PNO_SUPPORT
pwrpriv->pno_in_resume = _TRUE;
#endif
if (pwrpriv->wowlan_mode == _TRUE){
-#ifdef CONFIG_POWER_SAVING
#ifdef CONFIG_LPS
rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
#endif //CONFIG_LPS
-#endif
+
pwrpriv->bFwCurrentInPSMode = _FALSE;
#ifdef CONFIG_SDIO_HCI
@@ -3321,56 +3512,7 @@ _func_enter_;
}
else{
- // interface init
- //if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS)
- if ((padapter->intf_init) &&(padapter->intf_init(adapter_to_dvobj(padapter)) != _SUCCESS))
- {
- ret = -1;
- RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__));
- goto exit;
- }
-
- rtw_hal_disable_interrupt(padapter);
-
- if (padapter->HalFunc.clear_interrupt)
- padapter->HalFunc.clear_interrupt(padapter);
-
- //if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)
- if ((padapter->intf_alloc_irq)&&(padapter->intf_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS))
- {
- ret = -1;
- RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__));
- goto exit;
- }
-
- rtw_reset_drv_sw(padapter);
- #ifdef CONFIG_CONCURRENT_MODE
- rtw_reset_drv_sw(padapter->pbuddy_adapter);
- #endif
- pwrpriv->bkeepfwalive = _FALSE;
-
- DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive);
-
- if(pm_netdev_close(pnetdev, _TRUE) == 0) {
- DBG_871X("netdev_close success\n");
- }
-
- if(pm_netdev_open(pnetdev,_TRUE) != 0) {
- ret = -1;
- pdbgpriv->dbg_resume_error_cnt++;
- goto exit;
- }
-
- netif_device_attach(pnetdev);
- netif_carrier_on(pnetdev);
-
- #ifdef CONFIG_CONCURRENT_MODE
- if(rtw_buddy_adapter_up(padapter)){
- pbuddy_netdev = padapter->pbuddy_adapter->pnetdev;
- netif_device_attach(pbuddy_netdev);
- netif_carrier_on(pbuddy_netdev);
- }
- #endif
+ DBG_871X_LEVEL(_drv_always_, "%s: ### ERROR ### wowlan_mode=%d\n", __FUNCTION__, pwrpriv->wowlan_mode);
}
if( padapter->pid[1]!=0) {
@@ -3386,26 +3528,34 @@ _func_enter_;
DBG_871X("%s: disconnect reason: %02x\n", __func__,
pwrpriv->wowlan_wake_reason);
rtw_indicate_disconnect(padapter);
- rtw_sta_media_status_rpt(padapter, rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)), 0);
+
+ rtw_sta_media_status_rpt(padapter,
+ rtw_get_stainfo(&padapter->stapriv,
+ get_bssid(&padapter->mlmepriv)), 0);
+
rtw_free_assoc_resources(padapter, 1);
+ pmlmeinfo->state = WIFI_FW_NULL_STATE;
+
} else {
DBG_871X("%s: do roaming\n", __func__);
rtw_roaming(padapter, NULL);
}
}
- #ifdef CONFIG_RESUME_IN_WORKQUEUE
- rtw_unlock_suspend();
- #endif //CONFIG_RESUME_IN_WORKQUEUE
-
+ if (pwrpriv->wowlan_wake_reason == FWDecisionDisconnect) {
+ rtw_lock_ext_suspend_timeout(2000);
+ }
if (pwrpriv->wowlan_wake_reason == Rx_GTK ||
pwrpriv->wowlan_wake_reason == Rx_DisAssoc ||
- pwrpriv->wowlan_wake_reason == Rx_DeAuth ||
- pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {
+ pwrpriv->wowlan_wake_reason == Rx_DeAuth) {
rtw_lock_ext_suspend_timeout(8000);
}
+ if (pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {
+ rtw_lock_ext_suspend_timeout(15000);
+ }
+
if (pwrpriv->wowlan_mode == _TRUE) {
pwrpriv->bips_processing = _FALSE;
_set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
@@ -3455,11 +3605,11 @@ _func_enter_;
goto exit;
}
-#ifdef CONFIG_POWER_SAVING
+
#ifdef CONFIG_LPS
rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "AP-WOWLAN");
#endif //CONFIG_LPS
-#endif
+
pwrpriv->bFwCurrentInPSMode = _FALSE;
rtw_hal_disable_interrupt(padapter);
@@ -3551,7 +3701,7 @@ _func_enter_;
}
#ifdef CONFIG_RESUME_IN_WORKQUEUE
- rtw_unlock_suspend();
+ //rtw_unlock_suspend();
#endif //CONFIG_RESUME_IN_WORKQUEUE
if (pwrpriv->wowlan_wake_reason == AP_WakeUp)
@@ -3685,7 +3835,7 @@ _func_enter_;
#endif
#ifdef CONFIG_RESUME_IN_WORKQUEUE
- rtw_unlock_suspend();
+ //rtw_unlock_suspend();
#endif //CONFIG_RESUME_IN_WORKQUEUE
DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter));
@@ -3712,7 +3862,10 @@ int rtw_resume_common(_adapter *padapter)
#endif
) {
#ifdef CONFIG_WOWLAN
- rtw_resume_process_wow(padapter);
+ if (pwrpriv->wowlan_mode == _TRUE)
+ rtw_resume_process_wow(padapter);
+ else
+ rtw_resume_process_normal(padapter);
#else
rtw_resume_process_normal(padapter);
#endif
@@ -3757,6 +3910,4 @@ int rtw_resume_common(_adapter *padapter)
return ret;
}
-#endif
-
diff --git a/rtl8723BS/os_dep/linux/recv_linux.c b/rtl8723BS/os_dep/linux/recv_linux.c
index 2f965d2..57fc16f 100755
--- a/rtl8723BS/os_dep/linux/recv_linux.c
+++ b/rtl8723BS/os_dep/linux/recv_linux.c
@@ -233,9 +233,12 @@ int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf)
if(precvbuf->pskb)
+ {
+#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
+ if(rtw_free_skb_premem(precvbuf->pskb)!=0)
+#endif
rtw_skb_free(precvbuf->pskb);
-
-
+ }
return ret;
}
@@ -302,6 +305,7 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
#ifdef CONFIG_BR_EXT
void *br_port = NULL;
#endif
+ int ret;
/* Indicat the packets to upper layer */
if (pkt) {
@@ -342,7 +346,9 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
if(bmcast && (pskb2 != NULL) ) {
pkt = pskb2;
+ DBG_COUNTER(padapter->rx_logs.os_indicate_ap_mcast);
} else {
+ DBG_COUNTER(padapter->rx_logs.os_indicate_ap_forward);
return;
}
}
@@ -350,6 +356,7 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
else// to APself
{
//DBG_871X("to APSelf\n");
+ DBG_COUNTER(padapter->rx_logs.os_indicate_ap_self);
}
}
@@ -395,7 +402,11 @@ void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attri
pkt->ip_summed = CHECKSUM_NONE;
#endif //CONFIG_TCP_CSUM_OFFLOAD_RX
- rtw_netif_rx(padapter->pnetdev, pkt);
+ ret = rtw_netif_rx(padapter->pnetdev, pkt);
+ if (ret == NET_RX_SUCCESS)
+ DBG_COUNTER(padapter->rx_logs.os_netif_ok);
+ else
+ DBG_COUNTER(padapter->rx_logs.os_netif_err);
}
}
@@ -562,6 +573,8 @@ int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame)
_func_enter_;
+ DBG_COUNTER(padapter->rx_logs.os_indicate);
+
precvpriv = &(padapter->recvpriv);
pfree_recv_queue = &(precvpriv->free_recv_queue);
@@ -639,6 +652,7 @@ _recv_indicatepkt_drop:
if(precv_frame)
rtw_free_recvframe(precv_frame, pfree_recv_queue);
+ DBG_COUNTER(padapter->rx_logs.os_indicate_err);
return _FAIL;
_func_exit_;
diff --git a/rtl8723BS/os_dep/linux/rtw_android.c b/rtl8723BS/os_dep/linux/rtw_android.c
index 59ce0dc..4150e7c 100755
--- a/rtl8723BS/os_dep/linux/rtw_android.c
+++ b/rtl8723BS/os_dep/linux/rtw_android.c
@@ -64,6 +64,9 @@ const char *android_wifi_cmd_str[ANDROID_WIFI_CMD_MAX] = {
"P2P_GET_NOA",
"P2P_SET_PS",
"SET_AP_WPS_P2P_IE",
+
+ "MIRACAST",
+
#ifdef CONFIG_PNO_SUPPORT
"PNOSSIDCLR",
"PNOSETUP",
@@ -135,16 +138,18 @@ char pno_in_example[] = {
#endif /* PNO_SUPPORT */
typedef struct android_wifi_priv_cmd {
+ char *buf;
+ int used_len;
+ int total_len;
+} android_wifi_priv_cmd;
#ifdef CONFIG_COMPAT
+typedef struct compat_android_wifi_priv_cmd {
compat_uptr_t buf;
-#else
- char *buf;
-#endif
-
int used_len;
int total_len;
-} android_wifi_priv_cmd;
+} compat_android_wifi_priv_cmd;
+#endif /* CONFIG_COMPAT */
/**
* Local (static) functions and variables
@@ -159,6 +164,17 @@ static int g_wifi_on = _TRUE;
unsigned int oob_irq;
#ifdef CONFIG_PNO_SUPPORT
+/*
+ * rtw_android_pno_setup
+ * Description:
+ * This is used for private command.
+ *
+ * Parameter:
+ * net: net_device
+ * command: parameters from private command
+ * total_len: the length of the command.
+ *
+ * */
static int rtw_android_pno_setup(struct net_device *net, char *command, int total_len) {
pno_ssid_t pno_ssids_local[MAX_PNO_LIST_COUNT];
int res = -1;
@@ -248,10 +264,56 @@ exit_proc:
return res;
}
-static int rtw_android_pno_enable(struct net_device *net, int pno_enable) {
+/*
+ * rtw_android_cfg80211_pno_setup
+ * Description:
+ * This is used for cfg80211 sched_scan.
+ *
+ * Parameter:
+ * net: net_device
+ * request: cfg80211_request
+ * */
+
+int rtw_android_cfg80211_pno_setup(struct net_device *net,
+ struct cfg80211_ssid *ssids, int n_ssids, int interval) {
+ int res = -1;
+ int nssid = 0;
+ int pno_time = 0;
+ int pno_repeat = 0;
+ int pno_freq_expo_max = 0;
+ int index = 0;
+ pno_ssid_t pno_ssids_local[MAX_PNO_LIST_COUNT];
+
+ if (n_ssids > MAX_PNO_LIST_COUNT || n_ssids < 0) {
+ DBG_871X("%s: nssids(%d) is invalid.\n", __func__, n_ssids);
+ return -EINVAL;
+ }
+
+ memset(pno_ssids_local, 0, sizeof(pno_ssids_local));
+
+ nssid = n_ssids;
+
+ for (index = 0 ; index < nssid ; index++) {
+ pno_ssids_local[index].SSID_len = ssids[index].ssid_len;
+ memcpy(pno_ssids_local[index].SSID, ssids[index].ssid,
+ ssids[index].ssid_len);
+ }
+
+ pno_time = (interval / 1000);
+
+ DBG_871X("%s: nssids: %d, pno_time=%d\n", __func__, nssid, pno_time);
+
+ res = rtw_dev_pno_set(net, pno_ssids_local, nssid, pno_time,
+ pno_repeat, pno_freq_expo_max);
+
+exit_proc:
+ return res;
+}
+
+int rtw_android_pno_enable(struct net_device *net, int pno_enable) {
_adapter *padapter = (_adapter *)rtw_netdev_priv(net);
struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
-
+
if (pwrctl) {
pwrctl->wowlan_pno_enable = pno_enable;
DBG_871X("%s: wowlan_pno_enable: %d\n", __func__, pwrctl->wowlan_pno_enable);
@@ -381,6 +443,46 @@ int rtw_android_getband(struct net_device *net, char *command, int total_len)
return bytes_written;
}
+enum {
+ MIRACAST_DISABLED = 0,
+ MIRACAST_SOURCE,
+ MIRACAST_SINK,
+ MIRACAST_INVALID,
+};
+
+static const char *miracast_mode_str[] = {
+ "DISABLED",
+ "SOURCE",
+ "SINK",
+ "INVALID",
+};
+
+static const char *get_miracast_mode_str(int mode)
+{
+ if (mode < MIRACAST_DISABLED || mode >= MIRACAST_INVALID)
+ mode = MIRACAST_INVALID;
+
+ return miracast_mode_str[mode];
+}
+
+int rtw_android_set_miracast_mode(struct net_device *net, char *command, int total_len)
+{
+ _adapter *adapter = (_adapter *)rtw_netdev_priv(net);
+ char *arg = command + strlen(android_wifi_cmd_str[ANDROID_WIFI_CMD_MIRACAST]) + 1;
+ u8 mode;
+ int num;
+ int ret = _FAIL;
+
+ num = sscanf(arg, "%hhu", &mode);
+
+ if (num >= 1) {
+ DBG_871X("Miracast mode: %s(%u)\n", get_miracast_mode_str(mode), mode);
+ ret = _SUCCESS;
+ }
+
+ return (ret==_SUCCESS)?0:-1;
+}
+
int get_int_from_command( char* pcmd )
{
int i = 0;
@@ -460,12 +562,27 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
#ifdef CONFIG_WFD
struct wifi_display_info *pwfd_info;
#endif
+
rtw_lock_suspend();
if (!ifr->ifr_data) {
ret = -EINVAL;
goto exit;
}
+#ifdef CONFIG_COMPAT
+ if (is_compat_task()) {
+ /* User space is 32-bit, use compat ioctl */
+ compat_android_wifi_priv_cmd compat_priv_cmd;
+
+ if (copy_from_user(&compat_priv_cmd, ifr->ifr_data, sizeof(compat_android_wifi_priv_cmd))) {
+ ret = -EFAULT;
+ goto exit;
+ }
+ priv_cmd.buf = compat_ptr(compat_priv_cmd.buf);
+ priv_cmd.used_len = compat_priv_cmd.used_len;
+ priv_cmd.total_len = compat_priv_cmd.total_len;
+ } else
+#endif /* CONFIG_COMPAT */
if (copy_from_user(&priv_cmd, ifr->ifr_data, sizeof(android_wifi_priv_cmd))) {
ret = -EFAULT;
goto exit;
@@ -488,11 +605,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
ret = -EFAULT;
goto exit;
}
-#ifdef CONFIG_COMPAT
- if (copy_from_user(command, compat_ptr(priv_cmd.buf), (unsigned long) priv_cmd.total_len)) {
-#else
if (copy_from_user(command, (void *)priv_cmd.buf, priv_cmd.total_len)) {
-#endif
ret = -EFAULT;
goto exit;
}
@@ -595,7 +708,11 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
case ANDROID_WIFI_CMD_GETBAND:
bytes_written = rtw_android_getband(net, command, priv_cmd.total_len);
break;
-
+
+ case ANDROID_WIFI_CMD_MIRACAST:
+ bytes_written = rtw_android_set_miracast_mode(net, command, priv_cmd.total_len);
+ break;
+
case ANDROID_WIFI_CMD_COUNTRY:
bytes_written = rtw_android_set_country(net, command, priv_cmd.total_len);
break;
@@ -671,12 +788,8 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
pwfd_info = &padapter->wfd_info;
if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
{
-#ifdef CONFIG_COMPAT
- pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( compat_ptr(priv_cmd.buf) );
-#else
pwfd_info->rtsp_ctrlport = ( u16 ) get_int_from_command( priv_cmd.buf );
-#endif
- }
+ }
break;
}
case ANDROID_WIFI_CMD_WFD_SET_MAX_TPUT:
@@ -691,12 +804,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
pwfd_info = &padapter->wfd_info;
if( padapter->wdinfo.driver_interface == DRIVER_CFG80211 )
{
-#ifdef CONFIG_COMPAT
- pwfd_info->wfd_device_type = ( u8 ) get_int_from_command( compat_ptr(priv_cmd.buf) );
-#else
pwfd_info->wfd_device_type = ( u8 ) get_int_from_command( priv_cmd.buf );
-#endif
-
pwfd_info->wfd_device_type &= WFD_DEVINFO_DUAL;
}
break;
@@ -706,7 +814,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
{
#ifdef CONFIG_LPS
u8 dtim;
- u8 *ptr = priv_cmd.buf;
+ u8 *ptr =(u8 *) &priv_cmd.buf;
ptr += 9;//string command length of "SET_DTIM";
@@ -740,7 +848,7 @@ int rtw_android_priv_cmd(struct net_device *net, struct ifreq *ifr, int cmd)
}
#ifdef CONFIG_GTK_OL
case ANDROID_WIFI_CMD_GTK_REKEY_OFFLOAD:
- rtw_gtk_offload(net, priv_cmd.buf);
+ rtw_gtk_offload(net, (u8 *)&priv_cmd.buf);
break;
#endif //CONFIG_GTK_OL
case ANDROID_WIFI_CMD_P2P_DISABLE:
@@ -770,11 +878,7 @@ response:
bytes_written++;
}
priv_cmd.used_len = bytes_written;
-#ifdef CONFIG_COMPAT
- if (copy_to_user(compat_ptr(priv_cmd.buf), command, bytes_written)) {
-#else
if (copy_to_user((void *)priv_cmd.buf, command, bytes_written)) {
-#endif
DBG_871X("%s: failed to copy data to user buffer\n", __FUNCTION__);
ret = -EFAULT;
}
diff --git a/rtl8723BS/os_dep/linux/rtw_proc.c b/rtl8723BS/os_dep/linux/rtw_proc.c
index 1bdb8bf..2971bbb 100755
--- a/rtl8723BS/os_dep/linux/rtw_proc.c
+++ b/rtl8723BS/os_dep/linux/rtw_proc.c
@@ -318,6 +318,27 @@ int proc_get_rx_info(struct seq_file *m, void *v)
return 0;
}
+
+ssize_t proc_reset_rx_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
+{
+ struct net_device *dev = data;
+ _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
+ struct dvobj_priv *psdpriv = padapter->dvobj;
+ struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
+ char cmd[32];
+ if (buffer && !copy_from_user(cmd, buffer, sizeof(cmd))) {
+ if('0' == cmd[0]){
+ pdbgpriv->dbg_rx_ampdu_drop_count = 0;
+ pdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0;
+ pdbgpriv->dbg_rx_ampdu_loss_count = 0;
+ pdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0;
+ pdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0;
+ }
+ }
+
+ return count;
+}
+
static int proc_get_cam(struct seq_file *m, void *v)
{
struct net_device *dev = m->private;
@@ -368,25 +389,29 @@ static int proc_get_cam_cache(struct seq_file *m, void *v)
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
u8 i;
- DBG_871X_SEL_NL(m, "%-2s %-6s %-17s %-32s %-7s %-3s"
- //" %-2s %-2s"
+ DBG_871X_SEL_NL(m, "cam bitmap:0x%016llx\n", dvobj->cam_ctl.bitmap);
+
+ DBG_871X_SEL_NL(m, "%-2s %-6s %-17s %-32s %-3s %-7s"
+ //" %-2s %-2s %-4s %-5s"
"\n"
- , "id", "ctrl", "mac", "key", "type", "kid"
- //, "DK", "GK"
+ , "id", "ctrl", "addr", "key", "kid", "type"
+ //, "MK", "GK", "MFB", "valid"
);
for (i=0;i<32;i++) {
if (dvobj->cam_cache[i].ctrl != 0)
- DBG_871X_SEL_NL(m, "%2u 0x%04x "MAC_FMT" "KEY_FMT" %-7s %3u"
- //" %2u %2u"
+ DBG_871X_SEL_NL(m, "%2u 0x%04x "MAC_FMT" "KEY_FMT" %3u %-7s"
+ //" %2u %2u 0x%02x %5u"
"\n", i
, dvobj->cam_cache[i].ctrl
, MAC_ARG(dvobj->cam_cache[i].mac)
, KEY_ARG(dvobj->cam_cache[i].key)
- , security_type_str(((dvobj->cam_cache[i].ctrl)>>2)&0x07)
, (dvobj->cam_cache[i].ctrl)&0x03
+ , security_type_str(((dvobj->cam_cache[i].ctrl)>>2)&0x07)
//, ((dvobj->cam_cache[i].ctrl)>>5)&0x01
//, ((dvobj->cam_cache[i].ctrl)>>6)&0x01
+ //, ((dvobj->cam_cache[i].ctrl)>>8)&0x7f
+ //, ((dvobj->cam_cache[i].ctrl)>>15)&0x01
);
}
@@ -414,7 +439,7 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
{"cam", proc_get_cam, proc_set_cam},
{"cam_cache", proc_get_cam_cache, NULL},
{"suspend_info", proc_get_suspend_resume_info, NULL},
- {"rx_info", proc_get_rx_info,NULL},
+ {"rx_info", proc_get_rx_info, proc_reset_rx_info},
#ifdef CONFIG_LAYER2_ROAMING
{"roam_flags", proc_get_roam_flags, proc_set_roam_flags},
@@ -470,6 +495,16 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = {
{"sreset", proc_get_sreset, proc_set_sreset},
#endif /* DBG_CONFIG_ERROR_DETECT */
{"linked_info_dump",proc_get_linked_info_dump,proc_set_linked_info_dump},
+#ifdef CONFIG_DBG_COUNTER
+ {"rx_logs", proc_get_rx_logs, NULL},
+ {"tx_logs", proc_get_tx_logs, NULL},
+ {"int_logs", proc_get_int_logs, NULL},
+#endif
+
+#ifdef CONFIG_PCI_HCI
+ {"rx_ring", proc_get_rx_ring, NULL},
+ {"tx_ring", proc_get_tx_ring, NULL},
+#endif
};
const int adapter_proc_hdls_num = sizeof(adapter_proc_hdls) / sizeof(struct rtw_proc_hdl);
diff --git a/rtl8723BS/os_dep/linux/sdio_intf.c b/rtl8723BS/os_dep/linux/sdio_intf.c
index 5344a5a..1d268a7 100755
--- a/rtl8723BS/os_dep/linux/sdio_intf.c
+++ b/rtl8723BS/os_dep/linux/sdio_intf.c
@@ -26,9 +26,6 @@
#error "CONFIG_SDIO_HCI shall be on!\n"
#endif
-extern void wifi_teardown_dt();
-extern int wifi_setup_dt();
-
#ifndef dev_to_sdio_func
#define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev)
#endif
@@ -177,8 +174,10 @@ static irqreturn_t gpio_hostwakeup_irq_thread(int irq, void *data)
static u8 gpio_hostwakeup_alloc_irq(PADAPTER padapter)
{
int err;
- if (oob_irq == 0)
+ if (oob_irq == 0) {
+ DBG_871X("oob_irq ZERO!\n");
return _FAIL;
+ }
/* dont set it IRQF_TRIGGER_LOW, or wowlan */
/* power is high after suspend */
/* and failing can prevent can not sleep issue if */
@@ -369,6 +368,9 @@ static void rtw_decide_chip_type_by_device_id(PADAPTER padapter, const struct sd
void rtw_set_hal_ops(PADAPTER padapter)
{
+ //alloc memory for HAL DATA
+ rtw_hal_data_init(padapter);
+
#if defined(CONFIG_RTL8723A)
if( padapter->chip_type == RTL8723A){
rtl8723as_set_hal_ops(padapter);
@@ -757,8 +759,6 @@ _func_exit_;
extern int pm_netdev_open(struct net_device *pnetdev,u8 bnormal);
extern int pm_netdev_close(struct net_device *pnetdev,u8 bnormal);
-
-#ifdef CONFIG_SUSPEND_REFINE
static int rtw_sdio_suspend(struct device *dev)
{
struct sdio_func *func =dev_to_sdio_func(dev);
@@ -769,6 +769,12 @@ static int rtw_sdio_suspend(struct device *dev)
int ret = 0;
u8 ch, bw, offset;
+ if(padapter->bDriverStopped == _TRUE)
+ {
+ DBG_871X("%s bDriverStopped = %d\n", __FUNCTION__, padapter->bDriverStopped);
+ goto exit;
+ }
+
if (pwrpriv->bInSuspend == _TRUE)
{
DBG_871X("%s bInSuspend = %d\n", __FUNCTION__, pwrpriv->bInSuspend);
@@ -780,6 +786,7 @@ static int rtw_sdio_suspend(struct device *dev)
exit:
#ifdef CONFIG_RTW_SDIO_PM_KEEP_POWER
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
//Android 4.0 don't support WIFI close power
//or power down or clock will close after wifi resume,
//this is sprd's bug in Android 4.0, but sprd don't
@@ -798,6 +805,7 @@ exit:
sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
}
}
+#endif
#endif
return ret;
}
@@ -806,7 +814,7 @@ int rtw_resume_process(_adapter *padapter)
struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
struct dvobj_priv *psdpriv = padapter->dvobj;
struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-
+
if (pwrpriv->bInSuspend == _FALSE)
{
pdbgpriv->dbg_resume_error_cnt++;
@@ -817,558 +825,50 @@ int rtw_resume_process(_adapter *padapter)
return rtw_resume_common(padapter);
}
-
-#else //CONFIG_SUSPEND_REFINE
-static int rtw_sdio_suspend(struct device *dev)
+static int rtw_sdio_resume(struct device *dev)
{
struct sdio_func *func =dev_to_sdio_func(dev);
struct dvobj_priv *psdpriv = sdio_get_drvdata(func);
struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(psdpriv);
_adapter *padapter = psdpriv->if1;
- struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
- struct net_device *pnetdev = padapter->pnetdev;
- struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-
+ struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
int ret = 0;
-#ifdef CONFIG_PLATFORM_SPRD
- u32 value;
-#endif // CONFIG_PLATFORM_SPRD
-
-#ifdef CONFIG_WOWLAN
- struct wowlan_ioctl_param poidparam;
- u8 ch, bw, offset;
- u8 ps_mode;
-#endif //CONFIG_WOWLAN
-
- u32 start_time = rtw_get_current_time();
-
- _func_enter_;
+ struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
- DBG_871X_LEVEL(_drv_always_, "sdio suspend start\n");
DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
- pdbgpriv->dbg_suspend_cnt++;
-
- if (pwrpriv->bInSuspend == _TRUE)
- {
- DBG_871X("%s bInSuspend = %d\n", __FUNCTION__, pwrpriv->bInSuspend);
- pdbgpriv->dbg_suspend_error_cnt++;
- goto exit;
- }
-
- pwrpriv->bInSuspend = _TRUE;
-#ifdef CONFIG_PNO_SUPPORT
- pwrpriv->pno_in_resume = _FALSE;
-#endif
-
-#ifdef CONFIG_WOWLAN
- if (check_fwstate(pmlmepriv, _FW_LINKED))
- pwrpriv->wowlan_mode = _TRUE;
- else
- pwrpriv->wowlan_mode = _FALSE;
-#endif
-
-#ifdef CONFIG_PNO_SUPPORT
- pwrpriv->wowlan_mode |= pwrpriv->wowlan_pno_enable;
-#endif
-
- while (pwrpriv->bips_processing == _TRUE)
- rtw_msleep_os(1);
-
-#ifdef CONFIG_IOL_READ_EFUSE_MAP
- if(!padapter->bup){
- u8 bMacPwrCtrlOn = _FALSE;
- rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
- if(bMacPwrCtrlOn)
- rtw_hal_power_off(padapter);
- }
-#endif
-
- if((!padapter->bup) || (padapter->bDriverStopped)||(padapter->bSurpriseRemoved))
- {
- DBG_871X("%s bup=%d bDriverStopped=%d bSurpriseRemoved = %d\n", __FUNCTION__
- ,padapter->bup, padapter->bDriverStopped,padapter->bSurpriseRemoved);
- pdbgpriv->dbg_suspend_error_cnt++;
- goto exit;
- }
-
- rtw_ps_deny(padapter, PS_DENY_SUSPEND);
-
- if(pnetdev) {
-#ifdef CONFIG_WOWLAN
- if(pwrpriv->wowlan_mode == _TRUE) {
- rtw_netif_stop_queue(pnetdev);
- }
- else
-#endif
- {
- netif_carrier_off(pnetdev);
- rtw_netif_stop_queue(pnetdev);
- }
- }
-
- rtw_cancel_all_timer(padapter);
-
-#ifdef CONFIG_CONCURRENT_MODE
- if (padapter->pbuddy_adapter)
- {
- rtw_cancel_all_timer(padapter->pbuddy_adapter);
- }
-#endif // CONFIG_CONCURRENT_MODE
-
- LeaveAllPowerSaveModeDirect(padapter);
-
- rtw_stop_cmd_thread(padapter);
-
-#ifdef CONFIG_WOWLAN
- if (pwrpriv->wowlan_mode == _TRUE)
- {
- // 1. stop thread
- padapter->bDriverStopped = _TRUE; //for stop thread
- rtw_stop_drv_threads(padapter);
- padapter->bDriverStopped = _FALSE; //for 32k command
-
-#ifdef CONFIG_CONCURRENT_MODE
- if (padapter->pbuddy_adapter)
- {
- padapter->pbuddy_adapter->bDriverStopped = _TRUE; //for stop thread
- rtw_stop_drv_threads(padapter->pbuddy_adapter);
- padapter->pbuddy_adapter->bDriverStopped = _FALSE; //for 32k command
- }
-#endif // CONFIG_CONCURRENT_MODE
-
- // 2. disable interrupt
- rtw_hal_disable_interrupt(padapter); // It need wait for leaving 32K.
- // 2.1 clean interupt
- if (padapter->HalFunc.clear_interrupt)
- padapter->HalFunc.clear_interrupt(padapter);
-
- // 2.2 free irq
- sdio_free_irq(adapter_to_dvobj(padapter));
- }
-#endif // CONFIG_WOWLAN
-
-#ifdef CONFIG_BT_COEXIST
- rtw_btcoex_SuspendNotify(padapter, 1);
-#endif // CONFIG_BT_COEXIST
-
- rtw_ps_deny_cancel(padapter, PS_DENY_SUSPEND);
-
-#ifdef CONFIG_WOWLAN
- DBG_871X("wowlan_mode: %d\n", pwrpriv->wowlan_mode);
+ pdbgpriv->dbg_resume_cnt++;
- if ((pwrpriv->bSupportRemoteWakeup == _TRUE) &&
- (pwrpriv->wowlan_mode == _TRUE))
+ if(pwrpriv->bInternalAutoSuspend)
{
- if (rtw_port_switch_chk(padapter))
- rtw_hal_set_hwreg(padapter, HW_VAR_PORT_SWITCH, NULL);
-
- poidparam.subcode = WOWLAN_ENABLE;
- padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);
+ ret = rtw_resume_process(padapter);
}
else
-#endif // CONFIG_WOWLAN
- {
- //s2-1. issue rtw_disassoc_cmd to fw
- rtw_disassoc_cmd(padapter, 0, _FALSE);
- }
-
- if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {
- if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)
- && check_fwstate(pmlmepriv, _FW_LINKED))
- {
- DBG_871X("%s %s(" MAC_FMT "), length:%d assoc_ssid.length:%d\n",__FUNCTION__,
- pmlmepriv->cur_network.network.Ssid.Ssid,
- MAC_ARG(pmlmepriv->cur_network.network.MacAddress),
- pmlmepriv->cur_network.network.Ssid.SsidLength,
- pmlmepriv->assoc_ssid.SsidLength);
- #ifdef CONFIG_WOWLAN
- if (pwrpriv->wowlan_mode != _TRUE)
- rtw_set_to_roam(padapter, 1);
- else
- rtw_set_to_roam(padapter, 0);
- #else // !CONFIG_WOWLAN
- rtw_set_to_roam(padapter, 1);
- #endif // !CONFIG_WOWLAN
- }
- }
-
-#ifdef CONFIG_WOWLAN
- if (pwrpriv->wowlan_mode == _TRUE)
{
- DBG_871X_LEVEL(_drv_always_, "%s: wowmode suspending\n", __func__);
-
- if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)
+ if(pwrpriv->wowlan_mode || pwrpriv->wowlan_ap_mode)
{
- DBG_871X_LEVEL(_drv_always_, "%s: fw_under_survey\n", __func__);
- rtw_indicate_scan_done(padapter, 1);
- clr_fwstate(pmlmepriv, _FW_UNDER_SURVEY);
- }
-
- if (rtw_get_ch_setting_union(padapter, &ch, &bw, &offset) != 0) {
- DBG_871X(FUNC_ADPT_FMT" back to linked/linking union - ch:%u, bw:%u, offset:%u\n",
- FUNC_ADPT_ARG(padapter), ch, bw, offset);
- set_channel_bwmode(padapter, ch, offset, bw);
+ rtw_resume_lock_suspend();
+ ret = rtw_resume_process(padapter);
+ rtw_resume_unlock_suspend();
}
-
-#ifdef CONFIG_POWER_SAVING
-#ifdef CONFIG_PNO_SUPPORT
- if(pwrpriv->wowlan_pno_enable)
- DBG_871X_LEVEL(_drv_always_, "%s: pno: %d\n", __func__, pwrpriv->wowlan_pno_enable);
else
-#endif //CONFIG_PNO_SUPPORT
- rtw_set_ps_mode(padapter, PS_MODE_SELF_DEFINED, 0, 0);
-#endif
- }
- else
-#endif // CONFIG_WOWLAN
- {
- //s2-2. indicate disconnect to os
- rtw_indicate_disconnect(padapter);
- //s2-3.
- rtw_free_assoc_resources(padapter, 1);
- //s2-4.
- rtw_free_network_queue(padapter, _TRUE);
- //s2-5 dev unload and stop thread
- rtw_dev_unload(padapter);
-
- if ((rtw_hal_check_ips_status(padapter) == _TRUE)
- || (adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off))
- {
- DBG_871X_LEVEL(_drv_always_, "%s: driver in IPS\n", __FUNCTION__);
- LeaveAllPowerSaveMode(padapter);
- DBG_871X_LEVEL(_drv_always_, "%s: driver not in IPS\n", __FUNCTION__);
- }
-
- if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == _TRUE)
- {
- DBG_871X_LEVEL(_drv_always_, "%s: fw_under_survey\n", __FUNCTION__);
- rtw_indicate_scan_done(padapter, 1);
- }
-
- if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)
- {
- DBG_871X_LEVEL(_drv_always_, "%s: fw_under_linking\n", __FUNCTION__);
- rtw_indicate_disconnect(padapter);
- }
-
- // interface deinit
- sdio_deinit(adapter_to_dvobj(padapter));
- }
-
- DBG_871X_LEVEL(_drv_always_, "sdio suspend success in %d ms\n",
- rtw_get_passing_time_ms(start_time));
-
-exit:
-
-#ifdef CONFIG_RTW_SDIO_PM_KEEP_POWER
- //Android 4.0 don't support WIFI close power
- //or power down or clock will close after wifi resume,
- //this is sprd's bug in Android 4.0, but sprd don't
- //want to fix it.
- //we have test power under 8723as, power consumption is ok
- if (func) {
- mmc_pm_flag_t pm_flag = 0;
- pm_flag = sdio_get_host_pm_caps(func);
- DBG_871X("cmd: %s: suspend: PM flag = 0x%x\n", sdio_func_id(func), pm_flag);
- if (!(pm_flag & MMC_PM_KEEP_POWER)) {
- DBG_871X("%s: cannot remain alive while host is suspended\n", sdio_func_id(func));
- pdbgpriv->dbg_suspend_error_cnt++;
- return -ENOSYS;
- } else {
- DBG_871X("cmd: suspend with MMC_PM_KEEP_POWER\n");
- sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
- }
- }
-#endif
-
- DBG_871X("<=== %s return %d.............. in %dms\n", __FUNCTION__
- , ret, rtw_get_passing_time_ms(start_time));
-
- _func_exit_;
- return ret;
-}
-
-
-
-int rtw_resume_process(_adapter *padapter)
-{
- struct net_device *pnetdev;
- struct pwrctrl_priv *pwrpriv = NULL;
- u8 is_pwrlock_hold_by_caller;
- u8 is_directly_called_by_auto_resume;
- int ret = 0;
- u32 start_time = rtw_get_current_time();
- struct dvobj_priv *psdpriv = padapter->dvobj;
- struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-#ifdef CONFIG_WOWLAN
- u32 value = 0;
- struct wowlan_ioctl_param poidparam;
- struct sta_info *psta = NULL;
-#endif // CONFIG_WOWLAN
-
- _func_enter_;
-
- DBG_871X_LEVEL(_drv_always_, "sdio resume start\n");
- DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
-
- if (padapter) {
- pnetdev = padapter->pnetdev;
- pwrpriv = adapter_to_pwrctl(padapter);
- } else {
- pdbgpriv->dbg_resume_error_cnt++;
- ret = -1;
- goto exit;
- }
-
- if (pwrpriv->bInSuspend == _FALSE)
- {
- ret = -1;
- pdbgpriv->dbg_resume_error_cnt++;
- DBG_871X("%s bInSuspend = %d\n", __FUNCTION__, pwrpriv->bInSuspend);
- goto exit;
- }
-
-#ifdef CONFIG_PNO_SUPPORT
- pwrpriv->pno_in_resume = _TRUE;
-#endif
-
-#ifdef CONFIG_WOWLAN
- if (pwrpriv->wowlan_mode == _FALSE){
-
- // interface init
- if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS)
- {
- ret = -1;
- RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__));
- goto exit;
- }
-
- rtw_hal_disable_interrupt(padapter);
-
- if (padapter->HalFunc.clear_interrupt)
- padapter->HalFunc.clear_interrupt(padapter);
-
- if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)
- {
- ret = -1;
- RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__));
- goto exit;
- }
-
- rtw_reset_drv_sw(padapter);
- pwrpriv->bkeepfwalive = _FALSE;
-
- DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive);
-
- if(pm_netdev_close(pnetdev, _TRUE) == 0) {
- DBG_871X("netdev_close success\n");
- }
-
- if(pm_netdev_open(pnetdev,_TRUE) != 0) {
- ret = -1;
- pdbgpriv->dbg_resume_error_cnt++;
- goto exit;
- }
-
- netif_device_attach(pnetdev);
- netif_carrier_on(pnetdev);
- } else {
-
-#ifdef CONFIG_POWER_SAVING
-#ifdef CONFIG_LPS
- rtw_set_ps_mode(padapter, PS_MODE_ACTIVE, 0, 0, "WOWLAN");
-#endif //CONFIG_LPS
-#endif
-
- pwrpriv->bFwCurrentInPSMode = _FALSE;
-
- rtw_hal_disable_interrupt(padapter);
-
- if (padapter->HalFunc.clear_interrupt)
- padapter->HalFunc.clear_interrupt(padapter);
-
- if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS) {
- ret = -1;
- RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__));
- goto exit;
- }
-
- //Disable WOW, set H2C command
- poidparam.subcode=WOWLAN_DISABLE;
- padapter->HalFunc.SetHwRegHandler(padapter,HW_VAR_WOWLAN,(u8 *)&poidparam);
-
- psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
- if (psta) {
- set_sta_rate(padapter, psta);
- }
-
- padapter->bDriverStopped = _FALSE;
- DBG_871X("%s: wowmode resuming, DriverStopped:%d\n", __func__, padapter->bDriverStopped);
- rtw_start_drv_threads(padapter);
-
-#ifdef CONFIG_CONCURRENT_MODE
- if (padapter->pbuddy_adapter)
{
- padapter->pbuddy_adapter->bDriverStopped = _FALSE;
- DBG_871X("%s: wowmode resuming, pbuddy_adapter->DriverStopped:%d\n",
- __FUNCTION__, padapter->pbuddy_adapter->bDriverStopped);
- rtw_start_drv_threads(padapter->pbuddy_adapter);
- }
-#endif // CONFIG_CONCURRENT_MODE
-
- rtw_hal_enable_interrupt(padapter);
-
- // start netif queue
- if (pnetdev) {
- if(!rtw_netif_queue_stopped(pnetdev))
- rtw_netif_start_queue(pnetdev);
- else
- rtw_netif_wake_queue(pnetdev);
- }
- }
-#else //!CONFIG_WOWLAN
-
- // interface init
- if (sdio_init(adapter_to_dvobj(padapter)) != _SUCCESS)
- {
- ret = -1;
- RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: initialize SDIO Failed!!\n", __FUNCTION__));
- goto exit;
- }
- rtw_hal_disable_interrupt(padapter);
- if (sdio_alloc_irq(adapter_to_dvobj(padapter)) != _SUCCESS)
- {
- ret = -1;
- RT_TRACE(_module_hci_intfs_c_, _drv_err_, ("%s: sdio_alloc_irq Failed!!\n", __FUNCTION__));
- goto exit;
- }
-
- rtw_reset_drv_sw(padapter);
- pwrpriv->bkeepfwalive = _FALSE;
-
- DBG_871X("bkeepfwalive(%x)\n",pwrpriv->bkeepfwalive);
- if(pm_netdev_open(pnetdev,_TRUE) != 0) {
- ret = -1;
- pdbgpriv->dbg_resume_error_cnt++;
- goto exit;
- }
-
- netif_device_attach(pnetdev);
- netif_carrier_on(pnetdev);
-#endif
- if( padapter->pid[1]!=0) {
- DBG_871X("pid[1]:%d\n",padapter->pid[1]);
- rtw_signal_process(padapter->pid[1], SIGUSR2);
- }
-
- if (rtw_chk_roam_flags(padapter, RTW_ROAM_ON_RESUME)) {
-#ifdef CONFIG_WOWLAN
- if (pwrpriv->wowlan_wake_reason == FWDecisionDisconnect ||
- pwrpriv->wowlan_wake_reason == Rx_DisAssoc ||
- pwrpriv->wowlan_wake_reason == Rx_DeAuth) {
-
- DBG_871X("%s: disconnect reason: %02x\n", __func__,
- pwrpriv->wowlan_wake_reason);
- rtw_indicate_disconnect(padapter);
- rtw_sta_media_status_rpt(padapter, rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)), 0);
- rtw_free_assoc_resources(padapter, 1);
- } else {
- DBG_871X("%s: do roaming\n", __func__);
- rtw_roaming(padapter, NULL);
- }
-#else
- rtw_roaming(padapter, NULL);
-#endif //CONFOG_WOWLAN
- }
-
- #ifdef CONFIG_RESUME_IN_WORKQUEUE
- rtw_unlock_suspend();
- #endif //CONFIG_RESUME_IN_WORKQUEUE
-
-#ifdef CONFIG_WOWLAN
- if (pwrpriv->wowlan_wake_reason == Rx_GTK ||
- pwrpriv->wowlan_wake_reason == Rx_DisAssoc ||
- pwrpriv->wowlan_wake_reason == Rx_DeAuth ||
- pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) {
- rtw_lock_ext_suspend_timeout(8000);
- }
-
- if (pwrpriv->wowlan_mode == _TRUE) {
- pwrpriv->bips_processing = _FALSE;
- _set_timer(&padapter->mlmepriv.dynamic_chk_timer, 2000);
-#ifndef CONFIG_IPS_CHECK_IN_WD
- rtw_set_pwr_state_check_timer(pwrpriv);
-#endif
- } else {
- DBG_871X_LEVEL(_drv_always_, "do not reset timer\n");
- }
-
- pwrpriv->wowlan_mode =_FALSE;
-
- //clean driver side wake up reason.
- pwrpriv->wowlan_wake_reason = 0;
-#endif //CONFIG_WOWLAN
-
-#ifdef CONFIG_BT_COEXIST
- rtw_btcoex_SuspendNotify(padapter, 0);
-#endif // CONFIG_BT_COEXIST
-
-exit:
- if (pwrpriv) {
- pwrpriv->bInSuspend = _FALSE;
-#ifdef CONFIG_PNO_SUPPORT
- pwrpriv->pno_in_resume = _FALSE;
-#endif
- }
- DBG_871X_LEVEL(_drv_always_, "sdio resume ret:%d in %d ms\n", ret,
- rtw_get_passing_time_ms(start_time));
-
- _func_exit_;
-
- return ret;
-}
-
-
-#endif
-static int rtw_sdio_resume(struct device *dev)
-{
- struct sdio_func *func =dev_to_sdio_func(dev);
- struct dvobj_priv *psdpriv = sdio_get_drvdata(func);
- struct pwrctrl_priv *pwrpriv = dvobj_to_pwrctl(psdpriv);
- _adapter *padapter = psdpriv->if1;
- struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
- int ret = 0;
- struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
-
- DBG_871X("==> %s (%s:%d)\n",__FUNCTION__, current->comm, current->pid);
- pdbgpriv->dbg_resume_cnt++;
-
- if(pwrpriv->bInternalAutoSuspend ){
- ret = rtw_resume_process(padapter);
- } else {
#ifdef CONFIG_RESUME_IN_WORKQUEUE
- rtw_resume_in_workqueue(pwrpriv);
-#else
- if (rtw_is_earlysuspend_registered(pwrpriv)
- #ifdef CONFIG_WOWLAN
- && !pwrpriv->wowlan_mode
- #endif /* CONFIG_WOWLAN */
- #ifdef CONFIG_AP_WOWLAN
- && !pwrpriv->wowlan_ap_mode
- #endif /* CONFIG_AP_WOWLAN*/
- ) {
- /* jeff: bypass resume here, do in late_resume */
- rtw_set_do_late_resume(pwrpriv, _TRUE);
- } else {
-
- //rtw_lock_suspend_timeout(4000);
- rtw_resume_lock_suspend();
-
- ret = rtw_resume_process(padapter);
- rtw_resume_unlock_suspend();
+ rtw_resume_in_workqueue(pwrpriv);
+#else
+ if (rtw_is_earlysuspend_registered(pwrpriv))
+ {
+ /* jeff: bypass resume here, do in late_resume */
+ rtw_set_do_late_resume(pwrpriv, _TRUE);
+ }
+ else
+ {
+ rtw_resume_lock_suspend();
+ ret = rtw_resume_process(padapter);
+ rtw_resume_unlock_suspend();
+ }
+#endif
}
-#endif /* CONFIG_RESUME_IN_WORKQUEUE */
}
pmlmeext->last_scan_time = rtw_get_current_time();
DBG_871X("<======== %s return %d\n", __FUNCTION__, ret);
@@ -1380,27 +880,18 @@ static int __init rtw_drv_entry(void)
{
int ret = 0;
-
DBG_871X_LEVEL(_drv_always_, "module init start\n");
dump_drv_version(RTW_DBGDUMP);
#ifdef BTCOEXVERSION
DBG_871X_LEVEL(_drv_always_, DRV_NAME" BT-Coex version = %s\n", BTCOEXVERSION);
#endif // BTCOEXVERSION
- ret =wifi_setup_dt();
- if(ret)
- {
- DBG_871X("%s: setup dt failed!!(%d)\n", __FUNCTION__, ret);
- ret = -1;
- goto exit;
- }
-
ret = platform_wifi_power_on();
if (ret)
{
DBG_871X("%s: power on failed!!(%d)\n", __FUNCTION__, ret);
ret = -1;
- goto resource;
+ goto exit;
}
sdio_drvpriv.drv_registered = _TRUE;
@@ -1426,9 +917,6 @@ static int __init rtw_drv_entry(void)
poweroff:
platform_wifi_power_off();
-resource:
- wifi_teardown_dt();
-
exit:
DBG_871X_LEVEL(_drv_always_, "module init ret=%d\n", ret);
return ret;
@@ -1446,8 +934,6 @@ static void __exit rtw_drv_halt(void)
platform_wifi_power_off();
- wifi_teardown_dt();
-
rtw_suspend_lock_uninit();
rtw_drv_proc_deinit();
rtw_ndev_notifier_unregister();
diff --git a/rtl8723BS/os_dep/linux/wifi_regd.c b/rtl8723BS/os_dep/linux/wifi_regd.c
index 74895ea..faa2c14 100755
--- a/rtl8723BS/os_dep/linux/wifi_regd.c
+++ b/rtl8723BS/os_dep/linux/wifi_regd.c
@@ -474,9 +474,9 @@ static const struct ieee80211_regdomain *_rtw_regdomain_select(struct
#endif
}
-static int _rtw_regd_init_wiphy(struct rtw_regulatory *reg,
+static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg,
struct wiphy *wiphy,
- int (*reg_notifier) (struct wiphy * wiphy,
+ void (*reg_notifier) (struct wiphy * wiphy,
struct regulatory_request *
request))
{
@@ -495,7 +495,6 @@ static int _rtw_regd_init_wiphy(struct rtw_regulatory *reg,
_rtw_reg_apply_flags(wiphy);
_rtw_reg_apply_radar_flags(wiphy);
_rtw_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg);
- return 0;
}
static struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode)
@@ -510,7 +509,7 @@ static struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode)
}
int rtw_regd_init(_adapter * padapter,
- int (*reg_notifier) (struct wiphy * wiphy,
+ void (*reg_notifier) (struct wiphy * wiphy,
struct regulatory_request * request))
{
//struct registry_priv *registrypriv = &padapter->registrypriv;
@@ -536,12 +535,12 @@ int rtw_regd_init(_adapter * padapter,
return 0;
}
-int rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
+void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
{
struct rtw_regulatory *reg = NULL;
DBG_8192C("%s\n", __func__);
- return _rtw_reg_notifier_apply(wiphy, request, reg);
+ _rtw_reg_notifier_apply(wiphy, request, reg);
}
#endif //CONFIG_IOCTL_CFG80211 \ No newline at end of file
diff --git a/rtl8723BS/os_dep/linux/xmit_linux.c b/rtl8723BS/os_dep/linux/xmit_linux.c
index 0539e65..1df08fd 100755
--- a/rtl8723BS/os_dep/linux/xmit_linux.c
+++ b/rtl8723BS/os_dep/linux/xmit_linux.c
@@ -143,11 +143,11 @@ int rtw_os_xmit_resource_alloc(_adapter *padapter, struct xmit_buf *pxmitbuf, u3
for(i=0; i<8; i++)
{
pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
- if(pxmitbuf->pxmit_urb[i] == NULL)
- {
- DBG_871X("pxmitbuf->pxmit_urb[i]==NULL");
- return _FAIL;
- }
+ if(pxmitbuf->pxmit_urb[i] == NULL)
+ {
+ DBG_871X("pxmitbuf->pxmit_urb[i]==NULL");
+ return _FAIL;
+ }
}
#endif
}
@@ -304,6 +304,8 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
int i;
s32 res;
+ DBG_COUNTER(padapter->tx_logs.os_tx_m2u);
+
_enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
phead = &pstapriv->asoc_list;
plist = get_next(phead);
@@ -324,14 +326,22 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
for (i = 0; i < chk_alive_num; i++) {
psta = rtw_get_stainfo_by_offset(pstapriv, chk_alive_list[i]);
if(!(psta->state &_FW_LINKED))
+ {
+ DBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_fw_linked);
continue;
+ }
/* avoid come from STA1 and send back STA1 */
if (_rtw_memcmp(psta->hwaddr, &skb->data[6], 6) == _TRUE
|| _rtw_memcmp(psta->hwaddr, null_addr, 6) == _TRUE
|| _rtw_memcmp(psta->hwaddr, bc_addr, 6) == _TRUE
)
+ {
+ DBG_COUNTER(padapter->tx_logs.os_tx_m2u_ignore_self);
continue;
+ }
+
+ DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry);
newskb = rtw_skb_copy(skb);
@@ -339,11 +349,13 @@ int rtw_mlcst2unicst(_adapter *padapter, struct sk_buff *skb)
_rtw_memcpy(newskb->data, psta->hwaddr, 6);
res = rtw_xmit(padapter, &newskb);
if (res < 0) {
+ DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_xmit);
DBG_871X("%s()-%d: rtw_xmit() return error!\n", __FUNCTION__, __LINE__);
pxmitpriv->tx_drop++;
rtw_skb_free(newskb);
}
} else {
+ DBG_COUNTER(padapter->tx_logs.os_tx_m2u_entry_err_skb);
DBG_871X("%s-%d: rtw_skb_copy() failed!\n", __FUNCTION__, __LINE__);
pxmitpriv->tx_drop++;
//rtw_skb_free(skb);
@@ -372,9 +384,11 @@ int _rtw_xmit_entry(_pkt *pkt, _nic_hdl pnetdev)
_func_enter_;
+ DBG_COUNTER(padapter->tx_logs.os_tx);
RT_TRACE(_module_rtl871x_mlme_c_, _drv_info_, ("+xmit_enry\n"));
if (rtw_if_up(padapter) == _FALSE) {
+ DBG_COUNTER(padapter->tx_logs.os_tx_err_up);
RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit_entry: rtw_if_up fail\n"));
#ifdef DBG_TX_DROP_FRAME
DBG_871X("DBG_TX_DROP_FRAME %s if_up fail\n", __FUNCTION__);
@@ -388,7 +402,11 @@ _func_enter_;
if ( !rtw_mc2u_disable
&& check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE
&& ( IP_MCAST_MAC(pkt->data)
- || ICMPV6_MCAST_MAC(pkt->data) )
+ || ICMPV6_MCAST_MAC(pkt->data)
+ #ifdef CONFIG_TX_BCAST2UNI
+ || is_broadcast_mac_addr(pkt->data)
+ #endif
+ )
&& (padapter->registrypriv.wifi_spec == 0)
)
{
@@ -400,6 +418,7 @@ _func_enter_;
} else {
//DBG_871X("Stop M2U(%d, %d)! ", pxmitpriv->free_xmitframe_cnt, pxmitpriv->free_xmitbuf_cnt);
//DBG_871X("!m2u );
+ DBG_COUNTER(padapter->tx_logs.os_tx_m2u_stop);
}
}
#endif // CONFIG_TX_MCAST2UNI
diff --git a/rtl8723BS/platform/platform_ARM_SUNnI_sdio.c b/rtl8723BS/platform/platform_ARM_SUNnI_sdio.c
index 4806526..d384141 100755
--- a/rtl8723BS/platform/platform_ARM_SUNnI_sdio.c
+++ b/rtl8723BS/platform/platform_ARM_SUNnI_sdio.c
@@ -69,20 +69,27 @@ int platform_wifi_power_on(void)
} else {
sdc_id = val.val;
DBG_871X("----- %s sdc_id: %d, mod_sel: %d\n", __FUNCTION__, sdc_id, mod_sel);
- wifi_pm_power(1);
- mdelay(10);
+
#if defined(CONFIG_PLATFORM_ARM_SUN6I) || defined(CONFIG_PLATFORM_ARM_SUN7I)
sw_mci_rescan_card(sdc_id, 1);
#elif defined(CONFIG_PLATFORM_ARM_SUN8I)
sunxi_mci_rescan_card(sdc_id, 1);
#endif
+ mdelay(100);
+ wifi_pm_power(1);
+
DBG_871X("%s: power up, rescan card.\n", __FUNCTION__);
}
#ifdef CONFIG_GPIO_WAKEUP
+#ifdef CONFIG_RTL8723B
type = script_get_item("wifi_para", "rtl8723bs_wl_host_wake", &val);
+#endif
+#ifdef CONFIG_RTL8188E
+ type = script_get_item("wifi_para", "rtl8189es_host_wake", &val);
+#endif
if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) {
- DBG_871X("has no rtl8723bs_wl_wake_host\n");
+ DBG_871X("No definition of wake up host PIN\n");
ret = -1;
} else {
gpio_eint_wlan = val.gpio.gpio;
@@ -100,12 +107,14 @@ int platform_wifi_power_on(void)
void platform_wifi_power_off(void)
{
#ifdef CONFIG_MMC
- wifi_pm_power(0);
#if defined(CONFIG_PLATFORM_ARM_SUN6I) ||defined(CONFIG_PLATFORM_ARM_SUN7I)
sw_mci_rescan_card(sdc_id, 0);
#elif defined(CONFIG_PLATFORM_ARM_SUN8I)
sunxi_mci_rescan_card(sdc_id, 0);
#endif
+ mdelay(100);
+ wifi_pm_power(0);
+
DBG_871X("%s: remove card, power off.\n", __FUNCTION__);
#endif // CONFIG_MMC
}
diff --git a/rtl8723BS/platform/platform_ARM_WMT_sdio.c b/rtl8723BS/platform/platform_ARM_WMT_sdio.c
new file mode 100755
index 0000000..62e5825
--- a/dev/null
+++ b/rtl8723BS/platform/platform_ARM_WMT_sdio.c
@@ -0,0 +1,51 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2013 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+#include <drv_types.h>
+#include <mach/wmt_iomux.h>
+#include <linux/gpio.h>
+
+extern void wmt_detect_sdio2(void);
+extern void force_remove_sdio2(void);
+
+int platform_wifi_power_on(void)
+{
+ int err = 0;
+ err = gpio_request(WMT_PIN_GP62_SUSGPIO1, "wifi_chip_en");
+ if (err < 0){
+ printk("request gpio for rtl8188eu failed!\n");
+ return err;
+ }
+ gpio_direction_output(WMT_PIN_GP62_SUSGPIO1, 0);//pull sus_gpio1 to 0 to open vcc_wifi.
+ printk("power on rtl8189.\n");
+ msleep(500);
+ wmt_detect_sdio2();
+ printk("[rtl8189es] %s: new card, power on.\n", __FUNCTION__);
+ return err;
+}
+
+void platform_wifi_power_off(void)
+{
+ force_remove_sdio2();
+
+ gpio_direction_output(WMT_PIN_GP62_SUSGPIO1, 1);//pull sus_gpio1 to 1 to close vcc_wifi.
+ printk("power off rtl8189.\n");
+ gpio_free(WMT_PIN_GP62_SUSGPIO1);
+ printk("[rtl8189es] %s: remove card, power off.\n", __FUNCTION__);
+}