author | Rongjun Chen <rongjun.chen@amlogic.com> | 2016-11-07 06:33:17 (GMT) |
---|---|---|
committer | Rongjun Chen <rongjun.chen@amlogic.com> | 2016-11-07 09:37:51 (GMT) |
commit | 0c20acb18001f9e9b382885eddfc1ea2332123a8 (patch) | |
tree | f514be93b9053efad38426e65b7b7a061b3838d1 | |
parent | b5a76651685d6e51c5545c9ee4e819e91ad63f91 (diff) | |
download | 8188ftv-p-tv-atom.zip 8188ftv-p-tv-atom.tar.gz 8188ftv-p-tv-atom.tar.bz2 |
wifi: update rtl8188ftv driver to v4.3.23.4_19019.20160811
Change-Id: I0787b77d3ac571fed2005e8e7cec3b5f647fb859
108 files changed, 9461 insertions, 5780 deletions
diff --git a/rtl8188FU/Makefile b/rtl8188FU/Makefile index 664b9de..2d3be55 100755 --- a/rtl8188FU/Makefile +++ b/rtl8188FU/Makefile @@ -52,7 +52,7 @@ CONFIG_EXT_CLK = n CONFIG_TRAFFIC_PROTECT = y CONFIG_LOAD_PHY_PARA_FROM_FILE = y CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY = n -CONFIG_CALIBRATE_TX_POWER_TO_MAX = n +CONFIG_CALIBRATE_TX_POWER_TO_MAX = y CONFIG_RTW_ADAPTIVITY_EN = disable CONFIG_RTW_ADAPTIVITY_MODE = normal CONFIG_SIGNAL_SCALE_MAPPING = n @@ -72,6 +72,8 @@ CONFIG_PNO_SET_DEBUG = n CONFIG_AP_WOWLAN = n ######### Notify SDIO Host Keep Power During Syspend ########## CONFIG_RTW_SDIO_PM_KEEP_POWER = y +###################### MP HW TX MODE FOR VHT ####################### +CONFIG_MP_VHT_HW_TX_MODE = n ###################### Platform Related ####################### CONFIG_PLATFORM_I386_PC = y CONFIG_PLATFORM_ANDROID_X86 = n @@ -95,6 +97,7 @@ CONFIG_PLATFORM_TEGRA4_DALMORE = n CONFIG_PLATFORM_ARM_TCC8900 = n CONFIG_PLATFORM_ARM_TCC8920 = n CONFIG_PLATFORM_ARM_TCC8920_JB42 = n +CONFIG_PLATFORM_ARM_TCC8930_JB42 = n CONFIG_PLATFORM_ARM_RK2818 = n CONFIG_PLATFORM_ARM_RK3066 = n CONFIG_PLATFORM_ARM_RK3188 = n @@ -524,7 +527,10 @@ endif ########### HAL_RTL8814A ################################# ifeq ($(CONFIG_RTL8814A), y) - +## ADD NEW VHT MP HW TX MODE ## +EXTRA_CFLAGS += -DCONFIG_MP_VHT_HW_TX_MODE +CONFIG_MP_VHT_HW_TX_MODE = y +########################################## RTL871X = rtl8814a ifeq ($(CONFIG_USB_HCI), y) MODULE_NAME = 8814au @@ -586,7 +592,6 @@ _OUTSRC_FILES += hal/phydm/$(RTL871X)/halhwimg8814a_bb.o\ endif - ########### HAL_RTL8723C ################################# ifeq ($(CONFIG_RTL8723C), y) @@ -797,6 +802,7 @@ endif ifeq ($(CONFIG_LOAD_PHY_PARA_FROM_FILE), y) EXTRA_CFLAGS += -DCONFIG_LOAD_PHY_PARA_FROM_FILE +#EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER #EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH=\"/lib/firmware/\" EXTRA_CFLAGS += -DREALTEK_CONFIG_PATH=\"\" endif @@ -891,6 +897,17 @@ ifeq ($(CONFIG_WIFI_MONITOR), y) EXTRA_CFLAGS += -DCONFIG_WIFI_MONITOR endif +ifeq ($(CONFIG_MP_VHT_HW_TX_MODE), y) +EXTRA_CFLAGS += -DCONFIG_MP_VHT_HW_TX_MODE +ifeq ($(CONFIG_PLATFORM_I386_PC), y) +## For I386 X86 ToolChain use Hardware FLOATING +EXTRA_CFLAGS += -mhard-float +else +## For ARM ToolChain use Hardware FLOATING +EXTRA_CFLAGS += -mfloat-abi=hard +endif +endif + EXTRA_CFLAGS += -DDM_ODM_SUPPORT_TYPE=0x04 ifeq ($(CONFIG_PLATFORM_I386_PC), y) @@ -925,7 +942,6 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_PLATFORM_ACTIONS_ATM705X EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS # Enable this for Android 5.0 EXTRA_CFLAGS += -DCONFIG_RADIO_WORK @@ -947,7 +963,6 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS EXTRA_CFLAGS += -DCONFIG_RESUME_IN_WORKQUEUE EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS @@ -1009,7 +1024,6 @@ EXTRA_CFLAGS += -DCONFIG_PLATFORM_INTEL_BYT EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS EXTRA_CFLAGS += -DCONFIG_SKIP_SIGNAL_SCALE_MAPPING ifeq ($(CONFIG_SDIO_HCI), y) EXTRA_CFLAGS += -DCONFIG_RESUME_IN_WORKQUEUE @@ -1020,7 +1034,6 @@ ifeq ($(CONFIG_PLATFORM_JB_X86), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS SUBARCH := $(shell uname -m | sed -e s/i.86/i386/) ARCH := $(SUBARCH) CROSS_COMPILE := /home/android_sdk/android-x86_JB/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7/bin/i686-linux-android- @@ -1172,7 +1185,6 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ARCH := arm CROSS_COMPILE := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi- KSRC := /home/android_sdk/nvidia/tegra-16r3-partner-android-4.1_20120723/out/target/product/cardhu/obj/KERNEL @@ -1185,7 +1197,6 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ARCH := arm CROSS_COMPILE := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- KSRC := /home/android_sdk/nvidia/tegra-17r9-partner-android-4.2-dalmore_20130131/out/target/product/dalmore/obj/KERNEL @@ -1213,7 +1224,6 @@ EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ARCH := arm CROSS_COMPILE := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- KSRC := /home/android_sdk/Telechips/v13.03_r1-tcc-android-4.2.2_ds_patched/kernel @@ -1237,7 +1247,6 @@ EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN # 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 @@ -1250,7 +1259,6 @@ EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ifeq ($(CONFIG_SDIO_HCI), y) EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN endif @@ -1312,7 +1320,6 @@ EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_SUNxI # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DDCONFIG_P2P_IPS EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS ifeq ($(CONFIG_USB_HCI), y) @@ -1340,7 +1347,7 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2, 4.3, 4.4 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION +EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS ifeq ($(CONFIG_USB_HCI), y) @@ -1372,7 +1379,7 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2, 4.3, 4.4 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION +EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS ifeq ($(CONFIG_USB_HCI), y) @@ -1403,7 +1410,6 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS ifeq ($(CONFIG_USB_HCI), y) @@ -1431,7 +1437,6 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS # Enable this for Android 5.0 EXTRA_CFLAGS += -DCONFIG_RADIO_WORK @@ -1464,7 +1469,6 @@ ifeq ($(CONFIG_PLATFORM_ARM_RTD299X), y) EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DUSB_XMITBUF_ALIGN_SZ=1024 -DUSB_PACKET_OFFSET_SZ=0 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ifeq ($(CONFIG_ANDROID), y) EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT # Enable this for Android 5.0 @@ -1480,7 +1484,6 @@ ifeq ($(SUPPORT_CONCURRENT),y) EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE endif EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DCONFIG_P2P_IPS ARCH := arm ifeq ($(CROSS_COMPILE),) CROSS_COMPILE = arm-hisiv200-linux- @@ -1545,7 +1548,7 @@ EXTRA_CFLAGS += -DCONFIG_TRAFFIC_PROTECT # default setting for Android 4.1, 4.2 EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -#EXTRA_CFLAGS += -DCONFIG_P2P_IPS -DCONFIG_QOS_OPTIMIZATION +#EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION EXTRA_CFLAGS += -DCONFIG_QOS_OPTIMIZATION #EXTRA_CFLAGS += -DCONFIG_#PLATFORM_OPS @@ -1574,7 +1577,6 @@ EXTRA_CFLAGS += -DCONFIG_PLATFORM_NOVATEK_NT72668 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT -EXTRA_CFLAGS += -DDCONFIG_P2P_IPS EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_RX EXTRA_CFLAGS += -DCONFIG_USE_USB_BUFFER_ALLOC_TX ARCH ?= arm @@ -1584,6 +1586,17 @@ KSRC := /Custom/Novatek/TCL/linux-3.8_header #KSRC := $(KERNELDIR) endif +ifeq ($(CONFIG_PLATFORM_ARM_TCC8930_JB42), y) +EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN +# default setting for Android 4.1, 4.2 +EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE +EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT +ARCH := arm +CROSS_COMPILE := /home/android_sdk/Telechips/v13.05_r1-tcc-android-4.2.2_tcc893x-evm_build/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi- +KSRC := /home/android_sdk/Telechips/v13.05_r1-tcc-android-4.2.2_tcc893x-evm_build/kernel +MODULE_NAME := wlan +endif + ifeq ($(CONFIG_MULTIDRV), y) ifeq ($(CONFIG_SDIO_HCI), y) diff --git a/rtl8188FU/core/efuse/rtw_efuse.c b/rtl8188FU/core/efuse/rtw_efuse.c index dbbef44..b301724 100755 --- a/rtl8188FU/core/efuse/rtw_efuse.c +++ b/rtl8188FU/core/efuse/rtw_efuse.c @@ -512,7 +512,8 @@ efuse_OneByteWrite( return bResult; } - + Efuse_PowerSwitch(pAdapter, _TRUE, _TRUE); + // -----------------e-fuse reg ctrl --------------------------------- //address @@ -563,6 +564,8 @@ efuse_OneByteWrite( PHY_SetMacReg(pAdapter, EFUSE_TEST, BIT(11), 0); } + Efuse_PowerSwitch(pAdapter, _TRUE, _FALSE); + return bResult; } @@ -736,6 +739,24 @@ u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size) return _SUCCESS; } //------------------------------------------------------------------------------ +u16 efuse_bt_GetMaxSize(PADAPTER padapter) +{ + u16 max_size; + + max_size = 0; + EFUSE_GetEfuseDefinition(padapter, EFUSE_BT , TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_size, _FALSE); + return max_size; +} + +u8 efuse_bt_GetCurrentSize(PADAPTER padapter, u16 *size) +{ + Efuse_PowerSwitch(padapter, _FALSE, _TRUE); + *size = Efuse_GetCurrentSize(padapter, EFUSE_BT, _FALSE); + Efuse_PowerSwitch(padapter, _FALSE, _FALSE); + + return _SUCCESS; +} + u8 rtw_efuse_map_read(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) { u16 mapLen=0; @@ -983,7 +1004,7 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) DBG_8192C("%s , data[%d] = %x, map[addr+i]= %x\n", __func__, i, data[i], map[addr+i]); } } - Efuse_PowerSwitch(padapter, _TRUE, _TRUE); + /*Efuse_PowerSwitch(padapter, _TRUE, _TRUE);*/ idx = 0; offset = (addr >> 3); @@ -1029,7 +1050,7 @@ u8 rtw_efuse_map_write(PADAPTER padapter, u16 addr, u16 cnts, u8 *data) offset++; } - Efuse_PowerSwitch(padapter, _TRUE, _FALSE); + /*Efuse_PowerSwitch(padapter, _TRUE, _FALSE);*/ exit: @@ -1492,6 +1513,13 @@ const u8 _mac_hidden_max_bw_to_hal_bw_cap[MAC_HIDDEN_MAX_BW_NUM] = { (BW_CAP_80M|BW_CAP_40M|BW_CAP_20M|BW_CAP_10M|BW_CAP_5M), }; +const u8 _mac_hidden_proto_to_hal_proto_cap[MAC_HIDDEN_PROTOCOL_NUM] = { + 0, + 0, + (PROTO_CAP_11N|PROTO_CAP_11G|PROTO_CAP_11B), + (PROTO_CAP_11AC|PROTO_CAP_11N|PROTO_CAP_11G|PROTO_CAP_11B), +}; + u8 mac_hidden_wl_func_to_hal_wl_func(u8 func) { u8 wl_func = 0; diff --git a/rtl8188FU/core/rtw_ap.c b/rtl8188FU/core/rtw_ap.c index 172b635..e67e46b 100755 --- a/rtl8188FU/core/rtw_ap.c +++ b/rtl8188FU/core/rtw_ap.c @@ -861,17 +861,12 @@ void update_bmc_sta(_adapter *padapter) int supportRateNum = 0;
u64 tx_ra_bitmap = 0;
struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
- struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
- struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
WLAN_BSSID_EX *pcur_network = (WLAN_BSSID_EX *)&pmlmepriv->cur_network.network;
struct sta_info *psta = rtw_get_bcmc_stainfo(padapter);
if(psta)
{
psta->aid = 0;//default set to 0
-
- pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;
-
psta->qos_option = 0;
#ifdef CONFIG_80211N_HT
psta->htpriv.ht_option = _FALSE;
@@ -903,9 +898,6 @@ void update_bmc_sta(_adapter *padapter) psta->raid = rtw_hal_networktype_to_raid(padapter,psta);
- //ap mode
- rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, _TRUE);
-
//if(pHalData->fw_ractrl == _TRUE)
{
u8 arg[4] = {0};
@@ -2147,16 +2139,15 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) pmlmepriv->vhtpriv.vht_option = _FALSE;
// if channel in 5G band, then add vht ie .
- if ((pbss_network->Configuration.DSConfig > 14) &&
- (pmlmepriv->htpriv.ht_option == _TRUE) &&
- (pregistrypriv->vht_enable))
- {
- if(vht_cap == _TRUE)
- {
+ if ((pbss_network->Configuration.DSConfig > 14)
+ && (pmlmepriv->htpriv.ht_option == _TRUE)
+ && REGSTY_IS_11AC_ENABLE(pregistrypriv)
+ && hal_chk_proto_cap(padapter, PROTO_CAP_11AC)
+ && (!pmlmepriv->country_ent || COUNTRY_CHPLAN_EN_11AC(pmlmepriv->country_ent))
+ ) {
+ if (vht_cap == _TRUE)
pmlmepriv->vhtpriv.vht_option = _TRUE;
- }
- else if(pregistrypriv->vht_enable == 2) // auto enabled
- {
+ else if (REGSTY_IS_11AC_AUTO(pregistrypriv)) {
u8 cap_len, operation_len;
rtw_vht_use_default_setting(padapter);
@@ -2184,7 +2175,16 @@ int rtw_check_beacon_data(_adapter *padapter, u8 *pbuf, int len) }
#endif //CONFIG_80211AC_VHT
- pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network);
+ if(pbss_network->Configuration.DSConfig <= 14 && padapter->registrypriv.wifi_spec == 1) { + uint len = 0; + + SET_EXT_CAPABILITY_ELE_BSS_COEXIST(pmlmepriv->ext_capab_ie_data, 1); + pmlmepriv->ext_capab_ie_len = 10; + rtw_set_ie(pbss_network->IEs + pbss_network->IELength, EID_EXTCapability, 8, pmlmepriv->ext_capab_ie_data, &len); + pbss_network->IELength += pmlmepriv->ext_capab_ie_len; + } + + pbss_network->Length = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX *)pbss_network); rtw_ies_get_chbw(pbss_network->IEs + _BEACON_IE_OFFSET_, pbss_network->IELength - _BEACON_IE_OFFSET_
, &pmlmepriv->ori_ch, &pmlmepriv->ori_bw, &pmlmepriv->ori_offset);
@@ -3376,39 +3376,7 @@ void bss_cap_update_on_sta_join(_adapter *padapter, struct sta_info *psta) }
- if (ht_capab & RTW_IEEE80211_HT_CAP_40MHZ_INTOLERANT) {
-
- if (!psta->ht_40mhz_intolerant) {
- psta->ht_40mhz_intolerant = 1;
- pmlmepriv->num_sta_40mhz_intolerant++;
- DBG_871X("%s STA " MAC_FMT " - HT_CAP_40MHZ_INTOLERANT is set\n" ,
- __FUNCTION__, MAC_ARG(psta->hwaddr));
- beacon_updated = _TRUE;
- }
-
-/*
- if (pmlmepriv->ht_40mhz_intolerant == _FALSE) {
-
- pmlmepriv->ht_40mhz_intolerant = _TRUE;
-
- DBG_871X("%s STA " MAC_FMT " - HT_CAP_40MHZ_INTOLERANT is set\n" ,
- __FUNCTION__, MAC_ARG(psta->hwaddr));
-
- beacon_updated = _TRUE;
- }
-*/
-
- /*update ext_capab_ie_len & ext_capab_ie_data for beacon, probersp, assocrsp.*/
- if (pmlmepriv->ext_capab_ie_len == 0)
- pmlmepriv->ext_capab_ie_len = 1;
- SET_EXT_CAPABILITY_ELE_BSS_COEXIST(pmlmepriv->ext_capab_ie_data, 1);
-
- update_beacon(padapter, _EXT_CAP_IE_, NULL, _FALSE);
- }
-
- }
- else
- {
+ } else { if (!psta->no_ht_set) {
psta->no_ht_set = 1;
pmlmepriv->num_sta_no_ht++;
@@ -3494,21 +3462,8 @@ u8 bss_cap_update_on_sta_leave(_adapter *padapter, struct sta_info *psta) pmlmepriv->num_sta_ht_20mhz--;
}
- if (psta->ht_40mhz_intolerant) {
- psta->ht_40mhz_intolerant = 0;
- pmlmepriv->num_sta_40mhz_intolerant--;
- /*update ext_capab_ie_len & ext_capab_ie_data for beacon, probersp, assocrsp.*/
- if ((pmlmepriv->ext_capab_ie_len > 0) && (pmlmepriv->num_sta_40mhz_intolerant == 0)) {
- SET_EXT_CAPABILITY_ELE_BSS_COEXIST(pmlmepriv->ext_capab_ie_data, 0);
- update_beacon(padapter, _EXT_CAP_IE_, NULL, _FALSE);
- }
- beacon_updated = _TRUE;
-
- update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _FALSE);
- }
-
if (rtw_ht_operation_update(padapter) > 0) {
update_beacon(padapter, _HT_CAPABILITY_IE_, NULL, _FALSE);
update_beacon(padapter, _HT_ADD_INFO_IE_, NULL, _TRUE);
@@ -3581,7 +3536,7 @@ u8 ap_free_sta(_adapter *padapter, struct sta_info *psta, bool active, u16 reaso rtw_indicate_sta_disassoc_event(padapter, psta);
}
- report_del_sta_event(padapter, psta->hwaddr, reason, enqueue);
+ report_del_sta_event(padapter, psta->hwaddr, reason, enqueue, _FALSE);
beacon_updated = bss_cap_update_on_sta_leave(padapter, psta);
@@ -3743,13 +3698,7 @@ void sta_info_update(_adapter *padapter, struct sta_info *psta) /* called >= TSR LEVEL for USB or SDIO Interface*/
void ap_sta_info_defer_update(_adapter *padapter, struct sta_info *psta)
{
- struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
- struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
-
- if(psta->state & _FW_LINKED)
- {
- pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta;
-
+ if (psta->state & _FW_LINKED) {
//add ratid
add_RATid(padapter, psta, 0);//DM_RATR_STA_INIT
}
diff --git a/rtl8188FU/core/rtw_cmd.c b/rtl8188FU/core/rtw_cmd.c index bf5679c..b33ec07 100755 --- a/rtl8188FU/core/rtw_cmd.c +++ b/rtl8188FU/core/rtw_cmd.c @@ -227,10 +227,6 @@ _func_enter_; if (obj == NULL) goto exit; - if(obj->cmdsz > MAX_CMDSZ ){ - DBG_871X("%s failed due to obj->cmdsz(%d) > MAX_CMDSZ(%d) \n",__FUNCTION__, obj->cmdsz,MAX_CMDSZ); - goto exit; - } //_enter_critical_bh(&queue->lock, &irqL); _enter_critical(&queue->lock, &irqL); @@ -459,7 +455,19 @@ _func_enter_; pcmdpriv = &(padapter->pbuddy_adapter->cmdpriv); #endif - if( _FAIL == (res=rtw_cmd_filter(pcmdpriv, cmd_obj)) ) { + res = rtw_cmd_filter(pcmdpriv, cmd_obj); + if ((_FAIL == res) || (cmd_obj->cmdsz > MAX_CMDSZ)) { + if (cmd_obj->cmdsz > MAX_CMDSZ) { + DBG_871X("%s failed due to obj->cmdsz(%d) > MAX_CMDSZ(%d)\n", __func__, cmd_obj->cmdsz, MAX_CMDSZ); + rtw_warn_on(1); + } + + if (cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) { + struct drvextra_cmd_parm *extra_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf; + + if (extra_parm->pbuf && extra_parm->size > 0) + rtw_mfree(extra_parm->pbuf, extra_parm->size); + } rtw_free_cmd_obj(cmd_obj); goto exit; } @@ -722,6 +730,9 @@ post_process: rtw_unregister_cmd_alive(padapter); #endif + /* to avoid enqueue cmd after free all cmd_obj */ + ATOMIC_SET(&(pcmdpriv->cmdthd_running), _FALSE); + /* free all cmd_obj resources */ do { pcmd = rtw_dequeue_cmd(pcmdpriv); @@ -742,7 +753,6 @@ post_process: } while (1); _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema); - ATOMIC_SET(&(pcmdpriv->cmdthd_running), _FALSE); _func_exit_; @@ -1546,7 +1556,11 @@ _func_enter_; #ifdef CONFIG_80211AC_VHT pvhtpriv->vht_option = _FALSE; - if (phtpriv->ht_option && pregistrypriv->vht_enable) { + if (phtpriv->ht_option + && REGSTY_IS_11AC_ENABLE(pregistrypriv) + && hal_chk_proto_cap(padapter, PROTO_CAP_11AC) + && (!pmlmepriv->country_ent || COUNTRY_CHPLAN_EN_11AC(pmlmepriv->country_ent)) + ) { rtw_restructure_vht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, &psecnetwork->IELength); } @@ -1982,6 +1996,46 @@ _func_exit_; return res; } + +u8 rtw_addbarsp_cmd(_adapter *padapter, u8 *addr, u16 tid, u8 status, u8 size, u16 start_seq) +{ + struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct cmd_obj *ph2c; + struct addBaRsp_parm *paddBaRsp_parm; + u8 res = _SUCCESS; + +_func_enter_; + + ph2c = (struct cmd_obj *)rtw_zmalloc(sizeof(struct cmd_obj)); + if (ph2c == NULL) { + res = _FAIL; + goto exit; + } + + paddBaRsp_parm = (struct addBaRsp_parm *)rtw_zmalloc(sizeof(struct addBaRsp_parm)); + + if (paddBaRsp_parm == NULL) { + rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj)); + res = _FAIL; + goto exit; + } + + _rtw_memcpy(paddBaRsp_parm->addr, addr, ETH_ALEN); + paddBaRsp_parm->tid = tid; + paddBaRsp_parm->status = status; + paddBaRsp_parm->size = size; + paddBaRsp_parm->start_seq = start_seq; + + init_h2fwcmd_w_parm_no_rsp(ph2c, paddBaRsp_parm, GEN_CMD_CODE(_AddBARsp)); + + res = rtw_enqueue_cmd(pcmdpriv, ph2c); + +exit: + +_func_exit_; + + return res; +} //add for CONFIG_IEEE80211W, none 11w can use it u8 rtw_reset_securitypriv_cmd(_adapter*padapter) { @@ -2168,7 +2222,7 @@ _func_exit_; return res; } -u8 rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, u8 swconfig) +u8 _rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, const struct country_chplan *country_ent, u8 swconfig) { struct cmd_obj *cmdobj; struct SetChannelPlan_param *parm; @@ -2185,23 +2239,23 @@ _func_enter_; goto exit; } + /* if country_entry is provided, replace chplan */ + if (country_ent) + chplan = country_ent->chplan; + /* check input parameter */ if (!rtw_is_channel_plan_valid(chplan)) { res = _FAIL; goto exit; } - if (rtw_chplan_is_empty(chplan) == _TRUE) { - res = _FAIL; - goto exit; - } - /* prepare cmd parameter */ parm = (struct SetChannelPlan_param *)rtw_zmalloc(sizeof(*parm)); if (parm == NULL) { res = _FAIL; goto exit; } + parm->country_ent = country_ent; parm->channel_plan = chplan; if (flags & RTW_CMDF_DIRECTLY) { @@ -2243,6 +2297,34 @@ _func_exit_; return res; } +inline u8 rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, u8 swconfig) +{ + return _rtw_set_chplan_cmd(adapter, flags, chplan, NULL, swconfig); +} + +inline u8 rtw_set_country_cmd(_adapter *adapter, int flags, const char *country_code, u8 swconfig) +{ + const struct country_chplan *ent; + + if (is_alpha(country_code[0]) == _FALSE + || is_alpha(country_code[1]) == _FALSE + ) { + DBG_871X_LEVEL(_drv_always_, "%s input country_code is not alpha2\n", __func__); + return _FAIL; + } + + ent = rtw_get_chplan_from_country(country_code); + + if (ent == NULL) { + DBG_871X_LEVEL(_drv_always_, "%s unsupported country_code:\"%c%c\"\n", __func__, country_code[0], country_code[1]); + return _FAIL; + } + + DBG_871X_LEVEL(_drv_always_, "%s country_code:\"%c%c\" mapping to chplan:0x%02x\n", __func__, country_code[0], country_code[1], ent->chplan); + + return _rtw_set_chplan_cmd(adapter, flags, RTW_CHPLAN_MAX, ent, swconfig); +} + u8 rtw_led_blink_cmd(_adapter*padapter, PVOID pLed) { struct cmd_obj* pcmdobj; @@ -2318,7 +2400,7 @@ _func_exit_; return res; } -u8 rtw_tdls_cmd(_adapter *padapter, u8 *addr, u8 option) +u8 rtw_tdls_cmd(_adapter *padapter, const u8 *addr, u8 option) { struct cmd_obj* pcmdobj; struct TDLSoption_param *TDLSoption; @@ -3049,7 +3131,7 @@ _func_exit_; #ifdef CONFIG_ANTENNA_DIVERSITY void antenna_select_wk_hdl(_adapter *padapter, u8 antenna) { - rtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna)); + rtw_hal_set_odm_var(padapter, HAL_ODM_ANTDIV_SELECT, &antenna, _TRUE); } u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue) @@ -3057,12 +3139,20 @@ u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue) struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); u8 bSupportAntDiv = _FALSE; u8 res = _SUCCESS; + int i; _func_enter_; rtw_hal_get_def_var(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv)); - if(_FALSE == bSupportAntDiv ) return res; + if (_FALSE == bSupportAntDiv) + return _FAIL; + + for (i = 0; i < dvobj->iface_nums; i++) { + if (rtw_linked_check(dvobj->padapters[i])) + return _FAIL; + } if(_TRUE == enqueue) { @@ -3753,6 +3843,7 @@ u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length) struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u8 *extra_cmd_buf; u8 res = _SUCCESS; ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj)); @@ -3768,10 +3859,19 @@ u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length) goto exit; } + extra_cmd_buf = rtw_zmalloc(length); + if (extra_cmd_buf == NULL) { + rtw_mfree((u8 *)ph2c, sizeof(struct cmd_obj)); + rtw_mfree((u8 *)pdrvextra_cmd_parm, sizeof(struct drvextra_cmd_parm)); + res = _FAIL; + goto exit; + } + + _rtw_memcpy(extra_cmd_buf, pbuf, length); pdrvextra_cmd_parm->ec_id = C2H_WK_CID; pdrvextra_cmd_parm->type = 0; pdrvextra_cmd_parm->size = length; - pdrvextra_cmd_parm->pbuf = pbuf; + pdrvextra_cmd_parm->pbuf = extra_cmd_buf; init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); @@ -3781,6 +3881,149 @@ exit: return res; } +static s32 rtw_mp_cmd_hdl(_adapter *padapter, u8 mp_cmd_id) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + int ret = H2C_SUCCESS; + u8 rfreg0; + + if (mp_cmd_id == MP_START) { + if (padapter->registrypriv.mp_mode == 0) { + rtw_hal_deinit(padapter); + padapter->registrypriv.mp_mode = 1; +#ifdef CONFIG_RF_POWER_TRIM + if (!IS_HARDWARE_TYPE_8814A(padapter) && !IS_HARDWARE_TYPE_8822B(padapter)) { + padapter->registrypriv.RegPwrTrimEnable = 1; + rtw_hal_read_chip_info(padapter); + } +#endif /*CONFIG_RF_POWER_TRIM*/ + rtw_hal_init(padapter); + } + + if (padapter->registrypriv.mp_mode == 0) { + ret = H2C_REJECTED; + goto exit; + } + + if (padapter->mppriv.mode == MP_OFF) { + if (mp_start_test(padapter) == _FAIL) { + ret = H2C_REJECTED; + goto exit; + } + padapter->mppriv.mode = MP_ON; + MPT_PwrCtlDM(padapter, 0); + } + 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 +#ifdef CONFIG_FOR_RTL8723BS_VQ0 + rtw_write32(padapter, 0x765, 0x0000); + rtw_write32(padapter, 0x948, 0x0280); +#endif + rtw_write8(padapter, 0x66, 0x27); /*Open BT uart Log*/ + rtw_write8(padapter, 0xc50, 0x20); /*for RX init Gain*/ +#endif + ODM_Write_DIG(&pHalData->odmpriv, 0x20); + +#ifdef CONFIG_RTL8188F + DBG_871X("Set reg 0x88c, 0x58, 0x00\n"); + rfreg0 = PHY_QueryRFReg(padapter, RF_PATH_A, 0x0, 0x1f); + PHY_SetBBReg(padapter, 0x88c, BIT21|BIT20, 0x3); + PHY_SetRFReg(padapter, RF_PATH_A, 0x58, BIT1, 0x1); + PHY_SetRFReg(padapter, RF_PATH_A, 0x0, 0xF001f, 0x2001f); + rtw_msleep_os(200); + PHY_SetRFReg(padapter, RF_PATH_A, 0x0, 0xF001f, 0x30000 | rfreg0); + PHY_SetRFReg(padapter, RF_PATH_A, 0x58, BIT1, 0x0); + PHY_SetBBReg(padapter, 0x88c, BIT21|BIT20, 0x0); + rtw_msleep_os(1000); +#endif + + } else if (mp_cmd_id == MP_STOP) { + if (padapter->registrypriv.mp_mode == 1) { + MPT_DeInitAdapter(padapter); + rtw_hal_deinit(padapter); + padapter->registrypriv.mp_mode = 0; + rtw_hal_init(padapter); + } + + if (padapter->mppriv.mode != MP_OFF) { + mp_stop_test(padapter); + padapter->mppriv.mode = MP_OFF; + } + + } else { + DBG_871X(FUNC_ADPT_FMT"invalid id:%d\n", FUNC_ADPT_ARG(padapter), mp_cmd_id); + ret = H2C_PARAMETERS_ERROR; + rtw_warn_on(1); + } + +exit: + return ret; +} + +u8 rtw_mp_cmd(_adapter *adapter, u8 mp_cmd_id, u8 flags) +{ + struct cmd_obj *cmdobj; + struct drvextra_cmd_parm *parm; + struct cmd_priv *pcmdpriv = &adapter->cmdpriv; + struct submit_ctx sctx; + u8 res = _SUCCESS; + + parm = (struct drvextra_cmd_parm *)rtw_zmalloc(sizeof(struct drvextra_cmd_parm)); + if (parm == NULL) { + res = _FAIL; + goto exit; + } + + parm->ec_id = MP_CMD_WK_CID; + parm->type = mp_cmd_id; + parm->size = 0; + parm->pbuf = NULL; + + if (flags & RTW_CMDF_DIRECTLY) { + /* no need to enqueue, do the cmd hdl directly and free cmd parameter */ + if (H2C_SUCCESS != rtw_mp_cmd_hdl(adapter, mp_cmd_id)) + res = _FAIL; + rtw_mfree((u8 *)parm, sizeof(*parm)); + } else { + /* need enqueue, prepare cmd_obj and enqueue */ + cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(*cmdobj)); + if (cmdobj == NULL) { + res = _FAIL; + rtw_mfree((u8 *)parm, sizeof(*parm)); + goto exit; + } + + init_h2fwcmd_w_parm_no_rsp(cmdobj, parm, GEN_CMD_CODE(_Set_Drv_Extra)); + + if (flags & RTW_CMDF_WAIT_ACK) { + cmdobj->sctx = &sctx; + rtw_sctx_init(&sctx, 10 * 1000); + } + + res = rtw_enqueue_cmd(pcmdpriv, cmdobj); + + if (res == _SUCCESS && (flags & RTW_CMDF_WAIT_ACK)) { + rtw_sctx_wait(&sctx, __func__); + _enter_critical_mutex(&pcmdpriv->sctx_mutex, NULL); + if (sctx.status == RTW_SCTX_SUBMITTED) + cmdobj->sctx = NULL; + _exit_critical_mutex(&pcmdpriv->sctx_mutex, NULL); + if (sctx.status != RTW_SCTX_DONE_SUCCESS) + res = _FAIL; + } + } + +exit: + return res; +} + //#else //CONFIG_C2H_PACKET_EN /* dont call R/W in this function, beucase SDIO interrupt have claim host */ /* or deadlock will happen and cause special-systemserver-died in android */ @@ -4210,6 +4453,7 @@ exit: u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf) { + int ret = H2C_SUCCESS; struct drvextra_cmd_parm *pdrvextra_cmd; if(!pbuf) @@ -4317,6 +4561,10 @@ u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf) rtw_hal_set_hwreg(padapter, HW_VAR_EN_HW_UPDATE_TSF, NULL); break; + case MP_CMD_WK_CID: + ret = rtw_mp_cmd_hdl(padapter, pdrvextra_cmd->type); + break; + default: break; } @@ -4326,7 +4574,7 @@ u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf) rtw_mfree(pdrvextra_cmd->pbuf, pdrvextra_cmd->size); } - return H2C_SUCCESS; + return ret; } void rtw_survey_cmd_callback(_adapter* padapter , struct cmd_obj *pcmd) diff --git a/rtl8188FU/core/rtw_debug.c b/rtl8188FU/core/rtw_debug.c index 4db64e4..2cd16a5 100755 --- a/rtl8188FU/core/rtw_debug.c +++ b/rtl8188FU/core/rtw_debug.c @@ -102,6 +102,9 @@ void dump_drv_cfg(void *sel) #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE DBG_871X_SEL_NL(sel, "LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH=%s\n", REALTEK_CONFIG_PATH); + #if defined(CONFIG_MULTIDRV) || defined(REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER) + DBG_871X_SEL_NL(sel, "LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER\n"); + #endif #ifdef CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY DBG_871X_SEL_NL(sel, "CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY\n"); #endif @@ -129,7 +132,11 @@ void dump_drv_cfg(void *sel) #ifdef CONFIG_GPIO_WAKEUP DBG_871X_SEL_NL(sel, "CONFIG_GPIO_WAKEUP - WAKEUP_GPIO_IDX:%d\n", WAKEUP_GPIO_IDX); #endif -#endif +#endif + +#ifdef CONFIG_TDLS + DBG_871X_SEL_NL(sel, "CONFIG_TDLS\n"); +#endif #ifdef CONFIG_USB_HCI #ifdef CONFIG_SUPPORT_USB_INT @@ -1854,6 +1861,24 @@ int proc_get_hw_status(struct seq_file *m, void *v) return 0; } +int proc_get_trx_info_debug(struct seq_file *m, void *v) +{ + struct net_device *dev = m->private; + _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + int i; + + + /*============ tx info ============ */ + rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, m); + + /*============ rx info ============ */ + rtw_hal_set_odm_var(padapter, HAL_ODM_RX_INFO_DUMP, m, _FALSE); + + +return 0; +} int proc_get_rx_signal(struct seq_file *m, void *v) { @@ -1978,6 +2003,8 @@ ssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t co struct registry_priv *pregpriv = &padapter->registrypriv; char tmp[32]; u32 mode; + u8 bw_2g; + u8 bw_5g; if (count < 1) return -EFAULT; @@ -1989,13 +2016,14 @@ ssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t co if (buffer && !copy_from_user(tmp, buffer, count)) { - int num = sscanf(tmp, "%d ", &mode); + int num = sscanf(tmp, "%x ", &mode); + bw_5g = mode >> 4; + bw_2g = mode & 0x0f; - if( pregpriv && mode < 2 ) - { + if (pregpriv && bw_2g <= 4 && bw_5g <= 4) { pregpriv->bw_mode = mode; - printk("bw_mode=%d\n", mode); + printk("bw_mode=0x%x\n", mode); } } @@ -2036,9 +2064,8 @@ ssize_t proc_set_ampdu_enable(struct file *file, const char __user *buffer, size int num = sscanf(tmp, "%d ", &mode); - if( pregpriv && mode < 3 ) - { - pregpriv->ampdu_enable= mode; + if (pregpriv && mode < 2) { + pregpriv->ampdu_enable = mode; printk("ampdu_enable=%d\n", mode); } diff --git a/rtl8188FU/core/rtw_ieee80211.c b/rtl8188FU/core/rtw_ieee80211.c index 0e16b53..893be78 100755 --- a/rtl8188FU/core/rtw_ieee80211.c +++ b/rtl8188FU/core/rtw_ieee80211.c @@ -482,18 +482,19 @@ _func_enter_; ie = rtw_set_ie(ie, _SSID_IE_, pdev_network->Ssid.SsidLength, pdev_network->Ssid.Ssid, &sz); //supported rates - if(pregistrypriv->wireless_mode == WIRELESS_11ABGN) - { + if (pregistrypriv->wireless_mode == WIRELESS_11ABGN) { if(pdev_network->Configuration.DSConfig > 14) wireless_mode = WIRELESS_11A_5N; else wireless_mode = WIRELESS_11BG_24N; - } - else - { + } else if (pregistrypriv->wireless_mode == WIRELESS_MODE_MAX) { /* WIRELESS_11ABGN | WIRELESS_11AC */ + if (pdev_network->Configuration.DSConfig > 14) + wireless_mode = WIRELESS_11_5AC; + else + wireless_mode = WIRELESS_11BG_24N; + } else wireless_mode = pregistrypriv->wireless_mode; - } - + rtw_set_supported_rate(pdev_network->SupportedRates, wireless_mode) ; rateLen = rtw_get_rateset_len(pdev_network->SupportedRates); @@ -2142,7 +2143,7 @@ uint rtw_del_p2p_attr(u8 *ie, uint ielen_ori, u8 attr_id) inline u8 *rtw_bss_ex_get_p2p_ie(WLAN_BSSID_EX *bss_ex, u8 *p2p_ie, uint *p2p_ielen) { - return rtw_get_wfd_ie(BSS_EX_TLV_IES(bss_ex), BSS_EX_TLV_IES_LEN(bss_ex), p2p_ie, p2p_ielen); + return rtw_get_p2p_ie(BSS_EX_TLV_IES(bss_ex), BSS_EX_TLV_IES_LEN(bss_ex), p2p_ie, p2p_ielen); } void rtw_bss_ex_del_p2p_ie(WLAN_BSSID_EX *bss_ex) diff --git a/rtl8188FU/core/rtw_ioctl_set.c b/rtl8188FU/core/rtw_ioctl_set.c index 93f0641..25b1687 100755 --- a/rtl8188FU/core/rtw_ioctl_set.c +++ b/rtl8188FU/core/rtw_ioctl_set.c @@ -361,7 +361,7 @@ _func_enter_; rtw_disassoc_cmd(padapter, 0, _TRUE); if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); @@ -451,7 +451,7 @@ _func_enter_; rtw_disassoc_cmd(padapter, 0, _TRUE); if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); @@ -480,7 +480,7 @@ _func_enter_; rtw_disassoc_cmd(padapter, 0, _TRUE); if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); @@ -644,7 +644,7 @@ _func_enter_; { if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { - rtw_indicate_disconnect(padapter); //will clr Linked_state; before this function, we must have chked whether issue dis-assoc_cmd or not + rtw_indicate_disconnect(padapter, 0, _FALSE); /*will clr Linked_state; before this function, we must have checked whether issue dis-assoc_cmd or not*/ } } @@ -707,7 +707,7 @@ _func_enter_; RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("MgntActrtw_set_802_11_disassociate: rtw_indicate_disconnect\n")); rtw_disassoc_cmd(padapter, 0, _TRUE); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); //modify for CONFIG_IEEE80211W, none 11w can use it rtw_free_assoc_resources_cmd(padapter); if (_FAIL == rtw_pwr_wakeup(padapter)) @@ -1449,17 +1449,11 @@ int rtw_set_channel_plan(_adapter *adapter, u8 channel_plan) */ int rtw_set_country(_adapter *adapter, const char *country_code) { - int channel_plan; - - channel_plan = rtw_get_chplan_from_country(country_code); - - if (channel_plan == -1) { - DBG_871X_LEVEL(_drv_always_, "%s unsupported country_code:%s\n", __func__, country_code); - return _FAIL; - } - - DBG_871X_LEVEL(_drv_always_, "%s country_code:%s mapping to chplan:0x%02x\n", __func__, country_code, channel_plan); - return rtw_set_channel_plan(adapter, channel_plan); +#ifdef CONFIG_RTW_IOCTL_SET_COUNTRY + return rtw_set_country_cmd(adapter, RTW_CMDF_WAIT_ACK, country_code, 1); +#else + return _FAIL; +#endif } /* diff --git a/rtl8188FU/core/rtw_mlme.c b/rtl8188FU/core/rtw_mlme.c index 3958426..3d7f7ef 100755 --- a/rtl8188FU/core/rtw_mlme.c +++ b/rtl8188FU/core/rtw_mlme.c @@ -545,17 +545,10 @@ _func_exit_; void rtw_generate_random_ibss(u8* pibss) { - u32 curtime = rtw_get_current_time(); - -_func_enter_; - pibss[0] = 0x02; //in ad-hoc mode bit1 must set to 1 + *((u32 *)(&pibss[2])) = rtw_random32(); + pibss[0] = 0x02; /* in ad-hoc mode local bit must set to 1 */ pibss[1] = 0x11; pibss[2] = 0x87; - pibss[3] = (u8)(curtime & 0xff) ;//p[0]; - pibss[4] = (u8)((curtime>>8) & 0xff) ;//p[1]; - pibss[5] = (u8)((curtime>>16) & 0xff) ;//p[2]; -_func_exit_; - return; } u8 *rtw_get_capability_from_ie(u8 *ie) @@ -1039,8 +1032,7 @@ _func_enter_; goto exit; } #ifdef CONFIG_ANTENNA_DIVERSITY - //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna;//optimum_antenna=>For antenna diversity - rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); + rtw_hal_get_odm_var(adapter, HAL_ODM_ANTDIV_SELECT, &(target->PhyInfo.Optimum_antenna), NULL); #endif _rtw_memcpy(&(pnetwork->network), target, get_WLAN_BSSID_EX_sz(target)); //pnetwork->last_scanned = rtw_get_current_time(); @@ -1069,8 +1061,7 @@ _func_enter_; bssid_ex_sz = get_WLAN_BSSID_EX_sz(target); target->Length = bssid_ex_sz; #ifdef CONFIG_ANTENNA_DIVERSITY - //target->PhyInfo.Optimum_antenna = pHalData->CurAntenna; - rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(target->PhyInfo.Optimum_antenna)); + rtw_hal_get_odm_var(adapter, HAL_ODM_ANTDIV_SELECT, &(target->PhyInfo.Optimum_antenna), NULL); #endif _rtw_memcpy(&(pnetwork->network), target, bssid_ex_sz ); @@ -1413,14 +1404,14 @@ _func_enter_; } #endif // CONFIG_INTEL_WIDI rtw_free_assoc_resources(adapter, 1); - rtw_indicate_disconnect(adapter); + rtw_indicate_disconnect(adapter, 0, _FALSE); } else { pmlmepriv->to_join = _TRUE; } } else { - rtw_indicate_disconnect(adapter); + rtw_indicate_disconnect(adapter, 0, _FALSE); } _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); } @@ -1432,7 +1423,7 @@ _func_enter_; { if (rtw_select_roaming_candidate(pmlmepriv) == _SUCCESS) { receive_disconnect(adapter, pmlmepriv->cur_network.network.MacAddress - , WLAN_REASON_ACTIVE_ROAM); + , WLAN_REASON_ACTIVE_ROAM, _FALSE); } } } @@ -1612,11 +1603,12 @@ _func_enter_; _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); pwlan = _rtw_find_same_network(&pmlmepriv->scanned_queue, tgt_network); - if(pwlan) - { + if ((pwlan) && (!check_fwstate(pmlmepriv, WIFI_UNDER_WPS))) { + pwlan->fixed = _FALSE; - DBG_871X("free disconnecting network\n"); + DBG_871X("free disconnecting network of scanned_queue\n"); + rtw_free_network_nolock(adapter, pwlan); #ifdef CONFIG_P2P if(!rtw_p2p_chk_state(&adapter->wdinfo, P2P_STATE_NONE)) @@ -1625,10 +1617,12 @@ _func_enter_; //rtw_clear_scan_deny(adapter); } #endif //CONFIG_P2P - } - else - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("rtw_free_assoc_resources : pwlan== NULL \n\n")); + } else { + if (pwlan == NULL) + DBG_871X("free disconnecting network of scanned_queue failed due to pwlan== NULL\n\n"); + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) + DBG_871X("donot free disconnecting network of scanned_queue when WIFI_UNDER_WPS\n\n"); + } @@ -1707,7 +1701,7 @@ _func_exit_; /* *rtw_indicate_disconnect: the caller has to lock pmlmepriv->lock */ -void rtw_indicate_disconnect( _adapter *padapter ) +void rtw_indicate_disconnect(_adapter *padapter, u16 reason, u8 locally_generated) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); @@ -1762,7 +1756,8 @@ _func_enter_; || (rtw_to_roam(padapter) <= 0) ) { - rtw_os_indicate_disconnect(padapter); + + rtw_os_indicate_disconnect(padapter, reason, locally_generated); //set ips_deny_time to avoid enter IPS before LPS leave rtw_set_ips_deny(padapter, 3000); @@ -2207,29 +2202,20 @@ _func_enter_; //s3. find ptarget_sta & update ptarget_sta after update cur_network only for station mode - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) { ptarget_sta = rtw_joinbss_update_stainfo(adapter, pnetwork); - if(ptarget_sta==NULL) - { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't update stainfo when joinbss_event callback\n")); + if (ptarget_sta == NULL) { + DBG_871X_LEVEL(_drv_err_, "Can't update stainfo when joinbss_event callback\n"); _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); goto ignore_joinbss_callback; } } //s4. indicate connect - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { + if (MLME_IS_STA(adapter) || MLME_IS_ADHOC(adapter)) { pmlmepriv->cur_network_scanned = ptarget_wlan; rtw_indicate_connect(adapter); } - else - { - //adhoc mode will rtw_indicate_connect when rtw_stassoc_event_callback - RT_TRACE(_module_rtl871x_mlme_c_,_drv_info_,("adhoc mode, fw_state:%x", get_fwstate(pmlmepriv))); - } - //s5. Cancle assoc_timer _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); @@ -2320,67 +2306,6 @@ _func_enter_; _func_exit_; } -#if 0 -//#if (RATE_ADAPTIVE_SUPPORT==1) //for 88E RA -u8 search_max_mac_id(_adapter *padapter) -{ - u8 mac_id, aid; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_priv *pstapriv = &padapter->stapriv; - -#if defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)){ - -#if 1 - _irqL irqL; - struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); - - _enter_critical_bh(&pdvobj->lock, &irqL); - for(mac_id=(NUM_STA-1); mac_id>0; mac_id--) - if(pdvobj->macid[mac_id] == _TRUE) - break; - _exit_critical_bh(&pdvobj->lock, &irqL); - -#else - for (aid = (pstapriv->max_num_sta); aid > 0; aid--) - { - if (pstapriv->sta_aid[aid-1] != NULL) - { - psta = pstapriv->sta_aid[aid-1]; - break; - } - } -/* - for (mac_id = (pstapriv->max_num_sta-1); mac_id >= 0; mac_id--) - { - if (pstapriv->sta_aid[mac_id] != NULL) - break; - } -*/ - mac_id = aid + 1; -#endif - } - else -#endif - {//adhoc id = 31~2 - for (mac_id = (NUM_STA-1); mac_id >= IBSS_START_MAC_ID ; mac_id--) - { - if (pmlmeinfo->FW_sta_info[mac_id].status == 1) - { - break; - } - } - } - - DBG_871X("max mac_id=%d\n", mac_id); - - return mac_id; - -} -#endif - void rtw_sta_media_status_rpt(_adapter *adapter, struct sta_info *sta, bool connected) { struct macid_ctl_t *macid_ctl = &adapter->dvobj->macid_ctl; @@ -2428,7 +2353,8 @@ void rtw_sta_media_status_rpt(_adapter *adapter, struct sta_info *sta, bool conn role = H2C_MSR_ROLE_GC; else role = H2C_MSR_ROLE_STA; - } + } else if (MLME_IS_ADHOC(adapter) || MLME_IS_ADHOC_MASTER(adapter)) + role = H2C_MSR_ROLE_ADHOC; #ifdef CONFIG_WFD if (role == H2C_MSR_ROLE_GC @@ -2568,29 +2494,15 @@ _func_enter_; } #endif //defined (CONFIG_AP_MODE) && defined (CONFIG_NATIVEAP_MLME) - //for AD-HOC mode - psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); - if( psta != NULL) - { - //the sta have been in sta_info_queue => do nothing - - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Error: rtw_stassoc_event_callback: sta has been in sta_hash_queue \n")); - - goto exit; //(between drv has received this event before and fw have not yet to set key to CAM_ENTRY) - } - - psta = rtw_alloc_stainfo(&adapter->stapriv, pstassoc->macaddr); + /* for AD-HOC mode */ + psta = rtw_get_stainfo(&adapter->stapriv, pstassoc->macaddr); if (psta == NULL) { - RT_TRACE(_module_rtl871x_mlme_c_,_drv_err_,("Can't alloc sta_info when rtw_stassoc_event_callback\n")); + DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT" get no sta_info with "MAC_FMT"\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(pstassoc->macaddr)); + rtw_warn_on(1); goto exit; - } - - //to do : init sta_info variable - psta->qos_option = 0; - psta->mac_id = (uint)pstassoc->cam_id; - //psta->aid = (uint)pstassoc->cam_id; - DBG_871X("%s\n",__FUNCTION__); - //for ad-hoc mode + } + rtw_hal_set_odm_var(adapter,HAL_ODM_STA_INFO,psta,_TRUE); rtw_sta_media_status_rpt(adapter, psta, 1); @@ -2666,6 +2578,47 @@ _func_exit_; } #endif /* CONFIG_IEEE80211W */ +static void rtw_sta_mstatus_disc_rpt(_adapter *adapter, u8 mac_id) +{ + struct macid_ctl_t *macid_ctl = &adapter->dvobj->macid_ctl; + + DBG_871X("%s "ADPT_FMT" - mac_id=%d\n", __func__, ADPT_ARG(adapter), mac_id); + + if (mac_id >= 0 && mac_id < macid_ctl->num) { + rtw_hal_set_FwMediaStatusRpt_single_cmd(adapter, 0, 0, 0, 0, mac_id); + /* + * 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. */ + /*if (MLME_IS_STA(adapter))*/ + rtw_hal_macid_wakeup(adapter, mac_id); + } else { + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" invalid macid:%u\n" + , FUNC_ADPT_ARG(adapter), mac_id); + rtw_warn_on(1); + } +} + +void rtw_sta_mstatus_report(_adapter *adapter) +{ + struct mlme_priv *pmlmepriv = &adapter->mlmepriv; + struct wlan_network *tgt_network = &pmlmepriv->cur_network; + struct sta_info *psta = NULL; + + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { + psta = rtw_get_stainfo(&adapter->stapriv, tgt_network->network.MacAddress); + if (psta) { + rtw_sta_mstatus_disc_rpt(adapter, psta->mac_id); + } else { + DBG_871X("%s "ADPT_FMT" - mac_addr: "MAC_FMT" psta == NULL\n", __func__, ADPT_ARG(adapter), MAC_ARG(tgt_network->network.MacAddress)); + rtw_warn_on(1); + } + } +} + void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf) { _irqL irqL,irqL2; @@ -2684,24 +2637,20 @@ void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf) _func_enter_; - psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr); - if(psta) - mac_id = psta->mac_id; - else - mac_id = pstadel->mac_id; + DBG_871X("%s(mac_id=%d)=" MAC_FMT "\n", __func__, pstadel->mac_id, MAC_ARG(pstadel->macaddr)); + rtw_sta_mstatus_disc_rpt(adapter, pstadel->mac_id); - DBG_871X("%s(mac_id=%d)=" MAC_FMT "\n", __func__, mac_id, MAC_ARG(pstadel->macaddr)); + psta = rtw_get_stainfo(&adapter->stapriv, pstadel->macaddr); - if (mac_id >= 0 && mac_id < macid_ctl->num) { - rtw_hal_set_FwMediaStatusRpt_single_cmd(adapter, 0, 0, 0, 0, mac_id); - if (psta) - rtw_wfd_st_switch(psta, 0); - } else { - DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" invalid macid:%u\n" - , FUNC_ADPT_ARG(adapter), mac_id); - rtw_warn_on(1); + if (psta == NULL) { + DBG_871X("%s(mac_id=%d)=" MAC_FMT " psta == NULL\n", __func__, pstadel->mac_id, MAC_ARG(pstadel->macaddr)); + /*rtw_warn_on(1);*/ } + if (psta) + rtw_wfd_st_switch(psta, 0); + + //if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) if((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) { @@ -2755,7 +2704,7 @@ _func_enter_; rtw_free_uc_swdec_pending_queue(adapter); rtw_free_assoc_resources(adapter, 1); - rtw_indicate_disconnect(adapter); + rtw_indicate_disconnect(adapter, *(u16 *)pstadel->rsvd, pstadel->locally_generated); rtw_free_mlme_priv_ie_data(pmlmepriv); _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL); @@ -2908,7 +2857,7 @@ _func_enter_; } #endif // CONFIG_INTEL_WIDI DBG_871X("%s We've try roaming but fail\n", __FUNCTION__); - rtw_indicate_disconnect(adapter); + rtw_indicate_disconnect(adapter, 0, _FALSE); break; } } @@ -2916,12 +2865,12 @@ _func_enter_; } else #endif { - rtw_indicate_disconnect(adapter); + rtw_indicate_disconnect(adapter, 0, _FALSE); free_scanqueue(pmlmepriv);//??? #ifdef CONFIG_IOCTL_CFG80211 //indicate disconnect for the case that join_timeout and check_fwstate != FW_LINKED - rtw_cfg80211_indicate_disconnect(adapter); + rtw_cfg80211_indicate_disconnect(adapter, 0, _FALSE); #endif //CONFIG_IOCTL_CFG80211 } @@ -2994,6 +2943,14 @@ void rtw_mlme_reset_auto_scan_int(_adapter *adapter) goto exit; } #endif + +#ifdef CONFIG_TDLS + if (adapter->tdlsinfo.link_established == _TRUE) { + mlme->auto_scan_int_ms = 0; + goto exit; + } +#endif + if(pmlmeinfo->VHT_enable) //disable auto scan when connect to 11AC AP { mlme->auto_scan_int_ms = 0; @@ -3507,7 +3464,7 @@ candidate_exist: #endif { rtw_disassoc_cmd(adapter, 0, _TRUE); - rtw_indicate_disconnect(adapter); + rtw_indicate_disconnect(adapter, 0, _FALSE); rtw_free_assoc_resources(adapter, 0); } } @@ -3517,10 +3474,10 @@ candidate_exist: if(_TRUE == bSupportAntDiv) { u8 CurrentAntenna; - rtw_hal_get_def_var(adapter, HAL_DEF_CURRENT_ANTENNA, &(CurrentAntenna)); + rtw_hal_get_odm_var(adapter, HAL_ODM_ANTDIV_SELECT, &(CurrentAntenna), NULL); DBG_871X("#### Opt_Ant_(%s) , cur_Ant(%s)\n", - (2==candidate->network.PhyInfo.Optimum_antenna)?"A":"B", - (2==CurrentAntenna)?"A":"B" + (MAIN_ANT == candidate->network.PhyInfo.Optimum_antenna) ? "MAIN_ANT":"AUX_ANT", + (MAIN_ANT == CurrentAntenna) ? "MAIN_ANT":"AUX_ANT" ); } #endif @@ -4148,6 +4105,7 @@ void rtw_build_wmm_ie_ht(_adapter *padapter, u8 *out_ie, uint *pout_len) unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, uint in_len, uint *pout_len, u8 channel) { u32 ielen, out_len; + u32 rx_packet_offset, max_recvbuf_sz; HT_CAP_AMPDU_FACTOR max_rx_ampdu_factor; HT_CAP_AMPDU_DENSITY best_ampdu_density; unsigned char *p, *pframe; @@ -4278,10 +4236,10 @@ unsigned int rtw_restructure_ht_ie(_adapter *padapter, u8 *in_ie, u8 *out_ie, ui u32 rx_packet_offset, max_recvbuf_sz; rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); - //if(max_recvbuf_sz-rx_packet_offset>(8191-256)) { - // DBG_871X("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__); - // ht_capie.cap_info = ht_capie.cap_info |IEEE80211_HT_CAP_MAX_AMSDU; - //} + if (max_recvbuf_sz-rx_packet_offset >= (8191-256)) { + DBG_871X("%s IEEE80211_HT_CAP_MAX_AMSDU is set\n", __FUNCTION__); + ht_capie.cap_info = ht_capie.cap_info | IEEE80211_HT_CAP_MAX_AMSDU; + } } /* AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k @@ -4404,17 +4362,10 @@ void rtw_update_ht_cap(_adapter *padapter, u8 *pie, uint ie_len, u8 channel) phtpriv->ampdu_enable = _TRUE; } else - { phtpriv->ampdu_enable = _TRUE; - } - } - else if(pregistrypriv->ampdu_enable==2) - { - //remove this part because testbed AP should disable RX AMPDU - //phtpriv->ampdu_enable = _TRUE; - } + } + - //check Max Rx A-MPDU Size len = 0; p = rtw_get_ie(pie+sizeof (NDIS_802_11_FIXED_IEs), _HT_CAPABILITY_IE_, &len, ie_len-sizeof (NDIS_802_11_FIXED_IEs)); @@ -4743,7 +4694,7 @@ void _rtw_roaming(_adapter *padapter, struct wlan_network *tgt_network) continue; } else { DBG_871X("%s(%d) -to roaming fail, indicate_disconnect\n", __FUNCTION__,__LINE__); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); break; } } diff --git a/rtl8188FU/core/rtw_mlme_ext.c b/rtl8188FU/core/rtw_mlme_ext.c index 4cd5770..bbf78ec 100755 --- a/rtl8188FU/core/rtw_mlme_ext.c +++ b/rtl8188FU/core/rtw_mlme_ext.c @@ -152,6 +152,7 @@ static RT_CHANNEL_PLAN_2G RTW_ChannelPlan2G[] = { /* 5, RTW_RD_2G_ETSI2 */ {{10, 11, 12, 13}, 4}, /* 6, RTW_RD_2G_GLOBAL */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14}, /* 7, RTW_RD_2G_MKK2 */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, + /* 8, RTW_RD_2G_FCC2 */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, }; static RT_CHANNEL_PLAN_5G RTW_ChannelPlan5G[] = { @@ -242,7 +243,7 @@ static RT_CHANNEL_PLAN_MAP RTW_ChannelPlanMap[] = { {RTW_RD_2G_MKK1, RTW_RD_5G_MKK1, TXPWR_LMT_MKK}, /* 0x27, RTW_CHPLAN_MKK1_MKK1 */ {RTW_RD_2G_WORLD, RTW_RD_5G_KCC1, TXPWR_LMT_ETSI}, /* 0x28, RTW_CHPLAN_WORLD_KCC1 */ {RTW_RD_2G_WORLD, RTW_RD_5G_FCC2, TXPWR_LMT_FCC}, /* 0x29, RTW_CHPLAN_WORLD_FCC2 */ - {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x2A, */ + {RTW_RD_2G_FCC2, RTW_RD_5G_NULL, TXPWR_LMT_FCC}, /* 0x2A, RTW_CHPLAN_FCC2_NULL */ {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x2B, */ {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x2C, */ {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x2D, */ @@ -290,6 +291,13 @@ static RT_CHANNEL_PLAN_MAP RTW_ChannelPlanMap[] = { {RTW_RD_2G_FCC1, RTW_RD_5G_FCC10, TXPWR_LMT_FCC}, /* 0x57, RTW_CHPLAN_FCC1_FCC10 */ {RTW_RD_2G_MKK2, RTW_RD_5G_MKK4, TXPWR_LMT_MKK}, /* 0x58, RTW_CHPLAN_MKK2_MKK4 */ {RTW_RD_2G_WORLD, RTW_RD_5G_ETSI14, TXPWR_LMT_ETSI}, /* 0x59, RTW_CHPLAN_WORLD_ETSI14 */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5A, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5B, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5C, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5D, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5E, */ + {RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW}, /* 0x5F, */ + {RTW_RD_2G_FCC1, RTW_RD_5G_FCC5, TXPWR_LMT_FCC}, /* 0x60, RTW_CHPLAN_FCC1_FCC5 */ }; static RT_CHANNEL_PLAN_MAP RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = { @@ -300,11 +308,6 @@ bool rtw_chplan_is_empty(u8 id) { RT_CHANNEL_PLAN_MAP *chplan_map; - if (!rtw_is_channel_plan_valid(id)) { - rtw_warn_on(1); - return _FALSE; - } - if (id == RTW_CHPLAN_REALTEK_DEFINE) chplan_map = &RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE; else @@ -566,12 +569,43 @@ bool rtw_choose_available_chbw(_adapter *adapter, u8 req_bw, u8 *dec_ch, u8 *dec return (i < mlmeext->max_chan_nums)?_TRUE:_FALSE; } +void dump_country_chplan(void *sel, const struct country_chplan *ent) +{ + DBG_871X_SEL(sel, "\"%c%c\", 0x%02X%s\n" + , ent->alpha2[0], ent->alpha2[1], ent->chplan + , COUNTRY_CHPLAN_EN_11AC(ent) ? " ac" : "" + ); +} + +void dump_country_chplan_map(void *sel) +{ + const struct country_chplan *ent; + u8 code[2]; + +#if RTW_DEF_MODULE_REGULATORY_CERT + DBG_871X_SEL(sel, "RTW_DEF_MODULE_REGULATORY_CERT:0x%x\n", RTW_DEF_MODULE_REGULATORY_CERT); +#endif +#ifdef CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP + DBG_871X_SEL(sel, "CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP\n"); +#endif + + for (code[0] = 'A'; code[0] <= 'Z'; code[0]++) { + for (code[1] = 'A'; code[1] <= 'Z'; code[1]++) { + ent = rtw_get_chplan_from_country(code); + if (!ent) + continue; + + dump_country_chplan(sel, ent); + } + } +} + void dump_chplan_id_list(void *sel) { int i; for (i = 0; i < RTW_CHPLAN_MAX; i++) { - if (rtw_chplan_is_empty(i)) + if (!rtw_is_channel_plan_valid(i)) continue; DBG_871X_SEL(sel, "0x%02X ", i); @@ -634,8 +668,13 @@ void dump_cur_chset(void *sel, _adapter *adapter) struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); - DBG_871X_SEL_NL(sel, "Channel plan ID:0x%02X, 2G_PLS:%u, 5G_PLS:%u\n" - , mlme->ChannelPlan, hal_data->Regulation2_4G, hal_data->Regulation5G); + if (mlme->country_ent) + dump_country_chplan(sel, mlme->country_ent); + else + DBG_871X_SEL_NL(sel, "chplan:0x%02X\n", mlme->ChannelPlan); + + DBG_871X_SEL_NL(sel, "2G_PLS:%u, 5G_PLS:%u\n" + , hal_data->Regulation2_4G, hal_data->Regulation5G); dump_chset(sel, mlmeext->channel_set); } @@ -855,7 +894,7 @@ static u8 init_channel_set(_adapter* padapter, u8 ChannelPlan, RT_CHANNEL_INFO * HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter); if (!rtw_is_channel_plan_valid(ChannelPlan)) { - DBG_871X("ChannelPlan ID %x error !!!!!\n",ChannelPlan); + DBG_871X_LEVEL(_drv_err_, "ChannelPlan ID 0x%02X error !!!!!\n", ChannelPlan); return chanset_size; } @@ -1465,7 +1504,7 @@ _continue: psta->state |= _FW_LINKED; _exit_critical_bh(&psta->lock, &irqL); - report_add_sta_event(padapter, psta->hwaddr, psta->aid); + report_add_sta_event(padapter, psta->hwaddr); } @@ -1617,7 +1656,6 @@ unsigned int OnProbeRsp(_adapter *padapter, union recv_frame *precv_frame) unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) { - int cam_idx; struct sta_info *psta; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -1632,6 +1670,9 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_TDLS struct sta_info *ptdls_sta; struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; +#ifdef CONFIG_TDLS_CH_SW + struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; +#endif #endif /* CONFIG_TDLS */ #ifdef CONFIG_ATTEMPT_TO_FIX_AP_BEACON_ERROR @@ -1729,7 +1770,7 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) { // join wrong channel, deauth and reconnect issue_deauth(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_DEAUTH_LEAVING); - report_del_sta_event(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_JOIN_WRONG_CHANNEL, _TRUE); + report_del_sta_event(padapter, (&(pmlmeinfo->network))->MacAddress, WLAN_REASON_JOIN_WRONG_CHANNEL, _TRUE, _FALSE); pmlmeinfo->state &= (~WIFI_FW_ASSOC_SUCCESS); return _SUCCESS; } @@ -1738,7 +1779,7 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) ret = rtw_check_bcn_info(padapter, pframe, len); if (!ret) { DBG_871X_LEVEL(_drv_always_, "ap has changed, disconnect now\n "); - receive_disconnect(padapter, pmlmeinfo->network.MacAddress , 0); + receive_disconnect(padapter, pmlmeinfo->network.MacAddress , 0, _FALSE); return _SUCCESS; } //update WMM, ERP in the beacon @@ -1753,16 +1794,16 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_TDLS #ifdef CONFIG_TDLS_CH_SW - if (padapter->tdlsinfo.ch_switch_prohibited == _FALSE) + if (rtw_tdls_is_chsw_allowed(padapter) == _TRUE) { /* Send TDLS Channel Switch Request when receiving Beacon */ - if ((padapter->tdlsinfo.chsw_info.ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) && (pmlmeext->cur_channel == rtw_get_oper_ch(padapter))) { - ptdlsinfo->chsw_info.ch_sw_state |= TDLS_WAIT_CH_RSP_STATE; - /* DBG_871X("[%s] issue_tdls_ch_switch_req to "MAC_FMT"\n", __FUNCTION__, MAC_ARG(padapter->tdlsinfo.chsw_info.addr)); */ + if ((padapter->tdlsinfo.chsw_info.ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) && (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) + && (pmlmeext->cur_channel == rtw_get_oper_ch(padapter))) { ptdls_sta = rtw_get_stainfo(&padapter->stapriv, padapter->tdlsinfo.chsw_info.addr); if (ptdls_sta != NULL) { - if (ptdls_sta->tdls_sta_state | TDLS_LINKED_STATE) - issue_tdls_ch_switch_req(padapter, ptdls_sta); + if (ptdls_sta->tdls_sta_state | TDLS_LINKED_STATE) { + _set_timer(&ptdls_sta->stay_on_base_chnl_timer, TDLS_CH_SW_STAY_ON_BASE_CHNL_TIMEOUT); + } } } } @@ -1784,46 +1825,47 @@ unsigned int OnBeacon(_adapter *padapter, union recv_frame *precv_frame) psta->sta_stats.rx_mgnt_pkts++; #endif } - } - else if((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - if ((psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe))) != NULL) - { - //update WMM, ERP in the beacon - //todo: the timer is used instead of the number of the beacon received + + } else if ((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) { + _irqL irqL; + u8 rate_set[16]; + u8 rate_num = 0; + + psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta != NULL) { + /* + * update WMM, ERP in the beacon + * todo: the timer is used instead of the number of the beacon received + */ if ((sta_rx_pkts(psta) & 0xf) == 0) - { - //DBG_871X("update_bcn_info\n"); update_beacon_info(padapter, pframe, len, psta); - } if (pmlmeext->en_hw_update_tsf) rtw_enable_hw_update_tsf_cmd(padapter); - #if 0 //move to validate_recv_mgnt_frame - psta->sta_stats.rx_mgnt_pkts++; - #endif - } - else - { - //allocate a new CAM entry for IBSS station - if ((cam_idx = allocate_fw_sta_entry(padapter)) == NUM_STA) - { + } else { + rtw_ies_get_supported_rate(pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_, len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_, rate_set, &rate_num); + if (rate_num == 0) { + DBG_871X(FUNC_ADPT_FMT" RX beacon with no supported rate\n", FUNC_ADPT_ARG(padapter)); goto _END_ONBEACON_; } - //get supported rate - if (update_sta_support_rate(padapter, (pframe + WLAN_HDR_A3_LEN + _BEACON_IE_OFFSET_), (len - WLAN_HDR_A3_LEN - _BEACON_IE_OFFSET_), cam_idx) == _FAIL) - { - pmlmeinfo->FW_sta_info[cam_idx].status = 0; + psta = rtw_alloc_stainfo(pstapriv, GetAddr2Ptr(pframe)); + if (psta == NULL) { + DBG_871X(FUNC_ADPT_FMT" Exceed the upper limit of supported clients\n", FUNC_ADPT_ARG(padapter)); goto _END_ONBEACON_; } + psta->expire_to = pstapriv->adhoc_expire_to; + + _rtw_memcpy(psta->bssrateset, rate_set, rate_num); + psta->bssratelen = rate_num; + //update TSF Value update_TSF(pmlmeext, pframe, len); //report sta add event - report_add_sta_event(padapter, GetAddr2Ptr(pframe), cam_idx); + report_add_sta_event(padapter, GetAddr2Ptr(pframe)); } } } @@ -2240,8 +2282,8 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) unsigned char reassoc, *p, *pos, *wpa_ie; unsigned char WMM_IE[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; int i, ie_len, wpa_ie_len, left; - unsigned char supportRate[16]; - int supportRateNum; + u8 rate_set[16]; + u8 rate_num; unsigned short status = _STATS_SUCCESSFUL_; unsigned short frame_type, ie_offset=0; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -2386,39 +2428,14 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) if(_STATS_SUCCESSFUL_ != status) goto OnAssocReqFail; - // check if the supported rate is ok - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _SUPPORTEDRATES_IE_, &ie_len, pkt_len - WLAN_HDR_A3_LEN - ie_offset); - if (p == NULL) { - DBG_871X("Rx a sta assoc-req which supported rate is empty!\n"); - // use our own rate set as statoin used - //_rtw_memcpy(supportRate, AP_BSSRATE, AP_BSSRATE_LEN); - //supportRateNum = AP_BSSRATE_LEN; - + rtw_ies_get_supported_rate(pframe + WLAN_HDR_A3_LEN + ie_offset, pkt_len - WLAN_HDR_A3_LEN - ie_offset, rate_set, &rate_num); + if (rate_num == 0) { + DBG_871X(FUNC_ADPT_FMT" RX assoc-req with no supported rate\n", FUNC_ADPT_ARG(padapter)); status = _STATS_FAILURE_; goto OnAssocReqFail; } - else { - _rtw_memcpy(supportRate, p+2, ie_len); - supportRateNum = ie_len; - - p = rtw_get_ie(pframe + WLAN_HDR_A3_LEN + ie_offset, _EXT_SUPPORTEDRATES_IE_ , &ie_len, - pkt_len - WLAN_HDR_A3_LEN - ie_offset); - if (p != NULL) { - - if(supportRateNum<=sizeof(supportRate)) - { - _rtw_memcpy(supportRate+supportRateNum, p+2, ie_len); - supportRateNum += ie_len; - } - } - } - - //todo: mask supportRate between AP & STA -> move to update raid - //get_matched_rate(pmlmeext, supportRate, &supportRateNum, 0); - - //update station supportRate - pstat->bssratelen = supportRateNum; - _rtw_memcpy(pstat->bssrateset, supportRate, supportRateNum); + _rtw_memcpy(pstat->bssrateset, rate_set, rate_num); + pstat->bssratelen = rate_num; UpdateBrateTblForSoftAP(pstat->bssrateset, pstat->bssratelen); //check RSN/WPA/WPS @@ -2632,6 +2649,9 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) #ifdef CONFIG_80211N_HT + if (pmlmepriv->htpriv.ht_option == _FALSE) + goto bypass_ht_chk; + /* save HT capabilities in the sta object */ _rtw_memset(&pstat->htpriv.ht_cap, 0, sizeof(struct rtw_ieee80211_ht_cap)); if (elems.ht_capabilities && elems.ht_capabilities_len >= sizeof(struct rtw_ieee80211_ht_cap)) @@ -2644,17 +2664,19 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) } else pstat->flags &= ~WLAN_STA_HT; +bypass_ht_chk: - - if((pmlmepriv->htpriv.ht_option == _FALSE) && (pstat->flags&WLAN_STA_HT)) - { + if ((pmlmepriv->htpriv.ht_option == _FALSE) && (pstat->flags&WLAN_STA_HT)) { + rtw_warn_on(1); status = _STATS_FAILURE_; goto OnAssocReqFail; } - #endif /* CONFIG_80211N_HT */ #ifdef CONFIG_80211AC_VHT + if (pmlmepriv->vhtpriv.vht_option == _FALSE) + goto bypass_vht_chk; + _rtw_memset(&pstat->vhtpriv, 0, sizeof(struct vht_priv)); if (elems.vht_capabilities && elems.vht_capabilities_len == 12) { pstat->flags |= WLAN_STA_VHT; @@ -2672,9 +2694,10 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) else { pstat->flags &= ~WLAN_STA_VHT; } +bypass_vht_chk: - if((pmlmepriv->vhtpriv.vht_option == _FALSE) && (pstat->flags&WLAN_STA_VHT)) - { + if ((pmlmepriv->vhtpriv.vht_option == _FALSE) && (pstat->flags&WLAN_STA_VHT)) { + rtw_warn_on(1); status = _STATS_FAILURE_; goto OnAssocReqFail; } @@ -2837,7 +2860,7 @@ unsigned int OnAssocReq(_adapter *padapter, union recv_frame *precv_frame) #endif /* CONFIG_IEEE80211W */ { /* .3-(1) report sta add event */ - report_add_sta_event(padapter, pstat->hwaddr, pstat->aid); + report_add_sta_event(padapter, pstat->hwaddr); } #ifdef CONFIG_IEEE80211W if (pstat->bpairwise_key_installed == _TRUE && padapter->securitypriv.binstallBIPkey == _TRUE) { @@ -3099,7 +3122,7 @@ unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) if ( 0 == ignore_received_deauth ) { - receive_disconnect(padapter, GetAddr2Ptr(pframe), reason); + receive_disconnect(padapter, GetAddr2Ptr(pframe), reason, _FALSE); } } pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; @@ -3176,7 +3199,7 @@ unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" reason=%u, ta=%pM\n" , FUNC_ADPT_ARG(padapter), reason, GetAddr2Ptr(pframe)); - receive_disconnect(padapter, GetAddr2Ptr(pframe), reason); + receive_disconnect(padapter, GetAddr2Ptr(pframe), reason, _FALSE); } pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; return _SUCCESS; @@ -7487,6 +7510,47 @@ s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntfram #endif //!CONFIG_XMIT_ACK } +s32 dump_mgntframe_and_wait_ack_timeout(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms) +{ +#ifdef CONFIG_XMIT_ACK + static u8 seq_no = 0; + s32 ret = _FAIL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + #ifdef CONFIG_CONCURRENT_MODE + if (padapter->pbuddy_adapter && !padapter->isprimary) + pxmitpriv = &(padapter->pbuddy_adapter->xmitpriv); + #endif + + if (RTW_CANNOT_RUN(padapter)) { + rtw_free_xmitbuf(&padapter->xmitpriv, pmgntframe->pxmitbuf); + rtw_free_xmitframe(&padapter->xmitpriv, pmgntframe); + return -1; + } + + _enter_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL); + pxmitpriv->ack_tx = _TRUE; + pxmitpriv->seq_no = seq_no++; + pmgntframe->ack_report = 1; + rtw_sctx_init(&(pxmitpriv->ack_tx_ops), timeout_ms); + if (rtw_hal_mgnt_xmit(padapter, pmgntframe) == _SUCCESS) { +#ifdef CONFIG_XMIT_ACK_POLLING + ret = rtw_ack_tx_polling(pxmitpriv, timeout_ms); +#else + ret = rtw_sctx_wait(&(pxmitpriv->ack_tx_ops), __func__); +#endif + } + + pxmitpriv->ack_tx = _FALSE; + _exit_critical_mutex(&pxmitpriv->ack_tx_mutex, NULL); + + return ret; +#else //!CONFIG_XMIT_ACK + dump_mgntframe(padapter, pmgntframe); + rtw_msleep_os(50); + return _SUCCESS; +#endif //!CONFIG_XMIT_ACK +} + int update_hidden_ssid(u8 *ies, u32 ies_len, u8 hidden_ssid_mode) { u8 *ssid_ie; @@ -9937,6 +10001,62 @@ inline void issue_addba_rsp(_adapter *adapter, unsigned char *ra, u8 tid, u16 st } /** + * issue_addba_rsp_wait_ack - TX ADDBA_RESP and wait ack + * @adapter: the adapter to TX + * @ra: receiver address + * @tid: tid + * @status: status code + * @size: the announced AMPDU buffer size + * @try_cnt: the maximal TX count to try + * @wait_ms: == 0 means that there is no need to wait ack through C2H_CCX_TX_RPT + * > 0 means you want to wait ack through C2H_CCX_TX_RPT, and the value of wait_ms means the interval between each TX + */ +inline u8 issue_addba_rsp_wait_ack(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size, int try_cnt, int wait_ms) +{ + int ret = _FAIL; + int i = 0; + u32 start = rtw_get_current_time(); + + if (rtw_rfctl_is_tx_blocked_by_cac(adapter_to_rfctl(adapter))) + goto exit; + + do { + ret = issue_action_ba(adapter, ra, RTW_WLAN_ACTION_ADDBA_RESP + , tid + , size + , status + , 0 /* unused */ + , _TRUE + ); + + i++; + + if (RTW_CANNOT_RUN(adapter)) + break; + + if (i < try_cnt && wait_ms > 0 && ret == _FAIL) + rtw_msleep_os(wait_ms); + + } while ((i < try_cnt) && ((ret == _FAIL) || (wait_ms == 0))); + + if (ret != _FAIL) { + ret = _SUCCESS; + #ifndef DBG_XMIT_ACK + /* goto exit; */ + #endif + } + + if (try_cnt && wait_ms) { + DBG_871X(FUNC_ADPT_FMT" ra="MAC_FMT" tid=%u%s, %d/%d in %u ms\n" + , FUNC_ADPT_ARG(adapter), MAC_ARG(ra), tid + , ret == _SUCCESS?", acked":"", i, try_cnt, rtw_get_passing_time_ms(start)); + } + +exit: + return ret; +} + +/** * issue_del_ba - TX DELBA * @adapter: the adapter to TX * @ra: receiver address @@ -10571,8 +10691,7 @@ u8 collect_bss_info(_adapter *padapter, union recv_frame *precv_frame, WLAN_BSSI bssid->PhyInfo.SignalQuality = precv_frame->u.hdr.attrib.phy_info.SignalQuality;//in percentage bssid->PhyInfo.SignalStrength = precv_frame->u.hdr.attrib.phy_info.SignalStrength;//in percentage #ifdef CONFIG_ANTENNA_DIVERSITY - //rtw_hal_get_hwreg(padapter, HW_VAR_CURRENT_ANTENNA, (u8 *)(&bssid->PhyInfo.Optimum_antenna)); - rtw_hal_get_def_var(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); + rtw_hal_get_odm_var(padapter, HAL_ODM_ANTDIV_SELECT, &(bssid->PhyInfo.Optimum_antenna), NULL); #endif // checking SSID @@ -10985,7 +11104,7 @@ void start_clnt_assoc(_adapter* padapter) set_link_timer(pmlmeext, REASSOC_TO); } -unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason) +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, u8 locally_generated) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); @@ -10997,16 +11116,12 @@ unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsi if((pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE) { - if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) - { - pmlmeinfo->state = WIFI_FW_NULL_STATE; - report_del_sta_event(padapter, MacAddr, reason, _TRUE); - - } - else if (pmlmeinfo->state & WIFI_FW_LINKING_STATE) - { - pmlmeinfo->state = WIFI_FW_NULL_STATE; - report_join_res(padapter, -2); + if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) { + if (report_del_sta_event(padapter, MacAddr, reason, _TRUE, locally_generated) != _FAIL) + pmlmeinfo->state = WIFI_FW_NULL_STATE; + } else if (pmlmeinfo->state & WIFI_FW_LINKING_STATE) { + if (report_join_res(padapter, -2) != _FAIL) + pmlmeinfo->state = WIFI_FW_NULL_STATE; } else DBG_871X(FUNC_ADPT_FMT" - End to Disconnect\n", FUNC_ADPT_ARG(padapter)); } @@ -11417,7 +11532,7 @@ void report_surveydone_event(_adapter *padapter) } -void report_join_res(_adapter *padapter, int res) +u32 report_join_res(_adapter *padapter, int res) { struct cmd_obj *pcmd_obj; u8 *pevtcmd; @@ -11427,17 +11542,16 @@ void report_join_res(_adapter *padapter, int res) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct cmd_priv *pcmdpriv = &padapter->cmdpriv; + u32 ret = _FAIL; if ((pcmd_obj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj))) == NULL) - { - return; - } + goto exit; cmdsz = (sizeof(struct joinbss_event) + sizeof(struct C2HEvent_Header)); - if ((pevtcmd = (u8*)rtw_zmalloc(cmdsz)) == NULL) - { + pevtcmd = (u8 *)rtw_zmalloc(cmdsz); + if (pevtcmd == NULL) { rtw_mfree((u8 *)pcmd_obj, sizeof(struct cmd_obj)); - return; + goto exit; } _rtw_init_listhead(&pcmd_obj->list); @@ -11464,10 +11578,10 @@ void report_join_res(_adapter *padapter, int res) rtw_joinbss_event_prehandle(padapter, (u8 *)&pjoinbss_evt->network); - rtw_enqueue_cmd(pcmdpriv, pcmd_obj); - - return; + ret = rtw_enqueue_cmd(pcmdpriv, pcmd_obj); +exit: + return ret; } void report_wmm_edca_update(_adapter *padapter) @@ -11516,7 +11630,7 @@ void report_wmm_edca_update(_adapter *padapter) } -void report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, bool enqueue) +u32 report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, bool enqueue, u8 locally_generated) { struct cmd_obj *pcmd_obj; u8 *pevtcmd; @@ -11551,6 +11665,7 @@ void report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned s else mac_id = (-1); pdel_sta_evt->mac_id = mac_id; + pdel_sta_evt->locally_generated = locally_generated; if (!enqueue) { /* do directly */ @@ -11580,10 +11695,10 @@ exit: DBG_871X(FUNC_ADPT_FMT" "MAC_FMT" mac_id=%d, enqueue:%d, res:%u\n" , FUNC_ADPT_ARG(padapter), MAC_ARG(MacAddr), mac_id, enqueue, res); - return; + return res; } -void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx) +void report_add_sta_event(_adapter *padapter, unsigned char *MacAddr) { struct cmd_obj *pcmd_obj; u8 *pevtcmd; @@ -11621,7 +11736,6 @@ void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_id padd_sta_evt = (struct stassoc_event*)(pevtcmd + sizeof(struct C2HEvent_Header)); _rtw_memcpy((unsigned char *)(&(padd_sta_evt->macaddr)), MacAddr, ETH_ALEN); - padd_sta_evt->cam_id = cam_idx; DBG_871X("report_add_sta_event: add STA\n"); @@ -11814,22 +11928,6 @@ static void rtw_mlmeext_disconnect(_adapter *padapter) //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); @@ -11960,8 +12058,6 @@ void mlmeext_joinbss_event_callback(_adapter *padapter, int join_res) psta = rtw_get_stainfo(pstapriv, cur_network->MacAddress); if (psta) //only for infra. mode { - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - //DBG_871X("set_sta_rate\n"); psta->wireless_mode = pmlmeext->cur_wireless_mode; @@ -12036,28 +12132,16 @@ void mlmeext_sta_add_event_callback(_adapter *padapter, struct sta_info *psta) correct_TSF(padapter, pmlmeext); //start beacon - if(send_beacon(padapter)==_FAIL) - { - pmlmeinfo->FW_sta_info[psta->mac_id].status = 0; - - pmlmeinfo->state ^= WIFI_FW_ADHOC_STATE; - - return; - } + if (send_beacon(padapter) == _FAIL) + rtw_warn_on(1); pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; - } join_type = 2; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); } - pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; - - psta->bssratelen = rtw_get_rateset_len(pmlmeinfo->FW_sta_info[psta->mac_id].SupportedRates); - _rtw_memcpy(psta->bssrateset, pmlmeinfo->FW_sta_info[psta->mac_id].SupportedRates, psta->bssratelen); - //update adhoc sta_info update_sta_info(padapter, psta); @@ -12093,9 +12177,8 @@ void _linked_info_dump(_adapter *padapter) int i; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + HAL_DATA_TYPE *HalData = GET_HAL_DATA(padapter); int UndecoratedSmoothedPWDB = 0; - struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); - struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); if(padapter->bLinkInfoDump){ @@ -12130,19 +12213,14 @@ void _linked_info_dump(_adapter *padapter) _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); } - for(i=0; i<macid_ctl->num; i++) - { - if(rtw_macid_is_used(macid_ctl, i) - && !rtw_macid_is_bmc(macid_ctl, i) /* skip bc/mc sta */ - ) { - //============ tx info ============ - rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, &i); - } - } - rtw_hal_set_odm_var(padapter, HAL_ODM_RX_INFO_DUMP, NULL, _FALSE); + /*============ tx info ============ */ + rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, RTW_DBGDUMP); + + rtw_hal_set_odm_var(padapter, HAL_ODM_RX_INFO_DUMP, RTW_DBGDUMP, _FALSE); + } - + } void rtw_delba_check(_adapter *padapter, struct sta_info *psta, u8 from_timer) @@ -12236,6 +12314,37 @@ u8 chk_ap_is_alive(_adapter *padapter, struct sta_info *psta) return ret; } +u8 chk_adhoc_peer_is_alive(struct sta_info *psta) +{ + u8 ret = _TRUE; + + #ifdef DBG_EXPIRATION_CHK + DBG_871X("sta:"MAC_FMT", rssi:%d, rx:"STA_PKTS_FMT", beacon:%llu, probersp_to_self:%llu" + /*", probersp_bm:%llu, probersp_uo:%llu, probereq:%llu, BI:%u"*/ + ", expire_to:%u\n" + , MAC_ARG(psta->hwaddr) + , psta->rssi_stat.UndecoratedSmoothedPWDB + , STA_RX_PKTS_DIFF_ARG(psta) + , psta->sta_stats.rx_beacon_pkts - psta->sta_stats.last_rx_beacon_pkts + , psta->sta_stats.rx_probersp_pkts - psta->sta_stats.last_rx_probersp_pkts + /*, psta->sta_stats.rx_probersp_bm_pkts - psta->sta_stats.last_rx_probersp_bm_pkts + , psta->sta_stats.rx_probersp_uo_pkts - psta->sta_stats.last_rx_probersp_uo_pkts + , psta->sta_stats.rx_probereq_pkts - psta->sta_stats.last_rx_probereq_pkts + , pmlmeinfo->bcn_interval*/ + , psta->expire_to + ); + #endif + + if (sta_rx_data_pkts(psta) == sta_last_rx_data_pkts(psta) + && sta_rx_beacon_pkts(psta) == sta_last_rx_beacon_pkts(psta) + && sta_rx_probersp_pkts(psta) == sta_last_rx_probersp_pkts(psta)) + ret = _FALSE; + + sta_update_last_rx_pkts(psta); + + return ret; +} + #ifdef CONFIG_TDLS u8 chk_tdls_peer_sta_is_alive(_adapter *padapter, struct sta_info *psta) { @@ -12248,10 +12357,10 @@ u8 chk_tdls_peer_sta_is_alive(_adapter *padapter, struct sta_info *psta) void linked_status_chk_tdls(_adapter *padapter) { -struct candidate_pool{ - struct sta_info *psta; - u8 addr[ETH_ALEN]; -}; + struct candidate_pool { + struct sta_info *psta; + u8 addr[ETH_ALEN]; + }; struct sta_priv *pstapriv = &padapter->stapriv; _irqL irqL; u8 ack_chk; @@ -12259,8 +12368,10 @@ struct candidate_pool{ int i, num_teardown=0, num_checkalive=0; _list *plist, *phead; struct tdls_txmgmt txmgmt; - struct candidate_pool checkalive[NUM_STA]; - struct candidate_pool teardown[NUM_STA]; + struct candidate_pool checkalive[MAX_ALLOWED_TDLS_STA_NUM]; + struct candidate_pool teardown[MAX_ALLOWED_TDLS_STA_NUM]; + u8 tdls_sta_max = _FALSE; + #define ALIVE_MIN 2 #define ALIVE_MAX 5 @@ -12305,8 +12416,16 @@ struct candidate_pool{ } psta->sta_stats.last_rx_data_pkts = psta->sta_stats.rx_data_pkts; psta->sta_stats.last_rx_tdls_disc_rsp_pkts = psta->sta_stats.rx_tdls_disc_rsp_pkts; + + if ((num_checkalive >= MAX_ALLOWED_TDLS_STA_NUM) || (num_teardown >= MAX_ALLOWED_TDLS_STA_NUM)) { + tdls_sta_max = _TRUE; + break; + } } } + + if (tdls_sta_max == _TRUE) + break; } _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); @@ -12471,7 +12590,7 @@ void linked_status_chk(_adapter *padapter, u8 from_timer) DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" disconnect or roaming\n", FUNC_ADPT_ARG(padapter)); receive_disconnect(padapter, pmlmeinfo->network.MacAddress - , WLAN_REASON_EXPIRATION_CHK); + , WLAN_REASON_EXPIRATION_CHK, _FALSE); return; } } else { @@ -12487,43 +12606,48 @@ void linked_status_chk(_adapter *padapter, u8 from_timer) } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) - } - else if (is_client_associated_to_ibss(padapter)) - { - //linked IBSS mode - //for each assoc list entry to check the rx pkt counter - for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) - { - if (pmlmeinfo->FW_sta_info[i].status == 1) - { - psta = pmlmeinfo->FW_sta_info[i].psta; + } else if (is_client_associated_to_ibss(padapter)) { + _irqL irqL; + _list *phead, *plist, dlist; - if(NULL==psta) continue; + _rtw_init_listhead(&dlist); - if (pmlmeinfo->FW_sta_info[i].rx_pkt == sta_rx_pkts(psta)) - { + _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - if(pmlmeinfo->FW_sta_info[i].retry<3) - { - pmlmeinfo->FW_sta_info[i].retry++; - } - else - { - pmlmeinfo->FW_sta_info[i].retry = 0; - pmlmeinfo->FW_sta_info[i].status = 0; - report_del_sta_event(padapter, psta->hwaddr, WLAN_REASON_EXPIRATION_CHK, _TRUE); - } - } + for (i = 0; i < NUM_STA; i++) { + + phead = &(pstapriv->sta_hash[i]); + plist = get_next(phead); + while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); + plist = get_next(plist); + + if (is_broadcast_mac_addr(psta->hwaddr)) + continue; + + if (chk_adhoc_peer_is_alive(psta) || !psta->expire_to) + psta->expire_to = pstapriv->adhoc_expire_to; else - { - pmlmeinfo->FW_sta_info[i].retry = 0; - pmlmeinfo->FW_sta_info[i].rx_pkt = (u32)sta_rx_pkts(psta); + psta->expire_to--; + + if (psta->expire_to <= 0) { + rtw_list_delete(&psta->list); + rtw_list_insert_tail(&psta->list, &dlist); } } } - //set_link_timer(pmlmeext, DISCONNECT_TO); + _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); + plist = get_next(&dlist); + while (rtw_end_of_queue_search(&dlist, plist) == _FALSE) { + psta = LIST_CONTAINOR(plist, struct sta_info, list); + plist = get_next(plist); + rtw_list_delete(&psta->list); + DBG_871X(FUNC_ADPT_FMT" ibss expire "MAC_FMT"\n" + , FUNC_ADPT_ARG(padapter), MAC_ARG(psta->hwaddr)); + report_del_sta_event(padapter, psta->hwaddr, WLAN_REASON_EXPIRATION_CHK, from_timer ? _TRUE : _FALSE, _FALSE); + } } } @@ -12613,68 +12737,6 @@ void link_timer_hdl(_adapter *padapter) issue_assocreq(padapter); set_link_timer(pmlmeext, REASSOC_TO); } -#if 0 - else if (is_client_associated_to_ap(padapter)) - { - //linked infrastructure client mode - if ((psta = rtw_get_stainfo(pstapriv, pmlmeinfo->network.MacAddress)) != NULL) - { - /*to monitor whether the AP is alive or not*/ - if (rx_pkt == psta->sta_stats.rx_pkts) - { - receive_disconnect(padapter, pmlmeinfo->network.MacAddress); - return; - } - else - { - rx_pkt = psta->sta_stats.rx_pkts; - set_link_timer(pmlmeext, DISCONNECT_TO); - } - - //update the EDCA paramter according to the Tx/RX mode - update_EDCA_param(padapter); - - /*to send the AP a nulldata if no frame is xmitted in order to keep alive*/ - if (pmlmeinfo->link_count++ == 0) - { - tx_cnt = pxmitpriv->tx_pkts; - } - else if ((pmlmeinfo->link_count & 0xf) == 0) - { - if (tx_cnt == pxmitpriv->tx_pkts) - { - issue_nulldata_in_interrupt(padapter, NULL, 0); - } - - tx_cnt = pxmitpriv->tx_pkts; - } - } //end of if ((psta = rtw_get_stainfo(pstapriv, passoc_res->network.MacAddress)) != NULL) - } - else if (is_client_associated_to_ibss(padapter)) - { - //linked IBSS mode - //for each assoc list entry to check the rx pkt counter - for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) - { - if (pmlmeinfo->FW_sta_info[i].status == 1) - { - psta = pmlmeinfo->FW_sta_info[i].psta; - - if (pmlmeinfo->FW_sta_info[i].rx_pkt == psta->sta_stats.rx_pkts) - { - pmlmeinfo->FW_sta_info[i].status = 0; - report_del_sta_event(padapter, psta->hwaddr); - } - else - { - pmlmeinfo->FW_sta_info[i].rx_pkt = psta->sta_stats.rx_pkts; - } - } - } - - set_link_timer(pmlmeext, DISCONNECT_TO); - } -#endif return; } @@ -12760,7 +12822,7 @@ void clnt_sa_query_timeout(_adapter *padapter) { rtw_disassoc_cmd(padapter, 0, _TRUE); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); DBG_871X("SA query timeout client disconnect\n"); @@ -13493,6 +13555,8 @@ static void sitesurvey_res_reset(_adapter *adapter, struct sitesurvey_parm *parm ss->bss_cnt = 0; ss->channel_idx = 0; + ss->igi_scan = 0; + ss->igi_before_scan = 0; #ifdef CONFIG_SCAN_BACKOP ss->scan_cnt = 0; #endif @@ -13811,32 +13875,59 @@ u8 sitesurvey_ps_annc(struct dvobj_priv *dvobj, bool ps) return ps_anc; } -void sitesurvey_set_igi(_adapter *adapter, bool enter) +void sitesurvey_set_igi(_adapter *adapter) { + struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv; + struct ss_res *ss = &mlmeext->sitesurvey_res; u8 igi; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &adapter->wdinfo; #endif - if (enter) { -#ifdef CONFIG_P2P -#ifdef CONFIG_IOCTL_CFG80211 + switch (mlmeext_scan_state(mlmeext)) { + case SCAN_ENTER: + #ifdef CONFIG_P2P + #ifdef CONFIG_IOCTL_CFG80211 if (adapter_wdev_data(adapter)->p2p_enabled == _TRUE && pwdinfo->driver_interface == DRIVER_CFG80211) igi = 0x30; else -#endif /* CONFIG_IOCTL_CFG80211 */ + #endif /* CONFIG_IOCTL_CFG80211 */ if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) igi = 0x28; else -#endif /* CONFIG_P2P */ + #endif /* CONFIG_P2P */ igi = 0x1e; - } else { - igi = 0xff; /* restore RX GAIN */ - } - rtw_hal_set_odm_var(adapter, HAL_ODM_INITIAL_GAIN, &igi, _FALSE); + /* record IGI status */ + ss->igi_scan = igi; + rtw_hal_get_odm_var(adapter, HAL_ODM_INITIAL_GAIN, &ss->igi_before_scan, NULL); + + /* disable DIG and set IGI for scan */ + rtw_hal_set_odm_var(adapter, HAL_ODM_INITIAL_GAIN, &igi, _FALSE); + break; + case SCAN_COMPLETE: + case SCAN_TO_P2P_LISTEN: + /* enable DIG and restore IGI */ + igi = 0xff; + rtw_hal_set_odm_var(adapter, HAL_ODM_INITIAL_GAIN, &igi, _FALSE); + break; +#ifdef CONFIG_SCAN_BACKOP + case SCAN_BACKING_OP: + /* write IGI for op channel when DIG is not enabled */ + ODM_Write_DIG(GET_ODM(adapter), ss->igi_before_scan); + break; + case SCAN_LEAVE_OP: + /* write IGI for scan when DIG is not enabled */ + ODM_Write_DIG(GET_ODM(adapter), ss->igi_scan); + break; +#endif /* CONFIG_SCAN_BACKOP */ + default: + rtw_warn_on(1); + break; + } } + u8 sitesurvey_cmd_hdl(_adapter *padapter, u8 *pbuf) { struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf; @@ -13910,13 +14001,12 @@ operation_by_state: * HW register and DM setting for enter scan */ - /* config the initial gain under scanning */ - sitesurvey_set_igi(padapter, 1); - - /* disable dynamic functions, such as high power, DIG */ rtw_phydm_ability_backup(padapter); - rtw_phydm_func_for_offchannel(padapter); + + sitesurvey_set_igi(padapter); + /* config dynamic functions for off channel */ + rtw_phydm_func_for_offchannel(padapter); /* set MSR to no link state */ Set_MSR(padapter, _HW_STATE_NOLINK_); val8 = 1; /* under site survey */ @@ -14039,7 +14129,7 @@ operation_by_state: rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); if (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC)) { - sitesurvey_set_igi(padapter, 0); + sitesurvey_set_igi(padapter); sitesurvey_ps_annc(adapter_to_dvobj(padapter), 0); } @@ -14097,10 +14187,8 @@ operation_by_state: * HW register and DM setting for enter scan */ - if (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC)) { - /* config the initial gain under scanning */ - sitesurvey_set_igi(padapter, 1); - } + if (mlmeext_chk_scan_backop_flags(pmlmeext, SS_BACKOP_PS_ANNC)) + sitesurvey_set_igi(padapter); /* set MSR to no link state */ Set_MSR(padapter, _HW_STATE_NOLINK_); @@ -14140,7 +14228,7 @@ operation_by_state: /* turn on phy-dynamic functions */ rtw_phydm_ability_restore(padapter); - sitesurvey_set_igi(padapter, 0); + sitesurvey_set_igi(padapter); mlmeext_set_scan_state(pmlmeext, SCAN_P2P_LISTEN); _set_timer(&pwdinfo->find_phase_timer, (u32)((u32)pwdinfo->listen_dwell * 100)); @@ -14181,7 +14269,7 @@ operation_by_state: /* turn on phy-dynamic functions */ rtw_phydm_ability_restore(padapter); - sitesurvey_set_igi(padapter, 0); + sitesurvey_set_igi(padapter); sitesurvey_ps_annc(adapter_to_dvobj(padapter), 0); @@ -14398,6 +14486,48 @@ u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf) } +u8 add_ba_rsp_hdl(_adapter *padapter, unsigned char *pbuf) +{ + struct addBaRsp_parm *pparm = (struct addBaRsp_parm *)pbuf; + u8 ret = _TRUE, i = 0, try_cnt = 3, wait_ms = 50; + struct recv_reorder_ctrl *preorder_ctrl; + struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_info *psta; + + psta = rtw_get_stainfo(pstapriv, pparm->addr); + if (!psta) + goto exit; + + preorder_ctrl = &psta->recvreorder_ctrl[pparm->tid]; + ret = issue_addba_rsp_wait_ack(padapter, pparm->addr, pparm->tid, pparm->status, pparm->size, 3, 50); + + #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ + /* status = 0 means accept this addba req, so update indicate seq = start_seq under this compile flag */ + if (pparm->status == 0) { + preorder_ctrl->indicate_seq = pparm->start_seq; + #ifdef DBG_RX_SEQ + DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __func__, __LINE__, + preorder_ctrl->indicate_seq, pparm->start_seq); + #endif + } + #else + preorder_ctrl->indicate_seq = 0xffff; + #endif + + /* + * status = 0 means accept this addba req + * status = 37 means reject this addba req + */ + if (pparm->status == 0) { + preorder_ctrl->enable = _TRUE; + preorder_ctrl->ampdu_size = pparm->size; + } else if (pparm->status == 37) + preorder_ctrl->enable = _FALSE; + +exit: + return H2C_SUCCESS; +} + u8 chk_bmc_sleepq_cmd(_adapter* padapter) { struct cmd_obj *ph2c; @@ -14940,7 +15070,7 @@ connect_allow_hdl: && check_fwstate(mlme, WIFI_ASOC_STATE) ) { rtw_disassoc_cmd(iface, 500, _FALSE); - rtw_indicate_disconnect(iface); + rtw_indicate_disconnect(iface, 0, _FALSE); rtw_free_assoc_resources(iface, 1); } } @@ -15145,6 +15275,7 @@ u8 set_chplan_hdl(_adapter *padapter, unsigned char *pbuf) return H2C_PARAMETERS_ERROR; } + mlme->country_ent = setChannelPlan_param->country_ent; mlme->ChannelPlan = setChannelPlan_param->channel_plan; pmlmeext->max_chan_nums = init_channel_set(padapter, setChannelPlan_param->channel_plan, pmlmeext->channel_set); @@ -15198,7 +15329,7 @@ u8 set_csa_hdl(_adapter *padapter, unsigned char *pbuf) rtw_hal_set_hwreg(padapter, HW_VAR_TXPAUSE, &gval8); rtw_disassoc_cmd(padapter, 0, _FALSE); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(iface, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); rtw_free_network_queue(padapter, _TRUE); @@ -15217,6 +15348,7 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) { #ifdef CONFIG_TDLS _irqL irqL; + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct tdls_info *ptdlsinfo = &padapter->tdlsinfo; #ifdef CONFIG_TDLS_CH_SW struct tdls_ch_switch *pchsw_info = &ptdlsinfo->chsw_info; @@ -15229,6 +15361,8 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) struct tdls_txmgmt txmgmt; u32 setchtime, resp_sleep = 0, wait_time; u8 zaddr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + u8 ret; + u8 doiqk; if (!pbuf) return H2C_PARAMETERS_ERROR; @@ -15242,7 +15376,7 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) return H2C_REJECTED; } } else { - if (!(option == TDLS_RS_RCR || option == TDLS_CH_SW_BACK)) + if (!(option == TDLS_RS_RCR)) return H2C_REJECTED; } @@ -15262,7 +15396,6 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_WRCR, 0); DBG_871X("Created Direct Link with "MAC_FMT"\n", MAC_ARG(ptdls_sta->hwaddr)); - pmlmeinfo->FW_sta_info[ptdls_sta->mac_id].psta = ptdls_sta; /* Set TDLS sta rate. */ /* Update station supportRate */ rtw_hal_update_sta_rate_mask(padapter, ptdls_sta); @@ -15308,70 +15441,125 @@ u8 tdls_hdl(_adapter *padapter, unsigned char *pbuf) txmgmt.status_code = 0; _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN); - issue_nulldata(padapter, NULL, 1, 0, 0); + issue_nulldata(padapter, NULL, 1, 3, 3); - DBG_871X("issue tdls channel switch response\n"); - issue_tdls_ch_switch_rsp(padapter, &txmgmt, _FALSE); - resp_sleep = 5; - rtw_msleep_os(resp_sleep); + DBG_871X("[TDLS ] issue tdls channel switch response\n"); + ret = issue_tdls_ch_switch_rsp(padapter, &txmgmt, _TRUE); /* If we receive TDLS_CH_SW_REQ at off channel which it's target is AP's channel */ /* then we just SelectChannel to AP's channel*/ if (padapter->mlmeextpriv.cur_channel == pchsw_info->off_ch_num) { - SelectChannel(padapter, padapter->mlmeextpriv.cur_channel); - issue_nulldata(padapter, NULL, 0, 0, 0); - pchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE); - ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END_TO_BASE_CHNL); break; } - _set_timer(&ptdls_sta->delay_timer, pmlmeinfo->bcn_interval - 40); - - /* Continue following actions */ - - case TDLS_CH_SW: - issue_nulldata(padapter, NULL, 1, 0, 0); - _set_timer(&ptdls_sta->ch_sw_timer, (u32)(ptdls_sta->ch_switch_timeout)/1000); + if (ret == _SUCCESS) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_OFF_CHNL); + else + DBG_871X("[TDLS] issue_tdls_ch_switch_rsp wait ack fail !!!!!!!!!!\n"); + + break; + case TDLS_CH_SW_PREPARE: + pchsw_info->ch_sw_state |= TDLS_CH_SWITCH_PREPARE_STATE; - setchtime = rtw_systime_to_ms(rtw_get_current_time()); - SelectChannel(padapter, pchsw_info->off_ch_num); - setchtime = rtw_systime_to_ms(rtw_get_current_time()) - setchtime; - setchtime += resp_sleep; + /* to collect IQK info of off-chnl */ + doiqk = _TRUE; + rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, &doiqk); + set_channel_bwmode(padapter, pchsw_info->off_ch_num, pchsw_info->ch_offset, (pchsw_info->ch_offset) ? CHANNEL_WIDTH_40 : CHANNEL_WIDTH_20); + doiqk = _FALSE; + rtw_hal_set_hwreg(padapter, HW_VAR_DO_IQK, &doiqk); - if (pmlmeext->cur_channel != rtw_get_oper_ch(padapter)) - issue_nulldata(padapter, NULL, 0, 0, 0); - pchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE); + /* switch back to base-chnl */ + set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); - if ((u32)ptdls_sta->ch_switch_time/1000 > setchtime) - wait_time = (u32)ptdls_sta->ch_switch_time/1000 - setchtime; - else - wait_time = 0; + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_START); - if (wait_time > 0) - rtw_msleep_os(wait_time); + pchsw_info->ch_sw_state &= ~(TDLS_CH_SWITCH_PREPARE_STATE); + + break; + case TDLS_CH_SW_START: + rtw_tdls_set_ch_sw_oper_control(padapter, _TRUE); + break; + case TDLS_CH_SW_TO_OFF_CHNL: + issue_nulldata(padapter, NULL, 1, 3, 3); + + if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)) + _set_timer(&ptdls_sta->ch_sw_timer, (u32)(ptdls_sta->ch_switch_timeout) /1000); + + if (rtw_tdls_do_ch_sw(padapter, ptdls_sta, TDLS_CH_SW_OFF_CHNL, pchsw_info->off_ch_num, + pchsw_info->ch_offset, (pchsw_info->ch_offset) ? CHANNEL_WIDTH_40 : CHANNEL_WIDTH_20, ptdls_sta->ch_switch_time) == _SUCCESS) { + pchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE); + if (pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) { + if (issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 1, 3) == _FAIL) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_BASE_CHNL); + } + } + else { + u8 bcancelled; + + if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)) + _cancel_timer(&ptdls_sta->ch_sw_timer,&bcancelled); + } + + + break; + case TDLS_CH_SW_END: + case TDLS_CH_SW_END_TO_BASE_CHNL: + rtw_tdls_set_ch_sw_oper_control(padapter, _FALSE); + _cancel_timer_ex(&ptdls_sta->ch_sw_timer); + _cancel_timer_ex(&ptdls_sta->stay_on_base_chnl_timer); + _cancel_timer_ex(&ptdls_sta->ch_sw_monitor_timer); +#if 0 + _rtw_memset(pHalData->tdls_ch_sw_iqk_info_base_chnl, 0x00, sizeof(pHalData->tdls_ch_sw_iqk_info_base_chnl)); + _rtw_memset(pHalData->tdls_ch_sw_iqk_info_off_chnl, 0x00, sizeof(pHalData->tdls_ch_sw_iqk_info_off_chnl)); +#endif - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0); - issue_nulldata_to_TDLS_peer_STA(ptdls_sta->padapter, ptdls_sta->hwaddr, 0, 0, 0); + if (option == TDLS_CH_SW_END_TO_BASE_CHNL) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_BASE_CHNL); break; - case TDLS_CH_SW_BACK: + case TDLS_CH_SW_TO_BASE_CHNL_UNSOLICITED: + case TDLS_CH_SW_TO_BASE_CHNL: pchsw_info->ch_sw_state &= ~(TDLS_PEER_AT_OFF_STATE | TDLS_WAIT_CH_RSP_STATE); - ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); - SelectChannel(padapter, padapter->mlmeextpriv.cur_channel); - issue_nulldata(padapter, NULL, 0, 0, 0); + + if (option == TDLS_CH_SW_TO_BASE_CHNL_UNSOLICITED) { + if (ptdls_sta != NULL) { + /* Send unsolicited channel switch rsp. to peer */ + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + txmgmt.status_code = 0; + _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN); + issue_tdls_ch_switch_rsp(padapter, &txmgmt, _FALSE); + } + } + + if (rtw_tdls_do_ch_sw(padapter, ptdls_sta, TDLS_CH_SW_BASE_CHNL, pmlmeext->cur_channel, + pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode, ptdls_sta->ch_switch_time) == _SUCCESS) { + issue_nulldata(padapter, NULL, 0, 3, 3); + /* set ch sw monitor timer for responder */ + if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)) + _set_timer(&ptdls_sta->ch_sw_monitor_timer, TDLS_CH_SW_MONITOR_TIMEOUT); + } + break; #endif case TDLS_RS_RCR: rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_RS_RCR, 0); - DBG_871X("wirte REG_RCR, set bit6 on\n"); + DBG_871X("[TDLS] wirte REG_RCR, set bit6 on\n"); + break; + case TDLS_TEARDOWN_STA: + _rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt)); + txmgmt.status_code = 0; + _rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN); + + issue_tdls_teardown(padapter, &txmgmt, _TRUE); break; - case TDLS_TEAR_STA: + case TDLS_TEARDOWN_STA_LOCALLY: #ifdef CONFIG_TDLS_CH_SW if (_rtw_memcmp(TDLSoption->addr, pchsw_info->addr, ETH_ALEN) == _TRUE) { pchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE | TDLS_CH_SWITCH_ON_STATE | TDLS_PEER_AT_OFF_STATE); - ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); + rtw_tdls_set_ch_sw_oper_control(padapter, _FALSE); _rtw_memset(pchsw_info->addr, 0x00, ETH_ALEN); } #endif diff --git a/rtl8188FU/core/rtw_mp.c b/rtl8188FU/core/rtw_mp.c index 2ff5c07..e1a91cf 100755 --- a/rtl8188FU/core/rtw_mp.c +++ b/rtl8188FU/core/rtw_mp.c @@ -18,9 +18,7 @@ * ******************************************************************************/ #define _RTW_MP_C_ - #include <drv_types.h> - #ifdef PLATFORM_FREEBSD #include <sys/unistd.h> /* for RFHIGHPID */ #endif @@ -30,6 +28,19 @@ #include <rtw_bt_mp.h> #endif +#ifdef CONFIG_MP_VHT_HW_TX_MODE +#define CEILING_POS(X) ((X - (int)(X)) > 0 ? (int)(X + 1) : (int)(X)) +#define CEILING_NEG(X) ((X - (int)(X)) < 0 ? (int)(X - 1) : (int)(X)) +#define ceil(X) (((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X)) + +int rtfloor(float x) +{ +int i = x - 2; +while +(++i <= x - 1); +return i; +} +#endif #ifdef CONFIG_MP_INCLUDED @@ -117,7 +128,7 @@ static void _init_mp_priv_(struct mp_priv *pmp_priv) pmp_priv->channel = 1; pmp_priv->bandwidth = CHANNEL_WIDTH_20; pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - pmp_priv->rateidx = MPT_RATE_1M; + pmp_priv->rateidx = RATE_1M; pmp_priv->txpoweridx = 0x2A; pmp_priv->antenna_tx = ANTENNA_A; @@ -140,6 +151,7 @@ static void _init_mp_priv_(struct mp_priv *pmp_priv) pmp_priv->bSetRxBssid = _FALSE; pmp_priv->bRTWSmbCfg = _FALSE; + pmp_priv->bloopback = _FALSE; pnetwork = &pmp_priv->mp_network.network; _rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN); @@ -317,10 +329,11 @@ s32 init_mp_priv(PADAPTER padapter) pmppriv->papdater = padapter; pmppriv->mp_dm =0; pmppriv->tx.stop = 1; - pmppriv->bSetTxPower=0; //for manually set tx power - pmppriv->bTxBufCkFail=_FALSE; - pmppriv->pktInterval=0; - + pmppriv->bSetTxPower = 0; /*for manually set tx power*/ + pmppriv->bTxBufCkFail = _FALSE; + pmppriv->pktInterval = 0; + pmppriv->pktLength = 1000; + mp_init_xmit_attrib(&pmppriv->tx, padapter); switch (padapter->registrypriv.rf_config) { @@ -532,9 +545,9 @@ MPT_InitializeAdapter( PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /*default use Main*/ /*<20130522, Kordan> 0x51 and 0x71 should be set immediately after path switched, or they might be overwritten. */ if ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA90)) - PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E); else - PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E); + PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E); } /*set ant to wifi side in mp mode*/ rtw_write16(pAdapter, 0x870, 0x300); @@ -630,6 +643,7 @@ static u8 mpt_ProStartTest(PADAPTER padapter) pMptCtx->bSingleCarrier = _FALSE; pMptCtx->bCarrierSuppression = _FALSE; pMptCtx->bSingleTone = _FALSE; + pMptCtx->HWTxmode = PACKETS_TX; return _SUCCESS; } @@ -698,8 +712,12 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart) ConfigureTxpowerTrack(pDM_Odm, &c); ODM_ClearTxPowerTrackingState(pDM_Odm); if (*c.ODM_TxPwrTrackSetPwr) { - (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_A, chnl); - (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_B, chnl); + if (pDM_Odm->SupportICType == ODM_RTL8188F) + (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, chnl); + else { + (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_A, chnl); + (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, ODM_RF_PATH_B, chnl); + } } } } @@ -762,7 +780,7 @@ u32 mp_join(PADAPTER padapter,u8 mode) //init mp_start_test status if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { rtw_disassoc_cmd(padapter, 500, _TRUE); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); } pmppriv->prev_fw_state = get_fwstate(pmlmepriv); @@ -901,7 +919,7 @@ void mp_stop_test(PADAPTER padapter) goto end_of_mp_stop_test; //3 1. disconnect psudo AdHoc - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); //3 2. clear psta used in mp test mode. // rtw_free_assoc_resources(padapter, 1); @@ -1290,7 +1308,7 @@ void fill_tx_desc_8188e(PADAPTER padapter) desc->txdw4 |= cpu_to_le32(DISDATAFB); if( pmp_priv->preamble ){ - if (pmp_priv->rateidx <= MPT_RATE_54M) + if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M) desc->txdw4 |= cpu_to_le32(DATA_SHORT); // CCK Short Preamble } @@ -1301,7 +1319,7 @@ void fill_tx_desc_8188e(PADAPTER padapter) desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F); if( pmp_priv->preamble ){ - if (pmp_priv->rateidx > MPT_RATE_54M) + if (HwRateToMPTRate(pmp_priv->rateidx) > MPT_RATE_54M) desc->txdw5 |= cpu_to_le32(SGI); // MCS Short Guard Interval } @@ -1504,10 +1522,10 @@ void fill_tx_desc_8723b(PADAPTER padapter) SET_TX_DESC_USE_RATE_8723B(ptxdesc, 1); SET_TX_DESC_DISABLE_FB_8723B(ptxdesc, 1); - if (pmp_priv->preamble) - if (pmp_priv->rateidx <= MPT_RATE_54M) { + if (pmp_priv->preamble) { + if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M) SET_TX_DESC_DATA_SHORT_8723B(ptxdesc, 1); - } + } if (pmp_priv->bandwidth == CHANNEL_WIDTH_40) { SET_TX_DESC_DATA_BW_8723B(ptxdesc, 1); @@ -1538,7 +1556,7 @@ void fill_tx_desc_8703b(PADAPTER padapter) SET_TX_DESC_DISABLE_FB_8703B(ptxdesc, 1); if (pmp_priv->preamble) { - if (pmp_priv->rateidx <= MPT_RATE_54M) + if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M) SET_TX_DESC_DATA_SHORT_8703B(ptxdesc, 1); } @@ -1570,7 +1588,7 @@ void fill_tx_desc_8188f(PADAPTER padapter) SET_TX_DESC_DISABLE_FB_8188F(ptxdesc, 1); if (pmp_priv->preamble) - if (pmp_priv->rateidx <= MPT_RATE_54M) + if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M) SET_TX_DESC_DATA_SHORT_8188F(ptxdesc, 1); if (pmp_priv->bandwidth == CHANNEL_WIDTH_40) @@ -1755,50 +1773,44 @@ exit: void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB) { - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); struct mp_priv *pmppriv = &pAdapter->mppriv; - u8 type; - type = _HW_STATE_AP_; - if(bStartRx) - { + + + if (bStartRx) { #ifdef CONFIG_RTL8723B PHY_SetMacReg(pAdapter, 0xe70, BIT23|BIT22, 0x3);// Power on adc (in RX_WAIT_CCA state) write_bbreg(pAdapter, 0xa01, BIT0, bDisable);// improve Rx performance by jerry #endif - if( pmppriv->bSetRxBssid == _TRUE ){ - //pHalData->ReceiveConfig = RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYST_RXFF; - pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AB |RCR_AMF | RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYST_RXFF ; - pHalData->ReceiveConfig |= ACRC32; - - 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]); + pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AMF | RCR_HTC_LOC_CTRL; + pHalData->ReceiveConfig |= RCR_ACRC32; + pHalData->ReceiveConfig |= RCR_APP_PHYST_RXFF | RCR_APP_ICV | RCR_APP_MIC; + + if (pmppriv->bSetRxBssid == _TRUE) { + DBG_8192C("%s: pmppriv->network_macaddr=" MAC_FMT "\n", __func__, + MAC_ARG(pmppriv->network_macaddr)); + //Set_MSR(pAdapter, WIFI_FW_AP_STATE); //rtw_hal_set_hwreg(pAdapter, HW_VAR_BSSID, pmppriv->network_macaddr); //rtw_hal_set_hwreg(pAdapter, HW_VAR_SET_OPMODE, (u8 *)(&type)); + } else { + pHalData->ReceiveConfig |= RCR_ADF; + + /* Accept all data frames */ + rtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF); } - else - { - pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; - pHalData->ReceiveConfig |= ACRC32; - rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); - // Accept all data frames - rtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF); - // Accept CRC error and destination address - } - } - else - { + + if (bAB) + pHalData->ReceiveConfig |= RCR_AB; + } else { #ifdef CONFIG_RTL8723B PHY_SetMacReg(pAdapter, 0xe70, BIT23|BIT22, 0x00);// Power off adc (in RX_WAIT_CCA state) write_bbreg(pAdapter, 0xa01, BIT0, bEnable);// improve Rx performance by jerry #endif - rtw_write32(pAdapter, REG_RCR, 0); + pHalData->ReceiveConfig = 0; } - if (bAB) - rtw_write32(pAdapter, REG_RCR, rtw_read32(pAdapter, REG_RCR)|RCR_AB); - else - rtw_write32(pAdapter, REG_RCR, rtw_read32(pAdapter, REG_RCR)&(~RCR_AB)); + rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig); } void ResetPhyRxPktCount(PADAPTER pAdapter) @@ -2437,6 +2449,188 @@ MptToMgntRate( } } + +u8 HwRateToMPTRate(u8 rate) +{ + u8 ret_rate = MGN_1M; + + switch (rate) { + case DESC_RATE1M: + ret_rate = MPT_RATE_1M; break; + case DESC_RATE2M: + ret_rate = MPT_RATE_2M; break; + case DESC_RATE5_5M: + ret_rate = MPT_RATE_55M; break; + case DESC_RATE11M: + ret_rate = MPT_RATE_11M; break; + case DESC_RATE6M: + ret_rate = MPT_RATE_6M; break; + case DESC_RATE9M: + ret_rate = MPT_RATE_9M; break; + case DESC_RATE12M: + ret_rate = MPT_RATE_12M; break; + case DESC_RATE18M: + ret_rate = MPT_RATE_18M; break; + case DESC_RATE24M: + ret_rate = MPT_RATE_24M; break; + case DESC_RATE36M: + ret_rate = MPT_RATE_36M; break; + case DESC_RATE48M: + ret_rate = MPT_RATE_48M; break; + case DESC_RATE54M: + ret_rate = MPT_RATE_54M; break; + case DESC_RATEMCS0: + ret_rate = MPT_RATE_MCS0; break; + case DESC_RATEMCS1: + ret_rate = MPT_RATE_MCS1; break; + case DESC_RATEMCS2: + ret_rate = MPT_RATE_MCS2; break; + case DESC_RATEMCS3: + ret_rate = MPT_RATE_MCS3; break; + case DESC_RATEMCS4: + ret_rate = MPT_RATE_MCS4; break; + case DESC_RATEMCS5: + ret_rate = MPT_RATE_MCS5; break; + case DESC_RATEMCS6: + ret_rate = MPT_RATE_MCS6; break; + case DESC_RATEMCS7: + ret_rate = MPT_RATE_MCS7; break; + case DESC_RATEMCS8: + ret_rate = MPT_RATE_MCS8; break; + case DESC_RATEMCS9: + ret_rate = MPT_RATE_MCS9; break; + case DESC_RATEMCS10: + ret_rate = MPT_RATE_MCS10; break; + case DESC_RATEMCS11: + ret_rate = MPT_RATE_MCS11; break; + case DESC_RATEMCS12: + ret_rate = MPT_RATE_MCS12; break; + case DESC_RATEMCS13: + ret_rate = MPT_RATE_MCS13; break; + case DESC_RATEMCS14: + ret_rate = MPT_RATE_MCS14; break; + case DESC_RATEMCS15: + ret_rate = MPT_RATE_MCS15; break; + case DESC_RATEMCS16: + ret_rate = MPT_RATE_MCS16; break; + case DESC_RATEMCS17: + ret_rate = MPT_RATE_MCS17; break; + case DESC_RATEMCS18: + ret_rate = MPT_RATE_MCS18; break; + case DESC_RATEMCS19: + ret_rate = MPT_RATE_MCS19; break; + case DESC_RATEMCS20: + ret_rate = MPT_RATE_MCS20; break; + case DESC_RATEMCS21: + ret_rate = MPT_RATE_MCS21; break; + case DESC_RATEMCS22: + ret_rate = MPT_RATE_MCS22; break; + case DESC_RATEMCS23: + ret_rate = MPT_RATE_MCS23; break; + case DESC_RATEMCS24: + ret_rate = MPT_RATE_MCS24; break; + case DESC_RATEMCS25: + ret_rate = MPT_RATE_MCS25; break; + case DESC_RATEMCS26: + ret_rate = MPT_RATE_MCS26; break; + case DESC_RATEMCS27: + ret_rate = MPT_RATE_MCS27; break; + case DESC_RATEMCS28: + ret_rate = MPT_RATE_MCS28; break; + case DESC_RATEMCS29: + ret_rate = MPT_RATE_MCS29; break; + case DESC_RATEMCS30: + ret_rate = MPT_RATE_MCS30; break; + case DESC_RATEMCS31: + ret_rate = MPT_RATE_MCS31; break; + case DESC_RATEVHTSS1MCS0: + ret_rate = MPT_RATE_VHT1SS_MCS0; break; + case DESC_RATEVHTSS1MCS1: + ret_rate = MPT_RATE_VHT1SS_MCS1; break; + case DESC_RATEVHTSS1MCS2: + ret_rate = MPT_RATE_VHT1SS_MCS2; break; + case DESC_RATEVHTSS1MCS3: + ret_rate = MPT_RATE_VHT1SS_MCS3; break; + case DESC_RATEVHTSS1MCS4: + ret_rate = MPT_RATE_VHT1SS_MCS4; break; + case DESC_RATEVHTSS1MCS5: + ret_rate = MPT_RATE_VHT1SS_MCS5; break; + case DESC_RATEVHTSS1MCS6: + ret_rate = MPT_RATE_VHT1SS_MCS6; break; + case DESC_RATEVHTSS1MCS7: + ret_rate = MPT_RATE_VHT1SS_MCS7; break; + case DESC_RATEVHTSS1MCS8: + ret_rate = MPT_RATE_VHT1SS_MCS8; break; + case DESC_RATEVHTSS1MCS9: + ret_rate = MPT_RATE_VHT1SS_MCS9; break; + case DESC_RATEVHTSS2MCS0: + ret_rate = MPT_RATE_VHT2SS_MCS0; break; + case DESC_RATEVHTSS2MCS1: + ret_rate = MPT_RATE_VHT2SS_MCS1; break; + case DESC_RATEVHTSS2MCS2: + ret_rate = MPT_RATE_VHT2SS_MCS2; break; + case DESC_RATEVHTSS2MCS3: + ret_rate = MPT_RATE_VHT2SS_MCS3; break; + case DESC_RATEVHTSS2MCS4: + ret_rate = MPT_RATE_VHT2SS_MCS4; break; + case DESC_RATEVHTSS2MCS5: + ret_rate = MPT_RATE_VHT2SS_MCS5; break; + case DESC_RATEVHTSS2MCS6: + ret_rate = MPT_RATE_VHT2SS_MCS6; break; + case DESC_RATEVHTSS2MCS7: + ret_rate = MPT_RATE_VHT2SS_MCS7; break; + case DESC_RATEVHTSS2MCS8: + ret_rate = MPT_RATE_VHT2SS_MCS8; break; + case DESC_RATEVHTSS2MCS9: + ret_rate = MPT_RATE_VHT2SS_MCS9; break; + case DESC_RATEVHTSS3MCS0: + ret_rate = MPT_RATE_VHT3SS_MCS0; break; + case DESC_RATEVHTSS3MCS1: + ret_rate = MPT_RATE_VHT3SS_MCS1; break; + case DESC_RATEVHTSS3MCS2: + ret_rate = MPT_RATE_VHT3SS_MCS2; break; + case DESC_RATEVHTSS3MCS3: + ret_rate = MPT_RATE_VHT3SS_MCS3; break; + case DESC_RATEVHTSS3MCS4: + ret_rate = MPT_RATE_VHT3SS_MCS4; break; + case DESC_RATEVHTSS3MCS5: + ret_rate = MPT_RATE_VHT3SS_MCS5; break; + case DESC_RATEVHTSS3MCS6: + ret_rate = MPT_RATE_VHT3SS_MCS6; break; + case DESC_RATEVHTSS3MCS7: + ret_rate = MPT_RATE_VHT3SS_MCS7; break; + case DESC_RATEVHTSS3MCS8: + ret_rate = MPT_RATE_VHT3SS_MCS8; break; + case DESC_RATEVHTSS3MCS9: + ret_rate = MPT_RATE_VHT3SS_MCS9; break; + case DESC_RATEVHTSS4MCS0: + ret_rate = MPT_RATE_VHT4SS_MCS0; break; + case DESC_RATEVHTSS4MCS1: + ret_rate = MPT_RATE_VHT4SS_MCS1; break; + case DESC_RATEVHTSS4MCS2: + ret_rate = MPT_RATE_VHT4SS_MCS2; break; + case DESC_RATEVHTSS4MCS3: + ret_rate = MPT_RATE_VHT4SS_MCS3; break; + case DESC_RATEVHTSS4MCS4: + ret_rate = MPT_RATE_VHT4SS_MCS4; break; + case DESC_RATEVHTSS4MCS5: + ret_rate = MPT_RATE_VHT4SS_MCS5; break; + case DESC_RATEVHTSS4MCS6: + ret_rate = MPT_RATE_VHT4SS_MCS6; break; + case DESC_RATEVHTSS4MCS7: + ret_rate = MPT_RATE_VHT4SS_MCS7; break; + case DESC_RATEVHTSS4MCS8: + ret_rate = MPT_RATE_VHT4SS_MCS8; break; + case DESC_RATEVHTSS4MCS9: + ret_rate = MPT_RATE_VHT4SS_MCS9; break; + + default: + DBG_871X("HwRateToMRate(): Non supported Rate [%x]!!!\n", rate); + break; + } + return ret_rate; +} + u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr) { u16 i=0; @@ -2477,69 +2671,44 @@ ULONG mpt_ProQueryCalTxPower( ULONG TxPower = 1, PwrGroup=0, PowerDiffByRate=0; u1Byte limit = 0, rate = 0; - + u8 mgn_rate = MptToMgntRate(pMptCtx->MptRateIndex); + #if defined(CONFIG_RTL8188E) if (IS_HARDWARE_TYPE_8188E(pAdapter)) - { - //return mpt_ProQueryCalTxPower_8188E(pAdapter, RfPath); - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8188E(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - - } + TxPower = PHY_GetTxPowerIndex_8188E(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel); #endif - + #if defined(CONFIG_RTL8723B) - if( IS_HARDWARE_TYPE_8723B(pAdapter) ) - { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8723B(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } + if (IS_HARDWARE_TYPE_8723B(pAdapter)) + TxPower = PHY_GetTxPowerIndex_8723B(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel); #endif - + #if defined(CONFIG_RTL8192E) - if( IS_HARDWARE_TYPE_8192E(pAdapter) ) - { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8192E(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } + if (IS_HARDWARE_TYPE_8192E(pAdapter)) + TxPower = PHY_GetTxPowerIndex_8192E(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel); #endif + #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) - if( IS_HARDWARE_TYPE_JAGUAR(pAdapter) ) - { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8812A(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } + if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) + TxPower = PHY_GetTxPowerIndex_8812A(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel); #endif + #if defined(CONFIG_RTL8814A) - if ( IS_HARDWARE_TYPE_8814A(pAdapter) ) - { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8814A(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } + if (IS_HARDWARE_TYPE_8814A(pAdapter)) + TxPower = PHY_GetTxPowerIndex_8814A(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel); #endif #if defined(CONFIG_RTL8703B) - if (IS_HARDWARE_TYPE_8703B(pAdapter)) { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8703B(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } + if (IS_HARDWARE_TYPE_8703B(pAdapter)) + TxPower = PHY_GetTxPowerIndex_8703B(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel); #endif #if defined(CONFIG_RTL8188F) - if (IS_HARDWARE_TYPE_8188F(pAdapter)) { - rate = MptToMgntRate(pAdapter->mppriv.rateidx); - TxPower = PHY_GetTxPowerIndex_8188F(pAdapter, RfPath, rate, - pHalData->CurrentChannelBW, pHalData->CurrentChannel); - } + if (IS_HARDWARE_TYPE_8188F(pAdapter)) + TxPower = PHY_GetTxPowerIndex_8188F(pAdapter, RfPath, mgn_rate, pHalData->CurrentChannelBW, pHalData->CurrentChannel); #endif DBG_8192C("txPower=%d ,CurrentChannelBW=%d ,CurrentChannel=%d ,rate =%d\n", - TxPower, pHalData->CurrentChannelBW, pHalData->CurrentChannel, rate); + TxPower, pHalData->CurrentChannelBW, pHalData->CurrentChannel, mgn_rate); pAdapter->mppriv.txpoweridx = (u8)TxPower; pMptCtx->TxPwrLevel[ODM_RF_PATH_A] = (u8)TxPower; @@ -2550,5 +2719,788 @@ ULONG mpt_ProQueryCalTxPower( return TxPower; } + +#ifdef CONFIG_MP_VHT_HW_TX_MODE +static inline void dump_buf(u8 *buf, u32 len) +{ + u32 i; + + DBG_871X("-----------------Len %d----------------\n", len); + for (i = 0; i < len; i++) + DBG_871X("%2.2x-", *(buf + i)); + DBG_871X("\n"); +} + +void ByteToBit( + UCHAR *out, + bool *in, + UCHAR in_size) +{ + UCHAR i = 0, j = 0; + + for (i = 0; i < in_size; i++) { + for (j = 0; j < 8; j++) { + if (in[8*i+j]) + out[i] |= (1 << j); + } + } +} + + +void CRC16_generator( + bool *out, + bool *in, + UCHAR in_size +) +{ + UCHAR i = 0; + bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + + for (i = 0; i < in_size; i++) {/* take one's complement and bit reverse*/ + temp = in[i]^reg[15]; + reg[15] = reg[14]; + reg[14] = reg[13]; + reg[13] = reg[12]; + reg[12] = reg[11]; + reg[11] = reg[10]; + reg[10] = reg[9]; + reg[9] = reg[8]; + reg[8] = reg[7]; + + reg[7] = reg[6]; + reg[6] = reg[5]; + reg[5] = reg[4]; + reg[4] = reg[3]; + reg[3] = reg[2]; + reg[2] = reg[1]; + reg[1] = reg[0]; + reg[12] = reg[12] ^ temp; + reg[5] = reg[5] ^ temp; + reg[0] = temp; + } + for (i = 0; i < 16; i++) /* take one's complement and bit reverse*/ + out[i] = 1-reg[15-i]; +} + + + +/*======================================== + SFD SIGNAL SERVICE LENGTH CRC + 16 bit 8 bit 8 bit 16 bit 16 bit +========================================*/ +void CCK_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo + ) +{ + double ratio = 0; + bool crc16_in[32] = {0}, crc16_out[16] = {0}; + bool LengthExtBit; + double LengthExact; + double LengthPSDU; + UCHAR i; + UINT PacketLength = pPMacTxInfo->PacketLength; + + if (pPMacTxInfo->bSPreamble) + pPMacTxInfo->SFD = 0x05CF; + else + pPMacTxInfo->SFD = 0xF3A0; + + switch (pPMacPktInfo->MCS) { + case 0: + pPMacTxInfo->SignalField = 0xA; + ratio = 8; + /*CRC16_in(1,0:7)=[0 1 0 1 0 0 0 0]*/ + crc16_in[1] = crc16_in[3] = 1; + break; + case 1: + pPMacTxInfo->SignalField = 0x14; + ratio = 4; + /*CRC16_in(1,0:7)=[0 0 1 0 1 0 0 0];*/ + crc16_in[2] = crc16_in[4] = 1; + break; + case 2: + pPMacTxInfo->SignalField = 0x37; + ratio = 8.0/5.5; + /*CRC16_in(1,0:7)=[1 1 1 0 1 1 0 0];*/ + crc16_in[0] = crc16_in[1] = crc16_in[2] = crc16_in[4] = crc16_in[5] = 1; + break; + case 3: + pPMacTxInfo->SignalField = 0x6E; + ratio = 8.0/11.0; + /*CRC16_in(1,0:7)=[0 1 1 1 0 1 1 0];*/ + crc16_in[1] = crc16_in[2] = crc16_in[3] = crc16_in[5] = crc16_in[6] = 1; + break; + } + + LengthExact = PacketLength*ratio; + LengthPSDU = ceil(LengthExact); + + if ((pPMacPktInfo->MCS == 3) && + ((LengthPSDU-LengthExact) >= 0.727 || (LengthPSDU-LengthExact) <= -0.727)) + LengthExtBit = 1; + else + LengthExtBit = 0; + + + pPMacTxInfo->LENGTH = (UINT)LengthPSDU; + /* CRC16_in(1,16:31) = LengthPSDU[0:15]*/ + for (i = 0; i < 16; i++) + crc16_in[i+16] = (pPMacTxInfo->LENGTH >> i) & 0x1; + + if (LengthExtBit == 0) { + pPMacTxInfo->ServiceField = 0x0; + /* CRC16_in(1,8:15) = [0 0 0 0 0 0 0 0];*/ + } else { + pPMacTxInfo->ServiceField = 0x80; + /*CRC16_in(1,8:15)=[0 0 0 0 0 0 0 1];*/ + crc16_in[15] = 1; + } + + CRC16_generator(crc16_out, crc16_in, 32); + + _rtw_memset(pPMacTxInfo->CRC16, 0, 2); + ByteToBit(pPMacTxInfo->CRC16, crc16_out, 2); + +} + + +void PMAC_Get_Pkt_Param( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo) +{ + + UCHAR TX_RATE_HEX = 0, MCS = 0; + UCHAR TX_RATE = pPMacTxInfo->TX_RATE; + + /* TX_RATE & Nss */ + if (MPT_IS_2SS_RATE(TX_RATE)) + pPMacPktInfo->Nss = 2; + else if (MPT_IS_3SS_RATE(TX_RATE)) + pPMacPktInfo->Nss = 3; + else if (MPT_IS_4SS_RATE(TX_RATE)) + pPMacPktInfo->Nss = 4; + else + pPMacPktInfo->Nss = 1; + + DBG_871X("PMacTxInfo.Nss =%d\n", pPMacPktInfo->Nss); + + /* MCS & TX_RATE_HEX*/ + if (MPT_IS_CCK_RATE(TX_RATE)) { + switch (TX_RATE) { + case MPT_RATE_1M: + TX_RATE_HEX = MCS = 0; break; + case MPT_RATE_2M: + TX_RATE_HEX = MCS = 1; break; + case MPT_RATE_55M: + TX_RATE_HEX = MCS = 2; break; + case MPT_RATE_11M: + TX_RATE_HEX = MCS = 3; break; + } + } else if (MPT_IS_OFDM_RATE(TX_RATE)) { + MCS = TX_RATE - MPT_RATE_6M; + TX_RATE_HEX = MCS + 4; + } else if (MPT_IS_HT_RATE(TX_RATE)) { + MCS = TX_RATE - MPT_RATE_MCS0; + TX_RATE_HEX = MCS + 12; + } else if (MPT_IS_VHT_RATE(TX_RATE)) { + TX_RATE_HEX = TX_RATE - MPT_RATE_VHT1SS_MCS0 + 44; + + if (MPT_IS_VHT_2S_RATE(TX_RATE)) + MCS = TX_RATE - MPT_RATE_VHT2SS_MCS0; + else if (MPT_IS_VHT_3S_RATE(TX_RATE)) + MCS = TX_RATE - MPT_RATE_VHT3SS_MCS0; + else if (MPT_IS_VHT_4S_RATE(TX_RATE)) + MCS = TX_RATE - MPT_RATE_VHT4SS_MCS0; + else + MCS = TX_RATE - MPT_RATE_VHT1SS_MCS0; + } + + pPMacPktInfo->MCS = MCS; + pPMacTxInfo->TX_RATE_HEX = TX_RATE_HEX; + + DBG_871X(" MCS=%d, TX_RATE_HEX =0x%x\n", MCS, pPMacTxInfo->TX_RATE_HEX); + /* mSTBC & Nsts*/ + pPMacPktInfo->Nsts = pPMacPktInfo->Nss; + if (pPMacTxInfo->bSTBC) { + if (pPMacPktInfo->Nss == 1) { + pPMacTxInfo->m_STBC = 2; + pPMacPktInfo->Nsts = pPMacPktInfo->Nss*2; + } else + pPMacTxInfo->m_STBC = 1; + } else + pPMacTxInfo->m_STBC = 1; +} + + +UINT LDPC_parameter_generator( + UINT N_pld_int, + UINT N_CBPSS, + UINT N_SS, + UINT R, + UINT m_STBC, + UINT N_TCB_int +) +{ + double CR = 0.; + double N_pld = (double)N_pld_int; + double N_TCB = (double)N_TCB_int; + double N_CW = 0., N_shrt = 0., N_spcw = 0., N_fshrt = 0.; + double L_LDPC = 0., K_LDPC = 0., L_LDPC_info = 0.; + double N_punc = 0., N_ppcw = 0., N_fpunc = 0., N_rep = 0., N_rpcw = 0., N_frep = 0.; + double R_eff = 0.; + UINT VHTSIGA2B3 = 0;/* extra symbol from VHT-SIG-A2 Bit 3*/ + + if (R == 0) + CR = 0.5; + else if (R == 1) + CR = 2./3.; + else if (R == 2) + CR = 3./4.; + else if (R == 3) + CR = 5./6.; + + if (N_TCB <= 648.) { + N_CW = 1.; + if (N_TCB >= N_pld+912.*(1.-CR)) + L_LDPC = 1296.; + else + L_LDPC = 648.; + } else if (N_TCB <= 1296.) { + N_CW = 1.; + if (N_TCB >= (double)N_pld + 1464.*(1.-CR)) + L_LDPC = 1944.; + else + L_LDPC = 1296.; + } else if (N_TCB <= 1944.) { + N_CW = 1.; + L_LDPC = 1944.; + } else if (N_TCB <= 2592.) { + N_CW = 2.; + if (N_TCB >= N_pld+2916.*(1.-CR)) + L_LDPC = 1944.; + else + L_LDPC = 1296.; + } else { + N_CW = ceil(N_pld/1944./CR); + L_LDPC = 1944.; + } + /* Number of information bits per CW*/ + K_LDPC = L_LDPC*CR; + /* Number of shortening bits max(0, (N_CW * L_LDPC * R) - N_pld)*/ + N_shrt = (N_CW*K_LDPC-N_pld) > 0. ? (N_CW*K_LDPC-N_pld) : 0.; + /* Number of shortening bits per CW N_spcw = rtfloor(N_shrt/N_CW)*/ + N_spcw = rtfloor(N_shrt/N_CW); + /* The first N_fshrt CWs shorten 1 bit more*/ + N_fshrt = (double)((int)N_shrt % (int)N_CW); + /* Number of data bits for the last N_CW-N_fshrt CWs*/ + L_LDPC_info = K_LDPC-N_spcw; + /* Number of puncturing bits*/ + N_punc = (N_CW*L_LDPC-N_TCB-N_shrt) > 0. ? (N_CW*L_LDPC-N_TCB-N_shrt) : 0.; + if (((N_punc > .1 * N_CW * L_LDPC * (1.-CR)) && (N_shrt < 1.2 * N_punc * CR/(1.-CR))) || + (N_punc > 0.3*N_CW*L_LDPC*(1.-CR))) { + /*cout << "*** N_TCB and N_punc are Recomputed ***" << endl;*/ + VHTSIGA2B3 = 1; + N_TCB += (double)N_CBPSS*N_SS*m_STBC; + N_punc = (N_CW*L_LDPC-N_TCB-N_shrt) > 0. ? (N_CW*L_LDPC-N_TCB-N_shrt) : 0.; + } else + VHTSIGA2B3 = 0; + + return VHTSIGA2B3; +} /* function end of LDPC_parameter_generator */ + +/*======================================== + Data field of PPDU + Get N_sym and SIGA2BB3 +========================================*/ +void PMAC_Nsym_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo) +{ + UINT SIGA2B3 = 0; + UCHAR TX_RATE = pPMacTxInfo->TX_RATE; + + UINT R, R_list[10] = {0, 0, 2, 0, 2, 1, 2, 3, 2, 3}; + double CR = 0; + UINT N_SD, N_BPSC_list[10] = {1, 2, 2, 4, 4, 6, 6, 6, 8, 8}; + UINT N_BPSC = 0, N_CBPS = 0, N_DBPS = 0, N_ES = 0, N_SYM = 0, N_pld = 0, N_TCB = 0; + int D_R = 0; + + DBG_871X("TX_RATE = %d\n", TX_RATE); + /* N_SD*/ + if (pPMacTxInfo->BandWidth == 0) + N_SD = 52; + else if (pPMacTxInfo->BandWidth == 1) + N_SD = 108; + else + N_SD = 234; + + if (MPT_IS_HT_RATE(TX_RATE)) { + UCHAR MCS_temp; + + if (pPMacPktInfo->MCS > 23) + MCS_temp = pPMacPktInfo->MCS - 24; + else if (pPMacPktInfo->MCS > 15) + MCS_temp = pPMacPktInfo->MCS - 16; + else if (pPMacPktInfo->MCS > 7) + MCS_temp = pPMacPktInfo->MCS - 8; + else + MCS_temp = pPMacPktInfo->MCS; + + R = R_list[MCS_temp]; + + switch (R) { + case 0: + CR = .5; break; + case 1: + CR = 2./3.; break; + case 2: + CR = 3./4.; break; + case 3: + CR = 5./6.; break; + } + + N_BPSC = N_BPSC_list[MCS_temp]; + N_CBPS = N_BPSC*N_SD*pPMacPktInfo->Nss; + N_DBPS = (UINT)((double)N_CBPS*CR); + + if (pPMacTxInfo->bLDPC == FALSE) { + N_ES = (UINT)ceil((double)(N_DBPS * pPMacPktInfo->Nss)/4./300.); + DBG_871X("N_ES = %d\n", N_ES); + + /* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/ + N_SYM = pPMacTxInfo->m_STBC*(UINT)ceil((double)(pPMacTxInfo->PacketLength*8+16+N_ES*6)/ + (double)(N_DBPS*pPMacTxInfo->m_STBC)); + + } else { + N_ES = 1; + /* N_pld = length * 8 + 16*/ + N_pld = pPMacTxInfo->PacketLength*8+16; + DBG_871X("N_pld = %d\n", N_pld); + N_SYM = pPMacTxInfo->m_STBC*(UINT)ceil((double)(N_pld)/ + (double)(N_DBPS*pPMacTxInfo->m_STBC)); + DBG_871X("N_SYM = %d\n", N_SYM); + /* N_avbits = N_CBPS *m_STBC *(N_pld/N_CBPS*R*m_STBC)*/ + N_TCB = N_CBPS*N_SYM; + DBG_871X("N_TCB = %d\n", N_TCB); + SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB); + DBG_871X("SIGA2B3 = %d\n", SIGA2B3); + N_SYM = N_SYM + SIGA2B3*pPMacTxInfo->m_STBC; + DBG_871X("N_SYM = %d\n", N_SYM); + } + } else if (MPT_IS_VHT_RATE(TX_RATE)) { + R = R_list[pPMacPktInfo->MCS]; + + switch (R) { + case 0: + CR = .5; break; + case 1: + CR = 2./3.; break; + case 2: + CR = 3./4.; break; + case 3: + CR = 5./6.; break; + } + N_BPSC = N_BPSC_list[pPMacPktInfo->MCS]; + N_CBPS = N_BPSC*N_SD*pPMacPktInfo->Nss; + N_DBPS = (UINT)((double)N_CBPS*CR); + if (pPMacTxInfo->bLDPC == FALSE) { + if (pPMacTxInfo->bSGI) + N_ES = (UINT)ceil((double)(N_DBPS)/3.6/600.); + else + N_ES = (UINT)ceil((double)(N_DBPS)/4./600.); + /* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/ + N_SYM = pPMacTxInfo->m_STBC*(UINT)ceil((double)(pPMacTxInfo->PacketLength*8+16+N_ES*6)/(double)(N_DBPS*pPMacTxInfo->m_STBC)); + SIGA2B3 = 0; + } else { + N_ES = 1; + /* N_SYM = m_STBC* (8*length+N_service) / (m_STBC*N_DBPS)*/ + N_SYM = pPMacTxInfo->m_STBC*(UINT)ceil((double)(pPMacTxInfo->PacketLength*8+16)/(double)(N_DBPS*pPMacTxInfo->m_STBC)); + /* N_avbits = N_sys_init * N_CBPS*/ + N_TCB = N_CBPS * N_SYM; + /* N_pld = N_sys_init * N_DBPS*/ + N_pld = N_SYM * N_DBPS; + SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB); + N_SYM = N_SYM + SIGA2B3*pPMacTxInfo->m_STBC; + } + + switch (R) { + case 0: + D_R = 2; break; + case 1: + D_R = 3; break; + case 2: + D_R = 4; break; + case 3: + D_R = 6; break; + } + + if (((N_CBPS/N_ES)%D_R) != 0) { + DBG_871X("MCS= %d is not supported when Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth); + return; + } + + DBG_871X("MCS= %d Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth); + } + + pPMacPktInfo->N_sym = N_SYM; + pPMacPktInfo->SIGA2B3 = SIGA2B3; +} + +/*======================================== + L-SIG Rate R Length P Tail + 4b 1b 12b 1b 6b +========================================*/ + +void L_SIG_generator( + UINT N_SYM, /* Max: 750*/ + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo) +{ + u8 sig_bi[24] = {0}; /* 24 BIT*/ + UINT mode, LENGTH; + int i; + + if (MPT_IS_OFDM_RATE(pPMacTxInfo->TX_RATE)) { + mode = pPMacPktInfo->MCS; + LENGTH = pPMacTxInfo->PacketLength; + } else { + UCHAR N_LTF; + double T_data; + UINT OFDM_symbol; + + mode = 0; + + /* Table 20-13 Num of HT-DLTFs request*/ + if (pPMacPktInfo->Nsts <= 2) + N_LTF = pPMacPktInfo->Nsts; + else + N_LTF = 4; + + if (pPMacTxInfo->bSGI) + T_data = 3.6; + else + T_data = 4.0; + + /*(L-SIG, HT-SIG, HT-STF, HT-LTF....HT-LTF, Data)*/ + if (MPT_IS_VHT_RATE(pPMacTxInfo->TX_RATE)) + OFDM_symbol = (UINT)ceil((double)(8+4+N_LTF*4+N_SYM*T_data+4)/4.); + else + OFDM_symbol = (UINT)ceil((double)(8+4+N_LTF*4+N_SYM*T_data)/4.); + + DBG_871X("%s , OFDM_symbol =%d\n", __func__, OFDM_symbol); + LENGTH = OFDM_symbol*3-3; + DBG_871X("%s , LENGTH =%d\n", __func__, LENGTH); + + } + /* Rate Field*/ + switch (mode) { + case 0: + sig_bi[0] = 1; sig_bi[1] = 1; sig_bi[2] = 0; sig_bi[3] = 1; + break; + case 1: + sig_bi[0] = 1; sig_bi[1] = 1; sig_bi[2] = 1; sig_bi[3] = 1; + break; + case 2: + sig_bi[0] = 0; sig_bi[1] = 1; sig_bi[2] = 0; sig_bi[3] = 1; + break; + case 3: + sig_bi[0] = 0; sig_bi[1] = 1; sig_bi[2] = 1; sig_bi[3] = 1; + break; + case 4: + sig_bi[0] = 1; sig_bi[1] = 0; sig_bi[2] = 0; sig_bi[3] = 1; + break; + case 5: + sig_bi[0] = 1; sig_bi[1] = 0; sig_bi[2] = 1; sig_bi[3] = 1; + break; + case 6: + sig_bi[0] = 0; sig_bi[1] = 0; sig_bi[2] = 0; sig_bi[3] = 1; + break; + case 7: + sig_bi[0] = 0; sig_bi[1] = 0; sig_bi[2] = 1; sig_bi[3] = 1; + break; + } + /*Reserved bit*/ + sig_bi[4] = 0; + + /* Length Field*/ + for (i = 0; i < 12; i++) + sig_bi[i+5] = (LENGTH>>i) & 1; + + /* Parity Bit*/ + sig_bi[17] = 0; + for (i = 0; i < 17; i++) + sig_bi[17] = sig_bi[17] + sig_bi[i]; + + sig_bi[17] %= 2; + + /* Tail Field*/ + for (i = 18; i < 24; i++) + sig_bi[i] = 0; + + /* dump_buf(sig_bi,24);*/ + _rtw_memset(pPMacTxInfo->LSIG, 0, 3); + ByteToBit(pPMacTxInfo->LSIG, (bool *)sig_bi, 3); +} + + +void CRC8_generator( + bool *out, + bool *in, + UCHAR in_size + ) +{ + UCHAR i = 0; + bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1}; + + for (i = 0; i < in_size; i++) { /* take one's complement and bit reverse*/ + temp = in[i]^reg[7]; + reg[7] = reg[6]; + reg[6] = reg[5]; + reg[5] = reg[4]; + reg[4] = reg[3]; + reg[3] = reg[2]; + reg[2] = reg[1] ^ temp; + reg[1] = reg[0] ^ temp; + reg[0] = temp; + } + for (i = 0; i < 8; i++)/* take one's complement and bit reverse*/ + out[i] = reg[7-i]^1; + } + +/*/================================================================================ + HT-SIG1 MCS CW Length 24BIT + 24BIT + 7b 1b 16b + HT-SIG2 Smoothing Not sounding Rsvd AGG STBC FEC SGI N_ELTF CRC Tail + 1b 1b 1b 1b 2b 1b 1b 2b 8b 6b +================================================================================*/ +void HT_SIG_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo + ) +{ + UINT i; + bool sig_bi[48] = {0}, crc8[8] = {0}; + /* MCS Field*/ + for (i = 0; i < 7; i++) + sig_bi[i] = (pPMacPktInfo->MCS >> i) & 0x1; + /* Packet BW Setting*/ + sig_bi[7] = pPMacTxInfo->BandWidth; + /* HT-Length Field*/ + for (i = 0; i < 16; i++) + sig_bi[i+8] = (pPMacTxInfo->PacketLength >> i) & 0x1; + /* Smoothing; 1->allow smoothing*/ + sig_bi[24] = 1; + /*Not Sounding*/ + sig_bi[25] = 1-pPMacTxInfo->NDP_sound; + /*Reserved bit*/ + sig_bi[26] = 1; + /*/Aggregate*/ + sig_bi[27] = 0; + /*STBC Field*/ + if (pPMacTxInfo->bSTBC) { + sig_bi[28] = 1; + sig_bi[29] = 0; + } else { + sig_bi[28] = 0; + sig_bi[29] = 0; + } + /*Advance Coding, 0: BCC, 1: LDPC*/ + sig_bi[30] = pPMacTxInfo->bLDPC; + /* Short GI*/ + sig_bi[31] = pPMacTxInfo->bSGI; + /* N_ELTFs*/ + if (pPMacTxInfo->NDP_sound == FALSE) { + sig_bi[32] = 0; + sig_bi[33] = 0; + } else { + int N_ELTF = pPMacTxInfo->Ntx - pPMacPktInfo->Nss; + + for (i = 0; i < 2; i++) + sig_bi[32+i] = (N_ELTF>>i)%2; + } + /* CRC-8*/ + CRC8_generator(crc8, sig_bi, 34); + + for (i = 0; i < 8; i++) + sig_bi[34+i] = crc8[i]; + + /*Tail*/ + for (i = 42; i < 48; i++) + sig_bi[i] = 0; + + _rtw_memset(pPMacTxInfo->HT_SIG, 0, 6); + ByteToBit(pPMacTxInfo->HT_SIG, sig_bi, 6); +} + + +/*====================================================================================== + VHT-SIG-A1 + BW Reserved STBC G_ID SU_Nsts P_AID TXOP_PS_NOT_ALLOW Reserved + 2b 1b 1b 6b 3b 9b 1b 2b 1b + VHT-SIG-A2 + SGI SGI_Nsym SU/MU coding LDPC_Extra SU_NCS Beamformed Reserved CRC Tail + 1b 1b 1b 1b 4b 1b 1b 8b 6b +======================================================================================*/ +void VHT_SIG_A_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo) +{ + UINT i; + bool sig_bi[48], crc8[8]; + + _rtw_memset(sig_bi, 0, 48); + _rtw_memset(crc8, 0, 8); + + /* BW Setting*/ + for (i = 0; i < 2; i++) + sig_bi[i] = (pPMacTxInfo->BandWidth>>i) & 0x1; + /* Reserved Bit*/ + sig_bi[2] = 1; + /*STBC Field*/ + sig_bi[3] = pPMacTxInfo->bSTBC; + /*Group ID: Single User -> A value of 0 or 63 indicates an SU PPDU. */ + for (i = 0; i < 6; i++) + sig_bi[4+i] = 0; + /* N_STS/Partial AID*/ + for (i = 0; i < 12; i++) { + if (i < 3) + sig_bi[10+i] = ((pPMacPktInfo->Nsts - 1)>>i) & 0x1; + else + sig_bi[10+i] = 0; + } + /*TXOP_PS_NOT_ALLPWED*/ + sig_bi[22] = 0; + /*Reserved Bits*/ + sig_bi[23] = 1; + /*Short GI*/ + sig_bi[24] = pPMacTxInfo->bSGI; + if (pPMacTxInfo->bSGI > 0 && (pPMacPktInfo->N_sym%10) == 9) + sig_bi[25] = 1; + else + sig_bi[25] = 0; + /* SU/MU[0] Coding*/ + sig_bi[26] = pPMacTxInfo->bLDPC; /* 0:BCC, 1:LDPC */ + sig_bi[27] = pPMacPktInfo->SIGA2B3; /*/ Record Extra OFDM Symols is added or not when LDPC is used*/ + /*SU MCS/MU[1-3] Coding*/ + for (i = 0; i < 4; i++) + sig_bi[28+i] = (pPMacPktInfo->MCS>>i) & 0x1; + /*SU Beamform */ + sig_bi[32] = 0; /*packet.TXBF_en;*/ + /*Reserved Bit*/ + sig_bi[33] = 1; + /*CRC-8*/ + CRC8_generator(crc8, sig_bi, 34); + for (i = 0; i < 8; i++) + sig_bi[34+i] = crc8[i]; + /*Tail*/ + for (i = 42; i < 48; i++) + sig_bi[i] = 0; + + _rtw_memset(pPMacTxInfo->VHT_SIG_A, 0, 6); + ByteToBit(pPMacTxInfo->VHT_SIG_A, sig_bi, 6); +} + +/*====================================================================================== + VHT-SIG-B + Length Resesrved Trail + 17/19/21 BIT 3/2/2 BIT 6b +======================================================================================*/ +void VHT_SIG_B_generator( + PRT_PMAC_TX_INFO pPMacTxInfo) +{ + bool sig_bi[32], crc8_bi[8]; + UINT i, len, res, tail = 6, total_len, crc8_in_len; + UINT sigb_len; + + _rtw_memset(sig_bi, 0, 32); + _rtw_memset(crc8_bi, 0, 8); + + /*Sounding Packet*/ + if (pPMacTxInfo->NDP_sound == 1) { + if (pPMacTxInfo->BandWidth == 0) { + bool sigb_temp[26] = {0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + + _rtw_memcpy(sig_bi, sigb_temp, 26); + } else if (pPMacTxInfo->BandWidth == 1) { + bool sigb_temp[27] = {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}; + + _rtw_memcpy(sig_bi, sigb_temp, 27); + } else if (pPMacTxInfo->BandWidth == 2) { + bool sigb_temp[29] = {0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; + + _rtw_memcpy(sig_bi, sigb_temp, 29); + } + } else { /* Not NDP Sounding*/ + bool *sigb_temp[29] = {0}; + + if (pPMacTxInfo->BandWidth == 0) { + len = 17; res = 3; + } else if (pPMacTxInfo->BandWidth == 1) { + len = 19; res = 2; + } else if (pPMacTxInfo->BandWidth == 2) { + len = 21; res = 2; + } else { + len = 21; res = 2; + } + total_len = len+res+tail; + crc8_in_len = len+res; + + /*Length Field*/ + sigb_len = (pPMacTxInfo->PacketLength + 3) >> 2; + + for (i = 0; i < len; i++) + sig_bi[i] = (sigb_len>>i) & 0x1; + /*Reserved Field*/ + for (i = 0; i < res; i++) + sig_bi[len+i] = 1; + /* CRC-8*/ + CRC8_generator(crc8_bi, sig_bi, crc8_in_len); + + /* Tail */ + for (i = 0; i < tail; i++) + sig_bi[len+res+i] = 0; + } + + _rtw_memset(pPMacTxInfo->VHT_SIG_B, 0, 4); + ByteToBit(pPMacTxInfo->VHT_SIG_B, sig_bi, 4); + + pPMacTxInfo->VHT_SIG_B_CRC = 0; + ByteToBit(&(pPMacTxInfo->VHT_SIG_B_CRC), crc8_bi, 1); +} + +/*======================= + VHT Delimiter +=======================*/ +void VHT_Delimiter_generator( + PRT_PMAC_TX_INFO pPMacTxInfo + ) +{ + bool sig_bi[32] = {0}, crc8[8] = {0}; + UINT crc8_in_len = 16; + UINT PacketLength = pPMacTxInfo->PacketLength; + int j; + + /* Delimiter[0]: EOF*/ + sig_bi[0] = 1; + /* Delimiter[1]: Reserved*/ + sig_bi[1] = 0; + /* Delimiter[3:2]: MPDU Length High*/ + sig_bi[2] = ((PacketLength - 4) >> 12) % 2; + sig_bi[3] = ((PacketLength - 4) >> 13) % 2; + /* Delimiter[15:4]: MPDU Length Low*/ + for (j = 4; j < 16; j++) + sig_bi[j] = ((PacketLength - 4) >> (j-4)) % 2; + CRC8_generator(crc8, sig_bi, crc8_in_len); + for (j = 16; j < 24; j++) /* Delimiter[23:16]: CRC 8*/ + sig_bi[j] = crc8[j-16]; + for (j = 24; j < 32; j++) /* Delimiter[31:24]: Signature ('4E' in Hex, 78 in Dec)*/ + sig_bi[j] = (78 >> (j-24)) % 2; + + _rtw_memset(pPMacTxInfo->VHT_Delimiter, 0, 4); + ByteToBit(pPMacTxInfo->VHT_Delimiter, sig_bi, 4); +} + +#endif #endif diff --git a/rtl8188FU/core/rtw_odm.c b/rtl8188FU/core/rtw_odm.c index c5596d5..7b733a9 100755 --- a/rtl8188FU/core/rtw_odm.c +++ b/rtl8188FU/core/rtw_odm.c @@ -168,6 +168,18 @@ inline void rtw_odm_ability_set(_adapter *adapter, u32 ability) rtw_phydm_ability_set(adapter, ability); } +/* set ODM_CMNINFO_IC_TYPE based on chip_type */ +void rtw_odm_init_ic_type(_adapter *adapter) +{ + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); + DM_ODM_T *odm = &hal_data->odmpriv; + u4Byte ic_type = chip_type_to_odm_ic_type(rtw_get_chip_type(adapter)); + + rtw_warn_on(!ic_type); + + ODM_CmnInfoInit(odm, ODM_CMNINFO_IC_TYPE, ic_type); +} + void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter) { DBG_871X_SEL_NL(sel, "ADAPTIVITY_VERSION "ADAPTIVITY_VERSION"\n"); diff --git a/rtl8188FU/core/rtw_p2p.c b/rtl8188FU/core/rtw_p2p.c index d96d00f..101487d 100755 --- a/rtl8188FU/core/rtw_p2p.c +++ b/rtl8188FU/core/rtw_p2p.c @@ -3515,7 +3515,7 @@ _func_enter_; rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); if(!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) && - !(pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)) { val8 = 1; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); @@ -3539,7 +3539,7 @@ _func_enter_; if ( pbuddy_mlmeext->cur_channel != pwdinfo->listen_channel ) { set_channel_bwmode(padapter, pbuddy_mlmeext->cur_channel, pbuddy_mlmeext->cur_ch_offset, pbuddy_mlmeext->cur_bwmode); - if(!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) &&!(pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) + if (!check_buddy_mlmeinfo_state(padapter, WIFI_FW_AP_STATE) && ((pmlmeinfo->state&0x03) != WIFI_FW_AP_STATE)) { val8 = 0; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); diff --git a/rtl8188FU/core/rtw_pwrctrl.c b/rtl8188FU/core/rtw_pwrctrl.c index 9dd0956..1136183 100755 --- a/rtl8188FU/core/rtw_pwrctrl.c +++ b/rtl8188FU/core/rtw_pwrctrl.c @@ -211,10 +211,11 @@ bool rtw_pwr_unassociated_idle(_adapter *adapter) || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) || check_fwstate(pmlmepriv, WIFI_AP_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE) - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS) + #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) || pcfg80211_wdinfo->is_ro_ch #elif defined(CONFIG_P2P) - || !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) + || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) + || rtw_p2p_chk_state(pwdinfo, P2P_STATE_LISTEN) #endif #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) || rtw_get_passing_time_ms(pcfg80211_wdinfo->last_ro_ch_time) < 3000 @@ -237,10 +238,11 @@ bool rtw_pwr_unassociated_idle(_adapter *adapter) || check_fwstate(b_pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) || check_fwstate(b_pmlmepriv, WIFI_AP_STATE) || check_fwstate(b_pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE) - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS) + #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) || b_pcfg80211_wdinfo->is_ro_ch #elif defined(CONFIG_P2P) - || !rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_NONE) + || rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_IDLE) + || rtw_p2p_chk_state(b_pwdinfo, P2P_STATE_LISTEN) #endif #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) || rtw_get_passing_time_ms(b_pcfg80211_wdinfo->last_ro_ch_time) < 3000 @@ -689,10 +691,8 @@ u8 PS_RDY_CHECK(_adapter * padapter) || check_fwstate(pmlmepriv, WIFI_UNDER_LINKING|WIFI_UNDER_WPS) || check_fwstate(pmlmepriv, WIFI_AP_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE|WIFI_ADHOC_STATE) - #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) && defined(CONFIG_P2P_IPS) + #if defined(CONFIG_P2P) && defined(CONFIG_IOCTL_CFG80211) || pcfg80211_wdinfo->is_ro_ch - #elif defined(CONFIG_P2P) - || !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) #endif || rtw_is_scan_deny(padapter) #ifdef CONFIG_TDLS @@ -905,8 +905,6 @@ _func_enter_; else pwrpriv->lps_leave_cnts = 0; #ifdef CONFIG_TDLS - _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - for(i=0; i< NUM_STA; i++) { phead = &(pstapriv->sta_hash[i]); @@ -921,8 +919,6 @@ _func_enter_; plist = get_next(plist); } } - - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); #endif //CONFIG_TDLS pwrpriv->pwr_mode = ps_mode; @@ -984,8 +980,6 @@ _func_enter_; else pwrpriv->lps_enter_cnts = 0; #ifdef CONFIG_TDLS - _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - for(i=0; i< NUM_STA; i++) { phead = &(pstapriv->sta_hash[i]); @@ -1000,8 +994,6 @@ _func_enter_; plist = get_next(plist); } } - - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); #endif //CONFIG_TDLS #ifdef CONFIG_BT_COEXIST @@ -2187,6 +2179,7 @@ _func_enter_; /*default low active*/ pwrctrlpriv->is_high_active = HIGH_ACTIVE; val8 = (pwrctrlpriv->is_high_active == 0) ? 1 : 0; + rtw_hal_switch_gpio_wl_ctrl(padapter, WAKEUP_GPIO_IDX, _TRUE); rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, val8); DBG_871X("%s: set GPIO_%d %d as default.\n", __func__, WAKEUP_GPIO_IDX, val8); diff --git a/rtl8188FU/core/rtw_recv.c b/rtl8188FU/core/rtw_recv.c index 668b4a6..43d5e5b 100755 --- a/rtl8188FU/core/rtw_recv.c +++ b/rtl8188FU/core/rtw_recv.c @@ -1038,7 +1038,7 @@ sint OnTDLS(_adapter *adapter, union recv_frame *precv_frame) + PAYLOAD_TYPE_LEN + category_field; - DBG_871X("[TDLS] Recv %s from "MAC_FMT"\n", rtw_tdls_action_txt(*paction), MAC_ARG(pattrib->src)); + DBG_871X("[TDLS] Recv %s from "MAC_FMT" with SeqNum = %d \n", rtw_tdls_action_txt(*paction), MAC_ARG(pattrib->src), GetSequence(get_recvframe_data(precv_frame))); if (hal_chk_wl_func(adapter, WL_FUNC_TDLS) == _FALSE) { DBG_871X("Ignore tdls frame since hal doesn't support tdls\n"); @@ -1263,13 +1263,11 @@ _func_enter_; } #ifdef CONFIG_TDLS_CH_SW - pchsw_info->ch_sw_state |= TDLS_PEER_AT_OFF_STATE; - if(ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) { - if (!(pchsw_info->ch_sw_state & TDLS_PEER_AT_OFF_STATE)) { - DBG_871X("%s %d\n", __FUNCTION__, __LINE__); - issue_nulldata_to_TDLS_peer_STA(adapter, ptdls_sta->hwaddr, 0, 0, 0); + if (adapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(adapter)) { pchsw_info->ch_sw_state |= TDLS_PEER_AT_OFF_STATE; + if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)) + _cancel_timer_ex(&ptdls_sta->ch_sw_timer); /* On_TDLS_Peer_Traffic_Rsp(adapter, precv_frame); */ } } @@ -2325,7 +2323,8 @@ _func_enter_; #if 1 //Dump rx packets { - u8 bDumpRxPkt; + u8 bDumpRxPkt = 0; + rtw_hal_get_def_var(adapter, HAL_DEF_DBG_DUMP_RXPKT, &(bDumpRxPkt)); if (bDumpRxPkt == 1) //dump all rx packets dump_rx_packet(ptr); @@ -3556,11 +3555,15 @@ int recv_indicatepkt_reorder(_adapter *padapter, union recv_frame *prframe) //recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE); if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _FALSE)==_TRUE) { + if (!preorder_ctrl->bReorderWaiting) { + preorder_ctrl->bReorderWaiting = _TRUE; _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); + } _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); } else { + preorder_ctrl->bReorderWaiting = _FALSE; _exit_critical_bh(&ppending_recvframe_queue->lock, &irql); _cancel_timer_ex(&preorder_ctrl->reordering_ctrl_timer); } @@ -3593,6 +3596,10 @@ void rtw_reordering_ctrl_timeout_handler(void *pcontext) _enter_critical_bh(&ppending_recvframe_queue->lock, &irql); + if (preorder_ctrl) { + preorder_ctrl->bReorderWaiting = _FALSE; + } + if(recv_indicatepkts_in_order(padapter, preorder_ctrl, _TRUE)==_TRUE) { _set_timer(&preorder_ctrl->reordering_ctrl_timer, REORDER_WAIT_TIME); @@ -3683,9 +3690,11 @@ int validate_mp_recv_frame(_adapter *adapter, union recv_frame *precv_frame) int ret = _SUCCESS; u8 *ptr = precv_frame->u.hdr.rx_data; u8 type,subtype; + struct mp_priv *pmppriv = &adapter->mppriv; + struct mp_tx *pmptx; + + pmptx = &pmppriv->tx; - if(!adapter->mppriv.bmac_filter) - return ret; #if 0 if (1){ u8 bDumpRxPkt; @@ -3700,10 +3709,19 @@ int validate_mp_recv_frame(_adapter *adapter, union recv_frame *precv_frame) 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"); + DBG_871X("#############################\n"); } } -#endif +#endif + if (pmppriv->bloopback) { + if (_rtw_memcmp(ptr + 24, pmptx->buf + 24, precv_frame->u.hdr.len - 24) == _FALSE) { + DBG_871X("Compare payload content Fail !!!\n"); + ret = _FAIL; + } + } + + if (!adapter->mppriv.bmac_filter) + return ret; if(_rtw_memcmp( GetAddr2Ptr(ptr), adapter->mppriv.mac_filter, ETH_ALEN) == _FALSE ) ret = _FAIL; diff --git a/rtl8188FU/core/rtw_rf.c b/rtl8188FU/core/rtw_rf.c index 7f3ed03..e97af16 100755 --- a/rtl8188FU/core/rtw_rf.c +++ b/rtl8188FU/core/rtw_rf.c @@ -188,266 +188,418 @@ const u8 _band_to_band_cap[] = { 0, }; -struct country_chplan { - char alpha2[2]; - u8 chplan; +#ifdef CONFIG_80211AC_VHT +#define COUNTRY_CHPLAN_ASSIGN_EN_11AC(_val) , .en_11ac = (_val) +#else +#define COUNTRY_CHPLAN_ASSIGN_EN_11AC(_val) +#endif + +#if RTW_DEF_MODULE_REGULATORY_CERT +#define COUNTRY_CHPLAN_ASSIGN_DEF_MODULE_FLAGS(_val) , .def_module_flags = (_val) +#else +#define COUNTRY_CHPLAN_ASSIGN_DEF_MODULE_FLAGS(_val) +#endif + +/* has def_module_flags specified, used by common map and HAL dfference map */ +#define COUNTRY_CHPLAN_ENT(_alpha2, _chplan, _en_11ac, _def_module_flags) \ + {.alpha2 = (_alpha2), .chplan = (_chplan) \ + COUNTRY_CHPLAN_ASSIGN_EN_11AC(_en_11ac) \ + COUNTRY_CHPLAN_ASSIGN_DEF_MODULE_FLAGS(_def_module_flags) \ + } + +#ifdef CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP + +#include "../platform/custom_country_chplan.h" + +#elif RTW_DEF_MODULE_REGULATORY_CERT + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8821AE_HMC_M2) +static const struct country_chplan RTL8821AE_HMC_M2_country_chplan_map[] = { + COUNTRY_CHPLAN_ENT("CN", 0x51, 1, 0xFB), /* China */ + COUNTRY_CHPLAN_ENT("RU", 0x59, 0, 0xFB), /* Russia(fac/gost), Kaliningrad */ + COUNTRY_CHPLAN_ENT("UA", 0x26, 0, 0xFB), /* Ukraine */ +}; +static const u16 RTL8821AE_HMC_M2_country_chplan_map_sz = sizeof(RTL8821AE_HMC_M2_country_chplan_map)/sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8821AU) +static const struct country_chplan RTL8821AU_country_chplan_map[] = { + COUNTRY_CHPLAN_ENT("RU", 0x59, 0, 0xFB), /* Russia(fac/gost), Kaliningrad */ + COUNTRY_CHPLAN_ENT("UA", 0x26, 0, 0xFB), /* Ukraine */ +}; +static const u16 RTL8821AU_country_chplan_map_sz = sizeof(RTL8821AU_country_chplan_map)/sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8812AENF_NGFF) +static const struct country_chplan RTL8812AENF_NGFF_country_chplan_map[] = { +}; +static const u16 RTL8812AENF_NGFF_country_chplan_map_sz = sizeof(RTL8812AENF_NGFF_country_chplan_map)/sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8812AEBT_HMC) +static const struct country_chplan RTL8812AEBT_HMC_country_chplan_map[] = { +}; +static const u16 RTL8812AEBT_HMC_country_chplan_map_sz = sizeof(RTL8812AEBT_HMC_country_chplan_map)/sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8188EE_HMC_M2) +static const struct country_chplan RTL8188EE_HMC_M2_country_chplan_map[] = { +}; +static const u16 RTL8188EE_HMC_M2_country_chplan_map_sz = sizeof(RTL8188EE_HMC_M2_country_chplan_map)/sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8723BE_HMC_M2) +static const struct country_chplan RTL8723BE_HMC_M2_country_chplan_map[] = { +}; +static const u16 RTL8723BE_HMC_M2_country_chplan_map_sz = sizeof(RTL8723BE_HMC_M2_country_chplan_map)/sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8723BS_NGFF1216) +static const struct country_chplan RTL8723BS_NGFF1216_country_chplan_map[] = { +}; +static const u16 RTL8723BS_NGFF1216_country_chplan_map_sz = sizeof(RTL8723BS_NGFF1216_country_chplan_map)/sizeof(struct country_chplan); +#endif + +#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8192EEBT_HMC_M2) +static const struct country_chplan RTL8192EEBT_HMC_M2_country_chplan_map[] = { }; +static const u16 RTL8192EEBT_HMC_M2_country_chplan_map_sz = sizeof(RTL8192EEBT_HMC_M2_country_chplan_map)/sizeof(struct country_chplan); +#endif + +/** + * rtw_def_module_get_chplan_from_country - + * @country_code: string of country code + * @return: + * Return NULL for case referring to common map + */ +static const struct country_chplan *rtw_def_module_get_chplan_from_country(const char *country_code) +{ + const struct country_chplan *ent = NULL; + const struct country_chplan *hal_map = NULL; + u16 hal_map_sz = 0; + int i; + + /* TODO: runtime selection for multi driver */ +#if (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8821AE_HMC_M2) + hal_map = RTL8821AE_HMC_M2_country_chplan_map; + hal_map_sz = RTL8821AE_HMC_M2_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8821AU) + hal_map = RTL8821AU_country_chplan_map; + hal_map_sz = RTL8821AU_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8812AENF_NGFF) + hal_map = RTL8812AENF_NGFF_country_chplan_map; + hal_map_sz = RTL8812AENF_NGFF_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8812AEBT_HMC) + hal_map = RTL8812AEBT_HMC_country_chplan_map; + hal_map_sz = RTL8812AEBT_HMC_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8188EE_HMC_M2) + hal_map = RTL8188EE_HMC_M2_country_chplan_map; + hal_map_sz = RTL8188EE_HMC_M2_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8723BE_HMC_M2) + hal_map = RTL8723BE_HMC_M2_country_chplan_map; + hal_map_sz = RTL8723BE_HMC_M2_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8723BS_NGFF1216) + hal_map = RTL8723BS_NGFF1216_country_chplan_map; + hal_map_sz = RTL8723BS_NGFF1216_country_chplan_map_sz; +#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8192EEBT_HMC_M2) + hal_map = RTL8192EEBT_HMC_M2_country_chplan_map; + hal_map_sz = RTL8192EEBT_HMC_M2_country_chplan_map_sz; +#endif + + if (hal_map == NULL || hal_map_sz == 0) + goto exit; + + for (i = 0; i < hal_map_sz; i++) { + if (strncmp(country_code, hal_map[i].alpha2, 2) == 0) { + ent = &hal_map[i]; + break; + } + } + +exit: + return ent; +} +#endif /* CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP or RTW_DEF_MODULE_REGULATORY_CERT */ static const struct country_chplan country_chplan_map[] = { - {"AD", 0x26}, /* Andorra */ - {"AE", 0x26}, /* United Arab Emirates */ - {"AF", 0x42}, /* Afghanistan */ - {"AG", 0x30}, /* Antigua & Barbuda */ - {"AI", 0x26}, /* Anguilla(UK) */ - {"AL", 0x26}, /* Albania */ - {"AM", 0x34}, /* Armenia */ - {"AO", 0x26}, /* Angola */ - {"AQ", 0x26}, /* Antarctica */ - {"AR", 0x57}, /* Argentina */ - {"AS", 0x34}, /* American Samoa */ - {"AT", 0x26}, /* Austria */ - {"AU", 0x45}, /* Australia */ - {"AW", 0x34}, /* Aruba */ - {"AZ", 0x26}, /* Azerbaijan */ - {"BA", 0x26}, /* Bosnia & Herzegovina */ - {"BB", 0x34}, /* Barbados */ - {"BD", 0x26}, /* Bangladesh */ - {"BE", 0x26}, /* Belgium */ - {"BF", 0x26}, /* Burkina Faso */ - {"BG", 0x26}, /* Bulgaria */ - {"BH", 0x47}, /* Bahrain */ - {"BI", 0x26}, /* Burundi */ - {"BJ", 0x26}, /* Benin */ - {"BN", 0x47}, /* Brunei */ - {"BO", 0x30}, /* Bolivia */ - {"BR", 0x34}, /* Brazil */ - {"BS", 0x34}, /* Bahamas */ - {"BW", 0x26}, /* Botswana */ - {"BY", 0x26}, /* Belarus */ - {"BZ", 0x34}, /* Belize */ - {"CA", 0x34}, /* Canada */ - {"CC", 0x26}, /* Cocos (Keeling) Islands (Australia) */ - {"CD", 0x26}, /* Congo, Republic of the */ - {"CF", 0x26}, /* Central African Republic */ - {"CG", 0x26}, /* Congo, Democratic Republic of the. Zaire */ - {"CH", 0x26}, /* Switzerland */ - {"CI", 0x26}, /* Cote d'Ivoire */ - {"CK", 0x26}, /* Cook Islands */ - {"CL", 0x30}, /* Chile */ - {"CM", 0x26}, /* Cameroon */ - {"CN", 0x48}, /* China */ - {"CO", 0x34}, /* Colombia */ - {"CR", 0x34}, /* Costa Rica */ - {"CV", 0x26}, /* Cape Verde */ - {"CX", 0x45}, /* Christmas Island (Australia) */ - {"CY", 0x26}, /* Cyprus */ - {"CZ", 0x26}, /* Czech Republic */ - {"DE", 0x26}, /* Germany */ - {"DJ", 0x26}, /* Djibouti */ - {"DK", 0x26}, /* Denmark */ - {"DM", 0x34}, /* Dominica */ - {"DO", 0x34}, /* Dominican Republic */ - {"DZ", 0x26}, /* Algeria */ - {"EC", 0x34}, /* Ecuador */ - {"EE", 0x26}, /* Estonia */ - {"EG", 0x47}, /* Egypt */ - {"EH", 0x47}, /* Western Sahara */ - {"ER", 0x26}, /* Eritrea */ - {"ES", 0x26}, /* Spain */ - {"ET", 0x26}, /* Ethiopia */ - {"FI", 0x26}, /* Finland */ - {"FJ", 0x34}, /* Fiji */ - {"FK", 0x26}, /* Falkland Islands (Islas Malvinas) (UK) */ - {"FM", 0x34}, /* Micronesia, Federated States of (USA) */ - {"FO", 0x26}, /* Faroe Islands (Denmark) */ - {"FR", 0x26}, /* France */ - {"GA", 0x26}, /* Gabon */ - {"GB", 0x26}, /* Great Britain (United Kingdom; England) */ - {"GD", 0x34}, /* Grenada */ - {"GE", 0x26}, /* Georgia */ - {"GF", 0x26}, /* French Guiana */ - {"GG", 0x26}, /* Guernsey (UK) */ - {"GH", 0x26}, /* Ghana */ - {"GI", 0x26}, /* Gibraltar (UK) */ - {"GL", 0x26}, /* Greenland (Denmark) */ - {"GM", 0x26}, /* Gambia */ - {"GN", 0x26}, /* Guinea */ - {"GP", 0x26}, /* Guadeloupe (France) */ - {"GQ", 0x26}, /* Equatorial Guinea */ - {"GR", 0x26}, /* Greece */ - {"GS", 0x26}, /* South Georgia and the Sandwich Islands (UK) */ - {"GT", 0x34}, /* Guatemala */ - {"GU", 0x34}, /* Guam (USA) */ - {"GW", 0x26}, /* Guinea-Bissau */ - {"GY", 0x44}, /* Guyana */ - {"HK", 0x26}, /* Hong Kong */ - {"HM", 0x45}, /* Heard and McDonald Islands (Australia) */ - {"HN", 0x32}, /* Honduras */ - {"HR", 0x26}, /* Croatia */ - {"HT", 0x34}, /* Haiti */ - {"HU", 0x26}, /* Hungary */ - {"ID", 0x54}, /* Indonesia */ - {"IE", 0x26}, /* Ireland */ - {"IL", 0x47}, /* Israel */ - {"IM", 0x26}, /* Isle of Man (UK) */ - {"IN", 0x47}, /* India */ - {"IQ", 0x26}, /* Iraq */ - {"IR", 0x26}, /* Iran */ - {"IS", 0x26}, /* Iceland */ - {"IT", 0x26}, /* Italy */ - {"JE", 0x26}, /* Jersey (UK) */ - {"JM", 0x51}, /* Jamaica */ - {"JO", 0x49}, /* Jordan */ - {"JP", 0x27}, /* Japan- Telec */ - {"KE", 0x47}, /* Kenya */ - {"KG", 0x26}, /* Kyrgyzstan */ - {"KH", 0x26}, /* Cambodia */ - {"KI", 0x26}, /* Kiribati */ - {"KN", 0x34}, /* Saint Kitts and Nevis */ - {"KR", 0x28}, /* South Korea */ - {"KW", 0x47}, /* Kuwait */ - {"KY", 0x34}, /* Cayman Islands (UK) */ - {"KZ", 0x26}, /* Kazakhstan */ - {"LA", 0x26}, /* Laos */ - {"LB", 0x26}, /* Lebanon */ - {"LC", 0x34}, /* Saint Lucia */ - {"LI", 0x26}, /* Liechtenstein */ - {"LK", 0x26}, /* Sri Lanka */ - {"LR", 0x26}, /* Liberia */ - {"LS", 0x26}, /* Lesotho */ - {"LT", 0x26}, /* Lithuania */ - {"LU", 0x26}, /* Luxembourg */ - {"LV", 0x26}, /* Latvia */ - {"LY", 0x26}, /* Libya */ - {"MA", 0x47}, /* Morocco */ - {"MC", 0x26}, /* Monaco */ - {"MD", 0x26}, /* Moldova */ - {"ME", 0x26}, /* Montenegro */ - {"MF", 0x34}, /* Saint Martin */ - {"MG", 0x26}, /* Madagascar */ - {"MH", 0x34}, /* Marshall Islands (USA) */ - {"MK", 0x26}, /* Republic of Macedonia (FYROM) */ - {"ML", 0x26}, /* Mali */ - {"MM", 0x26}, /* Burma (Myanmar) */ - {"MN", 0x26}, /* Mongolia */ - {"MO", 0x26}, /* Macau */ - {"MP", 0x34}, /* Northern Mariana Islands (USA) */ - {"MQ", 0x26}, /* Martinique (France) */ - {"MR", 0x26}, /* Mauritania */ - {"MS", 0x26}, /* Montserrat (UK) */ - {"MT", 0x26}, /* Malta */ - {"MU", 0x26}, /* Mauritius */ - {"MV", 0x26}, /* Maldives */ - {"MW", 0x26}, /* Malawi */ - {"MX", 0x34}, /* Mexico */ - {"MY", 0x47}, /* Malaysia */ - {"MZ", 0x26}, /* Mozambique */ - {"NA", 0x26}, /* Namibia */ - {"NC", 0x26}, /* New Caledonia */ - {"NE", 0x26}, /* Niger */ - {"NF", 0x45}, /* Norfolk Island (Australia) */ - {"NG", 0x50}, /* Nigeria */ - {"NI", 0x34}, /* Nicaragua */ - {"NL", 0x26}, /* Netherlands */ - {"NO", 0x26}, /* Norway */ - {"NP", 0x47}, /* Nepal */ - {"NR", 0x26}, /* Nauru */ - {"NU", 0x45}, /* Niue */ - {"NZ", 0x45}, /* New Zealand */ - {"OM", 0x26}, /* Oman */ - {"PA", 0x34}, /* Panama */ - {"PE", 0x34}, /* Peru */ - {"PF", 0x26}, /* French Polynesia (France) */ - {"PG", 0x26}, /* Papua New Guinea */ - {"PH", 0x26}, /* Philippines */ - {"PK", 0x51}, /* Pakistan */ - {"PL", 0x26}, /* Poland */ - {"PM", 0x26}, /* Saint Pierre and Miquelon (France) */ - {"PR", 0x34}, /* Puerto Rico */ - {"PT", 0x26}, /* Portugal */ - {"PW", 0x34}, /* Palau */ - {"PY", 0x34}, /* Paraguay */ - {"QA", 0x51}, /* Qatar */ - {"RE", 0x26}, /* Reunion (France) */ - {"RO", 0x26}, /* Romania */ - {"RS", 0x26}, /* Serbia */ - {"RU", 0x59}, /* Russia, fac/gost */ - {"RW", 0x26}, /* Rwanda */ - {"SA", 0x26}, /* Saudi Arabia */ - {"SB", 0x26}, /* Solomon Islands */ - {"SC", 0x34}, /* Seychelles */ - {"SE", 0x26}, /* Sweden */ - {"SG", 0x47}, /* Singapore */ - {"SH", 0x26}, /* Saint Helena (UK) */ - {"SI", 0x26}, /* Slovenia */ - {"SJ", 0x26}, /* Svalbard (Norway) */ - {"SK", 0x26}, /* Slovakia */ - {"SL", 0x26}, /* Sierra Leone */ - {"SM", 0x26}, /* San Marino */ - {"SN", 0x26}, /* Senegal */ - {"SO", 0x26}, /* Somalia */ - {"SR", 0x34}, /* Suriname */ - {"ST", 0x34}, /* Sao Tome and Principe */ - {"SV", 0x30}, /* El Salvador */ - {"SX", 0x34}, /* Sint Marteen */ - {"SZ", 0x26}, /* Swaziland */ - {"TC", 0x26}, /* Turks and Caicos Islands (UK) */ - {"TD", 0x26}, /* Chad */ - {"TF", 0x26}, /* French Southern and Antarctic Lands (FR Southern Territories) */ - {"TG", 0x26}, /* Togo */ - {"TH", 0x26}, /* Thailand */ - {"TJ", 0x26}, /* Tajikistan */ - {"TK", 0x45}, /* Tokelau */ - {"TM", 0x26}, /* Turkmenistan */ - {"TN", 0x47}, /* Tunisia */ - {"TO", 0x26}, /* Tonga */ - {"TR", 0x26}, /* Turkey */ - {"TT", 0x42}, /* Trinidad & Tobago */ - {"TW", 0x39}, /* Taiwan */ - {"TZ", 0x26}, /* Tanzania */ - {"UA", 0x26}, /* Ukraine */ - {"UG", 0x26}, /* Uganda */ - {"US", 0x34}, /* United States of America (USA) */ - {"UY", 0x34}, /* Uruguay */ - {"UZ", 0x47}, /* Uzbekistan */ - {"VA", 0x26}, /* Holy See (Vatican City) */ - {"VC", 0x34}, /* Saint Vincent and the Grenadines */ - {"VE", 0x30}, /* Venezuela */ - {"VI", 0x34}, /* United States Virgin Islands (USA) */ - {"VN", 0x26}, /* Vietnam */ - {"VU", 0x26}, /* Vanuatu */ - {"WF", 0x26}, /* Wallis and Futuna (France) */ - {"WS", 0x34}, /* Samoa */ - {"YE", 0x26}, /* Yemen */ - {"YT", 0x26}, /* Mayotte (France) */ - {"ZA", 0x26}, /* South Africa */ - {"ZM", 0x26}, /* Zambia */ - {"ZW", 0x26}, /* Zimbabwe */ + COUNTRY_CHPLAN_ENT("AD", 0x26, 1, 0x00), /* Andorra */ + COUNTRY_CHPLAN_ENT("AE", 0x26, 1, 0xFB), /* United Arab Emirates */ + COUNTRY_CHPLAN_ENT("AF", 0x42, 1, 0x00), /* Afghanistan */ + COUNTRY_CHPLAN_ENT("AG", 0x30, 1, 0x00), /* Antigua & Barbuda */ + COUNTRY_CHPLAN_ENT("AI", 0x26, 1, 0x00), /* Anguilla(UK) */ + COUNTRY_CHPLAN_ENT("AL", 0x26, 1, 0xF1), /* Albania */ + COUNTRY_CHPLAN_ENT("AM", 0x26, 1, 0xB0), /* Armenia */ + COUNTRY_CHPLAN_ENT("AO", 0x26, 1, 0xE0), /* Angola */ + COUNTRY_CHPLAN_ENT("AQ", 0x26, 1, 0x00), /* Antarctica */ + COUNTRY_CHPLAN_ENT("AR", 0x57, 1, 0xF3), /* Argentina */ + COUNTRY_CHPLAN_ENT("AS", 0x34, 1, 0x00), /* American Samoa */ + COUNTRY_CHPLAN_ENT("AT", 0x26, 1, 0xFB), /* Austria */ + COUNTRY_CHPLAN_ENT("AU", 0x45, 1, 0xFB), /* Australia */ + COUNTRY_CHPLAN_ENT("AW", 0x34, 1, 0xB0), /* Aruba */ + COUNTRY_CHPLAN_ENT("AZ", 0x26, 1, 0xF1), /* Azerbaijan */ + COUNTRY_CHPLAN_ENT("BA", 0x26, 1, 0xF1), /* Bosnia & Herzegovina */ + COUNTRY_CHPLAN_ENT("BB", 0x34, 1, 0x50), /* Barbados */ + COUNTRY_CHPLAN_ENT("BD", 0x26, 1, 0xF1), /* Bangladesh */ + COUNTRY_CHPLAN_ENT("BE", 0x26, 1, 0xFB), /* Belgium */ + COUNTRY_CHPLAN_ENT("BF", 0x26, 1, 0xB0), /* Burkina Faso */ + COUNTRY_CHPLAN_ENT("BG", 0x26, 1, 0xF1), /* Bulgaria */ + COUNTRY_CHPLAN_ENT("BH", 0x47, 1, 0xF1), /* Bahrain */ + COUNTRY_CHPLAN_ENT("BI", 0x26, 1, 0xB0), /* Burundi */ + COUNTRY_CHPLAN_ENT("BJ", 0x26, 1, 0xB0), /* Benin */ + COUNTRY_CHPLAN_ENT("BN", 0x47, 1, 0x10), /* Brunei */ + COUNTRY_CHPLAN_ENT("BO", 0x30, 1, 0xF1), /* Bolivia */ + COUNTRY_CHPLAN_ENT("BR", 0x34, 1, 0xF1), /* Brazil */ + COUNTRY_CHPLAN_ENT("BS", 0x34, 1, 0x20), /* Bahamas */ + COUNTRY_CHPLAN_ENT("BW", 0x26, 1, 0xF1), /* Botswana */ + COUNTRY_CHPLAN_ENT("BY", 0x26, 1, 0xF1), /* Belarus */ + COUNTRY_CHPLAN_ENT("BZ", 0x34, 1, 0x00), /* Belize */ + COUNTRY_CHPLAN_ENT("CA", 0x34, 1, 0xFB), /* Canada */ + COUNTRY_CHPLAN_ENT("CC", 0x26, 1, 0x00), /* Cocos (Keeling) Islands (Australia) */ + COUNTRY_CHPLAN_ENT("CD", 0x26, 1, 0xB0), /* Congo, Republic of the */ + COUNTRY_CHPLAN_ENT("CF", 0x26, 1, 0xB0), /* Central African Republic */ + COUNTRY_CHPLAN_ENT("CG", 0x26, 1, 0xB0), /* Congo, Democratic Republic of the. Zaire */ + COUNTRY_CHPLAN_ENT("CH", 0x26, 1, 0xFB), /* Switzerland */ + COUNTRY_CHPLAN_ENT("CI", 0x26, 1, 0xF1), /* Cote d'Ivoire */ + COUNTRY_CHPLAN_ENT("CK", 0x26, 1, 0x00), /* Cook Islands */ + COUNTRY_CHPLAN_ENT("CL", 0x30, 1, 0xF1), /* Chile */ + COUNTRY_CHPLAN_ENT("CM", 0x26, 1, 0xB0), /* Cameroon */ + COUNTRY_CHPLAN_ENT("CN", 0x48, 1, 0xFB), /* China */ + COUNTRY_CHPLAN_ENT("CO", 0x34, 1, 0xF1), /* Colombia */ + COUNTRY_CHPLAN_ENT("CR", 0x34, 1, 0xF1), /* Costa Rica */ + COUNTRY_CHPLAN_ENT("CV", 0x26, 1, 0xB0), /* Cape Verde */ + COUNTRY_CHPLAN_ENT("CX", 0x45, 1, 0x00), /* Christmas Island (Australia) */ + COUNTRY_CHPLAN_ENT("CY", 0x26, 1, 0xFB), /* Cyprus */ + COUNTRY_CHPLAN_ENT("CZ", 0x26, 1, 0xFB), /* Czech Republic */ + COUNTRY_CHPLAN_ENT("DE", 0x26, 1, 0xFB), /* Germany */ + COUNTRY_CHPLAN_ENT("DJ", 0x26, 1, 0x80), /* Djibouti */ + COUNTRY_CHPLAN_ENT("DK", 0x26, 1, 0xFB), /* Denmark */ + COUNTRY_CHPLAN_ENT("DM", 0x34, 1, 0x00), /* Dominica */ + COUNTRY_CHPLAN_ENT("DO", 0x34, 1, 0xF1), /* Dominican Republic */ + COUNTRY_CHPLAN_ENT("DZ", 0x26, 1, 0xF1), /* Algeria */ + COUNTRY_CHPLAN_ENT("EC", 0x34, 1, 0xF1), /* Ecuador */ + COUNTRY_CHPLAN_ENT("EE", 0x26, 1, 0xFB), /* Estonia */ + COUNTRY_CHPLAN_ENT("EG", 0x47, 0, 0xF1), /* Egypt */ + COUNTRY_CHPLAN_ENT("EH", 0x47, 1, 0x80), /* Western Sahara */ + COUNTRY_CHPLAN_ENT("ER", 0x26, 1, 0x00), /* Eritrea */ + COUNTRY_CHPLAN_ENT("ES", 0x26, 1, 0xFB), /* Spain, Canary Islands, Ceuta, Melilla */ + COUNTRY_CHPLAN_ENT("ET", 0x26, 1, 0xB0), /* Ethiopia */ + COUNTRY_CHPLAN_ENT("FI", 0x26, 1, 0xFB), /* Finland */ + COUNTRY_CHPLAN_ENT("FJ", 0x34, 1, 0x00), /* Fiji */ + COUNTRY_CHPLAN_ENT("FK", 0x26, 1, 0x00), /* Falkland Islands (Islas Malvinas) (UK) */ + COUNTRY_CHPLAN_ENT("FM", 0x34, 1, 0x00), /* Micronesia, Federated States of (USA) */ + COUNTRY_CHPLAN_ENT("FO", 0x26, 1, 0x00), /* Faroe Islands (Denmark) */ + COUNTRY_CHPLAN_ENT("FR", 0x26, 1, 0xFB), /* France */ + COUNTRY_CHPLAN_ENT("GA", 0x26, 1, 0xB0), /* Gabon */ + COUNTRY_CHPLAN_ENT("GB", 0x26, 1, 0xFB), /* Great Britain (United Kingdom; England) */ + COUNTRY_CHPLAN_ENT("GD", 0x34, 1, 0xB0), /* Grenada */ + COUNTRY_CHPLAN_ENT("GE", 0x26, 1, 0x00), /* Georgia */ + COUNTRY_CHPLAN_ENT("GF", 0x26, 1, 0x80), /* French Guiana */ + COUNTRY_CHPLAN_ENT("GG", 0x26, 1, 0x00), /* Guernsey (UK) */ + COUNTRY_CHPLAN_ENT("GH", 0x26, 1, 0xF1), /* Ghana */ + COUNTRY_CHPLAN_ENT("GI", 0x26, 1, 0x00), /* Gibraltar (UK) */ + COUNTRY_CHPLAN_ENT("GL", 0x26, 1, 0x00), /* Greenland (Denmark) */ + COUNTRY_CHPLAN_ENT("GM", 0x26, 1, 0xB0), /* Gambia */ + COUNTRY_CHPLAN_ENT("GN", 0x26, 1, 0x10), /* Guinea */ + COUNTRY_CHPLAN_ENT("GP", 0x26, 1, 0x00), /* Guadeloupe (France) */ + COUNTRY_CHPLAN_ENT("GQ", 0x26, 1, 0xB0), /* Equatorial Guinea */ + COUNTRY_CHPLAN_ENT("GR", 0x26, 1, 0xFB), /* Greece */ + COUNTRY_CHPLAN_ENT("GS", 0x26, 1, 0x00), /* South Georgia and the Sandwich Islands (UK) */ + COUNTRY_CHPLAN_ENT("GT", 0x34, 1, 0xF1), /* Guatemala */ + COUNTRY_CHPLAN_ENT("GU", 0x34, 1, 0x00), /* Guam (USA) */ + COUNTRY_CHPLAN_ENT("GW", 0x26, 1, 0xB0), /* Guinea-Bissau */ + COUNTRY_CHPLAN_ENT("GY", 0x44, 1, 0x00), /* Guyana */ + COUNTRY_CHPLAN_ENT("HK", 0x26, 1, 0xFB), /* Hong Kong */ + COUNTRY_CHPLAN_ENT("HM", 0x45, 1, 0x00), /* Heard and McDonald Islands (Australia) */ + COUNTRY_CHPLAN_ENT("HN", 0x32, 1, 0xF1), /* Honduras */ + COUNTRY_CHPLAN_ENT("HR", 0x26, 1, 0xF9), /* Croatia */ + COUNTRY_CHPLAN_ENT("HT", 0x34, 1, 0x50), /* Haiti */ + COUNTRY_CHPLAN_ENT("HU", 0x26, 1, 0xFB), /* Hungary */ + COUNTRY_CHPLAN_ENT("ID", 0x54, 0, 0xF3), /* Indonesia */ + COUNTRY_CHPLAN_ENT("IE", 0x26, 1, 0xFB), /* Ireland */ + COUNTRY_CHPLAN_ENT("IL", 0x47, 1, 0xF1), /* Israel */ + COUNTRY_CHPLAN_ENT("IM", 0x26, 1, 0x00), /* Isle of Man (UK) */ + COUNTRY_CHPLAN_ENT("IN", 0x47, 1, 0xF1), /* India */ + COUNTRY_CHPLAN_ENT("IQ", 0x26, 1, 0x00), /* Iraq */ + COUNTRY_CHPLAN_ENT("IR", 0x26, 0, 0x00), /* Iran */ + COUNTRY_CHPLAN_ENT("IS", 0x26, 1, 0xFB), /* Iceland */ + COUNTRY_CHPLAN_ENT("IT", 0x26, 1, 0xFB), /* Italy */ + COUNTRY_CHPLAN_ENT("JE", 0x26, 1, 0x00), /* Jersey (UK) */ + COUNTRY_CHPLAN_ENT("JM", 0x51, 1, 0xF1), /* Jamaica */ + COUNTRY_CHPLAN_ENT("JO", 0x49, 1, 0xFB), /* Jordan */ + COUNTRY_CHPLAN_ENT("JP", 0x27, 1, 0xFF), /* Japan- Telec */ + COUNTRY_CHPLAN_ENT("KE", 0x47, 1, 0xF9), /* Kenya */ + COUNTRY_CHPLAN_ENT("KG", 0x26, 1, 0xF1), /* Kyrgyzstan */ + COUNTRY_CHPLAN_ENT("KH", 0x26, 1, 0xF1), /* Cambodia */ + COUNTRY_CHPLAN_ENT("KI", 0x26, 1, 0x00), /* Kiribati */ + COUNTRY_CHPLAN_ENT("KN", 0x34, 1, 0x00), /* Saint Kitts and Nevis */ + COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0xFB), /* South Korea */ + COUNTRY_CHPLAN_ENT("KW", 0x47, 1, 0xFB), /* Kuwait */ + COUNTRY_CHPLAN_ENT("KY", 0x34, 1, 0x00), /* Cayman Islands (UK) */ + COUNTRY_CHPLAN_ENT("KZ", 0x26, 1, 0x00), /* Kazakhstan */ + COUNTRY_CHPLAN_ENT("LA", 0x26, 1, 0x00), /* Laos */ + COUNTRY_CHPLAN_ENT("LB", 0x26, 1, 0xF1), /* Lebanon */ + COUNTRY_CHPLAN_ENT("LC", 0x34, 1, 0x00), /* Saint Lucia */ + COUNTRY_CHPLAN_ENT("LI", 0x26, 1, 0xFB), /* Liechtenstein */ + COUNTRY_CHPLAN_ENT("LK", 0x26, 1, 0xF1), /* Sri Lanka */ + COUNTRY_CHPLAN_ENT("LR", 0x26, 1, 0xB0), /* Liberia */ + COUNTRY_CHPLAN_ENT("LS", 0x26, 1, 0xF1), /* Lesotho */ + COUNTRY_CHPLAN_ENT("LT", 0x26, 1, 0xFB), /* Lithuania */ + COUNTRY_CHPLAN_ENT("LU", 0x26, 1, 0xFB), /* Luxembourg */ + COUNTRY_CHPLAN_ENT("LV", 0x26, 1, 0xFB), /* Latvia */ + COUNTRY_CHPLAN_ENT("LY", 0x26, 1, 0x00), /* Libya */ + COUNTRY_CHPLAN_ENT("MA", 0x47, 1, 0xF1), /* Morocco */ + COUNTRY_CHPLAN_ENT("MC", 0x26, 1, 0xFB), /* Monaco */ + COUNTRY_CHPLAN_ENT("MD", 0x26, 1, 0xF1), /* Moldova */ + COUNTRY_CHPLAN_ENT("ME", 0x26, 1, 0xF1), /* Montenegro */ + COUNTRY_CHPLAN_ENT("MF", 0x34, 1, 0x00), /* Saint Martin */ + COUNTRY_CHPLAN_ENT("MG", 0x26, 1, 0x20), /* Madagascar */ + COUNTRY_CHPLAN_ENT("MH", 0x34, 1, 0x00), /* Marshall Islands (USA) */ + COUNTRY_CHPLAN_ENT("MK", 0x26, 1, 0xF1), /* Republic of Macedonia (FYROM) */ + COUNTRY_CHPLAN_ENT("ML", 0x26, 1, 0xB0), /* Mali */ + COUNTRY_CHPLAN_ENT("MM", 0x26, 1, 0x00), /* Burma (Myanmar) */ + COUNTRY_CHPLAN_ENT("MN", 0x26, 1, 0x00), /* Mongolia */ + COUNTRY_CHPLAN_ENT("MO", 0x26, 1, 0x00), /* Macau */ + COUNTRY_CHPLAN_ENT("MP", 0x34, 1, 0x00), /* Northern Mariana Islands (USA) */ + COUNTRY_CHPLAN_ENT("MQ", 0x26, 1, 0x40), /* Martinique (France) */ + COUNTRY_CHPLAN_ENT("MR", 0x26, 1, 0xA0), /* Mauritania */ + COUNTRY_CHPLAN_ENT("MS", 0x26, 1, 0x00), /* Montserrat (UK) */ + COUNTRY_CHPLAN_ENT("MT", 0x26, 1, 0xFB), /* Malta */ + COUNTRY_CHPLAN_ENT("MU", 0x26, 1, 0xB0), /* Mauritius */ + COUNTRY_CHPLAN_ENT("MV", 0x26, 1, 0x00), /* Maldives */ + COUNTRY_CHPLAN_ENT("MW", 0x26, 1, 0xB0), /* Malawi */ + COUNTRY_CHPLAN_ENT("MX", 0x34, 1, 0xF1), /* Mexico */ + COUNTRY_CHPLAN_ENT("MY", 0x47, 1, 0xF1), /* Malaysia */ + COUNTRY_CHPLAN_ENT("MZ", 0x26, 1, 0xF1), /* Mozambique */ + COUNTRY_CHPLAN_ENT("NA", 0x26, 0, 0x00), /* Namibia */ + COUNTRY_CHPLAN_ENT("NC", 0x26, 1, 0x00), /* New Caledonia */ + COUNTRY_CHPLAN_ENT("NE", 0x26, 1, 0xB0), /* Niger */ + COUNTRY_CHPLAN_ENT("NF", 0x45, 1, 0x00), /* Norfolk Island (Australia) */ + COUNTRY_CHPLAN_ENT("NG", 0x50, 1, 0xF9), /* Nigeria */ + COUNTRY_CHPLAN_ENT("NI", 0x34, 1, 0xF1), /* Nicaragua */ + COUNTRY_CHPLAN_ENT("NL", 0x26, 1, 0xFB), /* Netherlands */ + COUNTRY_CHPLAN_ENT("NO", 0x26, 1, 0xFB), /* Norway */ + COUNTRY_CHPLAN_ENT("NP", 0x47, 1, 0xF0), /* Nepal */ + COUNTRY_CHPLAN_ENT("NR", 0x26, 1, 0x00), /* Nauru */ + COUNTRY_CHPLAN_ENT("NU", 0x45, 1, 0x00), /* Niue */ + COUNTRY_CHPLAN_ENT("NZ", 0x45, 1, 0xFB), /* New Zealand */ + COUNTRY_CHPLAN_ENT("OM", 0x26, 1, 0xF9), /* Oman */ + COUNTRY_CHPLAN_ENT("PA", 0x34, 1, 0xF1), /* Panama */ + COUNTRY_CHPLAN_ENT("PE", 0x34, 1, 0xF1), /* Peru */ + COUNTRY_CHPLAN_ENT("PF", 0x26, 1, 0x00), /* French Polynesia (France) */ + COUNTRY_CHPLAN_ENT("PG", 0x26, 1, 0xF1), /* Papua New Guinea */ + COUNTRY_CHPLAN_ENT("PH", 0x26, 1, 0xF1), /* Philippines */ + COUNTRY_CHPLAN_ENT("PK", 0x51, 1, 0xF1), /* Pakistan */ + COUNTRY_CHPLAN_ENT("PL", 0x26, 1, 0xFB), /* Poland */ + COUNTRY_CHPLAN_ENT("PM", 0x26, 1, 0x00), /* Saint Pierre and Miquelon (France) */ + COUNTRY_CHPLAN_ENT("PR", 0x34, 1, 0xF1), /* Puerto Rico */ + COUNTRY_CHPLAN_ENT("PT", 0x26, 1, 0xFB), /* Portugal */ + COUNTRY_CHPLAN_ENT("PW", 0x34, 1, 0x00), /* Palau */ + COUNTRY_CHPLAN_ENT("PY", 0x34, 1, 0xF1), /* Paraguay */ + COUNTRY_CHPLAN_ENT("QA", 0x51, 1, 0xF9), /* Qatar */ + COUNTRY_CHPLAN_ENT("RE", 0x26, 1, 0x00), /* Reunion (France) */ + COUNTRY_CHPLAN_ENT("RO", 0x26, 1, 0xF1), /* Romania */ + COUNTRY_CHPLAN_ENT("RS", 0x26, 1, 0xF1), /* Serbia, Kosovo */ + COUNTRY_CHPLAN_ENT("RU", 0x59, 1, 0xFB), /* Russia(fac/gost), Kaliningrad */ + COUNTRY_CHPLAN_ENT("RW", 0x26, 1, 0xB0), /* Rwanda */ + COUNTRY_CHPLAN_ENT("SA", 0x26, 1, 0xFB), /* Saudi Arabia */ + COUNTRY_CHPLAN_ENT("SB", 0x26, 1, 0x00), /* Solomon Islands */ + COUNTRY_CHPLAN_ENT("SC", 0x34, 1, 0x90), /* Seychelles */ + COUNTRY_CHPLAN_ENT("SE", 0x26, 1, 0xFB), /* Sweden */ + COUNTRY_CHPLAN_ENT("SG", 0x47, 1, 0xFB), /* Singapore */ + COUNTRY_CHPLAN_ENT("SH", 0x26, 1, 0x00), /* Saint Helena (UK) */ + COUNTRY_CHPLAN_ENT("SI", 0x26, 1, 0xFB), /* Slovenia */ + COUNTRY_CHPLAN_ENT("SJ", 0x26, 1, 0x00), /* Svalbard (Norway) */ + COUNTRY_CHPLAN_ENT("SK", 0x26, 1, 0xFB), /* Slovakia */ + COUNTRY_CHPLAN_ENT("SL", 0x26, 1, 0xB0), /* Sierra Leone */ + COUNTRY_CHPLAN_ENT("SM", 0x26, 1, 0x00), /* San Marino */ + COUNTRY_CHPLAN_ENT("SN", 0x26, 1, 0xF1), /* Senegal */ + COUNTRY_CHPLAN_ENT("SO", 0x26, 1, 0x00), /* Somalia */ + COUNTRY_CHPLAN_ENT("SR", 0x34, 1, 0x00), /* Suriname */ + COUNTRY_CHPLAN_ENT("ST", 0x34, 1, 0x80), /* Sao Tome and Principe */ + COUNTRY_CHPLAN_ENT("SV", 0x30, 1, 0xF1), /* El Salvador */ + COUNTRY_CHPLAN_ENT("SX", 0x34, 1, 0x00), /* Sint Marteen */ + COUNTRY_CHPLAN_ENT("SZ", 0x26, 1, 0x20), /* Swaziland */ + COUNTRY_CHPLAN_ENT("TC", 0x26, 1, 0x00), /* Turks and Caicos Islands (UK) */ + COUNTRY_CHPLAN_ENT("TD", 0x26, 1, 0xB0), /* Chad */ + COUNTRY_CHPLAN_ENT("TF", 0x26, 1, 0x80), /* French Southern and Antarctic Lands (FR Southern Territories) */ + COUNTRY_CHPLAN_ENT("TG", 0x26, 1, 0xB0), /* Togo */ + COUNTRY_CHPLAN_ENT("TH", 0x26, 1, 0xF1), /* Thailand */ + COUNTRY_CHPLAN_ENT("TJ", 0x26, 1, 0x40), /* Tajikistan */ + COUNTRY_CHPLAN_ENT("TK", 0x45, 1, 0x00), /* Tokelau */ + COUNTRY_CHPLAN_ENT("TM", 0x26, 1, 0x00), /* Turkmenistan */ + COUNTRY_CHPLAN_ENT("TN", 0x47, 1, 0xF1), /* Tunisia */ + COUNTRY_CHPLAN_ENT("TO", 0x26, 1, 0x00), /* Tonga */ + COUNTRY_CHPLAN_ENT("TR", 0x26, 1, 0xF1), /* Turkey, Northern Cyprus */ + COUNTRY_CHPLAN_ENT("TT", 0x42, 1, 0xF1), /* Trinidad & Tobago */ + COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0xFF), /* Taiwan */ + COUNTRY_CHPLAN_ENT("TZ", 0x26, 1, 0xF0), /* Tanzania */ + COUNTRY_CHPLAN_ENT("UA", 0x26, 1, 0xFB), /* Ukraine */ + COUNTRY_CHPLAN_ENT("UG", 0x26, 1, 0xF1), /* Uganda */ + COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0xFF), /* United States of America (USA) */ + COUNTRY_CHPLAN_ENT("UY", 0x34, 1, 0xF1), /* Uruguay */ + COUNTRY_CHPLAN_ENT("UZ", 0x47, 1, 0xF0), /* Uzbekistan */ + COUNTRY_CHPLAN_ENT("VA", 0x26, 1, 0x00), /* Holy See (Vatican City) */ + COUNTRY_CHPLAN_ENT("VC", 0x34, 1, 0x10), /* Saint Vincent and the Grenadines */ + COUNTRY_CHPLAN_ENT("VE", 0x30, 1, 0xF1), /* Venezuela */ + COUNTRY_CHPLAN_ENT("VI", 0x34, 1, 0x00), /* United States Virgin Islands (USA) */ + COUNTRY_CHPLAN_ENT("VN", 0x26, 1, 0xF1), /* Vietnam */ + COUNTRY_CHPLAN_ENT("VU", 0x26, 1, 0x00), /* Vanuatu */ + COUNTRY_CHPLAN_ENT("WF", 0x26, 1, 0x00), /* Wallis and Futuna (France) */ + COUNTRY_CHPLAN_ENT("WS", 0x34, 1, 0x00), /* Samoa */ + COUNTRY_CHPLAN_ENT("YE", 0x26, 1, 0x40), /* Yemen */ + COUNTRY_CHPLAN_ENT("YT", 0x26, 1, 0x80), /* Mayotte (France) */ + COUNTRY_CHPLAN_ENT("ZA", 0x26, 1, 0xF1), /* South Africa */ + COUNTRY_CHPLAN_ENT("ZM", 0x26, 1, 0xB0), /* Zambia */ + COUNTRY_CHPLAN_ENT("ZW", 0x26, 1, 0xF1), /* Zimbabwe */ }; -u16 country_chplan_map_sz = sizeof(country_chplan_map)/sizeof(struct country_chplan); +u16 const country_chplan_map_sz = sizeof(country_chplan_map)/sizeof(struct country_chplan); /* * rtw_get_chplan_from_country - * @country_code: string of country code * -* Return channel_plan index or -1 when unsupported country_code is given +* Return pointer of struct country_chplan entry or NULL when unsupported country_code is given */ -int rtw_get_chplan_from_country(const char *country_code) +const struct country_chplan *rtw_get_chplan_from_country(const char *country_code) { - int channel_plan = -1; + const struct country_chplan *ent = NULL; + const struct country_chplan *map = NULL; + u16 map_sz = 0; + char code[2]; int i; - /* TODO: should consider 3-character country code? */ + code[0] = alpha_to_upper(country_code[0]); + code[1] = alpha_to_upper(country_code[1]); - for (i = 0; i < country_chplan_map_sz; i++) { - if (strncmp(country_code, country_chplan_map[i].alpha2, 2) == 0) { - channel_plan = country_chplan_map[i].chplan; +#if !defined(CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP) && RTW_DEF_MODULE_REGULATORY_CERT + ent = rtw_def_module_get_chplan_from_country(code); + if (ent != NULL) + goto exit; +#endif + +#ifdef CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP + map = CUSTOMIZED_country_chplan_map; + map_sz = CUSTOMIZED_country_chplan_map_sz; +#else + map = country_chplan_map; + map_sz = country_chplan_map_sz; +#endif + + for (i = 0; i < map_sz; i++) { + if (strncmp(code, map[i].alpha2, 2) == 0) { + ent = &map[i]; break; } } - return channel_plan; +exit: + #if RTW_DEF_MODULE_REGULATORY_CERT + if (ent && !(COUNTRY_CHPLAN_DEF_MODULE_FALGS(ent) & RTW_DEF_MODULE_REGULATORY_CERT)) + ent = NULL; + #endif + + return ent; } int rtw_ch_to_bb_gain_sel(int ch) @@ -476,7 +628,7 @@ s8 rtw_rf_get_kfree_tx_gain_offset(_adapter *padapter, u8 path, u8 ch) { s8 kfree_offset = 0; -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter); struct kfree_data_t *kfree_data = GET_KFREE_DATA(padapter); s8 bb_gain_sel = rtw_ch_to_bb_gain_sel(ch); @@ -493,7 +645,7 @@ s8 rtw_rf_get_kfree_tx_gain_offset(_adapter *padapter, u8 path, u8 ch) , __func__, path, ch, bb_gain_sel, kfree_offset); } exit: -#endif /* CONFIG_RF_GAIN_OFFSET */ +#endif /* CONFIG_RF_POWER_TRIM */ return kfree_offset; } diff --git a/rtl8188FU/core/rtw_sta_mgt.c b/rtl8188FU/core/rtw_sta_mgt.c index 730b425..68eda77 100755 --- a/rtl8188FU/core/rtw_sta_mgt.c +++ b/rtl8188FU/core/rtw_sta_mgt.c @@ -260,7 +260,7 @@ _func_enter_; psta++; } - + pstapriv->adhoc_expire_to = 4; /* 4 * 2 = 8 sec */ #ifdef CONFIG_AP_MODE @@ -454,7 +454,7 @@ _func_exit_; //struct sta_info *rtw_alloc_stainfo(_queue *pfree_sta_queue, unsigned char *hwaddr) -struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) +struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, const u8 *hwaddr) { _irqL irqL, irqL2; uint tmp_aid; @@ -858,7 +858,7 @@ _func_exit_; } /* any station allocated can be searched by hash list */ -struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) +struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, const u8 *hwaddr) { _irqL irqL; @@ -869,23 +869,19 @@ struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr) u32 index; - u8 *addr; + const u8 *addr; - u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + const u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; _func_enter_; if(hwaddr==NULL) return NULL; - if(IS_MCAST(hwaddr)) - { + if (IS_MCAST((unsigned char *)hwaddr)) addr = bc_addr; - } else - { addr = hwaddr; - } index = wifi_mac_hash(addr); diff --git a/rtl8188FU/core/rtw_tdls.c b/rtl8188FU/core/rtw_tdls.c index 7896aee..a31a3da 100755 --- a/rtl8188FU/core/rtw_tdls.c +++ b/rtl8188FU/core/rtw_tdls.c @@ -20,6 +20,7 @@ #define _RTW_TDLS_C_
#include <drv_types.h>
+#include <hal_data.h>
#ifdef CONFIG_TDLS
#define ONE_SEC 1000 /* 1000 ms */
@@ -52,7 +53,7 @@ void rtw_reset_tdls_info(_adapter* padapter) ptdlsinfo->chsw_info.ch_sw_state = TDLS_STATE_NONE;
ATOMIC_SET(&ptdlsinfo->chsw_info.chsw_on, _FALSE);
ptdlsinfo->chsw_info.off_ch_num = 0;
- ptdlsinfo->chsw_info.ch_offset = 0;
+ ptdlsinfo->chsw_info.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
ptdlsinfo->chsw_info.cur_time = 0;
ptdlsinfo->chsw_info.delay_switch_back = _FALSE;
ptdlsinfo->chsw_info.dump_stack = _FALSE;
@@ -127,6 +128,31 @@ int check_ap_tdls_ch_switching_prohibited(u8 *pframe, u8 pkt_len) return _FALSE;
}
+u8 rtw_tdls_is_setup_allowed(_adapter *padapter)
+{
+ struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
+
+ if (ptdlsinfo->ap_prohibited == _TRUE)
+ return _FALSE;
+
+ return _TRUE;
+}
+
+#ifdef CONFIG_TDLS_CH_SW
+u8 rtw_tdls_is_chsw_allowed(_adapter *padapter)
+{
+ struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
+
+ if (ptdlsinfo->ch_switch_prohibited == _TRUE)
+ return _FALSE;
+
+ if (padapter->registrypriv.wifi_spec == 0)
+ return _FALSE;
+
+ return _TRUE;
+}
+#endif
+
int _issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsigned int power_mode, int wait_ack)
{
int ret = _FAIL;
@@ -431,7 +457,9 @@ void rtw_tdls_process_vht_cap(_adapter *padapter, struct sta_info *ptdls_sta, u8 ptdls_sta->flags &= ~WLAN_STA_VHT;
if (ptdls_sta->flags & WLAN_STA_VHT) {
- if (padapter->registrypriv.vht_enable == _TRUE)
+ if (REGSTY_IS_11AC_ENABLE(&padapter->registrypriv)
+ && hal_chk_proto_cap(padapter, PROTO_CAP_11AC)
+ && (!pmlmepriv->country_ent || COUNTRY_CHPLAN_EN_11AC(pmlmepriv->country_ent)))
ptdls_sta->vhtpriv.vht_option = _TRUE;
else
ptdls_sta->vhtpriv.vht_option = _FALSE;
@@ -597,7 +625,7 @@ u8 *rtw_tdls_set_ftie(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib u8 *rtw_tdls_set_timeout_interval(struct tdls_txmgmt *ptxmgmt, u8 *pframe, struct pkt_attrib *pattrib, int init, struct sta_info *ptdls_sta)
{
u8 timeout_itvl[5]; /* set timeout interval to maximum value */
- u32 timeout_interval= TPK_RESEND_COUNT;
+ u32 timeout_interval= TDLS_TPK_RESEND_COUNT;
u8 *p = NULL;
int len = 0;
@@ -662,10 +690,15 @@ u8 *rtw_tdls_set_dialog(u8 *pframe, struct pkt_attrib *pattrib, struct tdls_txmg u8 *rtw_tdls_set_reg_class(u8 *pframe, struct pkt_attrib *pattrib, struct sta_info *ptdls_sta)
{
- u8 reg_class = 1;
+ u8 reg_class = 22;
return rtw_set_fixed_ie(pframe, 1, &(reg_class), &(pattrib->pktlen));
}
+u8 *rtw_tdls_set_second_channel_offset(u8 *pframe, struct pkt_attrib *pattrib, u8 ch_offset)
+{
+ return rtw_set_ie(pframe, EID_SecondaryChnlOffset , 1, &ch_offset, &(pattrib->pktlen));
+}
+
u8 *rtw_tdls_set_capability(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
{
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
@@ -734,16 +767,134 @@ u8 *rtw_tdls_set_target_ch(_adapter *padapter, u8 *pframe, struct pkt_attrib *pa u8 *rtw_tdls_set_ch_sw(u8 *pframe, struct pkt_attrib *pattrib, struct sta_info *ptdls_sta)
{
u8 ch_switch_timing[4] = {0};
- u16 switch_time = (ptdls_sta->ch_switch_time >= CH_SWITCH_TIME * 1000) ?
- ptdls_sta->ch_switch_time : CH_SWITCH_TIME;
- u16 switch_timeout = (ptdls_sta->ch_switch_timeout >= CH_SWITCH_TIMEOUT * 1000) ?
- ptdls_sta->ch_switch_timeout : CH_SWITCH_TIMEOUT;
+ u16 switch_time = (ptdls_sta->ch_switch_time >= TDLS_CH_SWITCH_TIME * 1000) ?
+ ptdls_sta->ch_switch_time : TDLS_CH_SWITCH_TIME;
+ u16 switch_timeout = (ptdls_sta->ch_switch_timeout >= TDLS_CH_SWITCH_TIMEOUT * 1000) ?
+ ptdls_sta->ch_switch_timeout : TDLS_CH_SWITCH_TIMEOUT;
_rtw_memcpy(ch_switch_timing, &switch_time, 2);
_rtw_memcpy(ch_switch_timing + 2, &switch_timeout, 2);
return rtw_set_ie(pframe, _CH_SWITCH_TIMING_, 4, ch_switch_timing, &(pattrib->pktlen));
}
+
+void rtw_tdls_set_ch_sw_oper_control(_adapter *padapter, u8 enable)
+{
+ if (ATOMIC_READ(&padapter->tdlsinfo.chsw_info.chsw_on) != enable)
+ ATOMIC_SET(&padapter->tdlsinfo.chsw_info.chsw_on, enable);
+
+ rtw_hal_set_hwreg(padapter, HW_VAR_TDLS_BCN_EARLY_C2H_RPT, &enable);
+ DBG_871X("[TDLS] %s Bcn Early C2H Report\n", (enable == _TRUE) ? "Start" : "Stop");
+}
+
+void rtw_tdls_ch_sw_back_to_base_chnl(_adapter *padapter)
+{
+ struct mlme_priv *pmlmepriv;
+ struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
+
+ pmlmepriv = &padapter->mlmepriv;
+
+ if ((ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) &&
+ /* Sometimes we receive multiple interrupts in very little time period, use the follow condition test to filter */
+ //(pchsw_info->cur_time - last_time > padapter->mlmeextpriv.mlmext_info.bcn_interval - 5) &&
+ (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter))) {
+ //if(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE)
+ rtw_tdls_cmd(padapter, pchsw_info->addr, TDLS_CH_SW_TO_BASE_CHNL_UNSOLICITED);
+ }
+}
+
+static void rtw_tdls_chsw_oper_init(_adapter* padapter, u32 timeout_ms)
+{
+ struct submit_ctx *chsw_sctx = &padapter->tdlsinfo.chsw_info.chsw_sctx;
+
+ rtw_sctx_init(chsw_sctx, timeout_ms);
+}
+
+static int rtw_tdls_chsw_oper_wait(_adapter* padapter)
+{
+ struct submit_ctx *chsw_sctx = &padapter->tdlsinfo.chsw_info.chsw_sctx;
+
+ return rtw_sctx_wait(chsw_sctx, __func__);
+}
+
+void rtw_tdls_chsw_oper_done(_adapter* padapter)
+{
+ struct submit_ctx *chsw_sctx = &padapter->tdlsinfo.chsw_info.chsw_sctx;
+
+ rtw_sctx_done(&chsw_sctx);
+}
+
+s32 rtw_tdls_do_ch_sw(_adapter *padapter, struct sta_info *ptdls_sta, u8 chnl_type, u8 channel, u8 channel_offset, u16 bwmode, u16 ch_switch_time)
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
+ u8 center_ch, chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
+ u32 ch_sw_time_start, ch_sw_time_spent, wait_time;
+ u8 take_care_iqk;
+ s32 ret = _FAIL;
+
+ ch_sw_time_start = rtw_systime_to_ms(rtw_get_current_time());
+
+ rtw_tdls_chsw_oper_init(padapter, TDLS_CH_SWITCH_OPER_OFFLOAD_TIMEOUT);
+
+ /* set mac_id sleep before channel switch */
+ rtw_hal_macid_sleep(padapter, ptdls_sta->mac_id);
+
+ /* channel switch IOs offload to FW */
+ if (rtw_hal_ch_sw_oper_offload(padapter, channel, channel_offset, bwmode) == _SUCCESS) {
+ if (rtw_tdls_chsw_oper_wait(padapter) == _SUCCESS) {
+ /* set channel and bw related variables in driver */
+ _enter_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
+
+ rtw_set_oper_ch(padapter, channel);
+ rtw_set_oper_choffset(padapter, channel_offset);
+ rtw_set_oper_bw(padapter, bwmode);
+
+ center_ch = rtw_get_center_ch(channel, bwmode, channel_offset);
+ pHalData->CurrentChannel = center_ch;
+ pHalData->CurrentCenterFrequencyIndex1 = center_ch;
+ pHalData->CurrentChannelBW = bwmode;
+ pHalData->nCur40MhzPrimeSC = channel_offset;
+
+ if (bwmode == CHANNEL_WIDTH_80) {
+ if (center_ch > channel)
+ chnl_offset80 = HAL_PRIME_CHNL_OFFSET_LOWER;
+ else if (center_ch < channel)
+ chnl_offset80 = HAL_PRIME_CHNL_OFFSET_UPPER;
+ else
+ chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
+ }
+ pHalData->nCur80MhzPrimeSC = chnl_offset80;
+
+ pHalData->CurrentCenterFrequencyIndex1 = center_ch;
+
+ _exit_critical_mutex(&(adapter_to_dvobj(padapter)->setch_mutex), NULL);
+
+ rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk);
+ if (take_care_iqk == _TRUE)
+ rtw_hal_ch_sw_iqk_info_restore(padapter, CH_SW_USE_CASE_TDLS);
+
+ ch_sw_time_spent = rtw_systime_to_ms(rtw_get_current_time()) - ch_sw_time_start;
+
+ if (chnl_type == TDLS_CH_SW_OFF_CHNL) {
+ if ((u32)ch_switch_time /1000 > ch_sw_time_spent)
+ wait_time = (u32)ch_switch_time /1000 - ch_sw_time_spent;
+ else
+ wait_time = 0;
+
+ if (wait_time > 0)
+ rtw_msleep_os(wait_time);
+ }
+
+ ret = _SUCCESS;
+ } else
+ DBG_871X("[TDLS] chsw oper wait fail !!\n");
+ }
+
+ /* set mac_id wakeup after channel switch */
+ rtw_hal_macid_wakeup(padapter, ptdls_sta->mac_id);
+
+ return ret;
+}
#endif
u8 *rtw_tdls_set_wmm_params(_adapter *padapter, u8 *pframe, struct pkt_attrib *pattrib)
@@ -897,12 +1048,12 @@ int issue_tdls_setup_req(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wa _irqL irqL;
int ret = _FAIL;
/* Retry timer should be set at least 301 sec, using TPK_count counting 301 times. */
- u32 timeout_interval= TPK_RESEND_COUNT;
+ u32 timeout_interval= TDLS_TPK_RESEND_COUNT;
DBG_871X("[TDLS] %s\n", __FUNCTION__);
ptxmgmt->action_code = TDLS_SETUP_REQUEST;
- if (ptdlsinfo->ap_prohibited == _TRUE)
+ if (rtw_tdls_is_setup_allowed(padapter) == _FALSE)
goto exit;
if ((pmgntframe = alloc_mgtxmitframe(pxmitpriv)) == NULL)
@@ -1025,8 +1176,8 @@ int _issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wai ret = _SUCCESS;
}
- if (ret == _SUCCESS && rtw_tdls_is_driver_setup(padapter))
- rtw_tdls_cmd(padapter, ptxmgmt->peer, TDLS_TEAR_STA);
+ if (rtw_tdls_is_driver_setup(padapter))
+ rtw_tdls_cmd(padapter, ptxmgmt->peer, TDLS_TEARDOWN_STA_LOCALLY);
exit:
@@ -1308,6 +1459,7 @@ exit: return ret;
}
+#ifdef CONFIG_TDLS_CH_SW
int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta)
{
struct xmit_frame *pmgntframe;
@@ -1319,8 +1471,8 @@ int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta) DBG_871X("[TDLS] %s\n", __FUNCTION__);
- if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)
- { DBG_871X("[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\n", __FUNCTION__);
+ if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE)
+ { DBG_871X("[TDLS] Ignore %s since channel switch is not allowed\n", __FUNCTION__);
goto exit;
}
@@ -1365,8 +1517,8 @@ int issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, in DBG_871X("[TDLS] %s\n", __FUNCTION__);
- if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)
- { DBG_871X("[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\n", __FUNCTION__);
+ if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE)
+ { DBG_871X("[TDLS] Ignore %s since channel switch is not allowed\n", __FUNCTION__);
goto exit;
}
@@ -1382,7 +1534,7 @@ int issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, in _rtw_memcpy(pattrib->dst, ptxmgmt->peer, ETH_ALEN);
_rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
- _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
+ _rtw_memcpy(pattrib->ra, ptxmgmt->peer, ETH_ALEN);
_rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
update_tdls_attrib(padapter, pattrib);
@@ -1401,16 +1553,16 @@ int issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, in }
if (wait_ack) {
- ret = dump_mgntframe_and_wait_ack(padapter, pmgntframe);
+ ret = dump_mgntframe_and_wait_ack_timeout(padapter, pmgntframe, 10);
} else {
dump_mgntframe(padapter, pmgntframe);
ret = _SUCCESS;
}
- ret = _SUCCESS;
exit:
return ret;
}
+#endif
int On_TDLS_Dis_Rsp(_adapter *padapter, union recv_frame *precv_frame)
{
@@ -1495,7 +1647,7 @@ sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame) u8 ccmp_included=0, rsnie_included=0;
u16 j, pairwise_count;
u8 SNonce[32];
- u32 timeout_interval = TPK_RESEND_COUNT;
+ u32 timeout_interval = TDLS_TPK_RESEND_COUNT;
sint parsing_length; /* Frame body length, without icv_len */
PNDIS_802_11_VARIABLE_IEs pIE;
u8 FIXED_IE = 5;
@@ -1503,7 +1655,7 @@ sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame) int supportRateNum = 0;
struct tdls_txmgmt txmgmt;
- if (ptdlsinfo->ap_prohibited == _TRUE)
+ if (rtw_tdls_is_setup_allowed(padapter) == _FALSE)
goto exit;
_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
@@ -1653,7 +1805,7 @@ sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame) _rtw_memcpy(ptdls_sta->SNonce, SNonce, 32);
if (timeout_interval <= 300)
- ptdls_sta->TDLS_PeerKey_Lifetime = TPK_RESEND_COUNT;
+ ptdls_sta->TDLS_PeerKey_Lifetime = TDLS_TPK_RESEND_COUNT;
else
ptdls_sta->TDLS_PeerKey_Lifetime = timeout_interval;
}
@@ -1669,7 +1821,7 @@ sint On_TDLS_Setup_Req(_adapter *padapter, union recv_frame *precv_frame) ptdlsinfo->sta_maximum = _TRUE;
#ifdef CONFIG_WFD
- rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE);
+ rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length);
#endif
}else {
@@ -1715,13 +1867,14 @@ int On_TDLS_Setup_Rsp(_adapter *padapter, union recv_frame *precv_frame) int supportRateNum = 0;
struct tdls_txmgmt txmgmt;
int ret = _SUCCESS;
- u32 timeout_interval = TPK_RESEND_COUNT;
+ u32 timeout_interval = TDLS_TPK_RESEND_COUNT;
_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
psa = get_sa(ptr);
ptdls_sta = rtw_get_stainfo(pstapriv, psa);
- if (NULL == ptdls_sta) {
+ if (ptdls_sta == NULL) {
+ DBG_871X("[%s] Direct Link Peer = "MAC_FMT" not found\n", __FUNCTION__, MAC_ARG(psa));
ret = _FAIL;
goto exit;
}
@@ -1828,7 +1981,7 @@ int On_TDLS_Setup_Rsp(_adapter *padapter, union recv_frame *precv_frame) _rtw_memcpy(ptdls_sta->ANonce, ANonce, 32);
#ifdef CONFIG_WFD
- rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length - FIXED_IE);
+ rtw_tdls_process_wfd_ie(ptdlsinfo, ptr + FIXED_IE, parsing_length);
#endif
if (status_code != _STATS_SUCCESSFUL_) {
@@ -2089,7 +2242,7 @@ int On_TDLS_Teardown(_adapter *padapter, union recv_frame *precv_frame) ptdls_sta = rtw_get_stainfo(pstapriv, psa);
if (ptdls_sta != NULL) {
if (rtw_tdls_is_driver_setup(padapter))
- rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEAR_STA);
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEARDOWN_STA_LOCALLY);
}
return _SUCCESS;
@@ -2214,17 +2367,24 @@ sint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame) u16 j;
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct tdls_txmgmt txmgmt;
- u16 switch_time= CH_SWITCH_TIME * 1000, switch_timeout=CH_SWITCH_TIMEOUT * 1000;
+ u8 zaddr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ u16 switch_time= TDLS_CH_SWITCH_TIME * 1000, switch_timeout=TDLS_CH_SWITCH_TIMEOUT * 1000;
+ u8 take_care_iqk;
- if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)
- { DBG_871X("[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\n", __FUNCTION__);
- return _SUCCESS;
+ if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE)
+ { DBG_871X("[TDLS] Ignore %s since channel switch is not allowed\n", __FUNCTION__);
+ return _FAIL;
}
_rtw_memset(&txmgmt, 0x00, sizeof(struct tdls_txmgmt));
psa = get_sa(ptr);
ptdls_sta = rtw_get_stainfo(pstapriv, psa);
+ if (ptdls_sta == NULL) {
+ DBG_871X("[%s] Direct Link Peer = "MAC_FMT" not found\n", __FUNCTION__, MAC_ARG(psa));
+ return _FAIL;
+ }
+
ptdls_sta->ch_switch_time=switch_time;
ptdls_sta->ch_switch_timeout=switch_timeout;
@@ -2240,8 +2400,8 @@ sint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame) pchsw_info->off_ch_num = *(ptr + 2);
- if (*(ptr + 2) == 2) {
- pchsw_info->off_ch_num = 11;
+ if ((*(ptr + 2) == 2) && (hal_is_band_support(padapter, BAND_ON_5G))) {
+ pchsw_info->off_ch_num = 44;
}
if (pchsw_info->off_ch_num != pmlmeext->cur_channel) {
@@ -2254,16 +2414,29 @@ sint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame) switch (pIE->ElementID) {
case EID_SecondaryChnlOffset:
- padapter->tdlsinfo.chsw_info.ch_offset = *(pIE->data);
+ switch (*(pIE->data))
+ {
+ case EXTCHNL_OFFSET_UPPER:
+ pchsw_info->ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER;
+ break;
+
+ case EXTCHNL_OFFSET_LOWER:
+ pchsw_info->ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER;
+ break;
+
+ default:
+ pchsw_info->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
+ break;
+ }
break;
case _LINK_ID_IE_:
break;
case _CH_SWITCH_TIMING_:
- ptdls_sta->ch_switch_time = (RTW_GET_LE16(pIE->data) >= CH_SWITCH_TIME * 1000) ?
- RTW_GET_LE16(pIE->data) : CH_SWITCH_TIME * 1000;
- ptdls_sta->ch_switch_timeout = (RTW_GET_LE16(pIE->data + 2) >= CH_SWITCH_TIMEOUT * 1000) ?
- RTW_GET_LE16(pIE->data + 2) : CH_SWITCH_TIMEOUT * 1000;
- DBG_871X("%s ch_switch_time:%d, ch_switch_timeout:%d\n"
+ ptdls_sta->ch_switch_time = (RTW_GET_LE16(pIE->data) >= TDLS_CH_SWITCH_TIME * 1000) ?
+ RTW_GET_LE16(pIE->data) : TDLS_CH_SWITCH_TIME * 1000;
+ ptdls_sta->ch_switch_timeout = (RTW_GET_LE16(pIE->data + 2) >= TDLS_CH_SWITCH_TIMEOUT * 1000) ?
+ RTW_GET_LE16(pIE->data + 2) : TDLS_CH_SWITCH_TIMEOUT * 1000;
+ DBG_871X("[TDLS] %s ch_switch_time:%d, ch_switch_timeout:%d\n"
, __FUNCTION__, RTW_GET_LE16(pIE->data), RTW_GET_LE16(pIE->data + 2));
default:
break;
@@ -2272,12 +2445,35 @@ sint On_TDLS_Ch_Switch_Req(_adapter *padapter, union recv_frame *precv_frame) j += (pIE->Length + 2);
}
+ rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk);
+ if (take_care_iqk == _TRUE) {
+ u8 central_chnl;
+ u8 bw_mode;
+
+ bw_mode = (pchsw_info->ch_offset) ? CHANNEL_WIDTH_40 : CHANNEL_WIDTH_20;
+ central_chnl = rtw_get_center_ch(pchsw_info->off_ch_num, bw_mode, pchsw_info->ch_offset);
+ if (rtw_hal_ch_sw_iqk_info_search(padapter, central_chnl, bw_mode) < 0) {
+ if (!(pchsw_info->ch_sw_state & TDLS_CH_SWITCH_PREPARE_STATE))
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_PREPARE);
+
+ return _FAIL;
+ }
+ }
+
+ /* cancel ch sw monitor timer for responder */
+ if (!(pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE))
+ _cancel_timer_ex(&ptdls_sta->ch_sw_monitor_timer);
+
/* Todo: check status */
txmgmt.status_code = 0;
_rtw_memcpy(txmgmt.peer, psa, ETH_ALEN);
-
- ATOMIC_SET(&pchsw_info->chsw_on, _TRUE);
+ if (_rtw_memcmp(pchsw_info->addr, zaddr, ETH_ALEN) == _TRUE)
+ _rtw_memcpy(pchsw_info->addr, ptdls_sta->hwaddr, ETH_ALEN);
+
+ if (ATOMIC_READ(&pchsw_info->chsw_on) == _FALSE)
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_START);
+
rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_RESP);
return _SUCCESS;
@@ -2298,20 +2494,25 @@ sint On_TDLS_Ch_Switch_Rsp(_adapter *padapter, union recv_frame *precv_frame) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
int ret = _SUCCESS;
- if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE)
- { DBG_871X("[TDLS] Ignore %s since ch_switch_prohibited = _TRUE\n", __FUNCTION__);
+ if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE)
+ { DBG_871X("[TDLS] Ignore %s since channel switch is not allowed\n", __FUNCTION__);
return _SUCCESS;
}
psa = get_sa(ptr);
ptdls_sta = rtw_get_stainfo(pstapriv, psa);
+ if (ptdls_sta == NULL) {
+ DBG_871X("[%s] Direct Link Peer = "MAC_FMT" not found\n", __FUNCTION__, MAC_ARG(psa));
+ return _FAIL;
+ }
+
/* If we receive Unsolicited TDLS Channel Switch Response when channel switch is running, */
/* we will go back to base channel and terminate this channel switch procedure */
if (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE) {
if (pmlmeext->cur_channel != rtw_get_oper_ch(padapter)) {
- DBG_871X("receive unsolicited channel switch response \n");
- rtw_tdls_cmd(padapter, NULL, TDLS_CH_SW_BACK);
+ DBG_871X("[TDLS] Rx unsolicited channel switch response \n");
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_BASE_CHNL);
goto exit;
}
}
@@ -2329,9 +2530,9 @@ sint On_TDLS_Ch_Switch_Rsp(_adapter *padapter, union recv_frame *precv_frame) _rtw_memcpy(&status_code, ptr+2, 2);
if (status_code != 0) {
- DBG_871X("[%s] status_code:%d\n", __FUNCTION__, status_code);
+ DBG_871X("[TDLS] %s status_code:%d\n", __FUNCTION__, status_code);
pchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE);
- ATOMIC_SET(&pchsw_info->chsw_on, _FALSE);
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END);
ret = _FAIL;
goto exit;
}
@@ -2361,8 +2562,8 @@ sint On_TDLS_Ch_Switch_Rsp(_adapter *padapter, union recv_frame *precv_frame) if ((pmlmeext->cur_channel == rtw_get_oper_ch(padapter)) &&
(pchsw_info->ch_sw_state & TDLS_WAIT_CH_RSP_STATE)) {
- ATOMIC_SET(&pchsw_info->chsw_on, _TRUE);
- rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW);
+ if (ATOMIC_READ(&pchsw_info->chsw_on) == _TRUE)
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_TO_OFF_CHNL);
}
exit:
@@ -2521,7 +2722,11 @@ void rtw_build_tdls_setup_req_ies(_adapter * padapter, struct xmit_frame * pxmit pframe = rtw_tdls_set_qos_cap(pframe, pattrib);
#ifdef CONFIG_80211AC_VHT
- if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pregistrypriv->vht_enable == _TRUE) && (pmlmeext->cur_channel > 14)) {
+ if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pmlmeext->cur_channel > 14)
+ && REGSTY_IS_11AC_ENABLE(pregistrypriv)
+ && hal_chk_proto_cap(padapter, PROTO_CAP_11AC)
+ && (!padapter->mlmepriv.country_ent || COUNTRY_CHPLAN_EN_11AC(padapter->mlmepriv.country_ent))
+ ) {
pframe = rtw_tdls_set_aid(padapter, pframe, pattrib);
pframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib);
}
@@ -2617,7 +2822,11 @@ void rtw_build_tdls_setup_rsp_ies(_adapter * padapter, struct xmit_frame * pxmit pframe = rtw_tdls_set_qos_cap(pframe, pattrib);
#ifdef CONFIG_80211AC_VHT
- if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pregistrypriv->vht_enable == _TRUE) && (pmlmeext->cur_channel > 14)) {
+ if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pmlmeext->cur_channel > 14)
+ && REGSTY_IS_11AC_ENABLE(pregistrypriv)
+ && hal_chk_proto_cap(padapter, PROTO_CAP_11AC)
+ && (!padapter->mlmepriv.country_ent || COUNTRY_CHPLAN_EN_11AC(padapter->mlmepriv.country_ent))
+ ) {
pframe = rtw_tdls_set_aid(padapter, pframe, pattrib);
pframe = rtw_tdls_set_vht_cap(padapter, pframe, pattrib);
pframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode);
@@ -2689,8 +2898,12 @@ void rtw_build_tdls_setup_cfm_ies(_adapter * padapter, struct xmit_frame * pxmit pframe = rtw_tdls_set_wmm_params(padapter, pframe, pattrib);
#ifdef CONFIG_80211AC_VHT
- if ((padapter->mlmepriv.htpriv.ht_option == _TRUE) && (pregistrypriv->vht_enable == _TRUE)
- && (ptdls_sta->vhtpriv.vht_option == _TRUE) && (pmlmeext->cur_channel > 14)) {
+ if ((padapter->mlmepriv.htpriv.ht_option == _TRUE)
+ && (ptdls_sta->vhtpriv.vht_option == _TRUE) && (pmlmeext->cur_channel > 14)
+ && REGSTY_IS_11AC_ENABLE(pregistrypriv)
+ && hal_chk_proto_cap(padapter, PROTO_CAP_11AC)
+ && (!padapter->mlmepriv.country_ent || COUNTRY_CHPLAN_EN_11AC(padapter->mlmepriv.country_ent))
+ ) {
pframe = rtw_tdls_set_vht_operation(padapter, pframe, pattrib, pmlmeext->cur_channel);
pframe = rtw_tdls_set_vht_op_mode_notify(padapter, pframe, pattrib, pmlmeext->cur_bwmode);
}
@@ -2831,11 +3044,11 @@ void rtw_build_tdls_peer_traffic_rsp_ies(_adapter * padapter, struct xmit_frame #ifdef CONFIG_TDLS_CH_SW
void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)
{
-
+ struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
struct pkt_attrib *pattrib = &pxmitframe->attrib;
struct sta_priv *pstapriv = &padapter->stapriv;
struct sta_info *ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);
- u16 switch_time= CH_SWITCH_TIME * 1000, switch_timeout=CH_SWITCH_TIMEOUT * 1000;
+ u16 switch_time= TDLS_CH_SWITCH_TIME * 1000, switch_timeout=TDLS_CH_SWITCH_TIMEOUT * 1000;
ptdls_sta->ch_switch_time=switch_time;
ptdls_sta->ch_switch_timeout=switch_timeout;
@@ -2845,7 +3058,19 @@ void rtw_build_tdls_ch_switch_req_ies(_adapter * padapter, struct xmit_frame * p pframe = rtw_tdls_set_action(pframe, pattrib, ptxmgmt);
pframe = rtw_tdls_set_target_ch(padapter, pframe, pattrib);
pframe = rtw_tdls_set_reg_class(pframe, pattrib, ptdls_sta);
-
+
+ if (ptdlsinfo->chsw_info.ch_offset != HAL_PRIME_CHNL_OFFSET_DONT_CARE) {
+ switch (ptdlsinfo->chsw_info.ch_offset)
+ {
+ case HAL_PRIME_CHNL_OFFSET_LOWER:
+ pframe = rtw_tdls_set_second_channel_offset(pframe, pattrib, SCA);
+ break;
+ case HAL_PRIME_CHNL_OFFSET_UPPER:
+ pframe = rtw_tdls_set_second_channel_offset(pframe, pattrib, SCB);
+ break;
+ }
+ }
+
if (ptdls_sta->tdls_sta_state & TDLS_INITIATOR_STATE)
pframe = rtw_tdls_set_linkid(pframe, pattrib, _FALSE);
else if (ptdls_sta->tdls_sta_state & TDLS_RESPONDER_STATE)
@@ -2943,7 +3168,7 @@ void _tdls_tpk_timer_hdl(void *FunctionContext) ptdls_sta->TPK_count++;
/* TPK_timer expired in a second */
/* Retry timer should set at least 301 sec. */
- if (ptdls_sta->TPK_count >= ptdls_sta->TDLS_PeerKey_Lifetime) {
+ if (ptdls_sta->TPK_count >= (ptdls_sta->TDLS_PeerKey_Lifetime - 3)) {
DBG_871X("[TDLS] %s, Re-Setup TDLS link with "MAC_FMT" since TPK lifetime expires!\n", __FUNCTION__, MAC_ARG(ptdls_sta->hwaddr));
ptdls_sta->TPK_count=0;
_rtw_memcpy(txmgmt.peer, ptdls_sta->hwaddr, ETH_ALEN);
@@ -2960,51 +3185,42 @@ void _tdls_ch_switch_timer_hdl(void *FunctionContext) _adapter *padapter = ptdls_sta->padapter;
struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
- //DBG_871X("%s %d, tdls_sta_state:0x%08x\n", __FUNCTION__, __LINE__, ptdls_sta->tdls_sta_state);
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END_TO_BASE_CHNL);
+ DBG_871X("[TDLS] %s, can't get traffic from op_ch:%d\n", __FUNCTION__, rtw_get_oper_ch(padapter));
+}
- if (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)) {
- if (!(pchsw_info->ch_sw_state & TDLS_PEER_AT_OFF_STATE)) {
- rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_BACK);
- ATOMIC_SET(&pchsw_info->chsw_on, _FALSE);
- DBG_871X("[TDLS] %s, can't get traffic from op_ch:%d\n", __FUNCTION__, rtw_get_oper_ch(padapter));
- } else {
- //DBG_871X("%s %d\n", __FUNCTION__, __LINE__);
- //_set_timer(&ptdls_sta->delay_timer, padapter->mlmeextpriv.mlmext_info.bcn_interval - 5 - ptdls_sta->ch_switch_timeout/1000);
- }
- } else {
- //DBG_871X("%s %d, op_ch:%d, tdls_state:0x%08x\n", __FUNCTION__, __LINE__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state);
- }
+void _tdls_delay_timer_hdl(void *FunctionContext)
+{
+ struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
+ _adapter *padapter = ptdls_sta->padapter;
+ struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
-#if 0
- if (!(pchsw_info->ch_sw_state & TDLS_PEER_AT_OFF_STATE)) {
- //SelectChannel(padapter, padapter->mlmeextpriv.cur_channel);
- ATOMIC_SET(&pchsw_info->chsw_on, _FALSE);
- DBG_871X("%s %d, op_ch:%d, tdls_state:0x%08x\n", __FUNCTION__, __LINE__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state);
- }
+ DBG_871X("[TDLS] %s, op_ch:%d, tdls_state:0x%08x\n", __FUNCTION__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state);
+ pchsw_info->delay_switch_back = _TRUE;
+}
- if (pchsw_info->ch_sw_state & TDLS_CH_SW_INITIATOR_STATE) {
- if (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)) {
- DBG_871X("%s %d\n", __FUNCTION__, __LINE__);
- _set_timer(&ptdls_sta->delay_timer, padapter->mlmeextpriv.mlmext_info.bcn_interval - 5 - ptdls_sta->ch_switch_timeout/1000);
- //_set_timer(&ptdls_sta->delay_timer, 1000);
- } else {
- DBG_871X("%s %d\n", __FUNCTION__, __LINE__);
- issue_tdls_ch_switch_req(padapter, ptdls_sta);
- //_set_timer(&ptdls_sta->delay_timer, 500);
- }
+void _tdls_stay_on_base_chnl_timer_hdl(void *FunctionContext)
+{
+ struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
+ _adapter *padapter = ptdls_sta->padapter;
+ struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
+
+ if (ptdls_sta != NULL) {
+ issue_tdls_ch_switch_req(padapter, ptdls_sta);
+ pchsw_info->ch_sw_state |= TDLS_WAIT_CH_RSP_STATE;
}
-#endif
}
-void _tdls_delay_timer_hdl(void *FunctionContext)
+void _tdls_ch_switch_monitor_timer_hdl(void *FunctionContext)
{
struct sta_info *ptdls_sta = (struct sta_info *)FunctionContext;
_adapter *padapter = ptdls_sta->padapter;
struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info;
- DBG_871X("[TDLS] %s, op_ch:%d, tdls_state:0x%08x\n", __FUNCTION__, rtw_get_oper_ch(padapter), ptdls_sta->tdls_sta_state);
- pchsw_info->delay_switch_back = _TRUE;
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END);
+ DBG_871X("[TDLS] %s, does not receive ch sw req\n", __FUNCTION__);
}
+
#endif
void _tdls_handshake_timer_hdl(void *FunctionContext)
@@ -3021,11 +3237,11 @@ void _tdls_handshake_timer_hdl(void *FunctionContext) DBG_871X("[TDLS] Handshake time out\n");
if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)
{
- issue_tdls_teardown(padapter, &txmgmt, _TRUE);
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEARDOWN_STA);
}
else
{
- rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEAR_STA);
+ rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_TEARDOWN_STA_LOCALLY);
}
}
}
@@ -3056,6 +3272,8 @@ void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta) #ifdef CONFIG_TDLS_CH_SW
_init_timer(&psta->ch_sw_timer, padapter->pnetdev, _tdls_ch_switch_timer_hdl, psta);
_init_timer(&psta->delay_timer, padapter->pnetdev, _tdls_delay_timer_hdl, psta);
+ _init_timer(&psta->stay_on_base_chnl_timer, padapter->pnetdev, _tdls_stay_on_base_chnl_timer_hdl, psta);
+ _init_timer(&psta->ch_sw_monitor_timer, padapter->pnetdev, _tdls_ch_switch_monitor_timer_hdl, psta);
#endif
_init_timer(&psta->handshake_timer, padapter->pnetdev, _tdls_handshake_timer_hdl, psta);
_init_timer(&psta->pti_timer, padapter->pnetdev, _tdls_pti_timer_hdl, psta);
@@ -3066,7 +3284,9 @@ void rtw_free_tdls_timer(struct sta_info *psta) _cancel_timer_ex(&psta->TPK_timer);
#ifdef CONFIG_TDLS_CH_SW
_cancel_timer_ex(&psta->ch_sw_timer);
- _cancel_timer_ex(&psta->delay_timer);
+ _cancel_timer_ex(&psta->delay_timer);
+ _cancel_timer_ex(&psta->stay_on_base_chnl_timer);
+ _cancel_timer_ex(&psta->ch_sw_monitor_timer);
#endif
_cancel_timer_ex(&psta->handshake_timer);
_cancel_timer_ex(&psta->pti_timer);
diff --git a/rtl8188FU/core/rtw_vht.c b/rtl8188FU/core/rtw_vht.c index 0bdc2a3..18a4d7a 100755 --- a/rtl8188FU/core/rtw_vht.c +++ b/rtl8188FU/core/rtw_vht.c @@ -612,6 +612,7 @@ u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf) u16 HighestRate; u8 *pcap, *pcap_mcs; u32 len = 0; + u32 rx_packet_offset, max_recvbuf_sz; struct registry_priv *pregistrypriv = &padapter->registrypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv; @@ -620,8 +621,23 @@ u32 rtw_build_vht_cap_ie(_adapter *padapter, u8 *pbuf) _rtw_memset(pcap, 0, 32); /* B0 B1 Maximum MPDU Length */ - SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 2); - + rtw_hal_get_def_var(padapter, HAL_DEF_RX_PACKET_OFFSET, &rx_packet_offset); + rtw_hal_get_def_var(padapter, HAL_DEF_MAX_RECVBUF_SZ, &max_recvbuf_sz); + + RTW_DBG("%s, line%d, Available RX buf size = %d bytes\n.", __FUNCTION__, __LINE__, max_recvbuf_sz - rx_packet_offset); + + if ((max_recvbuf_sz - rx_packet_offset) >= 11454) { + SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 2); + RTW_INFO("%s, line%d, Set MAX MPDU len = 11454 bytes\n.", __FUNCTION__, __LINE__); + } else if ((max_recvbuf_sz - rx_packet_offset) >= 7991) { + SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 1); + RTW_INFO("%s, line%d, Set MAX MPDU len = 7991 bytes\n.", __FUNCTION__, __LINE__); + } else if ((max_recvbuf_sz - rx_packet_offset) >= 3895) { + SET_VHT_CAPABILITY_ELE_MAX_MPDU_LENGTH(pcap, 0); + RTW_INFO("%s, line%d, Set MAX MPDU len = 3895 bytes\n.", __FUNCTION__, __LINE__); + } else + RTW_ERR("%s, line%d, Error!! Available RX buf size < 3895 bytes\n.", __FUNCTION__, __LINE__); + /* B2 B3 Supported Channel Width Set */ if (hal_chk_bw_cap(padapter, BW_CAP_160M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_160)) { if (hal_chk_bw_cap(padapter, BW_CAP_80_80M) && REGSTY_IS_BW_5G_SUPPORT(pregistrypriv, CHANNEL_WIDTH_80_80)) diff --git a/rtl8188FU/core/rtw_wlan_util.c b/rtl8188FU/core/rtw_wlan_util.c index e65ab3f..11c315a 100755 --- a/rtl8188FU/core/rtw_wlan_util.c +++ b/rtl8188FU/core/rtw_wlan_util.c @@ -819,6 +819,9 @@ void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char { u8 center_ch, chnl_offset80 = HAL_PRIME_CHNL_OFFSET_DONT_CARE; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; +#if (defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)) || defined(CONFIG_MCC_MODE) + u8 iqk_info_backup = _FALSE; +#endif if ( padapter->bNotifyChannelChange ) { @@ -860,7 +863,24 @@ void set_channel_bwmode(_adapter *padapter, unsigned char channel, unsigned char rtw_set_oper_bw(padapter, bwmode); rtw_set_oper_choffset(padapter, channel_offset); +#if (defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)) || defined(CONFIG_MCC_MODE) + /* To check if we need to backup iqk info after switch chnl & bw */ + { + u8 take_care_iqk, do_iqk; + + rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk); + rtw_hal_get_hwreg(padapter, HW_VAR_DO_IQK, &do_iqk); + if ((take_care_iqk == _TRUE) && (do_iqk == _TRUE)) + iqk_info_backup = _TRUE; + } +#endif + rtw_hal_set_chnl_bw(padapter, center_ch, bwmode, channel_offset, chnl_offset80); // set center channel + +#if (defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)) || defined(CONFIG_MCC_MODE) + if (iqk_info_backup == _TRUE) + rtw_hal_ch_sw_iqk_info_backup(padapter); +#endif #ifdef CONFIG_DFS_MASTER if (ori_overlap_radar_detect_ch && !new_overlap_radar_detect_ch) { @@ -943,20 +963,21 @@ int is_client_associated_to_ibss(_adapter *padapter) int is_IBSS_empty(_adapter *padapter) { - unsigned int i; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - for (i = IBSS_START_MAC_ID; i < NUM_STA; i++) - { - if (pmlmeinfo->FW_sta_info[i].status == 1) - { + int i; + struct macid_ctl_t *macid_ctl = &padapter->dvobj->macid_ctl; + + for (i = 0; i < macid_ctl->num; i++) { + if (!rtw_macid_is_used(macid_ctl, i)) + continue; + if (rtw_macid_get_if_g(macid_ctl, i) != padapter->iface_id) + continue; + if (!GET_H2CCMD_MSRRPT_PARM_OPMODE(&macid_ctl->h2c_msr[i])) + continue; + if (GET_H2CCMD_MSRRPT_PARM_ROLE(&macid_ctl->h2c_msr[i]) == H2C_MSR_ROLE_ADHOC) return _FAIL; - } } - + return _TRUE; - } unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval) @@ -1527,25 +1548,6 @@ void rtw_camid_free(_adapter *adapter, u8 cam_id) _exit_critical_bh(&cam_ctl->lock, &irqL); } -int allocate_fw_sta_entry(_adapter *padapter) -{ - unsigned int mac_id; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - for (mac_id = IBSS_START_MAC_ID; mac_id < NUM_STA; mac_id++) - { - if (pmlmeinfo->FW_sta_info[mac_id].status == 0) - { - pmlmeinfo->FW_sta_info[mac_id].status = 1; - pmlmeinfo->FW_sta_info[mac_id].retry = 0; - break; - } - } - - return mac_id; -} - void flush_all_cam_entry(_adapter *padapter) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -1600,9 +1602,6 @@ void flush_all_cam_entry(_adapter *padapter) 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)); - } #if defined(CONFIG_P2P) && defined(CONFIG_WFD) @@ -1896,8 +1895,9 @@ static void bwmode_update_check(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pI } - if((new_bwmode!= pmlmeext->cur_bwmode) || (new_ch_offset!=pmlmeext->cur_ch_offset)) - { + if ((new_bwmode != pmlmeext->cur_bwmode || new_ch_offset != pmlmeext->cur_ch_offset) + && new_bwmode < pmlmeext->cur_bwmode + ) { pmlmeinfo->bwmode_updated = _TRUE; pmlmeext->cur_bwmode = new_bwmode; @@ -3113,7 +3113,7 @@ unsigned char get_highest_mcs_rate(struct HT_caps_element *pHT_caps) void Update_RA_Entry(_adapter *padapter, struct sta_info *psta) { - rtw_hal_update_ra_mask(psta, 0); + rtw_hal_update_ra_mask(psta, psta->rssi_level); } void enable_rate_adaptive(_adapter *padapter, struct sta_info *psta); @@ -3454,43 +3454,52 @@ void update_sta_basic_rate(struct sta_info *psta, u8 wireless_mode) } } -int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx) +int rtw_ies_get_supported_rate(u8 *ies, uint ies_len, u8 *rate_set, u8 *rate_num) { - unsigned int ie_len; - PNDIS_802_11_VARIABLE_IEs pIE; - int supportRateNum = 0; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _SUPPORTEDRATES_IE_, &ie_len, var_ie_len); - if (pIE == NULL) - { - return _FAIL; + u8 *ie; + unsigned int ie_len; + + if (!rate_set || !rate_num) + return _FALSE; + + *rate_num = 0; + + ie = rtw_get_ie(ies, _SUPPORTEDRATES_IE_, &ie_len, ies_len); + if (ie == NULL) + goto ext_rate; + + _rtw_memcpy(rate_set, ie + 2, ie_len); + *rate_num = ie_len; + +ext_rate: + ie = rtw_get_ie(ies, _EXT_SUPPORTEDRATES_IE_, &ie_len, ies_len); + if (ie) { + _rtw_memcpy(rate_set + *rate_num, ie + 2, ie_len); + *rate_num += ie_len; } - - _rtw_memcpy(pmlmeinfo->FW_sta_info[cam_idx].SupportedRates, pIE->data, ie_len); - supportRateNum = ie_len; - - pIE = (PNDIS_802_11_VARIABLE_IEs)rtw_get_ie(pvar_ie, _EXT_SUPPORTEDRATES_IE_, &ie_len, var_ie_len); - if (pIE) - { - _rtw_memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len); + + if (*rate_num == 0) + return _FAIL; + + if (0) { + int i; + + for (i = 0; i < *rate_num; i++) + DBG_871X("rate:0x%02x\n", *(rate_set + i)); } return _SUCCESS; - } void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr) { struct sta_info *psta; u16 tid, start_seq, param; - struct recv_reorder_ctrl *preorder_ctrl; struct sta_priv *pstapriv = &padapter->stapriv; struct ADDBA_request *preq = (struct ADDBA_request*)paddba_req; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 size; + u8 size, accept = _FALSE; psta = rtw_get_stainfo(pstapriv, addr); if (!psta) @@ -3501,27 +3510,14 @@ void process_addba_req(_adapter *padapter, u8 *paddba_req, u8 *addr) param = le16_to_cpu(preq->BA_para_set); tid = (param>>2)&0x0f; - preorder_ctrl = &psta->recvreorder_ctrl[tid]; - - #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ - preorder_ctrl->indicate_seq = start_seq; - #ifdef DBG_RX_SEQ - DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __func__, __LINE__, - preorder_ctrl->indicate_seq, start_seq); - #endif - #else - preorder_ctrl->indicate_seq = 0xffff; - #endif - preorder_ctrl->enable = rtw_rx_ampdu_is_accept(padapter); + accept = rtw_rx_ampdu_is_accept(padapter); size = rtw_rx_ampdu_size(padapter); - if (preorder_ctrl->enable == _TRUE) { - preorder_ctrl->ampdu_size = size; - issue_addba_rsp(padapter, addr, tid, 0, size); - } else { - issue_addba_rsp(padapter, addr, tid, 37, size); /* reject ADDBA Req */ - } + if (accept == _TRUE) + rtw_addbarsp_cmd(padapter, addr, tid, 0, size, start_seq); + else + rtw_addbarsp_cmd(padapter, addr, tid, 37, size, start_seq); /* reject ADDBA Req */ exit: return; @@ -3792,6 +3788,7 @@ void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta) rtw_macid_map_set(&macid_ctl->bmc, 1); for (i=0;i<IFACE_ID_MAX;i++) rtw_macid_map_set(&macid_ctl->if_g[padapter->iface_id], 1); + macid_ctl->sta[1] = psta; /* TODO ch_g? */ _exit_critical_bh(&macid_ctl->lock, &irqL); i = 1; @@ -3818,6 +3815,7 @@ void rtw_alloc_macid(_adapter *padapter, struct sta_info *psta) rtw_macid_map_set(&macid_ctl->bmc, i); rtw_macid_map_set(&macid_ctl->if_g[padapter->iface_id], i); + macid_ctl->sta[i] = psta; /* TODO ch_g? */ @@ -3885,6 +3883,7 @@ void rtw_release_macid(_adapter *padapter, struct sta_info *psta) rtw_macid_map_clr(&macid_ctl->if_g[i], psta->mac_id); for (i=0;i<2;i++) rtw_macid_map_clr(&macid_ctl->ch_g[i], psta->mac_id); + macid_ctl->sta[psta->mac_id] = NULL; } _exit_critical_bh(&macid_ctl->lock, &irqL); @@ -4085,15 +4084,17 @@ bool rtw_check_pattern_valid(u8 *input, u8 len) { int i = 0; bool res = _FALSE; - - for (i = 0 ; i < len ; i++) { - if ((input[i] <= '9' && input[i] >= '0') || - (input[i] <= 'F' && input[i] >= 'A') || - (input[i] <= 'f' && input[i] >= 'a')) - res = _TRUE; - else - res = _FALSE; - } + + if (len != 2) + goto exit; + + for (i = 0 ; i < len ; i++) + if (IsHexDigit(input[i]) == _FALSE) + goto exit; + + res = _SUCCESS; + +exit: return res; } diff --git a/rtl8188FU/core/rtw_xmit.c b/rtl8188FU/core/rtw_xmit.c index d0fba9d..c7f7f79 100755 --- a/rtl8188FU/core/rtw_xmit.c +++ b/rtl8188FU/core/rtw_xmit.c @@ -3786,7 +3786,7 @@ s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev) u16 frame_ctl; unsigned char src_mac_addr[6]; unsigned char dst_mac_addr[6]; - struct ieee80211_hdr *dot11_hdr; + struct rtw_ieee80211_hdr *dot11_hdr; struct ieee80211_radiotap_header *rtap_hdr; _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev); @@ -3812,8 +3812,8 @@ s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev) /* Skip the ratio tap header */ skb_pull(skb, rtap_len); - dot11_hdr = (struct ieee80211_hdr *)skb->data; - frame_ctl = le16_to_cpu(dot11_hdr->frame_control); + dot11_hdr = (struct rtw_ieee80211_hdr *)skb->data; + frame_ctl = le16_to_cpu(dot11_hdr->frame_ctl); /* Check if the QoS bit is set */ if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) { @@ -4217,7 +4217,7 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p rtw_list_delete(&pxmitframe->list); - //_enter_critical_bh(&psta->sleep_q.lock, &irqL); + /*_enter_critical_bh(&psta->sleep_q.lock, &irqL);*/ rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q)); @@ -4230,31 +4230,23 @@ sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *p pstapriv->sta_dz_bitmap |= BIT(0); //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); - if (padapter->registrypriv.wifi_spec == 1) { - /* - *if (update_tim == _TRUE) - * rtw_chk_hi_queue_cmd(padapter); - */ + if (update_tim == _TRUE) { + if (is_broadcast_mac_addr(pattrib->ra)) + _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC"); + else + _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC"); } else { - - if (update_tim == _TRUE) { - if (is_broadcast_mac_addr(pattrib->ra)) - _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC"); - else - _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC"); - } else { - chk_bmc_sleepq_cmd(padapter); - } + chk_bmc_sleepq_cmd(padapter); } - - //_exit_critical_bh(&psta->sleep_q.lock, &irqL); - ret = _TRUE; + /*_exit_critical_bh(&psta->sleep_q.lock, &irqL);*/ + + ret = _TRUE; DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast); - + } - + _exit_critical_bh(&psta->sleep_q.lock, &irqL); return ret; diff --git a/rtl8188FU/hal/efuse/rtl8188f/HalEfuseMask8188F_USB.c b/rtl8188FU/hal/efuse/rtl8188f/HalEfuseMask8188F_USB.c index 9912f5d..dddc3fa 100755 --- a/rtl8188FU/hal/efuse/rtl8188f/HalEfuseMask8188F_USB.c +++ b/rtl8188FU/hal/efuse/rtl8188f/HalEfuseMask8188F_USB.c @@ -31,39 +31,38 @@ ******************************************************************************/ u1Byte Array_MP_8188F_MUSB[] = { -0xFF, -0xF3, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x0F, -0xF1, -0xFF, -0xFF, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, -0x00, - + 0xFF, + 0xF3, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0F, + 0xF1, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0x70, + 0x00, + 0x12, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, }; u2Byte diff --git a/rtl8188FU/hal/hal_btcoex.c b/rtl8188FU/hal/hal_btcoex.c index 1c26fd9..29a64c2 100755 --- a/rtl8188FU/hal/hal_btcoex.c +++ b/rtl8188FU/hal/hal_btcoex.c @@ -3639,12 +3639,10 @@ hal_btcoex_AntIsolationConfig_ParaFile( _rtw_memset(pHalData->para_file_buf , 0 , MAX_PARA_FILE_BUF_LEN); - - rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName); - - if (rtw_is_file_readable(file_path) == _TRUE) + rtw_get_phy_file_path(Adapter, pFileName); + if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) { - rlen = rtw_retrieve_from_file(file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); + rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); if (rlen > 0) { rtStatus = _SUCCESS; diff --git a/rtl8188FU/hal/hal_com.c b/rtl8188FU/hal/hal_com.c index a145692..72ab838 100755 --- a/rtl8188FU/hal/hal_com.c +++ b/rtl8188FU/hal/hal_com.c @@ -27,7 +27,7 @@ //#define CONFIG_GTK_OL_DBG #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE -char file_path[PATH_LENGTH_MAX]; +char rtw_phy_para_file_path[PATH_LENGTH_MAX]; #endif void dump_chip_info(HAL_VERSION ChipVersion) @@ -136,61 +136,106 @@ void rtw_hal_config_rftype(PADAPTER padapter) * * Parameters: * padapter pointer of adapter - * hw_channel_plan channel plan from HW (efuse/eeprom) + * hw_alpha2 country code from HW (efuse/eeprom/mapfile) + * hw_chplan channel plan from HW (efuse/eeprom/mapfile) * BIT[7] software configure mode; 0:Enable, 1:disable * BIT[6:0] Channel Plan - * sw_channel_plan channel plan from SW (registry/module param) - * def_channel_plan channel plan used when HW/SW both invalid + * sw_alpha2 country code from HW (registry/module param) + * sw_chplan channel plan from SW (registry/module param) + * def_chplan channel plan used when HW/SW both invalid * AutoLoadFail efuse autoload fail or not * * Return: * Final channel plan decision * */ -u8 -hal_com_config_channel_plan( - IN PADAPTER padapter, - IN u8 hw_channel_plan, - IN u8 sw_channel_plan, - IN u8 def_channel_plan, - IN BOOLEAN AutoLoadFail +u8 hal_com_config_channel_plan( + IN PADAPTER padapter, + IN char *hw_alpha2, + IN u8 hw_chplan, + IN char *sw_alpha2, + IN u8 sw_chplan, + IN u8 def_chplan, + IN BOOLEAN AutoLoadFail ) { PHAL_DATA_TYPE pHalData; - u8 hwConfig; - u8 chnlPlan; - + u8 force_hw_chplan = _FALSE; + int chplan = -1; + const struct country_chplan *country_ent = NULL, *ent; pHalData = GET_HAL_DATA(padapter); - pHalData->bDisableSWChannelPlan = _FALSE; - chnlPlan = def_channel_plan; - - if (0xFF == hw_channel_plan) - AutoLoadFail = _TRUE; - - if (_FALSE == AutoLoadFail) - { - u8 hw_chnlPlan; - - hw_chnlPlan = hw_channel_plan & (~EEPROM_CHANNEL_PLAN_BY_HW_MASK); - if (rtw_is_channel_plan_valid(hw_chnlPlan)) - { -#ifndef CONFIG_SW_CHANNEL_PLAN - if (hw_channel_plan & EEPROM_CHANNEL_PLAN_BY_HW_MASK) - pHalData->bDisableSWChannelPlan = _TRUE; -#endif // !CONFIG_SW_CHANNEL_PLAN - chnlPlan = hw_chnlPlan; - } - } + /* treat 0xFF as invalid value, bypass hw_chplan & force_hw_chplan parsing */ + if (hw_chplan == 0xFF) + goto chk_hw_country_code; + + if (AutoLoadFail == _TRUE) + goto chk_sw_config; + + #ifndef CONFIG_FORCE_SW_CHANNEL_PLAN + if (hw_chplan & EEPROM_CHANNEL_PLAN_BY_HW_MASK) + force_hw_chplan = _TRUE; + #endif + + hw_chplan &= (~EEPROM_CHANNEL_PLAN_BY_HW_MASK); + +chk_hw_country_code: + if (hw_alpha2 && !IS_ALPHA2_NO_SPECIFIED(hw_alpha2)) { + ent = rtw_get_chplan_from_country(hw_alpha2); + if (ent) { + /* get chplan from hw country code, by pass hw chplan setting */ + country_ent = ent; + chplan = ent->chplan; + goto chk_sw_config; + } else + DBG_871X_LEVEL(_drv_always_, "%s unsupported hw_alpha2:\"%c%c\"\n", __func__, hw_alpha2[0], hw_alpha2[1]); + } + + if (rtw_is_channel_plan_valid(hw_chplan)) + chplan = hw_chplan; + else if (force_hw_chplan == _TRUE) { + DBG_871X_LEVEL(_drv_always_, "%s unsupported hw_chplan:0x%02X\n", __func__, hw_chplan); + /* hw infomaton invalid, refer to sw information */ + force_hw_chplan = _FALSE; + } + +chk_sw_config: + if (force_hw_chplan == _TRUE) + goto done; + + if (sw_alpha2 && !IS_ALPHA2_NO_SPECIFIED(sw_alpha2)) { + ent = rtw_get_chplan_from_country(sw_alpha2); + if (ent) { + /* get chplan from sw country code, by pass sw chplan setting */ + country_ent = ent; + chplan = ent->chplan; + goto done; + } else + DBG_871X_LEVEL(_drv_always_, "%s unsupported sw_alpha2:\"%c%c\"\n", __func__, sw_alpha2[0], sw_alpha2[1]); + } + + if (rtw_is_channel_plan_valid(sw_chplan)) { + /* cancel hw_alpha2 because chplan is specified by sw_chplan*/ + country_ent = NULL; + chplan = sw_chplan; + } else if (sw_chplan != RTW_CHPLAN_MAX) + DBG_871X_LEVEL(_drv_always_, "%s unsupported sw_chplan:0x%02X\n", __func__, sw_chplan); + +done: + if (chplan == -1) { + DBG_871X_LEVEL(_drv_always_, "%s use def_chplan:0x%02X\n", __func__, def_chplan); + chplan = def_chplan; + } else if (country_ent) { + DBG_871X_LEVEL(_drv_always_, "%s country code:\"%c%c\" with chplan:0x%02X\n", __func__ + , country_ent->alpha2[0], country_ent->alpha2[1], country_ent->chplan); + } else + DBG_871X_LEVEL(_drv_always_, "%s chplan:0x%02X\n", __func__, chplan); - if ((_FALSE == pHalData->bDisableSWChannelPlan) - && rtw_is_channel_plan_valid(sw_channel_plan)) - { - chnlPlan = sw_channel_plan; - } + padapter->mlmepriv.country_ent = country_ent; + pHalData->bDisableSWChannelPlan = force_hw_chplan; - return chnlPlan; + return chplan; } BOOLEAN @@ -776,6 +821,158 @@ exit: return ret; } +#define GET_C2H_MAC_HIDDEN_RPT_UUID_X(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 0, 0, 8) +#define GET_C2H_MAC_HIDDEN_RPT_UUID_Y(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 1, 0, 8) +#define GET_C2H_MAC_HIDDEN_RPT_UUID_Z(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 2, 0, 5) +#define GET_C2H_MAC_HIDDEN_RPT_UUID_CRC(_data) LE_BITS_TO_2BYTE(((u8 *)(_data)) + 2, 5, 11) +#define GET_C2H_MAC_HIDDEN_RPT_HCI_TYPE(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 4, 0, 4) +#define GET_C2H_MAC_HIDDEN_RPT_PACKAGE_TYPE(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 4, 4, 4) +#define GET_C2H_MAC_HIDDEN_RPT_WL_FUNC(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 5, 0, 4) +#define GET_C2H_MAC_HIDDEN_RPT_HW_STYPE(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 5, 4, 4) +#define GET_C2H_MAC_HIDDEN_RPT_BW(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 6, 0, 3) +#define GET_C2H_MAC_HIDDEN_RPT_ANT_NUM(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 6, 5, 3) +#define GET_C2H_MAC_HIDDEN_RPT_80211_PROTOCOL(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 7, 2, 2) +#define GET_C2H_MAC_HIDDEN_RPT_NIC_ROUTER(_data) LE_BITS_TO_1BYTE(((u8 *)(_data)) + 7, 6, 2) + +#ifndef DBG_C2H_MAC_HIDDEN_RPT_HANDLE +#define DBG_C2H_MAC_HIDDEN_RPT_HANDLE 0 +#endif + +int c2h_mac_hidden_rpt_hdl(_adapter *adapter, u8 *data, u8 len) +{ + HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); + struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter); + int ret = _FAIL; + + u32 uuid; + u8 uuid_x; + u8 uuid_y; + u8 uuid_z; + u16 uuid_crc; + + u8 hci_type; + u8 package_type; + u8 wl_func; + u8 hw_stype; + u8 bw; + u8 ant_num; + u8 protocol; + u8 nic; + + int i; + + if (len < MAC_HIDDEN_RPT_LEN) { + DBG_871X_LEVEL(_drv_warning_, "%s len(%u) < %d\n", __func__, len, MAC_HIDDEN_RPT_LEN); + goto exit; + } + + uuid_x = GET_C2H_MAC_HIDDEN_RPT_UUID_X(data); + uuid_y = GET_C2H_MAC_HIDDEN_RPT_UUID_Y(data); + uuid_z = GET_C2H_MAC_HIDDEN_RPT_UUID_Z(data); + uuid_crc = GET_C2H_MAC_HIDDEN_RPT_UUID_CRC(data); + + hci_type = GET_C2H_MAC_HIDDEN_RPT_HCI_TYPE(data); + package_type = GET_C2H_MAC_HIDDEN_RPT_PACKAGE_TYPE(data); + + wl_func = GET_C2H_MAC_HIDDEN_RPT_WL_FUNC(data); + hw_stype = GET_C2H_MAC_HIDDEN_RPT_HW_STYPE(data); + + bw = GET_C2H_MAC_HIDDEN_RPT_BW(data); + ant_num = GET_C2H_MAC_HIDDEN_RPT_ANT_NUM(data); + + protocol = GET_C2H_MAC_HIDDEN_RPT_80211_PROTOCOL(data); + nic = GET_C2H_MAC_HIDDEN_RPT_NIC_ROUTER(data); + + if (DBG_C2H_MAC_HIDDEN_RPT_HANDLE) { + for (i = 0; i < len; i++) + DBG_871X("%s: 0x%02X\n", __func__, *(data + i)); + + DBG_871X("uuid x:0x%02x y:0x%02x z:0x%x crc:0x%x\n", uuid_x, uuid_y, uuid_z, uuid_crc); + DBG_871X("hci_type:0x%x\n", hci_type); + DBG_871X("package_type:0x%x\n", package_type); + DBG_871X("wl_func:0x%x\n", wl_func); + DBG_871X("hw_stype:0x%x\n", hw_stype); + DBG_871X("bw:0x%x\n", bw); + DBG_871X("ant_num:0x%x\n", ant_num); + DBG_871X("protocol:0x%x\n", protocol); + DBG_871X("nic:0x%x\n", nic); + } + + hal_data->PackageType = package_type; + hal_spec->wl_func &= mac_hidden_wl_func_to_hal_wl_func(wl_func); + hal_spec->bw_cap &= mac_hidden_max_bw_to_hal_bw_cap(bw); + hal_spec->nss_num = rtw_min(hal_spec->nss_num, ant_num); + hal_spec->proto_cap &= mac_hidden_proto_to_hal_proto_cap(protocol); + + ret = _SUCCESS; + +exit: + return ret; +} + +int hal_read_mac_hidden_rpt(_adapter *adapter) +{ + int ret = _FAIL; + int ret_fwdl; + u8 mac_hidden_rpt[MAC_HIDDEN_RPT_LEN] = {0}; + u32 start = rtw_get_current_time(); + u32 cnt = 0; + u32 timeout_ms = 800; + u32 min_cnt = 10; + u8 id = C2H_MAC_HIDDEN_RPT + 1; + int i; + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_PCI_HCI) + u8 hci_type = rtw_get_intf_type(adapter); + + if ((hci_type == RTW_USB || hci_type == RTW_PCIE) + && !rtw_is_hw_init_completed(adapter)) + rtw_hal_power_on(adapter); +#endif + + /* clear data ready */ + rtw_write8(adapter, REG_C2HEVT_MSG_NORMAL, id); + + /* download FW */ + ret_fwdl = rtw_hal_fw_dl(adapter, _FALSE); + if (ret_fwdl != _SUCCESS) + goto mac_hidden_rpt_hdl; + + /* polling for data ready */ + start = rtw_get_current_time(); + do { + cnt++; + id = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL); + if (id == C2H_MAC_HIDDEN_RPT || RTW_CANNOT_IO(adapter)) + break; + rtw_msleep_os(10); + } while (rtw_get_passing_time_ms(start) < timeout_ms || cnt < min_cnt); + + if (id == C2H_MAC_HIDDEN_RPT) { + /* read data */ + for (i = 0; i < MAC_HIDDEN_RPT_LEN; i++) + mac_hidden_rpt[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i); + } + +mac_hidden_rpt_hdl: + c2h_mac_hidden_rpt_hdl(adapter, mac_hidden_rpt, MAC_HIDDEN_RPT_LEN); + + if (ret_fwdl == _SUCCESS && id == C2H_MAC_HIDDEN_RPT) + ret = _SUCCESS; + +exit: + +#if defined(CONFIG_USB_HCI) || defined(CONFIG_PCI_HCI) + if ((hci_type == RTW_USB || hci_type == RTW_PCIE) + && !rtw_is_hw_init_completed(adapter)) + rtw_hal_power_off(adapter); +#endif + + DBG_871X("%s %s! (%u, %dms), fwdl:%d, id:0x%02x\n", __func__ + , (ret == _SUCCESS)?"OK":"Fail", cnt, rtw_get_passing_time_ms(start), ret_fwdl, id); + + return ret; +} u8 rtw_hal_networktype_to_raid(_adapter *adapter, struct sta_info *psta) { @@ -1023,7 +1220,7 @@ void rtw_sec_write_cam_ent(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key) } #else - j = 5; + j = 7; #endif for (; j >= 0; j--) { @@ -1034,6 +1231,10 @@ void rtw_sec_write_cam_ent(_adapter *adapter, u8 id, u16 ctrl, u8 *mac, u8 *key) case 1: wdata = (mac[2] | (mac[3] << 8) | (mac[4] << 16) | (mac[5] << 24)); break; + case 6: + case 7: + wdata = 0; + break; default: i = (j - 2) << 2; wdata = (key[i] | (key[i + 1] << 8) | (key[i + 2] << 16) | (key[i + 3] << 24)); @@ -1263,6 +1464,7 @@ const char * const _h2c_msr_role_str[] = { "GC", "GO", "TDLS", + "ADHOC", "INVALID", }; @@ -1377,16 +1579,16 @@ void rtw_hal_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) } #ifdef CONFIG_GPIO_WAKEUP -/* - * Switch GPIO_13, GPIO_14 to wlan control, or pull GPIO_13,14 MUST fail. - * It happended at 8723B/8192E/8821A. New IC will check multi function GPIO, - * and implement HAL function. - */ -static void rtw_hal_switch_gpio_wl_ctrl(_adapter* padapter, u8 index, u8 enable) +void rtw_hal_switch_gpio_wl_ctrl(_adapter *padapter, u8 index, u8 enable) { - if (index !=13 && index != 14) return; - - rtw_hal_set_hwreg(padapter, HW_SET_GPIO_WL_CTRL, (u8 *)(&enable)); + /* + * Switch GPIO_13, GPIO_14 to wlan control, or pull GPIO_13,14 MUST fail. + * It happended at 8723B/8192E/8821A. New IC will check multi function GPIO, + * and implement HAL function. + * TODO: GPIO_8 multi function? + */ + if (index == 13 || index == 14) + rtw_hal_set_hwreg(padapter, HW_SET_GPIO_WL_CTRL, (u8 *)(&enable)); } void rtw_hal_set_output_gpio(_adapter *padapter, u8 index, u8 outputval) @@ -1742,9 +1944,11 @@ static void rtw_hal_fw_sync_cam_id(_adapter *adapter) DBG_871X("%s: cam_id: %d key_id(%d) is not GK\n", __func__, cam_id, index); } else { - rtw_sec_read_cam_ent(adapter, cam_id, NULL, NULL, get_key); - algorithm = psecuritypriv->dot11PrivacyAlgrthm; - ctrl = BIT(15) | BIT6 |(algorithm << 2) | index; + //rtw_sec_read_cam_ent(adapter, cam_id, NULL, NULL, get_key); + rtw_sec_read_cam_ent(adapter, cam_id, (u8 *)&ctrl, NULL, get_key); + //algorithm = psecuritypriv->dot11PrivacyAlgrthm; + //ctrl = BIT(15) | BIT6 |(algorithm << 2) | index; + ctrl = BIT(15) | BIT6 | index; write_cam(adapter, index, ctrl, addr, get_key); ctrl = 0; write_cam(adapter, cam_id, ctrl, null_addr, get_key); @@ -1786,10 +1990,12 @@ static void rtw_hal_update_gtk_offload_info(_adapter *adapter) do{ /* chech if GK */ if (rtw_sec_read_cam_is_gk(adapter, default_cam_id) == _TRUE) { - rtw_sec_read_cam_ent(adapter, default_cam_id, NULL, NULL, get_key); - algorithm = psecuritypriv->dot11PrivacyAlgrthm; + //rtw_sec_read_cam_ent(adapter, default_cam_id, NULL, NULL, get_key); + rtw_sec_read_cam_ent(adapter, default_cam_id, (u8 *)&ctrl, NULL, get_key); + //algorithm = psecuritypriv->dot11PrivacyAlgrthm; /* in default cam entry, cam id = key id */ - ctrl = BIT(15) | BIT6 | (algorithm << 2) | default_cam_id; + //ctrl = BIT(15) | BIT6 | (algorithm << 2) | default_cam_id; + ctrl |= BIT6; write_cam(adapter, cam_id, ctrl, addr, get_key); cam_id++; ctrl = 0; @@ -1996,9 +2202,15 @@ static u8 rtw_hal_set_remote_wake_ctrl_cmd(_adapter *adapter, u8 enable) } #endif //CONFIG_GTK_OL +#ifdef CONFIG_PLATFORM_NOVATEK_NT72668 + SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN( + u1H2CRemoteWakeCtrlParm, + 0); +#else SET_H2CCMD_REMOTE_WAKE_CTRL_FW_UNICAST_EN( u1H2CRemoteWakeCtrlParm, !ppwrpriv->wowlan_pattern); +#endif /* * filter NetBios name service pkt to avoid being waked-up @@ -2297,6 +2509,7 @@ static void rtw_hal_ap_wow_enable(_adapter *padapter) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct hal_ops *pHalFunc = &padapter->HalFunc; struct sta_info *psta = NULL; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); #ifdef DBG_CHECK_FW_PS_STATE struct dvobj_priv *psdpriv = padapter->dvobj; struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; @@ -2313,10 +2526,7 @@ static void rtw_hal_ap_wow_enable(_adapter *padapter) #endif /*DBG_CHECK_FW_PS_STATE*/ /* 1. Download WOWLAN FW*/ - if (pHalFunc->hal_set_wowlan_fw != NULL) - pHalFunc->hal_set_wowlan_fw(padapter, _TRUE); - else - DBG_871X("hal_set_wowlan_fw is null\n"); + rtw_hal_fw_dl(padapter, _TRUE); media_status_rpt = RT_MEDIA_CONNECT; rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, @@ -2358,7 +2568,8 @@ static void rtw_hal_ap_wow_enable(_adapter *padapter) #endif /*CONFIG_CONCURRENT_MODE*/ /* Invoid SE0 reset signal during suspending*/ rtw_write8(padapter, REG_RSV_CTRL, 0x20); - rtw_write8(padapter, REG_RSV_CTRL, 0x60); + if (IS_8188F(pHalData->VersionID) == FALSE) + rtw_write8(padapter, REG_RSV_CTRL, 0x60); #endif /*CONFIG_USB_HCI*/ } @@ -2395,15 +2606,12 @@ static void rtw_hal_ap_wow_disable(_adapter *padapter) rtw_hal_force_enable_rxdma(padapter); - if (pHalFunc->hal_set_wowlan_fw != NULL) - pHalFunc->hal_set_wowlan_fw(padapter, _FALSE); - else - DBG_871X("hal_set_wowlan_fw is null\n"); + rtw_hal_fw_dl(padapter, _FALSE); + #ifdef CONFIG_GPIO_WAKEUP val8 = (pwrctl->is_high_active == 0) ? 1 : 0; DBG_871X_LEVEL(_drv_always_, "Set Wake GPIO to default(%d).\n", val8); rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, val8); - rtw_hal_switch_gpio_wl_ctrl(padapter, WAKEUP_GPIO_IDX, _FALSE); #endif media_status_rpt = RT_MEDIA_CONNECT; @@ -5189,6 +5397,7 @@ static void rtw_hal_wow_enable(_adapter *adapter) struct mlme_priv *pmlmepriv = &adapter->mlmepriv; struct hal_ops *pHalFunc = &adapter->HalFunc; struct sta_info *psta = NULL; + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter); int res; u16 media_status_rpt; @@ -5217,7 +5426,7 @@ static void rtw_hal_wow_enable(_adapter *adapter) if (pwrctl->wowlan_pattern) rtw_hal_dl_pattern(adapter, _FALSE); - rtw_hal_set_wowlan_fw(adapter, _TRUE); + rtw_hal_fw_dl(adapter, _TRUE); media_status_rpt = RT_MEDIA_CONNECT; rtw_hal_set_hwreg(adapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)&media_status_rpt); @@ -5264,7 +5473,8 @@ static void rtw_hal_wow_enable(_adapter *adapter) #endif /*CONFIG_CONCURRENT_MODE*/ /* Invoid SE0 reset signal during suspending*/ rtw_write8(adapter, REG_RSV_CTRL, 0x20); - rtw_write8(adapter, REG_RSV_CTRL, 0x60); + if (IS_8188F(pHalData->VersionID) == FALSE) + rtw_write8(adapter, REG_RSV_CTRL, 0x60); #endif /*CONFIG_USB_HCI*/ rtw_hal_gate_bb(adapter, _FALSE); @@ -5335,14 +5545,14 @@ static void rtw_hal_wow_disable(_adapter *adapter) rtw_hal_update_gtk_offload_info(adapter); #endif /*CONFIG_GTK_OL*/ - rtw_hal_set_wowlan_fw(adapter, _FALSE); + rtw_hal_fw_dl(adapter, _FALSE); #ifdef CONFIG_GPIO_WAKEUP val8 = (pwrctl->is_high_active == 0) ? 1 : 0; DBG_871X_LEVEL(_drv_always_, "Set Wake GPIO to default(%d).\n", val8); rtw_hal_set_output_gpio(adapter, WAKEUP_GPIO_IDX, val8); - rtw_hal_switch_gpio_wl_ctrl(adapter, WAKEUP_GPIO_IDX, _FALSE); #endif + if ((pwrctl->wowlan_wake_reason != FWDecisionDisconnect) && (pwrctl->wowlan_wake_reason != Rx_Pairwisekey) && (pwrctl->wowlan_wake_reason != Rx_DisAssoc) && @@ -5724,6 +5934,34 @@ error: rtw_free_xmitframe(pxmitpriv, pcmdframe); } +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW +s32 rtw_hal_ch_sw_oper_offload(_adapter *padapter, u8 channel, u8 channel_offset, u16 bwmode) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + u8 ch_sw_h2c_buf[4] = {0x00, 0x00, 0x00, 0x00}; + + + SET_H2CCMD_CH_SW_OPER_OFFLOAD_CH_NUM(ch_sw_h2c_buf, channel); + SET_H2CCMD_CH_SW_OPER_OFFLOAD_BW_MODE(ch_sw_h2c_buf, bwmode); + switch (bwmode) { + case CHANNEL_WIDTH_40: + SET_H2CCMD_CH_SW_OPER_OFFLOAD_BW_40M_SC(ch_sw_h2c_buf, channel_offset); + break; + case CHANNEL_WIDTH_80: + SET_H2CCMD_CH_SW_OPER_OFFLOAD_BW_80M_SC(ch_sw_h2c_buf, channel_offset); + break; + case CHANNEL_WIDTH_20: + default: + break; + } + SET_H2CCMD_CH_SW_OPER_OFFLOAD_RFE_TYPE(ch_sw_h2c_buf, pHalData->RFEType); + + return rtw_hal_fill_h2c_cmd(padapter, H2C_CHNL_SWITCH_OPER_OFFLOAD, sizeof(ch_sw_h2c_buf), ch_sw_h2c_buf); +} +#endif +#endif + void SetHwReg(_adapter *adapter, u8 variable, u8 *val) { HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); @@ -5866,6 +6104,16 @@ _func_enter_; case HW_VAR_RF_TYPE: *((u8*)val) = hal_data->rf_type; break; + case HW_VAR_DO_IQK: + *val = hal_data->bNeedIQK; + break; + case HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO: + if (hal_is_band_support(adapter, BAND_ON_5G)) + *val = _TRUE; + else + *val = _FALSE; + + break; default: if (0) DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" variable(%d) not defined!\n", @@ -6097,20 +6345,19 @@ void SetHalODMVar( { PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure(podmpriv , PHYDM_FALSEALMCNT); pDIG_T pDM_DigTable = &podmpriv->DM_DigTable; + void *sel; - DBG_871X("============ Rx Info dump ===================\n"); - DBG_871X("bLinked = %d, RSSI_Min = %d(%%), CurrentIGI = 0x%x\n", - podmpriv->bLinked, podmpriv->RSSI_Min, pDM_DigTable->CurIGValue); - if (FalseAlmCnt) - DBG_871X("Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n", - FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all); + sel = pValue1; - if (podmpriv->bLinked) { - DBG_871X("RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n", - HDATA_RATE(podmpriv->RxRate), podmpriv->RSSI_A, podmpriv->RSSI_B); + DBG_871X_SEL(sel , "============ Rx Info dump ===================\n"); + DBG_871X_SEL(sel , "bLinked = %d, RSSI_Min = %d(%%), CurrentIGI = 0x%x\n", podmpriv->bLinked, podmpriv->RSSI_Min, pDM_DigTable->CurIGValue); + DBG_871X_SEL(sel , "Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n", FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all); + if (podmpriv->bLinked) { + DBG_871X_SEL(sel , "RxRate = %s", HDATA_RATE(podmpriv->RxRate)); + DBG_871X_SEL(sel , " RSSI_A = %d(%%), RSSI_B = %d(%%)\n", podmpriv->RSSI_A, podmpriv->RSSI_B); #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA - rtw_dump_raw_rssi_info(Adapter); + rtw_dump_raw_rssi_info(Adapter, sel); #endif } } @@ -6147,6 +6394,18 @@ void SetHalODMVar( } break; #endif +#ifdef CONFIG_ANTENNA_DIVERSITY + case HAL_ODM_ANTDIV_SELECT: + { + u8 antenna = (*(u8 *)pValue1); + + /*switch antenna*/ + ODM_UpdateRxIdleAnt(&pHalData->odmpriv, antenna); + /*DBG_871X("==> HAL_ODM_ANTDIV_SELECT, Ant_(%s)\n", (antenna == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");*/ + + } + break; +#endif default: break; @@ -6196,7 +6455,20 @@ void GetHalODMVar( } break; #endif - +#ifdef CONFIG_ANTENNA_DIVERSITY + case HAL_ODM_ANTDIV_SELECT: + { + pFAT_T pDM_FatTable = &podmpriv->DM_FatTable; + *((u8 *)pValue1) = pDM_FatTable->RxIdleAnt; + } + break; +#endif + case HAL_ODM_INITIAL_GAIN: + { + pDIG_T pDM_DigTable = &podmpriv->DM_DigTable; + *((u8 *)pValue1) = pDM_DigTable->CurIGValue; + } + break; default: break; } @@ -6258,30 +6530,6 @@ eqNByte( // // Description: -// Return TRUE if chTmp is represent for hex digit and -// FALSE otherwise. -// -// -BOOLEAN -IsHexDigit( - IN char chTmp -) -{ - if( (chTmp >= '0' && chTmp <= '9') || - (chTmp >= 'a' && chTmp <= 'f') || - (chTmp >= 'A' && chTmp <= 'F') ) - { - return _TRUE; - } - else - { - return _FALSE; - } -} - - -// -// Description: // Translate a character to hex digit. // u32 @@ -6591,14 +6839,13 @@ void rtw_get_raw_rssi_info(void *sel, _adapter *padapter) } } -void rtw_dump_raw_rssi_info(_adapter *padapter) +void rtw_dump_raw_rssi_info(_adapter *padapter, void *sel) { u8 isCCKrate,rf_path; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info; - DBG_871X("============ RAW Rx Info dump ===================\n"); - DBG_871X("RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n", - HDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all); + DBG_871X_SEL(sel, "============ RAW Rx Info dump ===================\n"); + DBG_871X_SEL(sel, "RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n", HDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all); isCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M)?TRUE :FALSE; @@ -6607,15 +6854,14 @@ void rtw_dump_raw_rssi_info(_adapter *padapter) for(rf_path = 0;rf_path<pHalData->NumTotalRFPath;rf_path++) { - DBG_871X("RF_PATH_%d=>signal_strength:%d(%%),signal_quality:%d(%%)" + DBG_871X_SEL(sel , "RF_PATH_%d=>signal_strength:%d(%%),signal_quality:%d(%%)" , rf_path, psample_pkt_rssi->mimo_signal_strength[rf_path], psample_pkt_rssi->mimo_signal_quality[rf_path]); - if(!isCCKrate){ - printk(",rx_ofdm_pwr:%d(dBm),rx_ofdm_snr:%d(dB)\n", - psample_pkt_rssi->ofdm_pwr[rf_path],psample_pkt_rssi->ofdm_snr[rf_path]); - }else{ - printk("\n"); - } + if (!isCCKrate) + DBG_871X_SEL(sel , ",rx_ofdm_pwr:%d(dBm),rx_ofdm_snr:%d(dB)\n", psample_pkt_rssi->ofdm_pwr[rf_path], psample_pkt_rssi->ofdm_snr[rf_path]); + else + DBG_871X_SEL(sel , "\n"); + } } @@ -6874,7 +7120,7 @@ exit: return ret; } -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM u32 Array_kfreemap[] = { 0x08,0xe, 0x06,0xc, @@ -6900,13 +7146,13 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) pu4Byte Array = Array_kfreemap; u4Byte v1 = 0, v2 = 0, GainValue = 0, target = 0; - if (registry_par->RegRfKFreeEnable == 2) { + if (registry_par->RegPwrTrimEnable == 2) { DBG_871X("Registry kfree default force disable.\n"); return; } #if defined(CONFIG_RTL8723B) - if (value & BIT4 || (registry_par->RegRfKFreeEnable == 1)) { + if (value & BIT4 || (registry_par->RegPwrTrimEnable == 1)) { DBG_871X("Offset RF Gain.\n"); DBG_871X("Offset RF Gain. pHalData->EEPROMRFGainVal=0x%x\n",pHalData->EEPROMRFGainVal); @@ -6949,7 +7195,7 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) } #elif defined(CONFIG_RTL8188E) - if (value & BIT4 || (registry_par->RegRfKFreeEnable == 1)) { + if (value & BIT4 || (registry_par->RegPwrTrimEnable == 1)) { DBG_871X("8188ES Offset RF Gain.\n"); DBG_871X("8188ES Offset RF Gain. EEPROMRFGainVal=0x%x\n", pHalData->EEPROMRFGainVal); @@ -6981,11 +7227,11 @@ void rtw_bb_rf_gain_offset(_adapter *padapter) #endif } -#endif //CONFIG_RF_GAIN_OFFSET +#endif /*CONFIG_RF_POWER_TRIM */ bool kfree_data_is_bb_gain_empty(struct kfree_data_t *data) { -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM int i, j; for (i = 0; i < BB_GAIN_NUM; i++) @@ -6996,8 +7242,8 @@ bool kfree_data_is_bb_gain_empty(struct kfree_data_t *data) return 1; } -#ifdef CONFIG_USB_RX_AGGREGATION -void rtw_set_usb_agg_by_mode(_adapter *padapter, u8 cur_wireless_mode) +#ifdef CONFIG_USB_RX_AGGREGATION +void rtw_set_usb_agg_by_mode_normal(_adapter *padapter, u8 cur_wireless_mode) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); if(cur_wireless_mode < WIRELESS_11_24N @@ -7071,6 +7317,43 @@ void rtw_set_usb_agg_by_mode(_adapter *padapter, u8 cur_wireless_mode) /* DBG_871X("%s: Unknow wireless mode(0x%x)\n",__func__,padapter->mlmeextpriv.cur_wireless_mode); */ } } + +void rtw_set_usb_agg_by_mode_customer(_adapter *padapter, u8 cur_wireless_mode, u8 UsbDmaSize, u8 Legacy_UsbDmaSize) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if (cur_wireless_mode < WIRELESS_11_24N + && cur_wireless_mode > 0) { /* ABG mode */ + if (Legacy_UsbDmaSize != pHalData->RegAcUsbDmaSize + || 0x10 != pHalData->RegAcUsbDmaTime) { + pHalData->RegAcUsbDmaSize = Legacy_UsbDmaSize; + pHalData->RegAcUsbDmaTime = 0x10; + rtw_write16(padapter, REG_RXDMA_AGG_PG_TH, + pHalData->RegAcUsbDmaSize | (pHalData->RegAcUsbDmaTime<<8)); + } + } else if (cur_wireless_mode >= WIRELESS_11_24N + && cur_wireless_mode <= WIRELESS_MODE_MAX) { /* N AC mode */ + if (UsbDmaSize != pHalData->RegAcUsbDmaSize + || 0x20 != pHalData->RegAcUsbDmaTime) { + pHalData->RegAcUsbDmaSize = UsbDmaSize; + pHalData->RegAcUsbDmaTime = 0x20; + rtw_write16(padapter, REG_RXDMA_AGG_PG_TH, + pHalData->RegAcUsbDmaSize | (pHalData->RegAcUsbDmaTime<<8)); + } + } else { + /* DBG_871X("%s: Unknown wireless mode(0x%x)\n",__func__,padapter->mlmeextpriv.cur_wireless_mode); */ + } +} + +void rtw_set_usb_agg_by_mode(_adapter *padapter, u8 cur_wireless_mode) +{ +#ifdef CONFIG_PLATFORM_NOVATEK_NT72668 + rtw_set_usb_agg_by_mode_customer(padapter, cur_wireless_mode, 0x3, 0x3); + return; +#endif /* CONFIG_PLATFORM_NOVATEK_NT72668 */ + + rtw_set_usb_agg_by_mode_normal(padapter, cur_wireless_mode); +} #endif //CONFIG_USB_RX_AGGREGATION //To avoid RX affect TX throughput @@ -7120,6 +7403,10 @@ void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer) #else //!CONFIG_CONCURRENT_MODE rtw_set_usb_agg_by_mode(padapter,cur_wireless_mode); #endif //CONFIG_CONCURRENT_MODE +#ifdef CONFIG_PLATFORM_NOVATEK_NT72668 + } else { + rtw_set_usb_agg_by_mode(padapter, cur_wireless_mode); +#endif /* CONFIG_PLATFORM_NOVATEK_NT72668 */ } #endif } @@ -7373,6 +7660,53 @@ int rtw_hal_disable_gpio_interrupt(_adapter* adapter, int gpio_num) } #endif +s8 rtw_hal_ch_sw_iqk_info_search(_adapter* padapter, u8 central_chnl, u8 bw_mode) { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 i; + + for (i = 0; i < MAX_IQK_INFO_BACKUP_CHNL_NUM; i++) { + if ((pHalData->iqk_reg_backup[i].central_chnl != 0)) { + if ((pHalData->iqk_reg_backup[i].central_chnl == central_chnl) + && (pHalData->iqk_reg_backup[i].bw_mode == bw_mode)) { + return i; + } + } + } + + return -1; +} + +void rtw_hal_ch_sw_iqk_info_backup(_adapter* padapter) { + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + s8 res; + u8 i; + + /* If it's an existed record, overwrite it */ + res = rtw_hal_ch_sw_iqk_info_search(padapter, pHalData->CurrentChannel, pHalData->CurrentChannelBW); + if ((res >= 0) && (res < MAX_IQK_INFO_BACKUP_CHNL_NUM)) { + rtw_hal_set_hwreg(padapter, HW_VAR_CH_SW_IQK_INFO_BACKUP, (u8*)&(pHalData->iqk_reg_backup[res])); + return; + } + + /* Search for the empty record to use */ + for (i = 0; i < MAX_IQK_INFO_BACKUP_CHNL_NUM; i++) { + if (pHalData->iqk_reg_backup[i].central_chnl == 0) { + rtw_hal_set_hwreg(padapter, HW_VAR_CH_SW_IQK_INFO_BACKUP, (u8*)&(pHalData->iqk_reg_backup[i])); + return; + } + } + + /* Else, overwrite the oldest record */ + for (i = 1; i < MAX_IQK_INFO_BACKUP_CHNL_NUM; i++) { + _rtw_memcpy(&(pHalData->iqk_reg_backup[i - 1]), &(pHalData->iqk_reg_backup[i]), sizeof(struct hal_iqk_reg_backup)); + } + rtw_hal_set_hwreg(padapter, HW_VAR_CH_SW_IQK_INFO_BACKUP, (u8*)&(pHalData->iqk_reg_backup[MAX_IQK_INFO_BACKUP_CHNL_NUM - 1])); +} + +void rtw_hal_ch_sw_iqk_info_restore(_adapter* padapter, u8 ch_sw_use_case) { + rtw_hal_set_hwreg(padapter, HW_VAR_CH_SW_IQK_INFO_RESTORE, &ch_sw_use_case); +} + void rtw_dump_mac_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter) { u32 mac_cck_ok=0, mac_ofdm_ok=0, mac_ht_ok=0, mac_vht_ok=0; @@ -7483,13 +7817,19 @@ void rtw_dump_phy_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_count } -void rtw_reset_phy_rx_counters(_adapter* padapter) +void rtw_reset_phy_trx_ok_counters(_adapter *padapter) +{ + if (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)) { + PHY_SetBBReg(padapter, 0xB58, BIT0, 0x1); + PHY_SetBBReg(padapter, 0xB58, BIT0, 0x0); + } +} +void rtw_reset_phy_rx_counters(_adapter *padapter) { //reset phy counter if (IS_HARDWARE_TYPE_JAGUAR(padapter) || IS_HARDWARE_TYPE_JAGUAR2(padapter)) { - PHY_SetBBReg(padapter, 0xB58, BIT0, 0x1); - PHY_SetBBReg(padapter, 0xB58, BIT0, 0x0); + rtw_reset_phy_trx_ok_counters(padapter); PHY_SetBBReg(padapter, 0x9A4, BIT17, 0x1);//reset OFDA FA counter PHY_SetBBReg(padapter, 0x9A4, BIT17, 0x0); @@ -7535,12 +7875,11 @@ void rtw_dump_phy_rxcnts_preprocess(_adapter* padapter,u8 rx_cnt_mode) { u8 initialgain; HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter); - DM_ODM_T *odm = &(hal_data->odmpriv); - DIG_T *pDigTable = &odm->DM_DigTable; if((!(padapter->dump_rx_cnt_mode& DUMP_PHY_RX_COUNTER)) && (rx_cnt_mode & DUMP_PHY_RX_COUNTER)) { - initialgain = pDigTable->CurIGValue; + /*initialgain = pDigTable->CurIGValue;*/ + rtw_hal_get_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, NULL); DBG_871X("%s CurIGValue:0x%02x\n",__FUNCTION__,initialgain); rtw_hal_set_odm_var(padapter, HAL_ODM_INITIAL_GAIN, &initialgain, _FALSE); /*disable dynamic functions, such as high power, DIG*/ @@ -7615,6 +7954,23 @@ void rtw_get_noise(_adapter* padapter) } +u8 rtw_get_current_tx_rate(_adapter *padapter, u8 macid) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + PDM_ODM_T pDM_Odm = &pHalData->odmpriv; + pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; + u8 rate_id = 0; + +#if (RATE_ADAPTIVE_SUPPORT == 1) + rate_id = ODM_RA_GetDecisionRate_8188E(pDM_Odm, macid); +#else + rate_id = (pRA_Table->link_tx_rate[macid]) & 0x7f; +#endif + + return rate_id; + +} + #ifdef CONFIG_FW_C2H_DEBUG /* C2H RX package original is 128. @@ -7844,6 +8200,13 @@ static const char * const _bw_cap_str[] = { /* BIT6 */"80_80M", }; +static const char * const _proto_cap_str[] = { + /* BIT0 */"b", + /* BIT1 */"g", + /* BIT2 */"n", + /* BIT3 */"ac", +}; + static const char * const _wl_func_str[] = { /* BIT0 */"P2P", /* BIT1 */"MIRACAST", @@ -7875,6 +8238,13 @@ void dump_hal_spec(void *sel, _adapter *adapter) } DBG_871X_SEL(sel, "\n"); + DBG_871X_SEL_NL(sel, "proto_cap:"); + for (i = 0; i < PROTO_CAP_BIT_NUM; i++) { + if (((hal_spec->proto_cap) >> i) & BIT0 && _proto_cap_str[i]) + DBG_871X_SEL(sel, "%s ", _proto_cap_str[i]); + } + DBG_871X_SEL(sel, "\n"); + DBG_871X_SEL_NL(sel, "wl_func:"); for (i = 0; i < WL_FUNC_BIT_NUM; i++) { if (((hal_spec->wl_func) >> i) & BIT0 && _wl_func_str[i]) @@ -7893,6 +8263,11 @@ inline bool hal_chk_bw_cap(_adapter *adapter, u8 cap) return (GET_HAL_SPEC(adapter)->bw_cap & cap); } +inline bool hal_chk_proto_cap(_adapter *adapter, u8 cap) +{ + return (GET_HAL_SPEC(adapter)->proto_cap & cap); +} + inline bool hal_chk_wl_func(_adapter *adapter, u8 func) { return (GET_HAL_SPEC(adapter)->wl_func & func); @@ -7908,6 +8283,37 @@ inline bool hal_is_bw_support(_adapter *adapter, u8 bw) return (GET_HAL_SPEC(adapter)->bw_cap & ch_width_to_bw_cap(bw)); } +inline bool hal_is_wireless_mode_support(_adapter *adapter, u8 mode) +{ + u8 proto_cap = GET_HAL_SPEC(adapter)->proto_cap; + + if (mode == WIRELESS_11B) + if ((proto_cap & PROTO_CAP_11B) && hal_chk_band_cap(adapter, BAND_CAP_2G)) + return 1; + + if (mode == WIRELESS_11G) + if ((proto_cap & PROTO_CAP_11G) && hal_chk_band_cap(adapter, BAND_CAP_2G)) + return 1; + + if (mode == WIRELESS_11A) + if ((proto_cap & PROTO_CAP_11G) && hal_chk_band_cap(adapter, BAND_CAP_5G)) + return 1; + + if (mode == WIRELESS_11_24N) + if ((proto_cap & PROTO_CAP_11N) && hal_chk_band_cap(adapter, BAND_CAP_2G)) + return 1; + + if (mode == WIRELESS_11_5N) + if ((proto_cap & PROTO_CAP_11N) && hal_chk_band_cap(adapter, BAND_CAP_5G)) + return 1; + + if (mode == WIRELESS_11AC) + if ((proto_cap & PROTO_CAP_11AC) && hal_chk_band_cap(adapter, BAND_CAP_5G)) + return 1; + + return 0; +} + /* * hal_largest_bw - starting from in_bw, get largest bw supported by HAL * @adapter: @@ -7928,3 +8334,40 @@ u8 hal_largest_bw(_adapter *adapter, u8 in_bw) return in_bw; } +#ifdef CONFIG_ANTENNA_DIVERSITY +u8 rtw_hal_antdiv_before_linked(_adapter *padapter) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 cur_ant, change_ant; + + if (!pHalData->AntDivCfg) + return _FALSE; + + if (pHalData->sw_antdiv_bl_state == 0) { + pHalData->sw_antdiv_bl_state = 1; + + rtw_hal_get_odm_var(padapter, HAL_ODM_ANTDIV_SELECT, &cur_ant, NULL); + change_ant = (cur_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT; + + return rtw_antenna_select_cmd(padapter, change_ant, _FALSE); + } + + pHalData->sw_antdiv_bl_state = 0; + return _FALSE; +} + +void rtw_hal_antdiv_rssi_compared(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src) +{ + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if (pHalData->AntDivCfg) { + /*DBG_871X("update_network=> org-RSSI(%d), new-RSSI(%d)\n", dst->Rssi, src->Rssi);*/ + /*select optimum_antenna for before linked =>For antenna diversity*/ + if (dst->Rssi >= src->Rssi) {/*keep org parameter*/ + src->Rssi = dst->Rssi; + src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna; + } + } +} +#endif + diff --git a/rtl8188FU/hal/hal_com_c2h.h b/rtl8188FU/hal/hal_com_c2h.h index 78a1ace..b8138b8 100755 --- a/rtl8188FU/hal/hal_com_c2h.h +++ b/rtl8188FU/hal/hal_com_c2h.h @@ -29,10 +29,12 @@ typedef enum _C2H_EVT { C2H_BT_MP_INFO = 0x0B, C2H_RA_RPT = 0x0C, C2H_RA_PARA_RPT = 0x0E, - C2H_FW_SWCHNL = 0x10, + C2H_FW_CHNL_SWITCH_COMPLETE = 0x10, C2H_IQK_FINISH = 0x11, C2H_MAILBOX_STATUS = 0x15, C2H_P2P_RPORT = 0x16, + C2H_MAC_HIDDEN_RPT = 0x19, + C2H_BCN_EARLY_RPT = 0x1E, C2H_BT_SCOREBOARD_STATUS = 0x20, C2H_EXTEND = 0xff, } C2H_EVT; @@ -41,5 +43,9 @@ typedef enum _EXTEND_C2H_EVT { EXTEND_C2H_DBG_PRINT = 0 } EXTEND_C2H_EVT; +#define MAC_HIDDEN_RPT_LEN 8 +int c2h_mac_hidden_rpt_hdl(_adapter *adapter, u8 *data, u8 len); +int hal_read_mac_hidden_rpt(_adapter *adapter); + #endif /* __COMMON_C2H_H__ */ diff --git a/rtl8188FU/hal/hal_com_phycfg.c b/rtl8188FU/hal/hal_com_phycfg.c index aea6814..9bb5368 100755 --- a/rtl8188FU/hal/hal_com_phycfg.c +++ b/rtl8188FU/hal/hal_com_phycfg.c @@ -2350,22 +2350,12 @@ bool phy_is_tx_power_by_rate_needed(_adapter *adapter) return _FALSE; } -int phy_load_tx_power_by_rate(_adapter *adapter, const char *hal_file_name, u8 force) +int phy_load_tx_power_by_rate(_adapter *adapter, u8 chk_file) { HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); struct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter)); int ret = _FAIL; - if (!force - && !rtw_is_phy_file_readable(hal_file_name) - && hal_data->txpwr_by_rate_loaded == 1 - && hal_data->txpwr_by_rate_from_file == 0 - ) { - /* No file and already load default(compile-time) table */ - ret = _SUCCESS; - goto exit; - } - hal_data->txpwr_by_rate_loaded = 0; PHY_InitTxPowerByRate(adapter); @@ -2373,8 +2363,8 @@ int phy_load_tx_power_by_rate(_adapter *adapter, const char *hal_file_name, u8 f hal_data->txpwr_limit_loaded = 0; #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (rtw_is_phy_file_readable(hal_file_name) - && phy_ConfigBBWithPgParaFile(adapter, hal_file_name) == _SUCCESS + if (chk_file + && phy_ConfigBBWithPgParaFile(adapter, PHY_FILE_PHY_REG_PG) == _SUCCESS ) { hal_data->txpwr_by_rate_from_file = 1; goto post_hdl; @@ -2407,22 +2397,12 @@ exit: return ret; } -int phy_load_tx_power_limit(_adapter *adapter, const char *hal_file_name, u8 force) +int phy_load_tx_power_limit(_adapter *adapter, u8 chk_file) { HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); struct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter)); int ret = _FAIL; - if (!force - && !rtw_is_phy_file_readable(hal_file_name) - && hal_data->txpwr_by_rate_loaded == 1 - && hal_data->txpwr_by_rate_from_file == 0 - ) { - /* No file and already load default(compile-time) table */ - ret = _SUCCESS; - goto exit; - } - hal_data->txpwr_limit_loaded = 0; PHY_InitTxPowerLimit(adapter); @@ -2432,8 +2412,8 @@ int phy_load_tx_power_limit(_adapter *adapter, const char *hal_file_name, u8 for } #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (rtw_is_phy_file_readable(hal_file_name) - && PHY_ConfigRFWithPowerLimitTableParaFile(adapter, hal_file_name) == _SUCCESS + if (chk_file + && PHY_ConfigRFWithPowerLimitTableParaFile(adapter, PHY_FILE_TXPWR_LMT) == _SUCCESS ) { hal_data->txpwr_limit_from_file = 1; goto post_hdl; @@ -2460,152 +2440,30 @@ exit: return ret; } -const char *hal_phy_reg_pg_str(_adapter *adapter) -{ - u8 interface_type = 0; - const char *str = NULL; - - interface_type = rtw_get_intf_type(adapter); - - switch (rtw_get_chip_type(adapter)) { -#ifdef CONFIG_RTL8723B - case RTL8723B: - str = RTL8723B_PHY_REG_PG; - break; -#endif -#ifdef CONFIG_RTL8703B - case RTL8703B: - str = RTL8703B_PHY_REG_PG; - break; -#endif -#ifdef CONFIG_RTL8188E - case RTL8188E: - str = RTL8188E_PHY_REG_PG; - break; -#endif -#ifdef CONFIG_RTL8188F - case RTL8188F: - str = RTL8188F_PHY_REG_PG; - break; -#endif -#ifdef CONFIG_RTL8812A - case RTL8812: - str = RTL8812_PHY_REG_PG; - break; -#endif -#ifdef CONFIG_RTL8821A - case RTL8821: - str = RTL8821_PHY_REG_PG; - break; -#endif -#ifdef CONFIG_RTL8192E - case RTL8192E: - str = RTL8192E_PHY_REG_PG; - break; -#endif -#ifdef CONFIG_RTL8814A - case RTL8814A: - str = RTL8814A_PHY_REG_PG; - break; -#endif - } - - if (str == NULL) { - DBG_871X_LEVEL(_drv_err_, "%s: unknown chip_type:%u\n" - , __func__, rtw_get_chip_type(adapter)); - } - - return str; -} - -const char *hal_txpwr_lmt_str(_adapter *adapter) -{ - u8 interface_type = 0; - const char *str = NULL; - - interface_type = rtw_get_intf_type(adapter); - - switch (rtw_get_chip_type(adapter)) { -#ifdef CONFIG_RTL8723B - case RTL8723B: - str = RTL8723B_TXPWR_LMT; - break; -#endif -#ifdef CONFIG_RTL8703B - case RTL8703B: - str = RTL8703B_TXPWR_LMT; - break; -#endif -#ifdef CONFIG_RTL8188E - case RTL8188E: - str = RTL8188E_TXPWR_LMT; - break; -#endif -#ifdef CONFIG_RTL8188F - case RTL8188F: - str = RTL8188F_TXPWR_LMT; - break; -#endif -#ifdef CONFIG_RTL8812A - case RTL8812: - str = RTL8812_TXPWR_LMT; - break; -#endif -#ifdef CONFIG_RTL8821A - case RTL8821: - str = RTL8821_TXPWR_LMT; - break; -#endif -#ifdef CONFIG_RTL8192E - case RTL8192E: - str = RTL8192E_TXPWR_LMT; - break; -#endif -#ifdef CONFIG_RTL8814A - case RTL8814A: - str = RTL8814A_TXPWR_LMT; - break; -#endif - } - - if (str == NULL) { - DBG_871X_LEVEL(_drv_err_, "%s: unknown chip_type:%u\n" - , __func__, rtw_get_chip_type(adapter)); - } - - return str; -} - -void phy_load_tx_power_ext_info(_adapter *adapter, u8 chk_file, u8 force) +void phy_load_tx_power_ext_info(_adapter *adapter, u8 chk_file) { struct registry_priv *regsty = adapter_to_regsty(adapter); - const char *str = NULL; /* check registy target tx power */ regsty->target_tx_pwr_valid = rtw_regsty_chk_target_tx_power_valid(adapter); /* power by rate and limit */ if (phy_is_tx_power_by_rate_needed(adapter) - || (phy_is_tx_power_limit_needed(adapter) && regsty->target_tx_pwr_valid != _TRUE) - ) { - str = chk_file ? hal_phy_reg_pg_str(adapter) : NULL; - phy_load_tx_power_by_rate(adapter, str, force); - } + || (phy_is_tx_power_limit_needed(adapter) && regsty->target_tx_pwr_valid != _TRUE)) + phy_load_tx_power_by_rate(adapter, chk_file); - if (phy_is_tx_power_limit_needed(adapter)) { - str = chk_file ? hal_txpwr_lmt_str(adapter) : NULL; - phy_load_tx_power_limit(adapter, str, force); - } + if (phy_is_tx_power_limit_needed(adapter)) + phy_load_tx_power_limit(adapter, chk_file); } inline void phy_reload_tx_power_ext_info(_adapter *adapter) { - phy_load_tx_power_ext_info(adapter, 1, 1); + phy_load_tx_power_ext_info(adapter, 1); } inline void phy_reload_default_tx_power_ext_info(_adapter *adapter) { - phy_load_tx_power_ext_info(adapter, 0, 1); + phy_load_tx_power_ext_info(adapter, 0); } void dump_tx_power_ext_info(void *sel, _adapter *adapter) @@ -2916,12 +2774,24 @@ void dump_tx_power_limit(void *sel, _adapter *adapter) } } -int rtw_is_phy_file_readable(const char *hal_file_name) +/* + * phy file path is stored in global char array rtw_phy_para_file_path + * need to care about racing + */ +int rtw_get_phy_file_path(_adapter *adapter, const char *file_name) { #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (hal_file_name) { - rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, hal_file_name); - return rtw_is_file_readable(file_path); + struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter); + int len = 0; + + if (file_name) { + len += snprintf(rtw_phy_para_file_path, PATH_LENGTH_MAX, "%s", rtw_phy_file_path); + #if defined(CONFIG_MULTIDRV) || defined(REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER) + len += snprintf(rtw_phy_para_file_path + len, PATH_LENGTH_MAX - len, "%s/", hal_spec->ic_name); + #endif + len += snprintf(rtw_phy_para_file_path + len, PATH_LENGTH_MAX - len, "%s", file_name); + + return _TRUE; } #endif return _FALSE; @@ -2946,11 +2816,10 @@ phy_ConfigMACWithParaFile( if ((pHalData->mac_reg_len == 0) && (pHalData->mac_reg == NULL)) { - rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName); - - if (rtw_is_file_readable(file_path) == _TRUE) + rtw_get_phy_file_path(Adapter, pFileName); + if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) { - rlen = rtw_retrieve_from_file(file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); + rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); if (rlen > 0) { rtStatus = _SUCCESS; @@ -3045,11 +2914,10 @@ phy_ConfigBBWithParaFile( if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) { - rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName); - - if (rtw_is_file_readable(file_path) == _TRUE) + rtw_get_phy_file_path(Adapter, pFileName); + if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) { - rlen = rtw_retrieve_from_file(file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); + rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); if (rlen > 0) { rtStatus = _SUCCESS; @@ -3076,7 +2944,7 @@ phy_ConfigBBWithParaFile( } else { - if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) { + if ((pBufLen != NULL) && (*pBufLen != 0) && (pBuf != NULL)) { _rtw_memcpy(pHalData->para_file_buf, pBuf, *pBufLen); rtStatus = _SUCCESS; } @@ -3497,11 +3365,10 @@ phy_ConfigBBWithPgParaFile( _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN); if (pHalData->bb_phy_reg_pg == NULL) { - rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName); - - if (rtw_is_file_readable(file_path) == _TRUE) + rtw_get_phy_file_path(Adapter, pFileName); + if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) { - rlen = rtw_retrieve_from_file(file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); + rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); if (rlen > 0) { rtStatus = _SUCCESS; @@ -3558,11 +3425,10 @@ phy_ConfigBBWithMpParaFile( if ((pHalData->bb_phy_reg_mp_len == 0) && (pHalData->bb_phy_reg_mp == NULL)) { - rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName); - - if (rtw_is_file_readable(file_path) == _TRUE) + rtw_get_phy_file_path(Adapter, pFileName); + if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) { - rlen = rtw_retrieve_from_file(file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); + rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); if (rlen > 0) { rtStatus = _SUCCESS; @@ -3694,11 +3560,10 @@ PHY_ConfigRFWithParaFile( if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) { - rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName); - - if (rtw_is_file_readable(file_path) == _TRUE) + rtw_get_phy_file_path(Adapter, pFileName); + if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) { - rlen = rtw_retrieve_from_file(file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); + rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); if (rlen > 0) { rtStatus = _SUCCESS; @@ -3725,7 +3590,7 @@ PHY_ConfigRFWithParaFile( } else { - if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) { + if ((pBufLen != NULL) && (*pBufLen != 0) && (pBuf != NULL)) { _rtw_memcpy(pHalData->para_file_buf, pBuf, *pBufLen); rtStatus = _SUCCESS; } @@ -3972,11 +3837,10 @@ PHY_ConfigRFWithTxPwrTrackParaFile( if ((pHalData->rf_tx_pwr_track_len == 0) && (pHalData->rf_tx_pwr_track == NULL)) { - rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName); - - if (rtw_is_file_readable(file_path) == _TRUE) + rtw_get_phy_file_path(Adapter, pFileName); + if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) { - rlen = rtw_retrieve_from_file(file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); + rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); if (rlen > 0) { rtStatus = _SUCCESS; @@ -4344,11 +4208,10 @@ PHY_ConfigRFWithPowerLimitTableParaFile( _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN); if (pHalData->rf_tx_pwr_lmt == NULL) { - rtw_merge_string(file_path, PATH_LENGTH_MAX, rtw_phy_file_path, pFileName); - - if (rtw_is_file_readable(file_path) == _TRUE) + rtw_get_phy_file_path(Adapter, pFileName); + if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) { - rlen = rtw_retrieve_from_file(file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); + rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN); if (rlen > 0) { rtStatus = _SUCCESS; diff --git a/rtl8188FU/hal/hal_dm.c b/rtl8188FU/hal/hal_dm.c index 4547dbe..139e2f2 100755 --- a/rtl8188FU/hal/hal_dm.c +++ b/rtl8188FU/hal/hal_dm.c @@ -88,6 +88,8 @@ void Init_ODM_ComInfo(_adapter *adapter) ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE);
+ rtw_odm_init_ic_type(adapter);
+
if (rtw_get_intf_type(adapter) == RTW_GSPI)
ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO);
else
@@ -161,6 +163,8 @@ void Init_ODM_ComInfo(_adapter *adapter) ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0);
+ ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);
+
/* Pointer reference */
ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
ODM_CmnInfoHook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
diff --git a/rtl8188FU/hal/hal_intf.c b/rtl8188FU/hal/hal_intf.c index b986988..00891f8 100755 --- a/rtl8188FU/hal/hal_intf.c +++ b/rtl8188FU/hal/hal_intf.c @@ -23,6 +23,19 @@ #include <drv_types.h> #include <hal_data.h> +const u32 _chip_type_to_odm_ic_type[] = { + 0, + ODM_RTL8188E, + ODM_RTL8192E, + ODM_RTL8812, + ODM_RTL8821, + ODM_RTL8723B, + ODM_RTL8814A, + ODM_RTL8703B, + ODM_RTL8188F, + 0, +}; + void rtw_hal_chip_configure(_adapter *padapter) { padapter->HalFunc.intf_chip_configure(padapter); @@ -50,6 +63,7 @@ void rtw_hal_read_chip_info(_adapter *padapter) void rtw_hal_read_chip_version(_adapter *padapter) { padapter->HalFunc.read_chip_version(padapter); + rtw_odm_init_ic_type(padapter); } void rtw_hal_def_value_init(_adapter *padapter) @@ -114,7 +128,7 @@ void rtw_hal_dm_init(_adapter *padapter) _rtw_spinlock_init(&pHalData->IQKSpinLock); - phy_load_tx_power_ext_info(padapter, 1, 1); + phy_load_tx_power_ext_info(padapter, 1); } } void rtw_hal_dm_deinit(_adapter *padapter) @@ -197,9 +211,9 @@ uint rtw_hal_init(_adapter *padapter) rtw_hal_init_opmode(padapter); -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM rtw_bb_rf_gain_offset(padapter); -#endif //CONFIG_RF_GAIN_OFFSET +#endif /*CONFIG_RF_POWER_TRIM*/ } else { pHalData->hw_init_completed = _FALSE; @@ -300,6 +314,11 @@ u8 rtw_hal_check_ips_status(_adapter *padapter) return val; } +s32 rtw_hal_fw_dl(_adapter *padapter, u8 wowlan) +{ + return padapter->HalFunc.fw_dl(padapter, wowlan); +} + #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) void rtw_hal_clear_interrupt(_adapter *padapter) { @@ -307,11 +326,6 @@ void rtw_hal_clear_interrupt(_adapter *padapter) padapter->HalFunc.clear_interrupt(padapter); #endif } -void rtw_hal_set_wowlan_fw(_adapter *padapter, u8 sleep) -{ - padapter->HalFunc.hal_set_wowlan_fw(padapter, sleep); -} - #endif #if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI) @@ -605,30 +619,6 @@ void rtw_hal_bcn_related_reg_setting(_adapter *padapter) padapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter); } - -#ifdef CONFIG_ANTENNA_DIVERSITY -u8 rtw_hal_antdiv_before_linked(_adapter *padapter) -{ - struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); - int i; - - if (!padapter->HalFunc.AntDivBeforeLinkHandler) - return _FALSE; - - for (i = 0; i < dvobj->iface_nums; i++) { - if (rtw_linked_check(dvobj->padapters[i])) - return _FALSE; - } - - return padapter->HalFunc.AntDivBeforeLinkHandler(padapter); -} -void rtw_hal_antdiv_rssi_compared(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src) -{ - if(padapter->HalFunc.AntDivCompareHandler) - padapter->HalFunc.AntDivCompareHandler(padapter, dst, src); -} -#endif - #ifdef CONFIG_HOSTAPD_MLME s32 rtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) { @@ -1061,11 +1051,13 @@ u8 rtw_hal_ops_check(_adapter *padapter) ret = _FAIL; } #endif - if (NULL == padapter->HalFunc.hal_set_wowlan_fw) { - rtw_hal_error_msg("hal_set_wowlan_fw"); + #endif /* CONFIG_WOWLAN */ + + if (NULL == padapter->HalFunc.fw_dl) { + rtw_hal_error_msg("fw_dl"); ret = _FAIL; } - #endif //CONFIG_WOWLAN + if ((IS_HARDWARE_TYPE_8814A(padapter) || IS_HARDWARE_TYPE_8822BU(padapter) || IS_HARDWARE_TYPE_8822BS(padapter)) && NULL == padapter->HalFunc.fw_correct_bcn) { diff --git a/rtl8188FU/hal/hal_mp.c b/rtl8188FU/hal/hal_mp.c index c4a4ba6..2808bec 100755 --- a/rtl8188FU/hal/hal_mp.c +++ b/rtl8188FU/hal/hal_mp.c @@ -144,6 +144,10 @@ void hal_mpt_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) ULONG ulRateIdx = pMptCtx->MptRateIndex;
u1Byte DataRate = 0xFF;
+ /* Suggested by BB David. 2015.04.27*/ + if(IS_HARDWARE_TYPE_8188F(Adapter)) + return; + DataRate = MptToMgntRate(ulRateIdx);
if (u1Channel == 14 && IS_CCK_RATE(DataRate))
@@ -166,8 +170,6 @@ void hal_mpt_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14) RT_TRACE(_module_mp_, DBG_LOUD, ("MPT_CCKTxPowerAdjust 8703B in Channel %u restore to default setting\n", u1Channel));
}
- } else if (IS_HARDWARE_TYPE_8188F(Adapter)) {
- /* No difference between CCK in CH14 and others, no need to change TX filter */
} else {
/* get current cck swing value and check 0xa22 & 0xa23 later to match the table.*/
@@ -246,7 +248,6 @@ void hal_mpt_SetChannel(PADAPTER pAdapter) struct mp_priv *pmp = &pAdapter->mppriv;
u8 channel = pmp->channel;
u8 bandwidth = pmp->bandwidth;
- u8 rate = pmp->rateidx;
hal_mpt_SwitchRfSetting(pAdapter);
@@ -358,6 +359,8 @@ mpt_SetTxPower( if (IS_HARDWARE_TYPE_8814A(pAdapter))
EndPath = ODM_RF_PATH_D;
+ else if (IS_HARDWARE_TYPE_8188F(pAdapter)) + EndPath = ODM_RF_PATH_A; switch (Rate) {
case MPT_CCK:
@@ -453,11 +456,11 @@ void hal_mpt_SetTxPower(PADAPTER pAdapter) PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
if (pHalData->rf_chip < RF_TYPE_MAX) {
- if (IS_HARDWARE_TYPE_8188E(pAdapter) ||
- IS_HARDWARE_TYPE_8723B(pAdapter) ||
- IS_HARDWARE_TYPE_8192E(pAdapter) ||
- IS_HARDWARE_TYPE_8703B(pAdapter) ||
- IS_HARDWARE_TYPE_8188F(pAdapter)) {
+ if (IS_HARDWARE_TYPE_8188E(pAdapter) || + IS_HARDWARE_TYPE_8723B(pAdapter) || + IS_HARDWARE_TYPE_8192E(pAdapter) || + IS_HARDWARE_TYPE_8703B(pAdapter) || + IS_HARDWARE_TYPE_8188F(pAdapter)) { u8 path = (pHalData->AntennaTxPath == ANTENNA_A) ? (ODM_RF_PATH_A) : (ODM_RF_PATH_B);
DBG_8192C("===> MPT_ProSetTxPower: Old\n");
@@ -487,8 +490,8 @@ void hal_mpt_SetDataRate(PADAPTER pAdapter) HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
u32 DataRate;
-
- DataRate = MptToMgntRate(pAdapter->mppriv.rateidx);
+
+ DataRate = MptToMgntRate(pMptCtx->MptRateIndex);
hal_mpt_SwitchRfSetting(pAdapter);
@@ -556,8 +559,7 @@ VOID mpt_SetRFPath_8814A(PADAPTER pAdapter) PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
R_ANTENNA_SELECT_OFDM *p_ofdm_tx; /* OFDM Tx register */
R_ANTENNA_SELECT_CCK *p_cck_txrx;
-
- u8 ForcedDataRate = HwRateToMRate(pAdapter->mppriv.rateidx);
+ u8 ForcedDataRate = MptToMgntRate(pMptCtx->MptRateIndex);
u8 HtStbcCap = pAdapter->registrypriv.stbc_cap;
/*/PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo);*/
/*/PRT_VERY_HIGH_THROUGHPUT pVHTInfo = GET_VHT_INFO(pMgntInfo);*/
@@ -1504,9 +1506,8 @@ void hal_mpt_SetSingleToneTx(PADAPTER pAdapter, u8 bStart) PHY_SetBBReg(pAdapter, rFPGA0_AnalogParameter4, 0xF00000, 0xF);
PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x1);
PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC, 0xF0000, 0x2);
-
- } else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) {
-#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
+ } else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_8822B(pAdapter)) { +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) u1Byte p = ODM_RF_PATH_A;
regRF = PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, bRFRegOffsetMask);
@@ -1582,9 +1583,9 @@ void hal_mpt_SetSingleToneTx(PADAPTER pAdapter, u8 bStart) PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC, 0xF0000, 0x3); /*Tx mode*/
PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x0); /*RF LO disabled*/
/*Set BB REG 88C: Prevent SingleTone Fail*/
- PHY_SetBBReg(pAdapter, rFPGA0_AnalogParameter4, 0xF00000, 0xc);
- } else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) {
-#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
+ PHY_SetBBReg(pAdapter, rFPGA0_AnalogParameter4, 0xF00000, 0xc); + } else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_8822B(pAdapter)) { +#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) u1Byte p = ODM_RF_PATH_A;
PHY_SetBBReg(pAdapter, rOFDMCCKEN_Jaguar, BIT29|BIT28, 0x3); /*/ Disable CCK and OFDM*/
@@ -1621,10 +1622,13 @@ void hal_mpt_SetSingleToneTx(PADAPTER pAdapter, u8 bStart) void hal_mpt_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)
{
+ u8 Rate;
pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart;
+
+ Rate = HwRateToMPTRate(pAdapter->mppriv.rateidx);
if (bStart) {/* Start Carrier Suppression.*/
RT_TRACE(_module_mp_, _drv_alert_, ("SetCarrierSuppressionTx: test start\n"));
- if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) {
+ if (Rate <= MPT_RATE_11M) {
/*/ 1. if CCK block on?*/
if (!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn))
write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);/*set CCK block on*/
@@ -1649,7 +1653,7 @@ void hal_mpt_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart) } else {/* Stop Carrier Suppression.*/
RT_TRACE(_module_mp_, _drv_alert_, ("SetCarrierSuppressionTx: test stop\n"));
- if (pAdapter->mppriv.rateidx <= MPT_RATE_11M) {
+ if (Rate <= MPT_RATE_11M) {
write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); /*normal mode*/
write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1); /*turn on scramble setting*/
@@ -1784,16 +1788,377 @@ void hal_mpt_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart) void hal_mpt_SetContinuousTx(PADAPTER pAdapter, u8 bStart)
{
+ u8 Rate;
RT_TRACE(_module_mp_, _drv_info_,
("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx));
+ Rate = HwRateToMPTRate(pAdapter->mppriv.rateidx);
pAdapter->mppriv.MptCtx.bStartContTx = bStart;
- if (pAdapter->mppriv.rateidx <= MPT_RATE_11M)
+ if (Rate <= MPT_RATE_11M)
hal_mpt_SetCCKContinuousTx(pAdapter, bStart);
- else if (pAdapter->mppriv.rateidx >= MPT_RATE_6M)
+ else if (Rate >= MPT_RATE_6M)
hal_mpt_SetOFDMContinuousTx(pAdapter, bStart);
}
+u32 hal_mpt_query_phytxok(PADAPTER pAdapter)
+{
+ PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
+ RT_PMAC_TX_INFO PMacTxInfo = pMptCtx->PMacTxInfo;
+ u16 count = 0;
+
+ if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))
+ count = PHY_QueryBBReg(pAdapter, 0xF50, bMaskLWord); /* [15:0]*/
+ else
+ count = PHY_QueryBBReg(pAdapter, 0xF50, bMaskHWord); /* [31:16]*/
+
+ if (count > 50000) {
+ rtw_reset_phy_trx_ok_counters(pAdapter);
+ pAdapter->mppriv.tx.sended += count;
+ count = 0;
+ }
+
+ return pAdapter->mppriv.tx.sended + count;
+
+}
+
+#if defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8821B) || defined(CONFIG_RTL8822B)
+/* for HW TX mode */
+static VOID mpt_StopCckContTx(
+ PADAPTER pAdapter
+ )
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
+ PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
+ u1Byte u1bReg;
+
+ pMptCtx->bCckContTx = FALSE;
+ pMptCtx->bOfdmContTx = FALSE;
+
+ PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); /*normal mode*/
+ PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1); /*turn on scramble setting*/
+
+ if (!IS_HARDWARE_TYPE_JAGUAR(pAdapter) && !IS_HARDWARE_TYPE_JAGUAR2(pAdapter)) {
+ PHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x0); /* 0xa15[1:0] = 2b00*/
+ PHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x0); /* 0xc08[16] = 0*/
+
+ PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, BIT14, 0);
+ PHY_SetBBReg(pAdapter, 0x0B34, BIT14, 0);
+ }
+
+ /*BB Reset*/
+ PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
+ PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
+
+ PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);
+ PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);
+
+} /* mpt_StopCckContTx */
+
+
+static VOID mpt_StopOfdmContTx(
+ PADAPTER pAdapter
+ )
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
+ PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
+ u1Byte u1bReg;
+ u4Byte data;
+
+ pMptCtx->bCckContTx = FALSE;
+ pMptCtx->bOfdmContTx = FALSE;
+
+ if (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_JAGUAR2(pAdapter))
+ PHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ALL_OFF);
+ else
+ PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);
+
+ rtw_mdelay_os(10);
+
+ if (!IS_HARDWARE_TYPE_JAGUAR(pAdapter) && !IS_HARDWARE_TYPE_JAGUAR2(pAdapter)) {
+ PHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x0); /* 0xa15[1:0] = 0*/
+ PHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x0); /* 0xc08[16] = 0*/
+ }
+
+ /*BB Reset*/
+ PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
+ PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
+
+ PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);
+ PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);
+} /* mpt_StopOfdmContTx */
+
+
+static VOID mpt_StartCckContTx(
+ PADAPTER pAdapter
+ )
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
+ PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
+ u4Byte cckrate;
+
+ /* 1. if CCK block on */
+ if (!PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bCCKEn))
+ PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bCCKEn, 1);/*set CCK block on*/
+
+ /*Turn Off All Test Mode*/
+ if (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(pAdapter))
+ PHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ALL_OFF);
+ else
+ PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);
+
+ cckrate = pAdapter->mppriv.rateidx;
+
+ PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, cckrate);
+
+ PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); /*transmit mode*/
+ PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 0x1); /*turn on scramble setting*/
+
+ if (!IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(pAdapter)) {
+ PHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x3); /* 0xa15[1:0] = 11 force cck rxiq = 0*/
+ PHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x1); /* 0xc08[16] = 1 force ofdm rxiq = ofdm txiq*/
+ PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter2, BIT14, 1);
+ PHY_SetBBReg(pAdapter, 0x0B34, BIT14, 1);
+ }
+
+ PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);
+ PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);
+
+ pMptCtx->bCckContTx = TRUE;
+ pMptCtx->bOfdmContTx = FALSE;
+
+} /* mpt_StartCckContTx */
+
+
+static VOID mpt_StartOfdmContTx(
+ PADAPTER pAdapter
+ )
+{
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
+ PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
+
+ /* 1. if OFDM block on?*/
+ if (!PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn))
+ PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 1);/*set OFDM block on*/
+
+ /* 2. set CCK test mode off, set to CCK normal mode*/
+ PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0);
+
+ /* 3. turn on scramble setting*/
+ PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 1);
+
+ if (!IS_HARDWARE_TYPE_JAGUAR(pAdapter) && !IS_HARDWARE_TYPE_JAGUAR2(pAdapter)) {
+ PHY_SetBBReg(pAdapter, 0xa14, 0x300, 0x3); /* 0xa15[1:0] = 2b'11*/
+ PHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, 0x10000, 0x1); /* 0xc08[16] = 1*/
+ }
+
+ /* 4. Turn On Continue Tx and turn off the other test modes.*/
+ if (IS_HARDWARE_TYPE_JAGUAR(pAdapter) || IS_HARDWARE_TYPE_JAGUAR2(pAdapter))
+ PHY_SetBBReg(pAdapter, 0x914, BIT18|BIT17|BIT16, OFDM_ContinuousTx);
+ else
+ PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ContinuousTx);
+
+ PHY_SetBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);
+ PHY_SetBBReg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);
+
+ pMptCtx->bCckContTx = FALSE;
+ pMptCtx->bOfdmContTx = TRUE;
+} /* mpt_StartOfdmContTx */
+
+
+void mpt_ProSetPMacTx(PADAPTER Adapter)
+{
+ PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
+ RT_PMAC_TX_INFO PMacTxInfo = pMptCtx->PMacTxInfo;
+ u32 u4bTmp;
+
+ DbgPrint("SGI %d bSPreamble %d bSTBC %d bLDPC %d NDP_sound %d\n", PMacTxInfo.bSGI, PMacTxInfo.bSPreamble, PMacTxInfo.bSTBC, PMacTxInfo.bLDPC, PMacTxInfo.NDP_sound);
+ DbgPrint("TXSC %d BandWidth %d PacketPeriod %d PacketCount %d PacketLength %d PacketPattern %d\n", PMacTxInfo.TX_SC, PMacTxInfo.BandWidth, PMacTxInfo.PacketPeriod, PMacTxInfo.PacketCount, PMacTxInfo.PacketLength, PMacTxInfo.PacketPattern);
+#if 0
+ PRINT_DATA("LSIG ", PMacTxInfo.LSIG, 3);
+ PRINT_DATA("HT_SIG", PMacTxInfo.HT_SIG, 6);
+ PRINT_DATA("VHT_SIG_A", PMacTxInfo.VHT_SIG_A, 6);
+ PRINT_DATA("VHT_SIG_B", PMacTxInfo.VHT_SIG_B, 4);
+ DbgPrint("VHT_SIG_B_CRC %x\n", PMacTxInfo.VHT_SIG_B_CRC);
+ PRINT_DATA("VHT_Delimiter", PMacTxInfo.VHT_Delimiter, 4);
+
+ PRINT_DATA("Src Address", Adapter->mac_addr, 6);
+ PRINT_DATA("Dest Address", PMacTxInfo.MacAddress, 6);
+#endif
+
+ if (PMacTxInfo.bEnPMacTx == FALSE) {
+ if (PMacTxInfo.Mode == CONTINUOUS_TX) {
+ PHY_SetBBReg(Adapter, 0xb04, 0xf, 2); /* TX Stop*/
+ if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))
+ mpt_StopCckContTx(Adapter);
+ else
+ mpt_StopOfdmContTx(Adapter);
+ } else if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE)) {
+ u4bTmp = PHY_QueryBBReg(Adapter, 0xf50, bMaskLWord);
+ PHY_SetBBReg(Adapter, 0xb1c, bMaskLWord, u4bTmp+50);
+ PHY_SetBBReg(Adapter, 0xb04, 0xf, 2); /*TX Stop*/
+ } else
+ PHY_SetBBReg(Adapter, 0xb04, 0xf, 2); /* TX Stop*/
+
+ if (PMacTxInfo.Mode == OFDM_Single_Tone_TX) {
+ /* Stop HW TX -> Stop Continuous TX -> Stop RF Setting*/
+ if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))
+ mpt_StopCckContTx(Adapter);
+ else
+ mpt_StopOfdmContTx(Adapter);
+
+ mpt_SetSingleTone_8814A(Adapter, FALSE, TRUE);
+ }
+
+ return;
+ }
+
+ if (PMacTxInfo.Mode == CONTINUOUS_TX) {
+ PMacTxInfo.PacketCount = 1;
+
+ if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))
+ mpt_StartCckContTx(Adapter);
+ else
+ mpt_StartOfdmContTx(Adapter);
+ } else if (PMacTxInfo.Mode == OFDM_Single_Tone_TX) {
+ /* Continuous TX -> HW TX -> RF Setting */
+ PMacTxInfo.PacketCount = 1;
+
+ if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE))
+ mpt_StartCckContTx(Adapter);
+ else
+ mpt_StartOfdmContTx(Adapter);
+ } else if (PMacTxInfo.Mode == PACKETS_TX) {
+ if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE) && PMacTxInfo.PacketCount == 0)
+ PMacTxInfo.PacketCount = 0xffff;
+ }
+
+ if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE)) {
+ /* 0xb1c[0:15] TX packet count 0xb1C[31:16] SFD*/
+ u4bTmp = PMacTxInfo.PacketCount|(PMacTxInfo.SFD << 16);
+ PHY_SetBBReg(Adapter, 0xb1c, bMaskDWord, u4bTmp);
+ /* 0xb40 7:0 SIGNAL 15:8 SERVICE 31:16 LENGTH*/
+ u4bTmp = PMacTxInfo.SignalField|(PMacTxInfo.ServiceField << 8)|(PMacTxInfo.LENGTH << 16);
+ PHY_SetBBReg(Adapter, 0xb40, bMaskDWord, u4bTmp);
+ u4bTmp = PMacTxInfo.CRC16[0] | (PMacTxInfo.CRC16[1] << 8);
+ PHY_SetBBReg(Adapter, 0xb44, bMaskLWord, u4bTmp);
+
+ if (PMacTxInfo.bSPreamble)
+ PHY_SetBBReg(Adapter, 0xb0c, BIT27, 0);
+ else
+ PHY_SetBBReg(Adapter, 0xb0c, BIT27, 1);
+ } else {
+ PHY_SetBBReg(Adapter, 0xb18, 0xfffff, PMacTxInfo.PacketCount);
+
+ u4bTmp = PMacTxInfo.LSIG[0]|((PMacTxInfo.LSIG[1]) << 8)|((PMacTxInfo.LSIG[2]) << 16)|((PMacTxInfo.PacketPattern) << 24);
+ PHY_SetBBReg(Adapter, 0xb08, bMaskDWord, u4bTmp); /* Set 0xb08[23:0] = LSIG, 0xb08[31:24] = Data init octet*/
+
+ if (PMacTxInfo.PacketPattern == 0x12)
+ u4bTmp = 0x3000000;
+ else
+ u4bTmp = 0;
+ }
+
+ if (IS_MPT_HT_RATE(PMacTxInfo.TX_RATE)) {
+ u4bTmp |= PMacTxInfo.HT_SIG[0]|((PMacTxInfo.HT_SIG[1]) << 8)|((PMacTxInfo.HT_SIG[2]) << 16);
+ PHY_SetBBReg(Adapter, 0xb0c, bMaskDWord, u4bTmp);
+ u4bTmp = PMacTxInfo.HT_SIG[3]|((PMacTxInfo.HT_SIG[4]) << 8)|((PMacTxInfo.HT_SIG[5]) << 16);
+ PHY_SetBBReg(Adapter, 0xb10, 0xffffff, u4bTmp);
+ } else if (IS_MPT_VHT_RATE(PMacTxInfo.TX_RATE)) {
+ u4bTmp |= PMacTxInfo.VHT_SIG_A[0]|((PMacTxInfo.VHT_SIG_A[1]) << 8)|((PMacTxInfo.VHT_SIG_A[2]) << 16);
+ PHY_SetBBReg(Adapter, 0xb0c, bMaskDWord, u4bTmp);
+ u4bTmp = PMacTxInfo.VHT_SIG_A[3]|((PMacTxInfo.VHT_SIG_A[4]) << 8)|((PMacTxInfo.VHT_SIG_A[5]) << 16);
+ PHY_SetBBReg(Adapter, 0xb10, 0xffffff, u4bTmp);
+
+ _rtw_memcpy(&u4bTmp, PMacTxInfo.VHT_SIG_B, 4);
+ PHY_SetBBReg(Adapter, 0xb14, bMaskDWord, u4bTmp);
+ }
+
+ if (IS_MPT_VHT_RATE(PMacTxInfo.TX_RATE)) {
+ u4bTmp = (PMacTxInfo.VHT_SIG_B_CRC << 24)|PMacTxInfo.PacketPeriod; /* for TX interval */
+ PHY_SetBBReg(Adapter, 0xb20, bMaskDWord, u4bTmp);
+
+ _rtw_memcpy(&u4bTmp, PMacTxInfo.VHT_Delimiter, 4);
+ PHY_SetBBReg(Adapter, 0xb24, bMaskDWord, u4bTmp);
+
+ /* 0xb28 - 0xb34 24 byte Probe Request MAC Header*/
+ /*& Duration & Frame control*/
+ PHY_SetBBReg(Adapter, 0xb28, bMaskDWord, 0x00000040);
+
+ /* Address1 [0:3]*/
+ u4bTmp = PMacTxInfo.MacAddress[0]|(PMacTxInfo.MacAddress[1] << 8)|(PMacTxInfo.MacAddress[2] << 16)|(PMacTxInfo.MacAddress[3] << 24);
+ PHY_SetBBReg(Adapter, 0xb2C, bMaskDWord, u4bTmp);
+
+ /* Address3 [3:0]*/
+ PHY_SetBBReg(Adapter, 0xb38, bMaskDWord, u4bTmp);
+
+ /* Address2[0:1] & Address1 [5:4]*/
+ u4bTmp = PMacTxInfo.MacAddress[4]|(PMacTxInfo.MacAddress[5] << 8)|(Adapter->mac_addr[0] << 16)|(Adapter->mac_addr[1] << 24);
+ PHY_SetBBReg(Adapter, 0xb30, bMaskDWord, u4bTmp);
+
+ /* Address2 [5:2]*/
+ u4bTmp = Adapter->mac_addr[2]|(Adapter->mac_addr[3] << 8)|(Adapter->mac_addr[4] << 16)|(Adapter->mac_addr[5] << 24);
+ PHY_SetBBReg(Adapter, 0xb34, bMaskDWord, u4bTmp);
+
+ /* Sequence Control & Address3 [5:4]*/
+ /*u4bTmp = PMacTxInfo.MacAddress[4]|(PMacTxInfo.MacAddress[5] << 8) ;*/
+ /*PHY_SetBBReg(Adapter, 0xb38, bMaskDWord, u4bTmp);*/
+ } else {
+ PHY_SetBBReg(Adapter, 0xb20, bMaskDWord, PMacTxInfo.PacketPeriod); /* for TX interval*/
+ /* & Duration & Frame control */
+ PHY_SetBBReg(Adapter, 0xb24, bMaskDWord, 0x00000040);
+
+ /* 0xb24 - 0xb38 24 byte Probe Request MAC Header*/
+ /* Address1 [0:3]*/
+ u4bTmp = PMacTxInfo.MacAddress[0]|(PMacTxInfo.MacAddress[1] << 8)|(PMacTxInfo.MacAddress[2] << 16)|(PMacTxInfo.MacAddress[3] << 24);
+ PHY_SetBBReg(Adapter, 0xb28, bMaskDWord, u4bTmp);
+
+ /* Address3 [3:0]*/
+ PHY_SetBBReg(Adapter, 0xb34, bMaskDWord, u4bTmp);
+
+ /* Address2[0:1] & Address1 [5:4]*/
+ u4bTmp = PMacTxInfo.MacAddress[4]|(PMacTxInfo.MacAddress[5] << 8)|(Adapter->mac_addr[0] << 16)|(Adapter->mac_addr[1] << 24);
+ PHY_SetBBReg(Adapter, 0xb2c, bMaskDWord, u4bTmp);
+
+ /* Address2 [5:2] */
+ u4bTmp = Adapter->mac_addr[2]|(Adapter->mac_addr[3] << 8)|(Adapter->mac_addr[4] << 16)|(Adapter->mac_addr[5] << 24);
+ PHY_SetBBReg(Adapter, 0xb30, bMaskDWord, u4bTmp);
+
+ /* Sequence Control & Address3 [5:4]*/
+ u4bTmp = PMacTxInfo.MacAddress[4] | (PMacTxInfo.MacAddress[5] << 8);
+ PHY_SetBBReg(Adapter, 0xb38, bMaskDWord, u4bTmp);
+ }
+
+ PHY_SetBBReg(Adapter, 0xb48, bMaskByte3, PMacTxInfo.TX_RATE_HEX);
+
+ /* 0xb4c 3:0 TXSC 5:4 BW 7:6 m_STBC 8 NDP_Sound*/
+ u4bTmp = (PMacTxInfo.TX_SC)|((PMacTxInfo.BandWidth) << 4)|((PMacTxInfo.m_STBC - 1) << 6)|((PMacTxInfo.NDP_sound) << 8);
+ PHY_SetBBReg(Adapter, 0xb4c, 0x1ff, u4bTmp);
+
+ if (IS_HARDWARE_TYPE_8814A(Adapter) || IS_HARDWARE_TYPE_8822B(Adapter)) {
+ u4Byte offset = 0xb44;
+
+ if (IS_MPT_OFDM_RATE(PMacTxInfo.TX_RATE))
+ PHY_SetBBReg(Adapter, offset, 0xc0000000, 0);
+ else if (IS_MPT_HT_RATE(PMacTxInfo.TX_RATE))
+ PHY_SetBBReg(Adapter, offset, 0xc0000000, 1);
+ else if (IS_MPT_VHT_RATE(PMacTxInfo.TX_RATE))
+ PHY_SetBBReg(Adapter, offset, 0xc0000000, 2);
+ }
+
+ PHY_SetBBReg(Adapter, 0xb00, BIT8, 1); /* Turn on PMAC*/
+/* //PHY_SetBBReg(Adapter, 0xb04, 0xf, 2); //TX Stop*/
+ if (IS_MPT_CCK_RATE(PMacTxInfo.TX_RATE)) {
+ PHY_SetBBReg(Adapter, 0xb04, 0xf, 8); /*TX CCK ON*/
+ PHY_SetBBReg(Adapter, 0xA84, BIT31, 0);
+ } else
+ PHY_SetBBReg(Adapter, 0xb04, 0xf, 4); /* TX Ofdm ON */
+
+ if (PMacTxInfo.Mode == OFDM_Single_Tone_TX)
+ mpt_SetSingleTone_8814A(Adapter, TRUE, TRUE);
+
+}
+#endif
+
#endif /* CONFIG_MP_INCLUDE*/
diff --git a/rtl8188FU/hal/led/hal_usb_led.c b/rtl8188FU/hal/led/hal_usb_led.c index d3adc8b..3477bbe 100755 --- a/rtl8188FU/hal/led/hal_usb_led.c +++ b/rtl8188FU/hal/led/hal_usb_led.c @@ -2404,8 +2404,7 @@ void BlinkTimerCallback(void *data) #ifdef CONFIG_LED_HANDLED_BY_CMD_THREAD
rtw_led_blink_cmd(padapter, (PVOID)pLed);
#else
- if(ATOMIC_READ(&pLed->bCancelWorkItem) == _FALSE)
- _set_workitem(&(pLed->BlinkWorkItem));
+ _set_workitem(&(pLed->BlinkWorkItem));
#endif
}
@@ -5159,7 +5158,6 @@ InitLed( pLed->LedPin = LedPin;
ResetLedStatus(pLed);
- ATOMIC_SET(&pLed->bCancelWorkItem, _FALSE);
_init_timer(&(pLed->BlinkTimer), padapter->pnetdev, BlinkTimerCallback, pLed);
_init_workitem(&(pLed->BlinkWorkItem), BlinkWorkItemCallback, pLed);
}
@@ -5174,7 +5172,6 @@ DeInitLed( PLED_USB pLed
)
{
- ATOMIC_SET(&pLed->bCancelWorkItem, _TRUE);
_cancel_workitem_sync(&(pLed->BlinkWorkItem));
_cancel_timer_ex(&(pLed->BlinkTimer));
ResetLedStatus(pLed);
diff --git a/rtl8188FU/hal/phydm/phydm.c b/rtl8188FU/hal/phydm/phydm.c index ecace00..d0ab8ca 100755 --- a/rtl8188FU/hal/phydm/phydm.c +++ b/rtl8188FU/hal/phydm/phydm.c @@ -482,7 +482,10 @@ ODM_DMReset( IN PDM_ODM_T pDM_Odm
)
{
- ODM_AntDivReset(pDM_Odm);
+ pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
+
+ ODM_AntDivReset(pDM_Odm);
+ phydm_setEDCCAThresholdAPI(pDM_Odm, pDM_DigTable->CurIGValue);
}
@@ -617,6 +620,9 @@ ODM_DMWatchdog( pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
Phydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
}
+ #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
+ odm_AntennaDiversity(pDM_Odm); /*enable AntDiv in PS mode, request from SD4 Jeff*/
+ #endif
ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("DMWatchdog in power saving mode\n"));
return;
}
diff --git a/rtl8188FU/hal/phydm/phydm_adaptivity.c b/rtl8188FU/hal/phydm/phydm_adaptivity.c index 07d1a94..def2a17 100755 --- a/rtl8188FU/hal/phydm/phydm_adaptivity.c +++ b/rtl8188FU/hal/phydm/phydm_adaptivity.c @@ -567,6 +567,7 @@ Phydm_AdaptivityInit( PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
s1Byte IGItarget = 0x32;
+ /*pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;*/
#if(DM_ODM_SUPPORT_TYPE == ODM_WIN)
PADAPTER pAdapter = pDM_Odm->Adapter;
PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
@@ -633,7 +634,10 @@ Phydm_AdaptivityInit( pDM_Odm->Adaptivity_IGI_upper = 0;
pDM_Odm->Adaptivity_enable = FALSE; /*use this flag to decide enable or disable*/
- pDM_Odm->EDCCA_enable = TRUE; /*even no adaptivity, we still enable EDCCA*/
+ if (pDM_Odm->bWIFITest == TRUE || pDM_Odm->mp_mode == TRUE)
+ pDM_Odm->EDCCA_enable = FALSE;
+ else
+ pDM_Odm->EDCCA_enable = TRUE; /*even no adaptivity, we still enable EDCCA*/
pDM_Odm->TH_L2H_ini_mode2 = 20;
pDM_Odm->TH_EDCCA_HL_diff_mode2 = 8;
@@ -676,6 +680,8 @@ Phydm_AdaptivityInit( ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("TH_L2H_ini = 0x%x, TH_EDCCA_HL_diff = 0x%x, Adaptivity->AdajustIGILevel = 0x%x\n", pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, Adaptivity->AdajustIGILevel));
+ /*phydm_setEDCCAThresholdAPI(pDM_Odm, pDM_DigTable->CurIGValue);*/
+
}
@@ -894,3 +900,47 @@ Phydm_AdaptivityBSOD( }
#endif
+
+VOID
+phydm_setEDCCAThresholdAPI(
+ IN PVOID pDM_VOID,
+ IN u1Byte IGI
+)
+{
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
+ PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
+ s1Byte TH_L2H_dmc, TH_H2L_dmc;
+ s1Byte Diff = 0, IGI_target = 0x32;
+
+ if (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) {
+
+ if (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)) {
+ if (Adaptivity->AdajustIGILevel > IGI)
+ Diff = Adaptivity->AdajustIGILevel - IGI;
+
+ TH_L2H_dmc = pDM_Odm->TH_L2H_ini - Diff + IGI_target;
+ TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
+ }
+#if (RTL8195A_SUPPORT == 0)
+ else {
+ 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 < Adaptivity->H2L_lb)
+ TH_H2L_dmc = Adaptivity->H2L_lb;
+ if (TH_L2H_dmc < Adaptivity->L2H_lb)
+ TH_L2H_dmc = Adaptivity->L2H_lb;
+ }
+#endif
+ ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("API :IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n", IGI, TH_L2H_dmc, TH_H2L_dmc));
+ ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("API :Adaptivity_IGI_upper=0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\n", pDM_Odm->Adaptivity_IGI_upper, Adaptivity->H2L_lb, Adaptivity->L2H_lb));
+
+ Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);
+ }
+
+}
diff --git a/rtl8188FU/hal/phydm/phydm_adaptivity.h b/rtl8188FU/hal/phydm/phydm_adaptivity.h index ea1ab38..6af2829 100755 --- a/rtl8188FU/hal/phydm/phydm_adaptivity.h +++ b/rtl8188FU/hal/phydm/phydm_adaptivity.h @@ -144,6 +144,12 @@ Phydm_Adaptivity( IN u1Byte IGI
);
+VOID
+phydm_setEDCCAThresholdAPI(
+ IN PVOID pDM_VOID,
+ IN u1Byte IGI
+);
+
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
VOID
Phydm_DisableEDCCA(
diff --git a/rtl8188FU/hal/phydm/phydm_antdiv.c b/rtl8188FU/hal/phydm/phydm_antdiv.c index 73f215a..f16325a 100755 --- a/rtl8188FU/hal/phydm/phydm_antdiv.c +++ b/rtl8188FU/hal/phydm/phydm_antdiv.c @@ -310,7 +310,7 @@ odm_UpdateTxAnt( pDM_FatTable->antsel_b[MacId] = (TxAnt&BIT1)>>1;
pDM_FatTable->antsel_c[MacId] = (TxAnt&BIT2)>>2;
- //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tx from TxInfo]: MacID:(( %d )), TxAnt = (( %s ))\n", MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tx from TxInfo]: MacID:(( %d )), TxAnt = (( %s ))\n", MacId, (Ant == MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=(( 3'b%d%d%d ))\n",pDM_FatTable->antsel_c[MacId] , pDM_FatTable->antsel_b[MacId] , pDM_FatTable->antsel_a[MacId] ));
}
@@ -2014,7 +2014,6 @@ odm_HW_AntDiv( {
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n"));
odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);
- odm_Tx_By_TxDesc_or_Reg(pDM_Odm , TX_BY_DESC);
//if(pDM_Odm->SupportICType == ODM_RTL8821 )
//ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable
@@ -2048,6 +2047,12 @@ odm_HW_AntDiv( }
}
+ if (pDM_Odm->bOneEntryOnly == TRUE)
+ odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_REG);
+ else
+ odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_DESC);
+
+
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n AntDiv Start =>\n"));
#ifdef ODM_EVM_ENHANCE_ANTDIV
@@ -2316,6 +2321,7 @@ odm_S0S1_SwAntDiv( ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));
if(pDM_FatTable->bBecomeLinked == TRUE)
{
+ odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_REG);
if (pDM_Odm->SupportICType == ODM_RTL8723B) {
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set REG 948[9:6]=0x0\n"));
@@ -2347,6 +2353,11 @@ odm_S0S1_SwAntDiv( pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;
}
}
+
+ if (pDM_Odm->bOneEntryOnly == TRUE)
+ odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_REG);
+ else
+ odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_DESC);
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[%d] { try_flag=(( %d )), Step=(( %d )), Double_chk_flag = (( %d )) }\n",
__LINE__,pDM_SWAT_Table->try_flag,Step,pDM_SWAT_Table->Double_chk_flag));
@@ -3017,11 +3028,15 @@ odm_FastAntTraining( if(pDM_FatTable->bBecomeLinked ==FALSE)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked!!!]\n"));
- odm_Tx_By_TxDesc_or_Reg(pDM_Odm , TX_BY_DESC);
pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;
}
}
+ if (pDM_Odm->bOneEntryOnly == TRUE)
+ odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_REG);
+ else
+ odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_DESC);
+
if(pDM_Odm->SupportICType == ODM_RTL8188E)
{
@@ -3514,11 +3529,15 @@ odm_FastAntTraining_hl_smart_antenna_type1( /*pdm_sat_table->fast_training_beam_num = 0;*/
/*phydm_set_all_ant_same_beam_num(pDM_Odm);*/
- odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_DESC);
pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;
}
}
+
+ if (pDM_Odm->bOneEntryOnly == TRUE)
+ odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_REG);
+ else
+ odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_DESC);
/*ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("HL Smart Ant Training: State (( %d ))\n", pDM_FatTable->FAT_State));*/
@@ -4092,7 +4111,7 @@ ODM_AntDiv( if(pDM_Odm->AntType != pDM_Odm->pre_AntType)
{
odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);
- odm_Tx_By_TxDesc_or_Reg(pDM_Odm , TX_BY_DESC);
+ /*odm_Tx_By_TxDesc_or_Reg(pDM_Odm, TX_BY_DESC);*/
}
pDM_Odm->pre_AntType=pDM_Odm->AntType;
}
@@ -4526,18 +4545,7 @@ ODM_AntDiv_Config( pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
}
#elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))
-
- ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("CE Config Antenna Diversity\n"));
- if(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT)
- {
- pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
- }
-
- if(pDM_Odm->SupportICType==ODM_RTL8723B)
- {
- pDM_Odm->AntDivType = S0S1_SW_ANTDIV;
- }
-
+ /* do noting, branch only */
#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("AP Config Antenna Diversity\n"));
diff --git a/rtl8188FU/hal/phydm/phydm_antdiv.h b/rtl8188FU/hal/phydm/phydm_antdiv.h index 31b5775..8d72d28 100755 --- a/rtl8188FU/hal/phydm/phydm_antdiv.h +++ b/rtl8188FU/hal/phydm/phydm_antdiv.h @@ -116,7 +116,7 @@ #define SWAW_STEP_DETERMINE 1
#define RSSI_CHECK_RESET_PERIOD 10
-#define RSSI_CHECK_THRESHOLD 35
+#define RSSI_CHECK_THRESHOLD 50
/*Hong Lin Smart antenna*/
#define HL_SMTANT_2WIRE_DATA_LEN 24
diff --git a/rtl8188FU/hal/phydm/phydm_debug.c b/rtl8188FU/hal/phydm/phydm_debug.c index 871ee42..acbb01c 100755 --- a/rtl8188FU/hal/phydm/phydm_debug.c +++ b/rtl8188FU/hal/phydm/phydm_debug.c @@ -1958,8 +1958,11 @@ phydm_fw_trace_handler_8051( int i = 0;
u1Byte Extend_c2hSubID = 0, Extend_c2hDbgLen = 0, Extend_c2hDbgSeq = 0;
- u1Byte fw_debug_trace[100];
+ u1Byte fw_debug_trace[128];
pu1Byte Extend_c2hDbgContent = 0;
+
+ if (CmdLen > 127)
+ return;
Extend_c2hSubID = Buffer[0];
Extend_c2hDbgLen = Buffer[1];
diff --git a/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_bb.c b/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_bb.c index 8cde4c6..e3dd26e 100755 --- a/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_bb.c +++ b/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_bb.c @@ -246,7 +246,7 @@ ODM_ReadAndConfig_MP_8188F_AGC_TAB( u4Byte
ODM_GetVersion_MP_8188F_AGC_TAB(void)
{
- return 24;
+ return 28;
}
/******************************************************************************
@@ -309,7 +309,11 @@ u4Byte Array_MP_8188F_PHY_REG[] = { 0x96C, 0x00000003,
0xA00, 0x00D047C8,
0xA04, 0x80FF800C,
+ 0x80000400, 0x00000000, 0x40000000, 0x00000000,
0xA08, 0x8C038300,
+ 0xA0000000, 0x00000000,
+ 0xA08, 0x8C898300,
+ 0xB0000000, 0x00000000,
0xA0C, 0x2E7F120F,
0xA10, 0x9500BB78,
0xA14, 0x1114D028,
@@ -366,7 +370,11 @@ u4Byte Array_MP_8188F_PHY_REG[] = { 0xC78, 0x0000001F,
0xC7C, 0x00B91612,
0xC80, 0x390000E4,
+ 0x80000400, 0x00000000, 0x40000000, 0x00000000,
+ 0xC84, 0x21F60000,
+ 0xA0000000, 0x00000000,
0xC84, 0x11F60000,
+ 0xB0000000, 0x00000000,
0xC88, 0x40000100,
0xC8C, 0x20200000,
0xC90, 0x00091521,
@@ -521,7 +529,7 @@ ODM_ReadAndConfig_MP_8188F_PHY_REG( u4Byte
ODM_GetVersion_MP_8188F_PHY_REG(void)
{
- return 24;
+ return 28;
}
/******************************************************************************
diff --git a/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_fw.c b/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_fw.c index b729cd5..ab5fe73 100755 --- a/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_fw.c +++ b/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_fw.c @@ -27,31 +27,31 @@ u1Byte Array_MP_8188F_FW_AP[] = {
-0xF1, 0x88, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00, 0x09, 0x22, 0x15, 0x56, 0xD2, 0x43, 0x02, 0x00,
-0xAF, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x02, 0x87, 0x32, 0x02, 0xB8, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xAC, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xB8, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0xF1, 0x88, 0x20, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x11, 0x25, 0x17, 0x05, 0x90, 0x44, 0x02, 0x00,
+0x2F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x02, 0x87, 0x32, 0x02, 0xB8, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xA7, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xB8, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xB8, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xA9, 0xC0, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xB8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xB8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xA3, 0x08, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xB8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x87, 0xDA, 0x02, 0x96, 0x33, 0x02, 0x80, 0x86, 0x02, 0x80, 0x89, 0x02, 0x80, 0x8C, 0x02,
-0x8D, 0x34, 0x02, 0xAD, 0xED, 0x02, 0x80, 0x95, 0x02, 0x80, 0x98, 0x02, 0x80, 0x9B, 0x02, 0x80,
+0x02, 0x87, 0xDA, 0x02, 0x94, 0x6F, 0x02, 0x80, 0x86, 0x02, 0x80, 0x89, 0x02, 0x80, 0x8C, 0x02,
+0x8D, 0x32, 0x02, 0xA5, 0x2A, 0x02, 0x80, 0x95, 0x02, 0x80, 0x98, 0x02, 0x80, 0x9B, 0x02, 0x80,
0x9E, 0x02, 0x80, 0xA1, 0x02, 0x80, 0xA4, 0x02, 0x80, 0xA7, 0x02, 0x80, 0xAA, 0x02, 0x80, 0xAD,
-0x02, 0x80, 0xB0, 0x02, 0x89, 0x03, 0x02, 0x80, 0xB6, 0x02, 0x80, 0xB9, 0x02, 0xB2, 0x46, 0x02,
-0xA0, 0x9E, 0x02, 0xA0, 0x27, 0x02, 0xA7, 0x15, 0x02, 0xAE, 0x20, 0x02, 0xB1, 0xDD, 0x02, 0x80,
+0x02, 0x80, 0xB0, 0x02, 0x89, 0x14, 0x02, 0x80, 0xB6, 0x02, 0x80, 0xB9, 0x02, 0xB7, 0xD8, 0x02,
+0xA0, 0x9C, 0x02, 0xA0, 0x25, 0x02, 0x9F, 0x96, 0x02, 0xA5, 0xC2, 0x02, 0xB7, 0x6F, 0x02, 0x80,
0xCE, 0x02, 0x80, 0xD1, 0x02, 0x80, 0xD4, 0x02, 0x80, 0xD7, 0x00, 0x00, 0x00, 0x02, 0x80, 0xDD,
-0x02, 0x80, 0xE0, 0x02, 0x80, 0xE3, 0x02, 0x80, 0xE6, 0x02, 0xC2, 0xD9, 0x02, 0x80, 0xEC, 0x02,
+0x02, 0x80, 0xE0, 0x02, 0x80, 0xE3, 0x02, 0x80, 0xE6, 0x02, 0xC3, 0xA4, 0x02, 0x80, 0xEC, 0x02,
0x80, 0xEF, 0x02, 0x80, 0xF2, 0x02, 0x80, 0xF5, 0x02, 0x80, 0xF8, 0x02, 0x80, 0xFB, 0x02, 0x80,
0xFE, 0x02, 0x81, 0x01, 0x02, 0x81, 0x04, 0x02, 0x81, 0x07, 0x02, 0x81, 0x0A, 0x02, 0x81, 0x0D,
0x02, 0x81, 0x10, 0x02, 0x81, 0x13, 0x02, 0x81, 0x16, 0x02, 0x81, 0x19, 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, 0x93, 0x38, 0x02, 0xB9, 0x12, 0x02, 0x90, 0xFA, 0x02, 0x90, 0xEF,
-0x02, 0x81, 0x40, 0x02, 0x8E, 0x92, 0x02, 0xBE, 0xD6, 0x02, 0x81, 0x49, 0x02, 0x81, 0x4C, 0x02,
+0x00, 0x00, 0x00, 0x00, 0x02, 0x92, 0x5D, 0x02, 0xB9, 0x50, 0x02, 0x90, 0xF1, 0x02, 0x90, 0xE6,
+0x02, 0x81, 0x40, 0x02, 0x8E, 0x93, 0x02, 0xBF, 0x9E, 0x02, 0x81, 0x49, 0x02, 0x81, 0x4C, 0x02,
0x81, 0x4F, 0x02, 0x81, 0x52, 0x02, 0x81, 0x55, 0x02, 0x81, 0x58, 0x02, 0x81, 0x5B, 0x02, 0x91,
-0x5D, 0x02, 0x81, 0x61, 0x02, 0x81, 0x64, 0x02, 0xBF, 0x9F, 0x02, 0xC2, 0x13, 0x02, 0xC2, 0x46,
+0x4A, 0x02, 0x81, 0x61, 0x02, 0x81, 0x64, 0x02, 0xC0, 0x75, 0x02, 0xC3, 0x01, 0x02, 0xC2, 0xDA,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -75,10 +75,10 @@ u1Byte Array_MP_8188F_FW_AP[] = { 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, 0x08, 0x08, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x0B, 0x0D,
-0x0E, 0x0F, 0x11, 0x12, 0x14, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x23, 0x00,
-0x2D, 0x00, 0x50, 0x00, 0x91, 0x00, 0xC3, 0x01, 0x27, 0x01, 0x31, 0x01, 0x5E, 0x00, 0xC8, 0x00,
-0xF0, 0x00, 0xDC, 0x01, 0x5E, 0x01, 0x68, 0x01, 0x9A, 0x01, 0xCC, 0x01, 0xEA, 0x02, 0x02, 0x04,
+0x30, 0x02, 0x02, 0x03, 0x04, 0x04, 0x08, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x02, 0x09, 0x0B,
+0x0E, 0x0D, 0x0F, 0x10, 0x12, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x23, 0x00,
+0x2D, 0x00, 0x50, 0x00, 0x91, 0x00, 0xC3, 0x01, 0x27, 0x01, 0x31, 0x01, 0x5E, 0x00, 0x8C, 0x00,
+0xC8, 0x00, 0xDC, 0x01, 0x5E, 0x01, 0x68, 0x01, 0x9A, 0x01, 0xCC, 0x01, 0xEA, 0x02, 0x02, 0x04,
0x08, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x14, 0x28, 0x32, 0x50, 0x78, 0xA0, 0xC8,
0xE6, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x02, 0x04, 0x06,
0x07, 0x07, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
@@ -152,971 +152,983 @@ u1Byte Array_MP_8188F_FW_AP[] = { 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, 0x41, 0x93, 0x9F, 0x00, 0x41, 0x93, 0xA0, 0x00, 0x41, 0x93, 0xA5,
-0x00, 0x44, 0x93, 0x8B, 0x41, 0x4E, 0x59, 0x00, 0x44, 0x93, 0x87, 0x61, 0x6E, 0x79, 0x00, 0x41,
-0x93, 0xA7, 0x00, 0x00, 0xB2, 0xB4, 0xB6, 0xC2, 0xA7, 0x66, 0x90, 0x93, 0xA3, 0xEF, 0xF0, 0x7F,
-0x02, 0xD1, 0x27, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x90, 0x93, 0xA3, 0xE0, 0xFE, 0xEF, 0x4E, 0x90,
+0xE9, 0xDE, 0xE7, 0x80, 0xBE, 0x41, 0x93, 0xB7, 0x00, 0x41, 0x93, 0xB8, 0x00, 0x41, 0x93, 0xBD,
+0x00, 0x44, 0x93, 0xA3, 0x41, 0x4E, 0x59, 0x00, 0x44, 0x93, 0x9F, 0x61, 0x6E, 0x79, 0x00, 0x41,
+0x93, 0xBF, 0x00, 0x00, 0xB2, 0x73, 0xB5, 0xF2, 0xB8, 0x3A, 0x90, 0x93, 0xBB, 0xEF, 0xF0, 0x7F,
+0x02, 0xD1, 0x27, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x90, 0x93, 0xBB, 0xE0, 0xFE, 0xEF, 0x4E, 0x90,
0x84, 0xC1, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x5B, 0x12, 0x02, 0xF6, 0x25, 0x5B, 0x90,
-0x84, 0xC6, 0xF0, 0xD1, 0xF7, 0x25, 0x5B, 0x90, 0x84, 0xC7, 0x71, 0xD8, 0x25, 0x5B, 0x90, 0x84,
+0x84, 0xC6, 0xF0, 0xD1, 0xF8, 0x25, 0x5B, 0x90, 0x84, 0xC7, 0x71, 0xE5, 0x25, 0x5B, 0x90, 0x84,
0xC8, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x03, 0x0F, 0x25, 0x5B, 0x90, 0x84, 0xC9, 0xF0, 0x90, 0x00,
0x04, 0x12, 0x03, 0x0F, 0x25, 0x5B, 0x90, 0x84, 0xCA, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x03, 0x0F,
0x25, 0x5B, 0x90, 0x84, 0xCB, 0xF0, 0x11, 0x3F, 0x25, 0x5B, 0x90, 0x84, 0xCC, 0xF0, 0x22, 0x90,
-0x00, 0x06, 0x02, 0x03, 0x0F, 0xF1, 0xC3, 0x12, 0x02, 0xF6, 0xFF, 0x54, 0x7F, 0x90, 0x85, 0xC5,
-0xF0, 0xEF, 0x71, 0xE3, 0xA3, 0xF0, 0xD1, 0xF7, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90,
-0x85, 0xC3, 0xE0, 0x54, 0xF0, 0x4E, 0x12, 0xA8, 0x6C, 0x25, 0xE0, 0xFE, 0x90, 0x85, 0xC1, 0xE0,
-0x54, 0xFD, 0x4E, 0xF0, 0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0xF1, 0xCA, 0x71, 0xD7, 0x90,
-0x85, 0xC4, 0xF0, 0x11, 0x3F, 0x30, 0xE0, 0x52, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04,
-0x90, 0x85, 0xD8, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x2A, 0x74, 0x03, 0xF0, 0x11, 0xFD, 0xE9, 0x24,
-0x06, 0xF9, 0xE4, 0x3A, 0xFA, 0x12, 0x02, 0xF6, 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, 0x03, 0x3C, 0x11, 0xFD, 0x11, 0x3F, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x85,
-0xCD, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x11, 0xFD, 0x90, 0x00, 0x04, 0x12,
-0x03, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x57, 0x82, 0x11, 0xFD, 0x12, 0x71, 0xCB, 0x12, 0xAA, 0x4D,
-0xF0, 0x90, 0x85, 0xC5, 0xF1, 0xFB, 0xF1, 0xC9, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x92, 0x07,
-0x02, 0x86, 0xFA, 0xF1, 0xC3, 0x11, 0xFD, 0x12, 0x02, 0xF6, 0x54, 0x7F, 0xFD, 0xD1, 0xF7, 0xFE,
-0x54, 0x1F, 0x90, 0x92, 0x0B, 0x71, 0xDF, 0x90, 0x92, 0x0A, 0x71, 0xD8, 0xFE, 0x54, 0x03, 0xFC,
-0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0x92, 0x0D, 0x71, 0xD8, 0xFE, 0x54, 0x40, 0xC4, 0x13,
-0x13, 0x54, 0x03, 0x90, 0x92, 0x0C, 0x71, 0xDF, 0xFF, 0x71, 0xD9, 0xFB, 0x54, 0x08, 0x13, 0x13,
-0x13, 0x54, 0x1F, 0x90, 0x92, 0x0F, 0xF0, 0xFA, 0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xA3,
-0xF0, 0xEF, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x51, 0x6B, 0x54, 0x7F, 0x4F, 0xF0,
-0x90, 0x92, 0x0C, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x51, 0x6B, 0x54, 0xBF, 0x4F,
-0xF0, 0xEA, 0x60, 0x02, 0x41, 0x6A, 0x90, 0x92, 0x0B, 0xE0, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x12,
-0xED, 0x71, 0xEF, 0x54, 0xE0, 0x4F, 0xF0, 0xEC, 0x54, 0x03, 0x51, 0x6B, 0x54, 0xFC, 0x4F, 0xF0,
-0xEC, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0x51, 0x6B, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0x92, 0x0A,
-0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0x71, 0xEF, 0x54, 0xDF,
-0x4F, 0xF0, 0x90, 0x92, 0x0D, 0xE0, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0x51, 0x6B, 0x54, 0xCF, 0x4F,
-0xF1, 0xD1, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF1, 0xD1, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0xE0,
-0xFF, 0x90, 0x92, 0x10, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83,
-0xF0, 0x90, 0x93, 0x19, 0xE0, 0x60, 0x3A, 0x11, 0xFD, 0xE9, 0x24, 0x03, 0xF9, 0xE4, 0x3A, 0xFA,
-0x12, 0x02, 0xF6, 0x54, 0x1F, 0x12, 0x03, 0x3C, 0x90, 0x92, 0x0E, 0x74, 0x01, 0xF0, 0x90, 0x92,
-0x0E, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x19, 0xEF, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x11,
-0xFD, 0x8F, 0x82, 0x8E, 0x83, 0xE4, 0x12, 0x03, 0x4E, 0x90, 0x92, 0x0E, 0xE0, 0x04, 0xF0, 0x80,
-0xDD, 0x90, 0x93, 0x17, 0xE0, 0x54, 0x07, 0xFF, 0xBF, 0x05, 0x0A, 0xEC, 0xB4, 0x01, 0x06, 0x90,
-0x93, 0x1C, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x92, 0x0E, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0xFC, 0x24,
-0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x11, 0xFD, 0x8F, 0x82, 0x8E, 0x83, 0x12, 0x03, 0x0F, 0xFF, 0xED,
-0x12, 0xBC, 0x06, 0xE5, 0x82, 0x2C, 0x12, 0xAE, 0x18, 0xEF, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0x04,
-0xF0, 0xE0, 0xB4, 0x04, 0xD5, 0xAF, 0x05, 0x12, 0x17, 0x8E, 0x22, 0xFF, 0x75, 0xF0, 0x12, 0xED,
-0x90, 0x89, 0x3F, 0x12, 0x05, 0x28, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1,
-0xBC, 0x20, 0xE6, 0x02, 0x61, 0x9E, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0x93, 0x96, 0xF0, 0x7F, 0x8D,
-0x12, 0x7B, 0x51, 0x90, 0x93, 0x97, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0x93, 0x98, 0xF0,
-0x90, 0x93, 0x97, 0xE0, 0x24, 0xFC, 0x60, 0x10, 0x24, 0x03, 0x60, 0x02, 0x61, 0x92, 0x90, 0x93,
-0x96, 0xE0, 0xFF, 0x12, 0xBC, 0x14, 0x61, 0x92, 0x90, 0x93, 0x96, 0xE0, 0x24, 0xDC, 0xF5, 0x82,
-0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x71, 0xD0, 0x75, 0xF0, 0x12, 0x51,
-0x70, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x71, 0xD0, 0x75, 0xF0, 0x12, 0x51, 0x70,
-0x71, 0xE3, 0xFB, 0x0D, 0xE4, 0xFF, 0x71, 0xD0, 0x75, 0xF0, 0x12, 0x51, 0x70, 0xC4, 0x54, 0x03,
-0xFB, 0x0D, 0xE4, 0xFF, 0x71, 0xD0, 0xF1, 0xDB, 0xFB, 0xE4, 0xFD, 0x0F, 0x71, 0xD0, 0x75, 0xF0,
-0x12, 0x90, 0x89, 0x3D, 0x12, 0x05, 0x28, 0x71, 0xCD, 0x75, 0xF0, 0x12, 0x71, 0xEF, 0xC4, 0x13,
-0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x71, 0xD0, 0x75, 0xF0, 0x12, 0x71, 0xEF, 0x54, 0x1F, 0x71,
-0xCE, 0x12, 0xBC, 0x06, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x71, 0xD0, 0x75, 0xF0, 0x08, 0xA4, 0x24,
-0x01, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x71, 0xCB, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82,
-0xE4, 0x34, 0x82, 0x71, 0xCB, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x82,
-0x71, 0xCB, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0,
-0xFB, 0xE4, 0xFD, 0x0F, 0x71, 0xD0, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34,
-0x82, 0x71, 0xCB, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x71, 0xCB,
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0x0D,
-0x71, 0xA3, 0xF1, 0xBC, 0x30, 0xE0, 0x07, 0xE4, 0xFD, 0x7F, 0x8D, 0x12, 0x7B, 0x3E, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 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, 0xF5, 0x83, 0xE0, 0xFB, 0x0D,
-0x71, 0xA3, 0x90, 0x93, 0x96, 0xE0, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x03, 0x0F, 0xF0,
-0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0x75, 0xF0, 0x12, 0xE5, 0x6E, 0x90,
-0x89, 0x3E, 0x12, 0x05, 0x28, 0xE0, 0x22, 0x8F, 0x6E, 0x8D, 0x6F, 0xEF, 0xF1, 0x8A, 0xE0, 0xF5,
-0x70, 0x54, 0x7F, 0xF5, 0x71, 0xE5, 0x70, 0x54, 0x80, 0xF5, 0x73, 0x75, 0xF0, 0x12, 0xEF, 0xF1,
-0xDE, 0xF5, 0x75, 0x75, 0xF0, 0x12, 0xEF, 0x51, 0x70, 0xC4, 0x54, 0x03, 0xF5, 0x76, 0xD1, 0xFD,
-0x74, 0xFF, 0xF0, 0x12, 0x9F, 0xB1, 0xE5, 0x70, 0x45, 0x73, 0xFF, 0xF1, 0xE6, 0xEF, 0xF0, 0xE5,
-0x6E, 0xF1, 0xAF, 0xE0, 0x54, 0x03, 0xF5, 0x74, 0x74, 0x4C, 0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34,
-0x90, 0xF5, 0x83, 0xE5, 0x74, 0xF0, 0xE5, 0x71, 0x65, 0x75, 0x70, 0x42, 0x71, 0xEA, 0xC4, 0x13,
-0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x73, 0x70, 0x08, 0xE5, 0x71, 0x44, 0x80, 0xF5, 0x70, 0x81,
-0xFB, 0x12, 0x9F, 0xB1, 0xE5, 0x6E, 0x12, 0xBA, 0xAA, 0xE0, 0xFF, 0xA3, 0xE0, 0x12, 0xC3, 0x27,
-0xE4, 0xF0, 0xA3, 0xE5, 0x6E, 0xF0, 0xE4, 0x90, 0x92, 0x49, 0x12, 0x99, 0x09, 0x7B, 0x01, 0xFA,
-0x7D, 0x02, 0x7F, 0x04, 0x12, 0x9E, 0xF1, 0x7D, 0x07, 0xAF, 0x6E, 0x02, 0xB9, 0x46, 0xE5, 0x71,
-0xC3, 0x95, 0x75, 0x50, 0x5F, 0xAB, 0x6E, 0xAD, 0x75, 0xAF, 0x71, 0x12, 0x72, 0xEA, 0x8F, 0x72,
-0x85, 0x72, 0x70, 0x71, 0xEA, 0xC4, 0x13, 0x54, 0x01, 0xFF, 0x90, 0x92, 0x49, 0xE4, 0x12, 0xC3,
-0x2B, 0xE4, 0xF0, 0xA3, 0xE5, 0x72, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x71, 0xF0, 0xE5, 0x73,
-0x71, 0xE3, 0x12, 0xC3, 0x65, 0xE4, 0xFB, 0xFA, 0x7D, 0x05, 0x7F, 0x04, 0x12, 0x9E, 0xF1, 0xE5,
-0x71, 0xC3, 0x94, 0x0C, 0x40, 0x25, 0x71, 0xEA, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x1C, 0xE5,
-0x6F, 0x60, 0x18, 0xE5, 0x73, 0x70, 0x14, 0xE5, 0x71, 0x44, 0x80, 0xF5, 0x70, 0xD1, 0xFD, 0xE5,
-0x72, 0xF0, 0x80, 0x07, 0xF1, 0xE6, 0xE5, 0x75, 0xF0, 0xF5, 0x70, 0x90, 0x92, 0x45, 0xE4, 0xF0,
-0xA3, 0xE5, 0x70, 0xF0, 0xD1, 0xFD, 0xE0, 0xFF, 0xF1, 0xF4, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3,
-0xE5, 0x74, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x6F, 0xF0, 0x7B, 0x01, 0x7A, 0x00, 0x7D, 0x05,
-0x7F, 0x04, 0x12, 0x9E, 0xF1, 0x90, 0x91, 0x0B, 0xE5, 0x74, 0xF0, 0xAB, 0x6F, 0xAD, 0x70, 0xAF,
-0x6E, 0x02, 0x27, 0x3D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xA6, 0xED, 0xF0,
-0x90, 0x85, 0xC1, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xC1, 0x8D, 0xEE,
-0x71, 0xE3, 0x30, 0xE0, 0x02, 0xC1, 0x8D, 0x90, 0x85, 0xC8, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xC1,
-0x8D, 0xEF, 0x70, 0x02, 0xA1, 0xF9, 0x24, 0xFE, 0x70, 0x02, 0xC1, 0x36, 0x24, 0xFE, 0x60, 0x4D,
-0x24, 0xFC, 0x70, 0x02, 0xC1, 0x75, 0x24, 0xFC, 0x60, 0x02, 0xC1, 0x87, 0xEE, 0xB4, 0x0E, 0x03,
-0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85,
-0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x0F, 0x90,
-0x93, 0xA6, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x6D, 0x4C, 0x80, 0x03, 0x12, 0x79, 0x61, 0x90, 0x85,
-0xC8, 0xE0, 0x64, 0x08, 0x60, 0x02, 0xC1, 0x87, 0x12, 0x7A, 0xB9, 0xC1, 0x87, 0x90, 0x85, 0xC8,
-0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12,
-0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0xD1, 0x92, 0xBF, 0x01, 0x03, 0x12, 0x74,
-0x93, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0xC1, 0x87, 0xD1, 0x92, 0xEF, 0x64, 0x01,
-0x60, 0x02, 0xC1, 0x87, 0x12, 0x70, 0x9E, 0xC1, 0x87, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08,
-0xD1, 0x92, 0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12,
-0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x08, 0xD1, 0x92, 0xBF, 0x01, 0x03, 0x12, 0x70,
-0x9E, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x04, 0x70, 0x5E, 0x12, 0xBE, 0xD6, 0xEF, 0x64, 0x01, 0x70,
-0x56, 0x12, 0x77, 0xFE, 0x80, 0x51, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0xD1, 0x92, 0xBF,
-0x01, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90,
-0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x08, 0xD1, 0x92, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90, 0x85,
-0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x17,
-0x12, 0x79, 0xF3, 0x80, 0x12, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x0B, 0x12, 0xAB, 0x06, 0x54,
-0x3F, 0x30, 0xE0, 0x03, 0x12, 0x7A, 0x8A, 0x90, 0x85, 0xC8, 0xF1, 0xFB, 0xF0, 0xD0, 0xD0, 0x92,
-0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7A, 0x29, 0xEF, 0x64, 0x01, 0x60,
-0x05, 0x75, 0x0E, 0x01, 0x80, 0x3B, 0x90, 0x85, 0xC1, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30,
-0xE0, 0x05, 0x75, 0x0E, 0x02, 0x80, 0x2A, 0x90, 0x85, 0xC7, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x05,
-0x75, 0x0E, 0x08, 0x80, 0x1C, 0x90, 0x93, 0x09, 0xE0, 0x30, 0xE0, 0x0C, 0x13, 0x13, 0x54, 0x3F,
-0x30, 0xE0, 0x05, 0x75, 0x0E, 0x11, 0x80, 0x09, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x80,
-0x0E, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x0E, 0xF0, 0x7F, 0x00, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x12, 0x86, 0xFA, 0x90, 0x00, 0x01, 0x02, 0x03, 0x0F, 0x74, 0x60, 0x25,
-0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22, 0x8D, 0x78, 0xEF, 0x30, 0xE6, 0x1A, 0xF1,
-0x88, 0xF1, 0xAB, 0xE0, 0x54, 0x03, 0x90, 0x91, 0x0B, 0xF0, 0xE4, 0xFB, 0xAF, 0x78, 0x12, 0x27,
-0x3D, 0xF1, 0x7B, 0xF1, 0x97, 0x74, 0x01, 0x80, 0x49, 0xF1, 0x9E, 0x04, 0xF0, 0xF1, 0x9E, 0x64,
-0x02, 0x70, 0x1E, 0x74, 0x60, 0x25, 0x78, 0xF1, 0x01, 0xE0, 0xFD, 0xF4, 0x60, 0x02, 0x80, 0x04,
-0xF1, 0x88, 0xE0, 0xFD, 0xF1, 0xAD, 0x12, 0xC3, 0x89, 0xF1, 0x88, 0xF1, 0x97, 0x74, 0x02, 0x80,
-0x21, 0xF1, 0x9E, 0xD3, 0x94, 0x03, 0x40, 0x0D, 0xAF, 0x78, 0x12, 0x6D, 0x94, 0xF1, 0x7B, 0xF1,
-0x97, 0x74, 0x03, 0x80, 0x0D, 0xF1, 0x88, 0xF1, 0xAB, 0x12, 0xC3, 0x89, 0xF1, 0x88, 0xF1, 0x97,
-0x74, 0x02, 0xF0, 0xAB, 0x78, 0xE4, 0xFD, 0xFF, 0x02, 0x52, 0xC3, 0x74, 0xBC, 0x25, 0x78, 0xF5,
-0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xE5, 0x78, 0xC4, 0x54, 0xF0, 0x24, 0x00, 0xF5,
-0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0xE0, 0x90, 0x8A, 0x71, 0xF0, 0xA3, 0x22, 0x74, 0xBC,
-0x25, 0x78, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0xFD, 0xE5, 0x78, 0xC4,
-0x54, 0xF0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x7F, 0x8F, 0x12, 0x7B,
-0x51, 0xEF, 0x22, 0x90, 0x92, 0x07, 0x02, 0x87, 0x03, 0xF0, 0x90, 0x85, 0xC3, 0xE0, 0x54, 0x0F,
-0x22, 0xF0, 0x74, 0xCC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x22, 0x75, 0xF0, 0x12, 0x90, 0x89,
-0x3C, 0x12, 0x05, 0x28, 0xE0, 0x22, 0x74, 0xCC, 0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5,
-0x83, 0x22, 0x41, 0x78, 0x90, 0x92, 0x47, 0xE4, 0xF0, 0xA3, 0x22, 0xE0, 0x90, 0x01, 0xBA, 0xF0,
-0x90, 0x85, 0xC7, 0xE0, 0x90, 0x01, 0xBB, 0x22, 0x8B, 0x5B, 0x8A, 0x5C, 0x89, 0x5D, 0x90, 0x93,
-0x13, 0xE0, 0x70, 0x10, 0x12, 0x02, 0xF6, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, 0x93,
-0x19, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x15, 0xE0, 0x70, 0x0F, 0x11, 0xE3, 0xC4, 0x54, 0x0F, 0xFF,
-0xBF, 0x05, 0x06, 0x90, 0x93, 0x1A, 0x74, 0x01, 0xF0, 0xAB, 0x5B, 0xAA, 0x5C, 0xA9, 0x5D, 0x12,
-0x8E, 0xF7, 0xFF, 0xF5, 0x5F, 0x12, 0x02, 0xF6, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x8B,
-0xD9, 0xF5, 0x60, 0x80, 0x02, 0x8F, 0x60, 0x85, 0x5F, 0x5E, 0xE5, 0x5E, 0xD3, 0x95, 0x60, 0x50,
-0x28, 0x11, 0xE3, 0x54, 0x01, 0xFD, 0xAF, 0x5E, 0x12, 0x6E, 0x5F, 0xAF, 0x5E, 0x12, 0x77, 0x39,
-0xEF, 0xAF, 0x5E, 0x70, 0x04, 0x11, 0xA7, 0x80, 0x02, 0xF1, 0x2E, 0x90, 0x93, 0x1A, 0xE0, 0x60,
-0x04, 0xAF, 0x5E, 0x11, 0xA7, 0x05, 0x5E, 0x80, 0xD1, 0xE5, 0x5F, 0x70, 0x19, 0xFF, 0x12, 0x77,
-0x39, 0xEF, 0x70, 0x12, 0x71, 0x38, 0x12, 0x79, 0x61, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xF7, 0xF0,
-0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
-0x90, 0x92, 0x07, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x7D, 0x44, 0x7F, 0x6F, 0x11, 0xEF, 0x11, 0xFA,
-0x90, 0x92, 0x08, 0xE0, 0x90, 0x92, 0x07, 0xB4, 0x01, 0x0A, 0xE0, 0x12, 0x8F, 0xAF, 0xE0, 0x44,
-0x04, 0xF0, 0x80, 0x08, 0xE0, 0x12, 0x8F, 0xAF, 0xE0, 0x54, 0xFB, 0xF0, 0x11, 0xEC, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0xAB, 0x5B, 0xAA, 0x5C, 0xA9, 0x5D, 0x02, 0x02, 0xF6, 0xE4, 0xFD, 0xFF, 0x90,
-0x05, 0x22, 0xEF, 0xF0, 0x90, 0x92, 0xE1, 0xED, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x93, 0xF0, 0xA3,
-0xF0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0x95, 0xF0, 0x7D, 0x47, 0x7F, 0xFF, 0x11, 0xEF, 0x90,
-0x05, 0xF8, 0xE0, 0x70, 0x18, 0xA3, 0xE0, 0x70, 0x14, 0xA3, 0xE0, 0x70, 0x10, 0xA3, 0xE0, 0x70,
-0x0C, 0x90, 0x93, 0x95, 0xE0, 0xFF, 0x7D, 0x48, 0x11, 0xEF, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x93,
-0x94, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0x93, 0xE0, 0x94, 0x03, 0x40, 0x13, 0x90, 0x01, 0xC0, 0xE0,
-0x44, 0x20, 0xF0, 0x90, 0x93, 0x95, 0xE0, 0xFF, 0x7D, 0x48, 0x11, 0xEF, 0x7F, 0x00, 0x22, 0x7F,
-0x32, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90, 0x93, 0x93, 0xF1, 0xC4, 0x80, 0xB2, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0xDB, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x84, 0xC3, 0xE0,
-0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x32, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x92, 0xDF, 0xF0,
-0x7D, 0x26, 0x7F, 0xFF, 0x11, 0xEF, 0x11, 0xFA, 0xEF, 0x64, 0x01, 0x70, 0x0A, 0x31, 0xDF, 0xFB,
-0x7D, 0x01, 0x12, 0x3A, 0xC2, 0x31, 0xE9, 0x90, 0x92, 0xDF, 0xE0, 0xFF, 0x7D, 0x27, 0x11, 0xEF,
-0x90, 0x92, 0xDB, 0xE0, 0xFF, 0x12, 0x5C, 0xA3, 0x80, 0x18, 0x90, 0x92, 0xDB, 0xE0, 0xFF, 0x12,
-0x5C, 0xA3, 0x31, 0xDF, 0xFB, 0x90, 0x93, 0x92, 0x74, 0x0A, 0xF0, 0x7D, 0x01, 0x12, 0xBC, 0xC5,
-0x31, 0xE9, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x90, 0x84, 0xBF, 0xA3, 0xE0, 0x24, 0x7F, 0xF5,
-0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90,
-0x84, 0xC8, 0xE0, 0xFF, 0x90, 0x92, 0xDC, 0xE0, 0x22, 0x90, 0x92, 0xDD, 0xEE, 0xF0, 0xFC, 0xA3,
-0xEF, 0xF0, 0xFD, 0x90, 0x92, 0xDB, 0xE0, 0xFF, 0x12, 0x65, 0x61, 0x90, 0x92, 0xDD, 0xE0, 0xFE,
-0xA3, 0xE0, 0xFF, 0x02, 0x50, 0xD7, 0x90, 0x93, 0x09, 0xE0, 0x30, 0xE0, 0x4D, 0x13, 0x13, 0x54,
-0x3F, 0x20, 0xE0, 0x14, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x93, 0x0B, 0x51, 0x71, 0xE4, 0x51,
-0x5B, 0x30, 0xE0, 0x02, 0x91, 0x44, 0x81, 0x4B, 0x90, 0x93, 0x09, 0xE0, 0x13, 0x13, 0x54, 0x3F,
-0x30, 0xE0, 0x27, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x93, 0x0C, 0x51, 0x71, 0x90, 0x93, 0x09,
-0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x7D, 0x04, 0x7F, 0x01, 0x02, 0x57,
-0x82, 0x7D, 0x31, 0x7F, 0xFF, 0x11, 0xEF, 0x12, 0xB9, 0x12, 0x22, 0xFD, 0xFF, 0x11, 0xEF, 0x71,
-0x38, 0x90, 0x93, 0x09, 0xE0, 0xC3, 0x13, 0x22, 0xF0, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x86,
-0x6E, 0xE0, 0x90, 0x91, 0x6F, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02, 0x61, 0x41,
-0xE4, 0xF5, 0x77, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x61, 0x0F, 0xF1, 0x4C, 0x60, 0x02, 0x61,
-0x0F, 0xF1, 0x9C, 0x90, 0x85, 0xC3, 0xE0, 0xC4, 0x54, 0x0F, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03,
-0x04, 0x70, 0x1E, 0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x85, 0xCE,
-0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x77,
-0x01, 0xE5, 0x77, 0x60, 0x4A, 0x90, 0x85, 0xC8, 0xE0, 0x20, 0xE2, 0x07, 0x7D, 0x01, 0x7F, 0x04,
-0x12, 0x8D, 0x34, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x60, 0x04,
-0x64, 0x01, 0x70, 0x13, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x71, 0x1B, 0x51,
-0x72, 0x90, 0x85, 0xCE, 0xE0, 0x80, 0x12, 0xE4, 0x90, 0x91, 0x6E, 0x71, 0x10, 0x51, 0x72, 0x90,
-0x85, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0x71, 0x1B, 0x90, 0x85, 0xDE, 0xF0, 0x22,
-0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x85, 0xCD, 0xE0,
-0x2F, 0x22, 0x90, 0x93, 0x09, 0xE0, 0x30, 0xE0, 0x0E, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x51, 0x5B,
-0x30, 0xE0, 0x02, 0x91, 0x44, 0x91, 0x4B, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F,
-0x02, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x02, 0x12, 0x7B, 0x3E, 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, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x8F, 0xC3, 0x12, 0x02,
-0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x09, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54,
-0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x02, 0xF6, 0xFE, 0x54, 0x04, 0x25, 0xE0,
-0xFD, 0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x93, 0x09, 0xF0, 0xEE, 0x54, 0x08, 0x25, 0xE0, 0xFE,
-0xEF, 0x54, 0xEF, 0x4E, 0xF0, 0x90, 0x05, 0x52, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0x92, 0x07, 0x60,
-0x13, 0x12, 0x8E, 0xF4, 0xFD, 0x90, 0x05, 0x56, 0xE0, 0xC3, 0x9D, 0x90, 0x93, 0x0B, 0xF0, 0xA3,
-0xED, 0xF0, 0x80, 0x23, 0x12, 0x8E, 0xF4, 0xFB, 0xFF, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x9F, 0xFF,
-0xE4, 0x94, 0x00, 0xFE, 0x7C, 0x00, 0x7D, 0x05, 0x12, 0x03, 0x82, 0x90, 0x93, 0x0B, 0xEF, 0xF0,
-0xEB, 0x75, 0xF0, 0x05, 0x84, 0xA3, 0xF0, 0x12, 0x88, 0xFD, 0x12, 0x02, 0xF6, 0x20, 0xE0, 0x0B,
-0x71, 0x38, 0x11, 0xEC, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x80, 0x04, 0x91, 0x44, 0x91, 0x4B, 0x90,
-0x93, 0x09, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x04, 0xEF, 0x54, 0xDF, 0xF0, 0x51, 0x61,
-0x30, 0xE0, 0x19, 0x90, 0x85, 0xC5, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x85, 0xC7, 0xF0, 0x90, 0x85,
-0xC2, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x05, 0x58, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0xC5,
-0xF0, 0x90, 0x85, 0xC7, 0x74, 0x0C, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0xE0,
-0x54, 0xFB, 0xF0, 0x22, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x57, 0x82, 0x90, 0x93, 0x09, 0xE0, 0x44,
-0x04, 0xF0, 0x22, 0x51, 0x80, 0x90, 0x92, 0xE3, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0xBE, 0x5A, 0x61,
-0x22, 0x90, 0x93, 0x09, 0xE0, 0x30, 0xE0, 0x0C, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x93, 0x0B,
-0x51, 0x71, 0x91, 0x4B, 0x90, 0x84, 0xC5, 0xE0, 0xB4, 0x01, 0x16, 0x90, 0x93, 0x09, 0xE0, 0xFF,
-0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x03, 0x12, 0xC2,
-0x9D, 0x22, 0x7E, 0x00, 0x7F, 0xAC, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xC1, 0x12, 0x06,
-0xDE, 0x90, 0x85, 0xC4, 0x74, 0x02, 0xF0, 0x90, 0x85, 0xCB, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74,
-0x0A, 0xF0, 0x90, 0x85, 0xD1, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0xB1, 0x41, 0x12, 0xC0, 0x67, 0xE4,
-0xFD, 0xFF, 0x12, 0x57, 0x82, 0x7D, 0x0C, 0x7F, 0x02, 0x12, 0x57, 0x82, 0x91, 0x44, 0x90, 0x84,
-0xC5, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x85, 0xD0, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90,
-0x85, 0xD0, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x2C, 0x12,
-0x7B, 0x51, 0xEF, 0x54, 0x0F, 0xFF, 0xBF, 0x05, 0x08, 0x90, 0x85, 0xFB, 0x74, 0x02, 0xF0, 0x80,
-0x05, 0xE4, 0x90, 0x85, 0xFB, 0xF0, 0x90, 0x86, 0x6D, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x0F, 0xF0,
-0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x07, 0xB1, 0x41, 0xE4, 0x90, 0x85, 0xD7,
-0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x12, 0x69, 0x33, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90,
-0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x11, 0xEF, 0xE4, 0x90, 0x86, 0x71, 0xF0,
-0x22, 0xF0, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90, 0x85, 0xDD, 0xF0, 0xA3, 0x74, 0x0A, 0xF0,
-0x22, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0xC1, 0x0B, 0x90, 0x85, 0xDC, 0xE0, 0x04, 0xF0, 0x90,
-0x05, 0x61, 0xD1, 0x2C, 0x78, 0x08, 0x12, 0x04, 0xD8, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB,
-0x07, 0x90, 0x05, 0x60, 0xD1, 0x2C, 0x12, 0x86, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0,
-0x07, 0x90, 0x05, 0x62, 0xD1, 0x2C, 0x78, 0x10, 0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0, 0x02, 0xD0,
-0x01, 0xD0, 0x00, 0x12, 0x86, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0xD1,
-0x2C, 0x78, 0x18, 0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x86,
-0xD5, 0x90, 0x85, 0xFC, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x1F, 0xE0, 0x54, 0xFE, 0xF0,
-0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0D, 0x12, 0xAF, 0x97, 0x12, 0x51, 0x7D, 0x90, 0x93, 0x1F, 0xE0,
-0x54, 0xFD, 0xF0, 0x90, 0x85, 0xC2, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x15, 0x90,
-0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0E, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x7C, 0x41, 0x7D, 0x01, 0x7F,
-0x02, 0x12, 0x7C, 0x41, 0x90, 0x93, 0xA4, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B,
-0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xF1, 0xCB, 0xFF, 0xBF, 0x03,
-0x14, 0x90, 0x93, 0x11, 0xE0, 0xB4, 0x01, 0x0D, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x90, 0x05,
-0x21, 0xE0, 0x44, 0x80, 0xF0, 0x7F, 0x01, 0x12, 0xAD, 0xED, 0x81, 0x61, 0xE0, 0xFF, 0xE4, 0xFC,
-0xFD, 0xFE, 0x22, 0x90, 0x92, 0x04, 0x12, 0x87, 0x03, 0x90, 0x92, 0x03, 0xEF, 0xF0, 0x12, 0x87,
-0x0C, 0x96, 0x81, 0x00, 0x96, 0x8A, 0x01, 0x96, 0x92, 0x08, 0x96, 0x9A, 0x09, 0x96, 0xA3, 0x0A,
-0x96, 0xAC, 0x12, 0x96, 0xB5, 0x13, 0x96, 0xBE, 0x14, 0x96, 0xC7, 0x20, 0x96, 0xD0, 0x25, 0x96,
-0xD8, 0x26, 0x96, 0xE0, 0x40, 0x96, 0xE9, 0x42, 0x96, 0xF2, 0x43, 0x96, 0xFB, 0x44, 0x97, 0x2D,
-0x47, 0x97, 0x2D, 0x49, 0x97, 0x04, 0xC2, 0x97, 0x0C, 0xC3, 0x97, 0x15, 0xC4, 0x00, 0x00, 0x97,
-0x1E, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0x87, 0xF4, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA,
-0x01, 0x08, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0xE1, 0xF6, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA,
-0x02, 0x9F, 0xF8, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0xA0, 0x13, 0x90, 0x92, 0x04, 0x12,
-0x86, 0xFA, 0x02, 0xA7, 0xE4, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0xA7, 0xF8, 0x90, 0x92,
-0x04, 0x12, 0x86, 0xFA, 0x02, 0xAF, 0xF4, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0x88, 0x45,
-0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0xE1, 0xD2, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x61, 0x6B,
-0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0x89, 0x03, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02,
-0x4E, 0x29, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0x28, 0xE6, 0x90, 0x92, 0x04, 0x12, 0x86,
-0xFA, 0x02, 0x62, 0xFC, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0xE1, 0xDA, 0x90, 0x92, 0x04, 0x12,
-0x86, 0xFA, 0x02, 0xB0, 0x03, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0xB1, 0xC8, 0x90, 0x01,
-0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0x03, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0xE4, 0xFD,
-0x01, 0xA9, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x03, 0x12, 0xAA, 0x8A, 0x41, 0x06, 0xF1, 0x4C, 0x70,
-0x0A, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x04, 0xF1, 0xEB, 0x51, 0x68, 0x22, 0xE4, 0xFF, 0x12, 0x77,
-0x39, 0xEF, 0x64, 0x01, 0x22, 0xE4, 0x90, 0x92, 0xCC, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x3B,
-0xF1, 0x4C, 0x70, 0x37, 0x90, 0x85, 0xCB, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0xF1, 0x9C, 0x90, 0x92,
-0xCC, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x85, 0xCC, 0xF0, 0x04, 0x60, 0x1F, 0x90, 0x85, 0xC8, 0xE0,
-0x20, 0xE2, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x8D, 0x34, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x10,
-0xF0, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCD, 0x51, 0x71, 0x22, 0x90, 0x05, 0x63, 0xE0,
-0x90, 0x93, 0x28, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x93, 0x29, 0xF0, 0x90, 0x05, 0x61, 0xE0,
-0x90, 0x93, 0x2A, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x1F, 0xE0,
-0x44, 0x01, 0xF0, 0x22, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x07, 0x0A, 0x90, 0x01, 0x02, 0xE0, 0x54,
-0x03, 0x22, 0x12, 0x02, 0xF6, 0x90, 0x86, 0x71, 0xF0, 0x22, 0x12, 0x02, 0xF6, 0x90, 0x93, 0x11,
-0xF0, 0x22, 0xF1, 0x55, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x7C, 0xA9, 0x90, 0x01, 0x57, 0xE4, 0xF0,
-0x90, 0x01, 0x3C, 0x74, 0x02, 0x22, 0x12, 0x8F, 0xC3, 0x12, 0x02, 0xF6, 0x30, 0xE0, 0x13, 0x11,
-0xA6, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x01, 0x70, 0x28, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0,
-0x80, 0x1F, 0x90, 0x93, 0x05, 0xE0, 0x60, 0x16, 0x7D, 0x10, 0xE4, 0xFF, 0x12, 0x7B, 0xBF, 0x90,
-0x01, 0x3C, 0xE0, 0x30, 0xE4, 0x03, 0x74, 0x10, 0xF0, 0x90, 0x01, 0x63, 0xE4, 0xF0, 0x12, 0xA7,
-0xCA, 0x90, 0x92, 0x07, 0x12, 0x8E, 0xF4, 0x90, 0x92, 0xE4, 0x12, 0x8B, 0xD8, 0x90, 0x92, 0xE5,
-0xF0, 0x90, 0x92, 0xE4, 0xE0, 0x54, 0x01, 0x90, 0x92, 0xF1, 0xF0, 0x90, 0x92, 0xE4, 0xE0, 0x54,
-0x02, 0x90, 0x92, 0xF2, 0xF0, 0x90, 0x92, 0xE4, 0xE0, 0x54, 0x04, 0x90, 0x92, 0xF3, 0xF0, 0x90,
-0x92, 0xE4, 0xE0, 0x54, 0x08, 0x90, 0x92, 0xF4, 0xF0, 0x90, 0x92, 0xE4, 0xE0, 0x54, 0x10, 0x90,
-0x92, 0xF5, 0xF0, 0x90, 0x92, 0xE5, 0xE0, 0x54, 0x01, 0x90, 0x92, 0xF6, 0xF0, 0x90, 0x92, 0xE5,
-0xE0, 0x54, 0x02, 0x90, 0x92, 0xF7, 0xF0, 0x90, 0x92, 0xE5, 0xE0, 0x54, 0x04, 0x90, 0x92, 0xF8,
-0xF0, 0x90, 0x92, 0xE5, 0xE0, 0x54, 0x08, 0x90, 0x92, 0xF9, 0xF0, 0x90, 0x92, 0xE5, 0xE0, 0x54,
-0x10, 0x90, 0x92, 0xFA, 0xF0, 0x22, 0x12, 0xA0, 0xFF, 0x90, 0x85, 0xB7, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x92, 0xE3, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x08,
-0xE4, 0xFF, 0x12, 0x7C, 0xA9, 0x90, 0x05, 0x52, 0xE0, 0x54, 0x07, 0x04, 0x90, 0x92, 0xEE, 0x11,
-0xD9, 0x90, 0x04, 0x22, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22,
-0x90, 0x92, 0xE3, 0xE0, 0x54, 0xFE, 0x11, 0xD9, 0x90, 0x92, 0xEA, 0x31, 0x09, 0x90, 0x93, 0x05,
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x93, 0x5F, 0xE0, 0xFF, 0x90, 0x92, 0x45, 0xE4, 0xF0,
-0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
-0x22, 0x90, 0x04, 0x85, 0xE0, 0xF5, 0x6B, 0x90, 0x93, 0x5F, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x62,
-0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE5, 0x62, 0xC3, 0x9F, 0x40, 0x02, 0xC1, 0xEA, 0xE5, 0x62, 0x12,
-0x8F, 0x8A, 0xE0, 0xF5, 0x6D, 0x12, 0xC3, 0xC5, 0xF5, 0x83, 0xE0, 0x65, 0x6D, 0x60, 0x18, 0x90,
-0x8A, 0x71, 0xE5, 0x6D, 0xF0, 0xE4, 0xA3, 0xF0, 0xAB, 0x62, 0xFD, 0xFF, 0x12, 0x52, 0xC3, 0x12,
-0xC3, 0xC5, 0xF5, 0x83, 0xE5, 0x6D, 0xF0, 0x90, 0x04, 0xA0, 0xE0, 0x64, 0x01, 0x70, 0x50, 0xA3,
-0xE0, 0x65, 0x62, 0x70, 0x4A, 0xA3, 0xE0, 0xF5, 0x63, 0xA3, 0xE0, 0x90, 0x92, 0x3E, 0xF0, 0xE5,
-0x62, 0x12, 0x8F, 0x8A, 0xE0, 0x65, 0x63, 0x70, 0x02, 0xC1, 0xE6, 0xE5, 0x62, 0x12, 0x8F, 0x8A,
-0xE5, 0x63, 0xF0, 0xE5, 0x62, 0x12, 0x8F, 0xAF, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0x92, 0x3E, 0xE0,
-0x54, 0x03, 0x4F, 0xFF, 0xE5, 0x62, 0x12, 0x8F, 0xAF, 0xEF, 0xF0, 0x90, 0x8A, 0x71, 0xE5, 0x63,
-0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xAB, 0x62, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0xC3, 0xC1, 0xE6, 0xAF,
-0x62, 0x12, 0x77, 0x39, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0x8A, 0x70, 0x12, 0x8B, 0xE3, 0xFD,
-0x12, 0xC3, 0xAB, 0xED, 0xF0, 0x90, 0x92, 0x47, 0xE4, 0x12, 0xC3, 0x2B, 0xE4, 0xF0, 0xA3, 0xE5,
-0x62, 0xF0, 0x12, 0xAF, 0x4D, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE,
-0x5C, 0xFE, 0xEF, 0x5D, 0xFF, 0x90, 0x92, 0x4B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7B, 0x02, 0x7A,
-0x00, 0xE4, 0xFD, 0x7F, 0x01, 0xD1, 0xF1, 0x12, 0xB9, 0xBB, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12,
-0xB9, 0xB0, 0xE0, 0xFD, 0xE5, 0x62, 0x12, 0xAF, 0xA5, 0x54, 0x80, 0xFB, 0x12, 0xC3, 0xAB, 0xEB,
-0xF0, 0x12, 0x8F, 0xF4, 0xED, 0xF0, 0x90, 0x92, 0x45, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90,
-0x92, 0x4B, 0xF0, 0xA3, 0xF0, 0x7B, 0x03, 0xFA, 0xFD, 0x7F, 0x01, 0xD1, 0xF1, 0xAF, 0x62, 0x12,
-0x77, 0x39, 0xEF, 0x70, 0x02, 0xC1, 0xE6, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0x8A, 0x70, 0x12,
-0x8B, 0xE3, 0x30, 0xE0, 0x02, 0xC1, 0xE6, 0xE5, 0x62, 0x12, 0xAF, 0x4D, 0x80, 0x05, 0xC3, 0x33,
-0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x60, 0x02, 0xC1, 0xE6,
-0x12, 0xB9, 0xBB, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x70, 0x08, 0x12, 0xB9, 0xB0, 0xE0, 0x70, 0x02,
-0xC1, 0xE6, 0xE5, 0x62, 0x75, 0xF0, 0x12, 0xA4, 0x24, 0x44, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0xFA,
-0x7B, 0x01, 0x90, 0x92, 0x33, 0x12, 0x87, 0x03, 0x12, 0xC3, 0x7B, 0x12, 0x03, 0xED, 0x2F, 0xFF,
-0xF1, 0xA0, 0x2F, 0xFF, 0x12, 0xC3, 0xA5, 0x2F, 0xFF, 0xF1, 0xF2, 0x2F, 0xF5, 0x6C, 0x12, 0xB9,
-0xBB, 0xE0, 0xF5, 0x68, 0xA3, 0xE0, 0xF5, 0x69, 0x12, 0xB9, 0xB0, 0xE0, 0xFF, 0x90, 0x92, 0x36,
-0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x62, 0x12, 0x8F, 0x8A, 0xE0, 0xF5, 0x63, 0x54, 0x80, 0xF5,
-0x65, 0xE5, 0x63, 0x54, 0x7F, 0xF5, 0x64, 0x12, 0xC3, 0xBC, 0xF1, 0xA6, 0x12, 0xC3, 0x81, 0x90,
-0x92, 0x47, 0xF1, 0xAA, 0xF1, 0xA0, 0xFF, 0x90, 0x92, 0x49, 0xF1, 0xAA, 0x12, 0xC3, 0xA5, 0xFF,
-0x90, 0x92, 0x4B, 0xF1, 0xAA, 0x7B, 0x01, 0xF1, 0xD8, 0xF1, 0xEC, 0xF1, 0xA6, 0x90, 0x92, 0x36,
-0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92, 0x47, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE5, 0x68, 0xF0,
-0xA3, 0xE5, 0x69, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x63, 0xF0, 0x7B, 0x02, 0xF1, 0xD8, 0x74,
+0x00, 0x06, 0x02, 0x03, 0x0F, 0xF1, 0xC6, 0x12, 0x02, 0xF6, 0xFF, 0x54, 0x7F, 0x90, 0x85, 0xC5,
+0xF0, 0xEF, 0x71, 0xF0, 0xA3, 0xF0, 0xD1, 0xF8, 0xFD, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFF, 0x90,
+0x85, 0xC3, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x03, 0x0F, 0xFC, 0x54, 0x01,
+0x25, 0xE0, 0xFF, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0xEC, 0x54, 0x04, 0xFF, 0x90,
+0x93, 0x37, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0xF1, 0xDB,
+0x71, 0xE4, 0x90, 0x85, 0xC4, 0xF0, 0x11, 0x3F, 0x30, 0xE0, 0x4D, 0xC3, 0x13, 0x54, 0x07, 0xFF,
+0xC3, 0x94, 0x04, 0x90, 0x85, 0xD8, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x25, 0x74, 0x03, 0xF0, 0x31,
+0x0E, 0xE9, 0x24, 0x06, 0xF1, 0xCC, 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, 0x03,
+0x3C, 0x31, 0x0E, 0x11, 0x3F, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x85, 0xCD, 0x50,
+0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x31, 0x0E, 0x90, 0x00, 0x04, 0x12, 0x03, 0x0F,
+0xFD, 0x7F, 0x02, 0x12, 0x57, 0x82, 0x31, 0x0E, 0x12, 0x71, 0xCB, 0x12, 0xA3, 0xF2, 0xF0, 0x90,
+0x85, 0xC5, 0xF1, 0xE2, 0x90, 0x01, 0xBB, 0xF1, 0xDA, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x92,
+0x07, 0x02, 0x86, 0xFA, 0xF1, 0xC6, 0x31, 0x0E, 0x12, 0x02, 0xF6, 0x54, 0x7F, 0xFD, 0xD1, 0xF8,
+0xFE, 0x54, 0x1F, 0x90, 0x92, 0x0B, 0x71, 0xEC, 0x90, 0x92, 0x0A, 0x71, 0xE5, 0xFE, 0x54, 0x03,
+0xFC, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0x92, 0x0D, 0x71, 0xE5, 0xFE, 0x54, 0x40, 0xC4,
+0x13, 0x13, 0x54, 0x03, 0x90, 0x92, 0x0C, 0x71, 0xEC, 0xFF, 0x71, 0xE6, 0xFB, 0x54, 0x08, 0x13,
+0x13, 0x13, 0x54, 0x1F, 0x90, 0x92, 0x0F, 0xF0, 0xFA, 0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F,
+0xA3, 0xF0, 0xEF, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x51, 0x74, 0x54, 0x7F, 0x4F,
+0xF0, 0x90, 0x92, 0x0C, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x51, 0x74, 0x54, 0xBF,
+0x4F, 0xF0, 0xEA, 0x60, 0x02, 0x41, 0x73, 0x90, 0x92, 0x0B, 0xE0, 0x54, 0x1F, 0xFF, 0x75, 0xF0,
+0x12, 0xED, 0x71, 0xFC, 0x54, 0xE0, 0x4F, 0xF0, 0xEC, 0x54, 0x03, 0x51, 0x74, 0x54, 0xFC, 0x4F,
+0xF0, 0xEC, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0x51, 0x74, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0x92,
+0x0A, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0x71, 0xFC, 0x54,
+0xDF, 0x4F, 0xF0, 0x90, 0x92, 0x0D, 0xE0, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0x51, 0x74, 0x54, 0xCF,
+0x4F, 0xF1, 0xEC, 0xF5, 0x83, 0xE0, 0x54, 0xFB, 0xF1, 0xEC, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82,
+0xE0, 0xFF, 0x90, 0x92, 0x10, 0xE0, 0x12, 0xB3, 0xB0, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90,
+0x93, 0x31, 0xE0, 0x60, 0x35, 0x31, 0x0E, 0xE9, 0x24, 0x03, 0xF1, 0xCC, 0x54, 0x1F, 0x12, 0x03,
+0x3C, 0x90, 0x92, 0x0E, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50,
+0x19, 0xEF, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x31, 0x0E, 0x8F, 0x82, 0x8E, 0x83, 0xE4, 0x12,
+0x03, 0x4E, 0x90, 0x92, 0x0E, 0xE0, 0x04, 0xF0, 0x80, 0xDD, 0x90, 0x93, 0x2F, 0xE0, 0x54, 0x07,
+0xFF, 0xBF, 0x05, 0x0A, 0xEC, 0xB4, 0x01, 0x06, 0x90, 0x93, 0x34, 0x74, 0x01, 0xF0, 0xE4, 0x90,
+0x92, 0x0E, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0xFC, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x31, 0x0E,
+0x8F, 0x82, 0x8E, 0x83, 0x12, 0x03, 0x0F, 0xFF, 0xED, 0x12, 0xBC, 0xE0, 0xE5, 0x82, 0x2C, 0x12,
+0xA5, 0xBA, 0xEF, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x04, 0xD5, 0xAF, 0x05,
+0x12, 0x17, 0x8E, 0x22, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0x90, 0x89, 0x3F, 0x12, 0x05, 0x28, 0xE0,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x8F, 0x12, 0x7B, 0x51, 0xEF, 0x20, 0xE6,
+0x02, 0x61, 0xAB, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0x93, 0xAE, 0xF0, 0x7F, 0x8D, 0x12, 0x7B, 0x51,
+0x90, 0x93, 0xAF, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0x93, 0xB0, 0xF0, 0x90, 0x93, 0xAF,
+0xE0, 0x24, 0xFC, 0x60, 0x10, 0x24, 0x03, 0x60, 0x02, 0x61, 0x9F, 0x90, 0x93, 0xAE, 0xE0, 0xFF,
+0x12, 0xA6, 0xE7, 0x61, 0x9F, 0x90, 0x93, 0xAE, 0xE0, 0x24, 0xDC, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
+0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x71, 0xDD, 0x75, 0xF0, 0x12, 0x51, 0x79, 0x13, 0x13,
+0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x71, 0xDD, 0x75, 0xF0, 0x12, 0x51, 0x79, 0x71, 0xF0, 0xFB,
+0x0D, 0xE4, 0xFF, 0x71, 0xDD, 0x75, 0xF0, 0x12, 0x51, 0x79, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4,
+0xFF, 0x71, 0xDD, 0xF1, 0xF8, 0xFB, 0xE4, 0xFD, 0x0F, 0x71, 0xDD, 0x75, 0xF0, 0x12, 0x90, 0x89,
+0x3D, 0x12, 0x05, 0x28, 0x71, 0xDA, 0x75, 0xF0, 0x12, 0x71, 0xFC, 0xC4, 0x13, 0x54, 0x01, 0xFB,
+0x0D, 0x7F, 0x01, 0x71, 0xDD, 0x75, 0xF0, 0x12, 0x71, 0xFC, 0x54, 0x1F, 0x71, 0xDB, 0x12, 0xBC,
+0xE0, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x71, 0xDD, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82,
+0xE4, 0x34, 0x82, 0x71, 0xD8, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x82,
+0x71, 0xD8, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x71, 0xD8, 0x75,
+0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD,
+0x0F, 0x71, 0xDD, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x71, 0xD8,
+0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x71, 0xD8, 0x75, 0xF0, 0x08,
+0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x71, 0xB0, 0x7F,
+0x8F, 0x12, 0x7B, 0x51, 0xEF, 0x30, 0xE0, 0x03, 0x12, 0xA7, 0x71, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+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, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x71, 0xB0, 0x90,
+0x93, 0xAE, 0xE0, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x03, 0x0F, 0xF0, 0xEE, 0x54, 0x80,
+0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0x75, 0xF0, 0x12, 0xE5, 0x6E, 0x90, 0x89, 0x3E, 0x12,
+0x05, 0x28, 0xE0, 0x22, 0x8F, 0x6E, 0x8D, 0x6F, 0xEF, 0xF1, 0x9B, 0xE0, 0xF5, 0x70, 0x54, 0x7F,
+0xF5, 0x71, 0xE5, 0x70, 0x54, 0x80, 0xF5, 0x73, 0x75, 0xF0, 0x12, 0xEF, 0xF1, 0xFB, 0xF5, 0x75,
+0x75, 0xF0, 0x12, 0xEF, 0x51, 0x79, 0xC4, 0x54, 0x03, 0xF5, 0x76, 0xD1, 0xFE, 0x74, 0xFF, 0xF0,
+0x12, 0xAF, 0x7E, 0xE5, 0x70, 0x45, 0x73, 0xFF, 0x12, 0xBC, 0x52, 0xEF, 0xF0, 0xE5, 0x6E, 0xF1,
+0xAC, 0xE0, 0x54, 0x03, 0xF5, 0x74, 0x74, 0x4C, 0x25, 0x6E, 0x12, 0xBC, 0xD8, 0xE5, 0x74, 0xF0,
+0xE5, 0x71, 0x65, 0x75, 0x70, 0x42, 0x71, 0xF7, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5,
+0x73, 0x70, 0x08, 0xE5, 0x71, 0x44, 0x80, 0xF5, 0x70, 0xA1, 0x01, 0x12, 0xAF, 0x7E, 0xE5, 0x6E,
+0x12, 0xBB, 0x6C, 0xE0, 0xFF, 0xA3, 0xE0, 0x12, 0xC3, 0xF2, 0xE4, 0xF0, 0xA3, 0xE5, 0x6E, 0xF0,
+0xE4, 0x90, 0x92, 0x61, 0x12, 0x9E, 0x25, 0x7B, 0x01, 0xFA, 0x7D, 0x02, 0x7F, 0x04, 0x12, 0xAE,
+0xF6, 0x7D, 0x07, 0xAF, 0x6E, 0x02, 0xB9, 0x88, 0xE5, 0x71, 0xC3, 0x95, 0x75, 0x50, 0x5A, 0xAB,
+0x6E, 0xAD, 0x75, 0xAF, 0x71, 0x12, 0x72, 0xEA, 0x8F, 0x72, 0x85, 0x72, 0x70, 0x71, 0xF7, 0xC4,
+0x13, 0x54, 0x01, 0xFF, 0x90, 0x92, 0x61, 0xE4, 0x12, 0xC3, 0xF6, 0xE4, 0xF0, 0xA3, 0xE5, 0x72,
+0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x71, 0xF0, 0xE5, 0x73, 0x71, 0xF0, 0x12, 0xC4, 0x12, 0xE4,
+0xFB, 0xFA, 0xF1, 0xD3, 0xE5, 0x71, 0xC3, 0x94, 0x0C, 0x40, 0x26, 0x71, 0xF7, 0xC4, 0x13, 0x54,
+0x07, 0x30, 0xE0, 0x1D, 0xE5, 0x6F, 0x60, 0x19, 0xE5, 0x73, 0x70, 0x15, 0xE5, 0x71, 0x44, 0x80,
+0xF5, 0x70, 0xD1, 0xFE, 0xE5, 0x72, 0xF0, 0x80, 0x08, 0x12, 0xBC, 0x52, 0xE5, 0x75, 0xF0, 0xF5,
+0x70, 0x90, 0x92, 0x5D, 0xE4, 0xF0, 0xA3, 0xE5, 0x70, 0xF0, 0xD1, 0xFE, 0xE0, 0xFF, 0x12, 0xC4,
+0x52, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x74, 0x12, 0xBC, 0xD0, 0xF0, 0x7B, 0x01, 0x7A,
+0x00, 0xF1, 0xD3, 0x90, 0x91, 0x0B, 0xE5, 0x74, 0xF0, 0xAB, 0x6F, 0xAD, 0x70, 0xAF, 0x6E, 0x02,
+0x27, 0x3D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xBE, 0xED, 0xF0, 0x90, 0x85,
+0xC1, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xC1, 0x8E, 0xEE, 0x71, 0xF0,
+0x30, 0xE0, 0x02, 0xC1, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xC1, 0x8E, 0xEF,
+0x70, 0x02, 0xA1, 0xF7, 0x24, 0xFE, 0x70, 0x02, 0xC1, 0x34, 0x24, 0xFE, 0x60, 0x4D, 0x24, 0xFC,
+0x70, 0x02, 0xC1, 0x73, 0x24, 0xFC, 0x60, 0x02, 0xC1, 0x85, 0xEE, 0xB4, 0x0E, 0x03, 0x12, 0x74,
+0x93, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0,
+0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x93, 0xBE,
+0xE0, 0xFF, 0x60, 0x05, 0x12, 0x6D, 0x4C, 0x80, 0x03, 0x12, 0x79, 0x61, 0x90, 0x85, 0xC8, 0xE0,
+0x64, 0x08, 0x60, 0x02, 0xC1, 0x85, 0x12, 0x7A, 0xB9, 0xC1, 0x85, 0x90, 0x85, 0xC8, 0xE0, 0x70,
+0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E,
+0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0xD1, 0x93, 0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90,
+0x85, 0xC8, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0xC1, 0x85, 0xD1, 0x93, 0xEF, 0x64, 0x01, 0x60, 0x02,
+0xC1, 0x85, 0x12, 0x70, 0x9E, 0xC1, 0x85, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0xD1, 0x93,
+0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E,
+0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x08, 0xD1, 0x93, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90,
+0x85, 0xC8, 0xE0, 0x64, 0x04, 0x70, 0x5E, 0x12, 0xBF, 0x9E, 0xEF, 0x64, 0x01, 0x70, 0x56, 0x12,
+0x77, 0xFE, 0x80, 0x51, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0xD1, 0x93, 0xBF, 0x01, 0x03,
+0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8,
+0xE0, 0xB4, 0x0C, 0x08, 0xD1, 0x93, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90, 0x85, 0xC8, 0xE0,
+0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x17, 0x12, 0x79,
+0xF3, 0x80, 0x12, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x0B, 0x12, 0x96, 0x4C, 0x54, 0x3F, 0x30,
+0xE0, 0x03, 0x12, 0x7A, 0x8A, 0x90, 0x85, 0xC8, 0xF1, 0xE2, 0x90, 0x01, 0xBB, 0xF0, 0xD0, 0xD0,
+0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7A, 0x29, 0xEF, 0x64, 0x01,
+0x60, 0x05, 0x75, 0x0E, 0x01, 0x80, 0x3B, 0x90, 0x85, 0xC1, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F,
+0x30, 0xE0, 0x05, 0x75, 0x0E, 0x02, 0x80, 0x2A, 0x90, 0x85, 0xC7, 0xE0, 0xD3, 0x94, 0x04, 0x40,
+0x05, 0x75, 0x0E, 0x08, 0x80, 0x1C, 0x90, 0x93, 0x21, 0xE0, 0x30, 0xE0, 0x0C, 0x13, 0x13, 0x54,
+0x3F, 0x30, 0xE0, 0x05, 0x75, 0x0E, 0x11, 0x80, 0x09, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01,
+0x80, 0x0E, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x0E, 0xF0, 0x7F, 0x00,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x86, 0xFA, 0x90, 0x00, 0x01, 0x02, 0x03, 0x0F, 0x74, 0x78,
+0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22, 0x8D, 0x78, 0xEF, 0x30, 0xE6, 0x1E,
+0xF1, 0x99, 0xF1, 0xA8, 0xE0, 0x54, 0x03, 0x90, 0x91, 0x0B, 0xF0, 0xE4, 0xFB, 0xAF, 0x78, 0x12,
+0x27, 0x3D, 0xF1, 0x8C, 0xE0, 0x90, 0x8A, 0x71, 0xF0, 0xA3, 0x74, 0x01, 0x80, 0x55, 0xF1, 0xB9,
+0x04, 0xF0, 0xF1, 0xB9, 0x64, 0x02, 0x70, 0x22, 0x74, 0x78, 0x25, 0x78, 0xF1, 0x02, 0xE0, 0xFD,
+0xF4, 0x60, 0x02, 0x80, 0x04, 0xF1, 0x99, 0xE0, 0xFD, 0xF1, 0xAA, 0x12, 0xC4, 0x36, 0xF1, 0x99,
+0xE0, 0x90, 0x8A, 0x71, 0xF0, 0xA3, 0x74, 0x02, 0x80, 0x29, 0xF1, 0xB9, 0xD3, 0x94, 0x03, 0x40,
+0x11, 0xAF, 0x78, 0x12, 0x6D, 0x94, 0xF1, 0x8C, 0xE0, 0x90, 0x8A, 0x71, 0xF0, 0xA3, 0x74, 0x03,
+0x80, 0x11, 0xF1, 0x99, 0xF1, 0xA8, 0x12, 0xC4, 0x36, 0xF1, 0x99, 0xE0, 0x90, 0x8A, 0x71, 0xF0,
+0xA3, 0x74, 0x02, 0xF0, 0xAB, 0x78, 0xE4, 0xFD, 0xFF, 0x02, 0x52, 0xC3, 0x74, 0xBC, 0x25, 0x78,
+0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xE5, 0x78, 0xC4, 0x54, 0xF0, 0x24, 0x00,
+0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0xE0, 0xFD, 0xE5, 0x78, 0xC4, 0x54, 0xF0, 0x24,
+0x05, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x74, 0xBC, 0x25, 0x78, 0xF5, 0x82, 0xE4,
+0x34, 0x90, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x92, 0x07, 0x02, 0x87, 0x03, 0xF9, 0xE4, 0x3A, 0xFA,
+0x02, 0x02, 0xF6, 0x7D, 0x05, 0x7F, 0x04, 0x02, 0xAE, 0xF6, 0xF0, 0x90, 0x85, 0xC3, 0xE0, 0x54,
+0x0F, 0x22, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x85, 0xC7, 0xE0, 0x22, 0xF0, 0x74, 0xCC, 0x2D,
+0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x22, 0x41, 0x81, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x3C, 0x12, 0x05,
+0x28, 0xE0, 0x22, 0x8B, 0x5B, 0x8A, 0x5C, 0x89, 0x5D, 0x90, 0x93, 0x2B, 0xE0, 0x70, 0x10, 0x12,
+0x02, 0xF6, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x06, 0x90, 0x93, 0x31, 0x74, 0x01, 0xF0, 0x90,
+0x93, 0x2D, 0xE0, 0x70, 0x0F, 0x11, 0xDD, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x05, 0x06, 0x90, 0x93,
+0x32, 0x74, 0x01, 0xF0, 0xAB, 0x5B, 0xAA, 0x5C, 0xA9, 0x5D, 0x12, 0x8E, 0xF8, 0xFF, 0xF5, 0x5F,
+0x12, 0x02, 0xF6, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x8B, 0xE6, 0xF5, 0x60, 0x80, 0x02,
+0x8F, 0x60, 0x85, 0x5F, 0x5E, 0xE5, 0x5E, 0xD3, 0x95, 0x60, 0x50, 0x28, 0x11, 0xDD, 0x54, 0x01,
+0xFD, 0xAF, 0x5E, 0x12, 0x6E, 0x5F, 0xAF, 0x5E, 0x12, 0x77, 0x39, 0xEF, 0xAF, 0x5E, 0x70, 0x04,
+0x11, 0x9E, 0x80, 0x02, 0xB1, 0x6D, 0x90, 0x93, 0x32, 0xE0, 0x60, 0x04, 0xAF, 0x5E, 0x11, 0x9E,
+0x05, 0x5E, 0x80, 0xD1, 0xE5, 0x5F, 0x70, 0x15, 0xFF, 0x12, 0x77, 0x39, 0xEF, 0x70, 0x0E, 0x51,
+0x5D, 0x12, 0x79, 0x61, 0x12, 0xA2, 0xF6, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x7D, 0x01,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x07, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x7D,
+0x44, 0x7F, 0x6F, 0x11, 0xE6, 0x11, 0xF1, 0x90, 0x92, 0x08, 0xE0, 0x90, 0x92, 0x07, 0xB4, 0x01,
+0x0A, 0xE0, 0x12, 0x8F, 0xAC, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x08, 0xE0, 0x12, 0x8F, 0xAC, 0xE0,
+0x54, 0xFB, 0xF0, 0xE4, 0xFD, 0xFF, 0x11, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAB, 0x5B, 0xAA,
+0x5C, 0xA9, 0x5D, 0x02, 0x02, 0xF6, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x92, 0xF9, 0xED, 0xF0,
+0x22, 0xE4, 0x90, 0x93, 0xAB, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0xAD, 0xF0,
+0x7D, 0x47, 0x7F, 0xFF, 0x11, 0xE6, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x13, 0xA3, 0xE0, 0x70, 0x0F,
+0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0x31, 0xCC, 0x11, 0xE6, 0x7F, 0x01, 0x22, 0xD3,
+0x90, 0x93, 0xAC, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0xAB, 0xE0, 0x94, 0x03, 0x40, 0x0E, 0x90, 0x01,
+0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x31, 0xCC, 0x11, 0xE6, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00,
+0x12, 0x7C, 0x9F, 0x90, 0x93, 0xAB, 0xF1, 0xE5, 0x80, 0xBC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x90, 0x92, 0xF3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x84, 0xC3, 0xE0, 0x04, 0xF0, 0x90,
+0x04, 0x1D, 0xE0, 0x60, 0x32, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x92, 0xF7, 0xF0, 0x7D, 0x26, 0x7F,
+0xFF, 0x11, 0xE6, 0x11, 0xF1, 0xEF, 0x64, 0x01, 0x70, 0x0A, 0x31, 0xD4, 0xFB, 0x7D, 0x01, 0x12,
+0x3A, 0xC2, 0x31, 0xDE, 0x90, 0x92, 0xF7, 0xE0, 0xFF, 0x7D, 0x27, 0x11, 0xE6, 0x90, 0x92, 0xF3,
+0xE0, 0xFF, 0x12, 0x5C, 0xA3, 0x80, 0x18, 0x90, 0x92, 0xF3, 0xE0, 0xFF, 0x12, 0x5C, 0xA3, 0x31,
+0xD4, 0xFB, 0x90, 0x93, 0xAA, 0x74, 0x0A, 0xF0, 0x7D, 0x01, 0x12, 0xBD, 0x47, 0x31, 0xDE, 0x90,
+0x04, 0x1F, 0x74, 0x20, 0xF0, 0x90, 0x84, 0xBF, 0xA3, 0xE0, 0x24, 0x7F, 0xF5, 0x82, 0xE4, 0x34,
+0x82, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0xAD, 0xE0,
+0xFF, 0x7D, 0x48, 0x22, 0x90, 0x84, 0xC8, 0xE0, 0xFF, 0x90, 0x92, 0xF4, 0xE0, 0x22, 0x90, 0x92,
+0xF5, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x92, 0xF3, 0xE0, 0xFF, 0x12, 0x65, 0x61,
+0x90, 0x92, 0xF5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x50, 0xD7, 0x90, 0x93, 0x21, 0xE0, 0x30,
+0xE0, 0x4D, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x14, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x93,
+0x23, 0x71, 0x89, 0xE4, 0x51, 0x50, 0x30, 0xE0, 0x02, 0x71, 0x71, 0x61, 0x78, 0x90, 0x93, 0x21,
+0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x27, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x93, 0x24,
+0x71, 0x89, 0x90, 0x93, 0x21, 0xE0, 0x54, 0xFB, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x7D,
+0x04, 0x7F, 0x01, 0x02, 0x57, 0x82, 0x7D, 0x31, 0x7F, 0xFF, 0x11, 0xE6, 0x12, 0xB9, 0x50, 0x22,
+0xFD, 0xFF, 0x11, 0xE6, 0x51, 0x5D, 0x90, 0x93, 0x21, 0xE0, 0xC3, 0x13, 0x22, 0xD3, 0x10, 0xAF,
+0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x02, 0x12, 0xB5, 0x75, 0x7F, 0x02, 0x12, 0xB3, 0xBE, 0x44, 0x02,
+0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4,
+0x74, 0x86, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x21, 0xE0, 0x30, 0xE0, 0x0E, 0x90,
+0x01, 0x57, 0xE4, 0xF0, 0x51, 0x50, 0x30, 0xE0, 0x02, 0x71, 0x71, 0x71, 0x78, 0x22, 0x12, 0x8F,
+0xC6, 0x12, 0x02, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x21, 0xE0, 0x54, 0xFE, 0x4E, 0xFE,
+0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x12, 0xA2, 0x84, 0x54, 0x04, 0x25, 0xE0, 0xFD,
+0xEF, 0x54, 0xF7, 0x4D, 0xFF, 0x90, 0x93, 0x21, 0xF0, 0xEE, 0x54, 0x08, 0x25, 0xE0, 0xFE, 0xEF,
+0x54, 0xEF, 0x4E, 0xF0, 0x90, 0x05, 0x52, 0xE0, 0x54, 0x07, 0xFF, 0x90, 0x92, 0x07, 0x60, 0x13,
+0x12, 0x8E, 0xF5, 0xFD, 0x90, 0x05, 0x56, 0xE0, 0xC3, 0x9D, 0x90, 0x93, 0x23, 0xF0, 0xA3, 0xED,
+0xF0, 0x80, 0x23, 0x12, 0x8E, 0xF5, 0xFB, 0xFF, 0x90, 0x05, 0x54, 0xE0, 0xC3, 0x9F, 0xFF, 0xE4,
+0x94, 0x00, 0xFE, 0x7C, 0x00, 0x7D, 0x05, 0x12, 0x03, 0x82, 0x90, 0x93, 0x23, 0xEF, 0xF0, 0xEB,
+0x75, 0xF0, 0x05, 0x84, 0xA3, 0xF0, 0x12, 0x89, 0x0E, 0x12, 0x02, 0xF6, 0x20, 0xE0, 0x0E, 0x51,
+0x5D, 0xE4, 0xFD, 0xFF, 0x11, 0xE6, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x80, 0x04, 0x71, 0x71, 0x71,
+0x78, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x20, 0xE0, 0x04, 0xEF, 0x54, 0xDF, 0xF0,
+0x51, 0x56, 0x30, 0xE0, 0x14, 0x90, 0x85, 0xC5, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x85, 0xC7, 0xF0,
+0xF1, 0x51, 0x90, 0x05, 0x58, 0x74, 0x05, 0xF0, 0x22, 0xE4, 0x90, 0x85, 0xC5, 0xF0, 0x90, 0x85,
+0xC7, 0x74, 0x0C, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0xA3, 0xE0, 0x54, 0xFB, 0xF0,
+0x22, 0x7D, 0x0C, 0x7F, 0x01, 0x02, 0x57, 0x82, 0x90, 0x93, 0x21, 0xE0, 0x44, 0x04, 0xF0, 0x22,
+0xF0, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x86, 0x6E, 0xE0, 0x90, 0x91, 0x6F, 0xF0, 0xE4, 0xFB,
+0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02, 0x61, 0x41, 0xE4, 0xF5, 0x77, 0x90, 0x85, 0xC5, 0xE0, 0x60,
+0x78, 0xB1, 0x8A, 0x70, 0x74, 0xF1, 0xF3, 0xF1, 0x59, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04,
+0x70, 0x1E, 0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x85, 0xCE, 0xE0,
+0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x77, 0x01,
+0xE5, 0x77, 0x60, 0x45, 0x90, 0x85, 0xC8, 0xE0, 0x20, 0xE2, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12,
+0x8D, 0x32, 0xF1, 0x69, 0x90, 0x85, 0xCE, 0xE0, 0x60, 0x04, 0x64, 0x01, 0x70, 0x13, 0xE4, 0x90,
+0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x91, 0x25, 0x71, 0x8A, 0x90, 0x85, 0xCE, 0xE0, 0x80,
+0x12, 0xE4, 0x90, 0x91, 0x6E, 0x91, 0x1A, 0x71, 0x8A, 0x90, 0x85, 0xCE, 0xE0, 0x75, 0xF0, 0x03,
+0xA4, 0x24, 0xFE, 0x91, 0x25, 0x90, 0x85, 0xDE, 0xF0, 0x22, 0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x75,
+0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x85, 0xCD, 0xE0, 0x2F, 0x22, 0x71, 0x98, 0xE4, 0xFF,
+0xF1, 0x77, 0x90, 0x92, 0xFB, 0xE0, 0x30, 0xE0, 0x03, 0x12, 0xBE, 0x4C, 0x41, 0x88, 0x90, 0x93,
+0x21, 0xE0, 0x30, 0xE0, 0x0C, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x93, 0x23, 0x71, 0x89, 0x71,
+0x78, 0x90, 0x84, 0xC5, 0xE0, 0xB4, 0x01, 0x16, 0x90, 0x93, 0x21, 0xE0, 0xFF, 0xC4, 0x54, 0x0F,
+0x20, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x03, 0x12, 0xC3, 0x68, 0x22, 0x90,
+0x92, 0x04, 0x12, 0x87, 0x03, 0x90, 0x92, 0x03, 0xEF, 0xF0, 0x12, 0x87, 0x0C, 0x94, 0xBD, 0x00,
+0x94, 0xC6, 0x01, 0x94, 0xCE, 0x08, 0x94, 0xD7, 0x09, 0x94, 0xE0, 0x0A, 0x94, 0xE9, 0x12, 0x94,
+0xF2, 0x13, 0x94, 0xFB, 0x14, 0x95, 0x04, 0x20, 0x95, 0x0D, 0x25, 0x95, 0x16, 0x26, 0x95, 0x1E,
+0x40, 0x95, 0x27, 0x42, 0x95, 0x30, 0x43, 0x95, 0x39, 0x44, 0x95, 0x6C, 0x47, 0x95, 0x6C, 0x49,
+0x95, 0x42, 0xC2, 0x95, 0x4B, 0xC3, 0x95, 0x54, 0xC4, 0x00, 0x00, 0x95, 0x5D, 0x90, 0x92, 0x04,
+0x12, 0x86, 0xFA, 0x02, 0x87, 0xF4, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x01, 0x03, 0x90, 0x92,
+0x04, 0x12, 0x86, 0xFA, 0x02, 0x98, 0x1B, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0x9F, 0xF5,
+0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0xA0, 0x0A, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02,
+0xA1, 0x44, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0xA2, 0x0E, 0x90, 0x92, 0x04, 0x12, 0x86,
+0xFA, 0x02, 0xB0, 0x03, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0x88, 0x45, 0x90, 0x92, 0x04,
+0x12, 0x86, 0xFA, 0x02, 0xB0, 0x12, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x41, 0x9E, 0x90, 0x92,
+0x04, 0x12, 0x86, 0xFA, 0x02, 0x89, 0x14, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0x4E, 0x29,
+0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0x28, 0xE6, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02,
+0x62, 0xFC, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0xB0, 0x1A, 0x90, 0x92, 0x04, 0x12, 0x86,
+0xFA, 0x02, 0xB0, 0x22, 0x90, 0x92, 0x04, 0x12, 0x86, 0xFA, 0x02, 0xB7, 0x5A, 0x90, 0x01, 0xC0,
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0x03, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0xE4, 0xFD, 0x01,
+0xA0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x02, 0xB1, 0xD0, 0x21, 0xFB, 0xB1, 0x8A, 0x70, 0x0A, 0x90,
+0x85, 0xC5, 0xE0, 0x60, 0x04, 0xF1, 0xAB, 0x71, 0x80, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xEF,
+0x64, 0x01, 0x22, 0xE4, 0x90, 0x92, 0xE4, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x31, 0xB1, 0x8A,
+0x70, 0x2D, 0xF1, 0x61, 0xF0, 0xF1, 0xF3, 0x90, 0x92, 0xE4, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x85,
+0xCC, 0xF0, 0x04, 0x60, 0x1A, 0x90, 0x85, 0xC8, 0xE0, 0x20, 0xE2, 0x07, 0x7D, 0x01, 0x7F, 0x04,
+0x12, 0x8D, 0x32, 0xF1, 0x69, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCD, 0x71, 0x89, 0x22,
+0xD1, 0x4C, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x10, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0,
+0x07, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x7C, 0x41, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x13, 0x13, 0x54,
+0x3F, 0x30, 0xE0, 0x0A, 0xEF, 0xF1, 0xDB, 0xF0, 0x54, 0x07, 0x70, 0x47, 0x80, 0x43, 0x90, 0x85,
+0xCE, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEF, 0xF0, 0x12, 0xC3, 0x33, 0xD3, 0x9F,
+0x40, 0x2F, 0xB1, 0x8A, 0x70, 0x2D, 0x12, 0x8F, 0xDB, 0x70, 0x05, 0x12, 0x70, 0xDB, 0x80, 0x24,
+0x12, 0x70, 0xDB, 0x90, 0x85, 0xCF, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, 0x40, 0x09, 0xD1,
+0x44, 0xE4, 0x90, 0x85, 0xCF, 0xF0, 0x80, 0x03, 0x12, 0x79, 0x41, 0xE4, 0x90, 0x85, 0xCE, 0xF0,
+0x22, 0xF1, 0xD1, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x85, 0xC2, 0xE0,
+0xFF, 0x13, 0x13, 0x22, 0xB1, 0x8A, 0x60, 0x02, 0xE1, 0x40, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02,
+0xE1, 0x40, 0x90, 0x05, 0x63, 0xE0, 0x90, 0x93, 0x3C, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x93,
+0x3D, 0xF0, 0x90, 0x05, 0x61, 0xE0, 0x90, 0x93, 0x3E, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x93,
+0x3F, 0xF0, 0xF1, 0xAB, 0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEC, 0xF0, 0x90, 0x85, 0xC3, 0xE0,
+0xFF, 0xC4, 0x54, 0x0F, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x03, 0x12, 0xC0, 0x1B, 0x90, 0x85, 0xC3,
+0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x85, 0xCC,
+0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x85, 0xCB, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x85,
+0xCB, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90, 0x85, 0xCC, 0xEF, 0xF0, 0x12, 0xC1, 0x45, 0xE4, 0x90,
+0x85, 0xCE, 0xF0, 0x12, 0xC1, 0x3B, 0xD1, 0x4C, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x60, 0xEF, 0xC4,
+0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x27, 0xF1, 0x49, 0x6F, 0x70, 0x52, 0x90, 0x85, 0xC2, 0xE0,
+0x44, 0x40, 0xF0, 0xF1, 0x61, 0xF1, 0x41, 0xFD, 0x7F, 0x03, 0x12, 0x7B, 0xFD, 0xF1, 0xEC, 0x7D,
+0x02, 0x7F, 0x02, 0x12, 0x7C, 0x41, 0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0, 0x80, 0x30, 0xF1, 0x59,
+0x64, 0x01, 0x70, 0x2A, 0xF1, 0x49, 0xFE, 0x6F, 0x60, 0x24, 0x90, 0x05, 0x73, 0xE0, 0xFF, 0xEE,
+0x6F, 0x60, 0x1B, 0xD1, 0x4C, 0x54, 0x3F, 0x30, 0xE0, 0x14, 0xEF, 0x54, 0xBF, 0xF1, 0x41, 0xFD,
+0x7F, 0x03, 0x12, 0x7B, 0xBF, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x7C, 0xA9, 0xF1, 0xA4, 0xF1, 0x51,
+0x22, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0x22, 0x90, 0x85, 0xCB, 0xE0, 0xFF, 0xA3, 0xE0,
+0x22, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x85, 0xC3, 0xE0, 0xC4, 0x54, 0x0F,
+0x22, 0x90, 0x85, 0xCB, 0xE0, 0x90, 0x05, 0x73, 0x22, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x10, 0xF0,
+0x22, 0xB1, 0x93, 0xF1, 0xA4, 0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93,
+0x37, 0xE0, 0xFE, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x15, 0x90, 0x92, 0xE4, 0x74, 0x1E, 0x12,
+0xA2, 0xEE, 0x90, 0x92, 0xE6, 0xEF, 0xF0, 0x7B, 0x01, 0x12, 0xA2, 0xFE, 0x12, 0xA5, 0x2A, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x7C, 0xA9, 0x90, 0x01, 0x57, 0xE4, 0xF0,
+0x90, 0x01, 0x3C, 0x74, 0x02, 0x22, 0xB1, 0x8A, 0x70, 0x16, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x10,
+0xF1, 0xAB, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0xF1, 0xDB, 0xF0, 0x54, 0x07, 0x70, 0x02, 0xF1, 0xD1,
+0x22, 0x90, 0x85, 0xC7, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x8D, 0x32, 0x54, 0xFB, 0xF0, 0x90, 0x85,
+0xC9, 0xE0, 0x54, 0xFD, 0x22, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x07, 0x0A, 0x7D, 0x01, 0x7F, 0x02,
+0x02, 0x7C, 0x41, 0x90, 0x05, 0x63, 0xE0, 0x90, 0x93, 0x40, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90,
+0x93, 0x41, 0xF0, 0x90, 0x05, 0x61, 0xE0, 0x90, 0x93, 0x42, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90,
+0x93, 0x43, 0xF0, 0x90, 0x93, 0x37, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x12, 0x8F, 0xC6, 0x12, 0x02,
+0xF6, 0x30, 0xE0, 0x14, 0x12, 0xA1, 0x0E, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x01, 0x70, 0x27, 0x90,
+0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x1E, 0x90, 0x93, 0x1D, 0xE0, 0x60, 0x16, 0x7D, 0x10,
+0xE4, 0xFF, 0x12, 0x7B, 0xBF, 0x90, 0x01, 0x3C, 0xE0, 0x30, 0xE4, 0x03, 0x74, 0x10, 0xF0, 0x90,
+0x01, 0x63, 0xE4, 0xF0, 0x11, 0xCB, 0x90, 0x92, 0x07, 0x12, 0x8E, 0xF5, 0x90, 0x92, 0xFC, 0x12,
+0x8B, 0xE5, 0x90, 0x92, 0xFD, 0xF0, 0x90, 0x92, 0xFC, 0xE0, 0x54, 0x01, 0x90, 0x93, 0x09, 0xF0,
+0x90, 0x92, 0xFC, 0xE0, 0x54, 0x02, 0x90, 0x93, 0x0A, 0xF0, 0x90, 0x92, 0xFC, 0xE0, 0x54, 0x04,
+0x90, 0x93, 0x0B, 0xF0, 0x90, 0x92, 0xFC, 0xE0, 0x54, 0x08, 0x90, 0x93, 0x0C, 0xF0, 0x90, 0x92,
+0xFC, 0xE0, 0x54, 0x10, 0x90, 0x93, 0x0D, 0xF0, 0x90, 0x92, 0xFD, 0xE0, 0x54, 0x01, 0x90, 0x93,
+0x0E, 0xF0, 0x90, 0x92, 0xFD, 0xE0, 0x54, 0x02, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x92, 0xFD, 0xE0,
+0x54, 0x04, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x92, 0xFD, 0xE0, 0x54, 0x08, 0x90, 0x93, 0x11, 0xF0,
+0x90, 0x92, 0xFD, 0xE0, 0x54, 0x10, 0x90, 0x93, 0x12, 0xF0, 0x22, 0xC2, 0xAF, 0xD1, 0xC4, 0x7D,
+0x08, 0xE4, 0xFF, 0x12, 0x7C, 0x41, 0xE4, 0x90, 0x93, 0x07, 0xF0, 0xA3, 0xF0, 0xD2, 0xAF, 0x22,
+0x90, 0x93, 0x18, 0xE0, 0x90, 0x92, 0xAE, 0xF0, 0x90, 0x93, 0x19, 0xE0, 0x90, 0x92, 0xAF, 0xF0,
+0x90, 0x93, 0x1A, 0xE0, 0x90, 0x92, 0xB0, 0xF0, 0x90, 0x93, 0x1B, 0xE0, 0x90, 0x92, 0xB1, 0xF0,
+0x90, 0x93, 0x1C, 0xE0, 0x90, 0x92, 0xB2, 0xF0, 0x90, 0x93, 0x09, 0xE0, 0x90, 0x92, 0xB3, 0xF0,
+0x90, 0x93, 0x0A, 0xE0, 0x90, 0x92, 0xB4, 0xF0, 0x90, 0x93, 0x0B, 0xE0, 0x90, 0x92, 0xB5, 0xF0,
+0x90, 0x93, 0x0C, 0xE0, 0x90, 0x92, 0xB6, 0xF0, 0x90, 0x93, 0x0D, 0xE0, 0x90, 0x92, 0xB7, 0xF0,
+0x90, 0x93, 0x0E, 0xE0, 0x90, 0x92, 0xB8, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x90, 0x92, 0xB9, 0xF0,
+0x90, 0x93, 0x10, 0xE0, 0x90, 0x92, 0xBA, 0xF0, 0x90, 0x93, 0x11, 0xE0, 0x90, 0x92, 0xBB, 0xF0,
+0x90, 0x93, 0x12, 0xE0, 0x90, 0x92, 0xBC, 0xF0, 0xE4, 0x90, 0x92, 0x57, 0xF0, 0x90, 0x92, 0xC2,
+0xD1, 0x23, 0x90, 0x92, 0x56, 0xF0, 0xB1, 0x9A, 0x50, 0x04, 0xB1, 0xB4, 0x80, 0xF8, 0x90, 0x01,
+0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0x12, 0xA1, 0x05, 0x90, 0x92, 0x4B, 0xF0, 0xA3, 0xD1, 0x70,
+0xB1, 0x9A, 0x50, 0x4A, 0xB1, 0xD6, 0x90, 0x92, 0x56, 0xE0, 0xFE, 0x24, 0xBD, 0xF5, 0x82, 0xE4,
+0x34, 0x92, 0xD1, 0x03, 0xE0, 0x24, 0x4D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF,
+0x74, 0x58, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xD1, 0x03, 0xE0, 0x24, 0x4E, 0xF9, 0xE4, 0x34,
+0xFC, 0xFA, 0x7B, 0x01, 0xEE, 0xD1, 0xA1, 0x12, 0x87, 0x03, 0xD1, 0x07, 0xE0, 0x24, 0x38, 0xF9,
+0xE4, 0x34, 0xFC, 0xFA, 0xEE, 0xD1, 0x93, 0x12, 0x87, 0x03, 0xB1, 0xC1, 0x80, 0xB2, 0x90, 0x02,
+0x87, 0xE0, 0x70, 0x02, 0xA1, 0x99, 0x90, 0x92, 0xFB, 0xE0, 0x20, 0xE0, 0x02, 0xA1, 0x99, 0xE4,
+0x90, 0x92, 0xC7, 0xD1, 0x23, 0x90, 0x92, 0x4B, 0xE0, 0xFF, 0xA3, 0xE0, 0xA3, 0xCF, 0xF0, 0xA3,
+0xEF, 0xF0, 0x90, 0x92, 0x4D, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0x90, 0xFD, 0x11, 0xF0, 0x74,
+0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0xFE, 0xD1, 0x88, 0xE0, 0x7A, 0x00,
+0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0x92, 0x4F, 0xF0, 0xA3, 0xF1, 0xD9, 0x54, 0x0F,
+0x33, 0x33, 0x33, 0x54, 0xF8, 0x90, 0x92, 0x52, 0xF0, 0xFC, 0x74, 0x07, 0x2D, 0xF5, 0x82, 0xE4,
+0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x90, 0x92, 0x54, 0xF0, 0xEC, 0x24, 0x18, 0x90, 0x92,
+0x51, 0xF0, 0xFD, 0x90, 0x92, 0x4D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x55, 0x36, 0xEF, 0x54,
+0xFC, 0x90, 0x92, 0x53, 0xF0, 0x90, 0x92, 0x52, 0xE0, 0x24, 0x18, 0xFF, 0xE4, 0x33, 0x90, 0x92,
+0x4F, 0x8F, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x92, 0x4F, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x7A,
+0xD0, 0x90, 0x92, 0x4B, 0xEE, 0x8F, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x85, 0xB7, 0xE0, 0xFE, 0xA3,
+0xE0, 0xFF, 0x90, 0x92, 0x4B, 0x12, 0xAF, 0xAF, 0x40, 0x1B, 0x90, 0x85, 0xB8, 0xE0, 0x24, 0x01,
+0xFF, 0x90, 0x85, 0xB7, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xED, 0x9F, 0xFF, 0xEC, 0x9E, 0x90, 0x92,
+0x4B, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x53, 0xE0, 0x24, 0xC0, 0x60, 0x02, 0x81, 0x98, 0xB1,
+0xA7, 0x24, 0x18, 0xFD, 0x12, 0x55, 0x36, 0xEF, 0x60, 0x02, 0x81, 0x8A, 0xB1, 0xA7, 0x24, 0x19,
+0xFD, 0x12, 0x55, 0x36, 0x90, 0x92, 0x6C, 0xD1, 0x78, 0x90, 0x92, 0x6C, 0xE0, 0xFF, 0xB1, 0xE5,
+0x9F, 0x50, 0x15, 0xB1, 0xA7, 0x24, 0x1A, 0xD1, 0x61, 0x90, 0x92, 0x55, 0xE0, 0x24, 0x6D, 0xF5,
+0x82, 0xE4, 0x34, 0x92, 0xB1, 0xEC, 0x80, 0xE1, 0x90, 0x92, 0x6C, 0xE0, 0x70, 0x02, 0x61, 0xB9,
+0xE4, 0x90, 0x92, 0x56, 0xF0, 0xB1, 0x9A, 0x40, 0x02, 0x61, 0xA1, 0xB1, 0xD6, 0x90, 0x92, 0x56,
+0xE0, 0xFF, 0x24, 0x58, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0x90, 0x92, 0x6C,
+0xE0, 0xFD, 0xEE, 0x6D, 0x70, 0x20, 0xEF, 0xD1, 0xA1, 0x12, 0x86, 0xFA, 0xC0, 0x03, 0xC0, 0x02,
+0xC0, 0x01, 0xB1, 0xF7, 0x90, 0x92, 0xD2, 0xED, 0xF0, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0xD1,
+0x2D, 0xEF, 0x60, 0x02, 0x80, 0x4E, 0x90, 0x92, 0x6C, 0xE0, 0x64, 0x03, 0x70, 0x55, 0xB1, 0xF7,
+0x90, 0x92, 0xD2, 0x74, 0x03, 0xF0, 0x7A, 0x93, 0x79, 0xA3, 0xD1, 0x2D, 0xEF, 0x70, 0x11, 0xB1,
+0xF7, 0x90, 0x92, 0xD2, 0x74, 0x03, 0xF0, 0x7A, 0x93, 0x79, 0x9F, 0xD1, 0x2D, 0xEF, 0x60, 0x2B,
+0x90, 0x92, 0x56, 0xE0, 0xFF, 0x24, 0xB8, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x60,
+0x02, 0x80, 0x0C, 0x90, 0x92, 0x56, 0xE0, 0xFF, 0x24, 0xB3, 0xD1, 0x80, 0xE0, 0x60, 0x05, 0x74,
+0xC7, 0x2F, 0x80, 0x15, 0xB1, 0xC8, 0x74, 0x01, 0xF0, 0x80, 0x12, 0x90, 0x92, 0x56, 0xE0, 0x24,
+0xC7, 0x80, 0x06, 0x90, 0x92, 0x56, 0xE0, 0x24, 0xC7, 0xB1, 0xCE, 0xE4, 0xF0, 0xB1, 0xC1, 0x41,
+0xF5, 0x90, 0x92, 0xC7, 0xE0, 0x70, 0x50, 0xA3, 0xE0, 0x70, 0x4C, 0xA3, 0xE0, 0x70, 0x48, 0xA3,
+0xE0, 0x70, 0x44, 0xA3, 0xE0, 0x70, 0x40, 0x81, 0x8A, 0xE4, 0x90, 0x92, 0x56, 0xF0, 0xB1, 0x9A,
+0x50, 0x1D, 0x74, 0xB3, 0x2E, 0xD1, 0x80, 0xE0, 0x60, 0x09, 0x74, 0xC7, 0x2E, 0xB1, 0xCE, 0xE4,
+0xF0, 0x80, 0x08, 0x74, 0xC7, 0x2E, 0xB1, 0xCE, 0x74, 0x01, 0xF0, 0xB1, 0xC1, 0x80, 0xDF, 0x90,
+0x92, 0xC7, 0xE0, 0x70, 0x12, 0xA3, 0xE0, 0x70, 0x0E, 0xA3, 0xE0, 0x70, 0x0A, 0xA3, 0xE0, 0x70,
+0x06, 0xA3, 0xE0, 0x70, 0x02, 0x81, 0x8A, 0xE4, 0x90, 0x92, 0x56, 0xF0, 0xB1, 0x9A, 0x40, 0x02,
+0x81, 0x8A, 0xB1, 0xD6, 0xB1, 0xC8, 0xE0, 0x60, 0x7D, 0x90, 0x93, 0x21, 0xE0, 0x30, 0xE0, 0x07,
+0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x6F, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x10,
+0xD3, 0xEF, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x50, 0x07, 0x0F, 0xBF, 0x00, 0x01, 0x0E, 0x80, 0xEA,
+0x90, 0x04, 0x1D, 0xE0, 0x70, 0x50, 0x90, 0x92, 0x56, 0xE0, 0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34,
+0x92, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0xAA, 0x74, 0x06, 0xF0, 0x7B, 0x08, 0x7D, 0x01, 0x12,
+0xBD, 0x47, 0x90, 0x92, 0x4F, 0xEE, 0xF0, 0xA3, 0xD1, 0x78, 0xB1, 0xE5, 0x94, 0x06, 0x50, 0x1C,
+0xB1, 0xA7, 0x24, 0x0A, 0xD1, 0x61, 0x90, 0x92, 0x4F, 0xA3, 0xE0, 0xFE, 0x90, 0x92, 0x55, 0xE0,
+0x2E, 0x24, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xB1, 0xEC, 0x80, 0xDE, 0x90, 0x04, 0x1F, 0x74,
+0x20, 0xF0, 0x90, 0x06, 0x35, 0xF0, 0xB1, 0xC1, 0x61, 0xFC, 0xD1, 0x68, 0xFF, 0x12, 0x7C, 0x0B,
+0x90, 0x06, 0x36, 0x74, 0xDD, 0xF0, 0x21, 0xCE, 0x90, 0x92, 0x54, 0xE0, 0x60, 0x02, 0xA1, 0x91,
+0xB1, 0xA7, 0x24, 0x16, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x06, 0x34, 0xEF, 0xF0, 0xB1, 0xA7, 0x24,
+0x17, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x06, 0x37, 0xD1, 0x70, 0xB1, 0x9A, 0x50, 0x41, 0xB1, 0xD6,
+0xE4, 0x90, 0x92, 0x55, 0xF0, 0xB1, 0xE5, 0x94, 0x06, 0x50, 0x30, 0xB1, 0xA7, 0x24, 0x04, 0x2D,
+0xFD, 0x12, 0x55, 0x36, 0x90, 0x92, 0x56, 0xE0, 0xFE, 0xD1, 0x93, 0x12, 0x86, 0xFA, 0x90, 0x92,
+0x55, 0xE0, 0xF5, 0x82, 0xD1, 0x5B, 0x6F, 0x60, 0x0E, 0x74, 0xC2, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
+0x92, 0xF5, 0x83, 0xE4, 0xF0, 0x80, 0x04, 0xB1, 0xF0, 0x80, 0xCA, 0xB1, 0xC1, 0x80, 0xBB, 0x90,
+0x92, 0xC2, 0xE0, 0x64, 0x01, 0x60, 0x17, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x11, 0xA3, 0xE0, 0x64,
+0x01, 0x60, 0x0B, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x05, 0xA3, 0xE0, 0xB4, 0x01, 0x06, 0x90, 0x92,
+0x57, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x57, 0xE0, 0x64, 0x01, 0x70, 0x4F, 0x11, 0xCB, 0xF1, 0xED,
+0xFF, 0x12, 0x5F, 0xE9, 0x90, 0x93, 0x1D, 0xE0, 0x70, 0x02, 0x21, 0xCE, 0x90, 0x01, 0x3C, 0xE0,
+0x30, 0xE4, 0x03, 0x74, 0x10, 0xF0, 0x7D, 0x10, 0xE4, 0xFF, 0x12, 0x7B, 0xFD, 0x90, 0x93, 0x1E,
+0xE0, 0x60, 0x08, 0xF5, 0x25, 0xE4, 0xF5, 0x26, 0xFB, 0x80, 0x15, 0x90, 0x93, 0x1F, 0xE0, 0x60,
+0x08, 0xFB, 0xE4, 0xF5, 0x25, 0xF5, 0x26, 0x80, 0x07, 0x75, 0x25, 0x20, 0xE4, 0xF5, 0x26, 0xFB,
+0x7D, 0x01, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x76, 0x3D, 0x21, 0xCE, 0xE4, 0x90, 0x92, 0x57, 0xF0,
+0x90, 0x92, 0xC2, 0xD1, 0x23, 0x90, 0x92, 0x56, 0xF0, 0xB1, 0x9A, 0x50, 0x04, 0xB1, 0xB4, 0x80,
+0xF8, 0xD1, 0x68, 0xFF, 0x12, 0x7C, 0x0B, 0x21, 0xCE, 0x22, 0x90, 0x93, 0x06, 0xE0, 0xFF, 0x90,
+0x92, 0x56, 0xE0, 0xFE, 0xC3, 0x9F, 0x22, 0x90, 0x92, 0x4D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90,
+0x92, 0x51, 0xE0, 0x22, 0x74, 0xC2, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x74, 0x01,
+0xF0, 0x90, 0x92, 0x56, 0xE0, 0x04, 0xF0, 0x22, 0x90, 0x92, 0x56, 0xE0, 0x24, 0xC7, 0xF5, 0x82,
+0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0x74, 0xAE, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83,
+0xE0, 0xFF, 0x02, 0x7B, 0x2A, 0x90, 0x92, 0x55, 0xE0, 0xFD, 0xC3, 0x22, 0xF5, 0x83, 0xEF, 0xF0,
+0x90, 0x92, 0x55, 0xE0, 0x04, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x6D, 0x90, 0x92, 0xCF,
+0x02, 0x87, 0x03, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xBD, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5,
+0x83, 0x22, 0x90, 0x93, 0x77, 0xE0, 0xFF, 0x90, 0x92, 0x5D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4,
+0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x92, 0xCC,
+0x12, 0x87, 0x03, 0xE4, 0xFF, 0x90, 0x92, 0xD2, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x14, 0x90,
+0x92, 0xCF, 0xD1, 0x56, 0xFE, 0x90, 0x92, 0xCC, 0xD1, 0x56, 0x6E, 0x60, 0x03, 0x7F, 0x00, 0x22,
+0x0F, 0x80, 0xE2, 0x7F, 0x01, 0x22, 0x12, 0x86, 0xFA, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x02, 0x03,
+0x0F, 0xFC, 0xED, 0x2C, 0xFD, 0x02, 0x55, 0x36, 0x90, 0x92, 0x4B, 0xE0, 0xFE, 0xA3, 0xE0, 0x22,
+0xEF, 0xF0, 0xE4, 0x90, 0x92, 0x56, 0xF0, 0x22, 0xEF, 0xF0, 0xE4, 0x90, 0x92, 0x55, 0xF0, 0x22,
+0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB,
+0xF5, 0x83, 0x22, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x9F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83,
+0x22, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x5D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xD1,
+0xC4, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x02, 0xD1, 0x25, 0x90, 0x93, 0x1D, 0xF0, 0xA3,
+0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x92, 0xFB, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xF1, 0xE7, 0x12, 0x7B,
+0xEF, 0x12, 0x3C, 0x03, 0x12, 0xBA, 0x08, 0x12, 0xBE, 0x9A, 0xD1, 0xE8, 0xD1, 0xAF, 0x12, 0xBC,
+0xEE, 0x90, 0x93, 0x29, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x93, 0x21, 0xE0, 0x54, 0xFE, 0xF0, 0x54,
+0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x44, 0x10, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0x64, 0x02, 0x70,
+0x2D, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x93, 0x27, 0xF1,
+0x8F, 0x7E, 0x00, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0x93, 0x25, 0xF1, 0x8F, 0x7E, 0x00, 0x30,
+0xE2, 0x02, 0x7E, 0x01, 0x90, 0x93, 0x26, 0xF1, 0x8F, 0x90, 0x02, 0xFB, 0xF0, 0x22, 0xEF, 0x64,
+0x01, 0x70, 0x21, 0xF1, 0x88, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x93, 0x27, 0xEF, 0xF0, 0xF1,
+0x88, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x93, 0x25, 0xEF, 0xF0, 0xF1, 0x88, 0x30, 0xE2, 0x02,
+0x7F, 0x01, 0x80, 0x27, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x03, 0x70, 0x24, 0xF1, 0x81, 0x30, 0xE0,
+0x02, 0x7F, 0x01, 0x90, 0x93, 0x27, 0xEF, 0xF0, 0xF1, 0x81, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90,
+0x93, 0x25, 0xEF, 0xF0, 0xF1, 0x81, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90, 0x93, 0x26, 0xEF, 0xF0,
+0x22, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x22, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0xEE,
+0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xD1, 0x8B, 0xE4, 0xF0,
+0x0C, 0xEC, 0xB4, 0x18, 0xF3, 0xD1, 0x88, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D,
+0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xF1, 0xD9, 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, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82,
+0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xE4, 0xFD, 0xFF, 0x02, 0x6E, 0x5F, 0x90, 0x01, 0xC7,
+0x74, 0x66, 0xF0, 0xE4, 0x22, 0x12, 0x8F, 0xC6, 0x12, 0x89, 0x0E, 0x12, 0xA0, 0x1E, 0x75, 0x1E,
+0x05, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x13, 0x02, 0x6A, 0x21, 0x12, 0x8F, 0xC6, 0x12, 0x89, 0x0E,
+0x11, 0x1E, 0x75, 0x1E, 0x05, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x18, 0x02, 0x6A, 0x21, 0x8B, 0x1B,
+0x8A, 0x1C, 0x89, 0x1D, 0x22, 0x90, 0x92, 0x21, 0xEF, 0xF0, 0xA3, 0x12, 0x87, 0x03, 0x90, 0x93,
+0xB8, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x03, 0x4E, 0x74, 0x00, 0x2F, 0xF9,
+0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x92, 0x22, 0x12,
+0x86, 0xFA, 0x11, 0x1E, 0x75, 0x1E, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x6A, 0x21,
+0x90, 0x92, 0x21, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0,
+0x02, 0xC0, 0x01, 0xA3, 0x12, 0x86, 0xFA, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x1B, 0xF5,
+0x1C, 0x89, 0x1D, 0x90, 0x92, 0x22, 0x11, 0x93, 0xF5, 0x1E, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03,
+0x02, 0x6A, 0x21, 0x12, 0x86, 0xFA, 0x90, 0x00, 0x0E, 0x02, 0x03, 0x0F, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x25, 0x12, 0x87, 0x03, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x66, 0x80,
+0xEF, 0x60, 0x45, 0x11, 0xFD, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x92, 0x28,
+0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x92, 0x28, 0xE0, 0xFD, 0x90, 0x02, 0x94,
+0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x25, 0x11, 0x93, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12,
+0x5A, 0xA5, 0x90, 0x92, 0x28, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x92, 0x25, 0x12, 0x86, 0xFA, 0x12,
+0x56, 0xF4, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0x17,
+0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x22, 0x11, 0xFD,
+0x90, 0x85, 0xB7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x92,
+0xFB, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x7C, 0xA9, 0x90, 0x05, 0x52, 0xE0,
+0x54, 0x07, 0x04, 0x90, 0x93, 0x06, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x04, 0x22, 0xE0,
+0x54, 0xEF, 0xF0, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x93, 0x20, 0xF0, 0xBF, 0x01, 0x07, 0x31,
+0x57, 0xE4, 0x90, 0x93, 0x20, 0xF0, 0x22, 0x51, 0x07, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x64, 0x37,
+0xBF, 0x01, 0x06, 0x90, 0x92, 0x07, 0xE0, 0xA3, 0xF0, 0x51, 0x07, 0x7F, 0xF6, 0x7E, 0x01, 0x12,
+0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x09, 0xF0, 0x51, 0x07, 0x7F,
+0xF4, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x0A,
+0xF0, 0x51, 0x07, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07,
+0xE0, 0x90, 0x92, 0x0B, 0xF0, 0x51, 0x07, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01,
+0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x0C, 0xF0, 0x90, 0x92, 0x08, 0xE0, 0xFF, 0xA3, 0xE0,
+0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x92, 0x10, 0xF0, 0x90, 0x92, 0x0C, 0xE0, 0x90, 0x92,
+0x11, 0xF0, 0x90, 0x92, 0x12, 0x74, 0x12, 0xF0, 0x90, 0x92, 0x20, 0x74, 0x05, 0xF0, 0x90, 0x92,
+0x14, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x92, 0x10, 0xE0, 0x90, 0x92, 0x17,
+0xF0, 0x90, 0x92, 0x11, 0xE0, 0x90, 0x92, 0x18, 0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x12, 0x12,
+0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xDA, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x07, 0x22, 0x12, 0x02,
+0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90, 0x89, 0x16, 0xE0, 0x54, 0x7F, 0x4E, 0xFE, 0xF0, 0xEF, 0x54,
+0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x51, 0x84, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90,
+0x89, 0x16, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x02, 0xF6,
+0x54, 0x0F, 0xFE, 0xEF, 0x54, 0xF0, 0x4E, 0x90, 0x89, 0x16, 0xF0, 0x12, 0x8E, 0xF8, 0xFF, 0x54,
+0x7F, 0x90, 0x89, 0x18, 0xF0, 0xEF, 0x12, 0x8B, 0xEE, 0xFF, 0x90, 0x89, 0x17, 0xE0, 0x54, 0xFE,
+0x12, 0x8B, 0xE4, 0x90, 0x89, 0x19, 0xF0, 0x90, 0x00, 0x03, 0x12, 0x03, 0x0F, 0x54, 0x01, 0x25,
+0xE0, 0xFF, 0x90, 0x89, 0x17, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0x51, 0x8C, 0x20, 0xE0, 0x02, 0x7D,
+0x01, 0x02, 0x54, 0x9F, 0x4F, 0xFF, 0xF0, 0x12, 0x02, 0xF6, 0xFE, 0x22, 0x90, 0x89, 0x16, 0xE0,
+0xFE, 0x54, 0x0F, 0xFF, 0xEE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x7D, 0x00, 0x22, 0x90, 0x89, 0x16,
+0xE0, 0xFF, 0x12, 0x8B, 0xF0, 0x30, 0xE0, 0x1A, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x02, 0x51,
+0xC3, 0x90, 0x89, 0x17, 0xE0, 0x30, 0xE0, 0x0A, 0x51, 0x8C, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12,
+0x54, 0x9F, 0x22, 0xE4, 0x90, 0x92, 0xE6, 0xF0, 0x90, 0x92, 0xE4, 0x74, 0x14, 0x51, 0xEE, 0xFB,
+0x51, 0xFE, 0x02, 0x87, 0xDA, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x11, 0x90, 0x06, 0x92, 0xE0, 0x30,
+0xE1, 0x05, 0x12, 0x6B, 0x98, 0x80, 0x05, 0x51, 0xF6, 0x12, 0x97, 0xD1, 0x80, 0xAF, 0xF0, 0x90,
+0x92, 0xF2, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xF7, 0xF0, 0x22, 0x7A, 0x92,
+0x79, 0xE4, 0x12, 0x5E, 0x10, 0x7F, 0x04, 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, 0x08, 0xF0, 0x74, 0xA3, 0xA3, 0xF0, 0x12,
+0x75, 0x28, 0xE5, 0x56, 0x30, 0xE1, 0x03, 0x12, 0x95, 0x71, 0xE5, 0x56, 0x30, 0xE2, 0x02, 0x51,
+0xD5, 0xE5, 0x56, 0x30, 0xE4, 0x02, 0x91, 0x2F, 0xE5, 0x57, 0x30, 0xE0, 0x02, 0x71, 0xFC, 0xE5,
+0x59, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0xB1, 0x2A, 0xE5, 0x59, 0x30, 0xE4, 0x03, 0x12, 0x97, 0x71,
+0xE5, 0x59, 0x30, 0xE5, 0x02, 0x71, 0x94, 0xE5, 0x59, 0x30, 0xE6, 0x02, 0x71, 0xC1, 0x74, 0x08,
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xA3, 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, 0x85, 0xC1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0,
+0x1F, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x85, 0xC2, 0x30, 0xE0, 0x06, 0xE0,
+0x44, 0x01, 0xF0, 0x80, 0x08, 0xE0, 0x54, 0xFE, 0x71, 0xF1, 0x74, 0x04, 0xF0, 0x12, 0x97, 0xD1,
+0x22, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x12, 0x8B, 0xF0, 0x30, 0xE0, 0x24, 0xEF, 0x54, 0x7F, 0xF0,
+0x90, 0x04, 0xE0, 0xE0, 0x90, 0x85, 0xC2, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x07,
+0xE0, 0x54, 0xFD, 0x71, 0xF1, 0x04, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x03, 0x12, 0x97, 0xD1,
+0x22, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x22, 0x12, 0xBD, 0xFD, 0x90,
+0x92, 0xE4, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12,
+0x57, 0x82, 0x90, 0x92, 0xE4, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04,
+0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x91, 0x36, 0x02, 0x51, 0x7D, 0x12,
+0x9F, 0xED, 0xFF, 0x02, 0x5F, 0xE9, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x85,
+0xDE, 0xE0, 0xFB, 0x22, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0xA1, 0x09, 0x90, 0x85, 0xDC, 0xE0,
+0x04, 0xF0, 0x90, 0x05, 0x61, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x08, 0x12, 0x04, 0xD8,
+0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x05, 0x60, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD,
+0xFE, 0x12, 0x86, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0xE0,
+0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x10, 0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01,
+0xD0, 0x00, 0x12, 0x86, 0xD5, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0xE0, 0xFF,
+0xE4, 0xFC, 0xFD, 0xFE, 0x78, 0x18, 0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0,
+0x00, 0x12, 0x86, 0xD5, 0x90, 0x85, 0xFC, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x37, 0xE0,
+0x54, 0xFE, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0C, 0x91, 0x36, 0x12, 0x51, 0x7D, 0x90, 0x93,
+0x37, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x85, 0xC2, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0,
+0x11, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x0A, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x7C, 0x41, 0x12,
+0x97, 0xEC, 0x90, 0x93, 0xBC, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01,
+0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0xF1, 0x42, 0xFF, 0xBF, 0x03, 0x14, 0x90,
+0x93, 0x29, 0xE0, 0xB4, 0x01, 0x0D, 0x90, 0x01, 0xB8, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x21, 0xE0,
+0x44, 0x80, 0xF0, 0x7F, 0x01, 0xB1, 0x2A, 0x02, 0x94, 0x3E, 0x8F, 0x0D, 0x7F, 0x02, 0x12, 0x86,
+0x27, 0x90, 0x84, 0xC1, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0x90, 0x92, 0xD3, 0xEF, 0xF0, 0x90, 0x04,
+0x7E, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92, 0xE3, 0xF0, 0xE0, 0xFE, 0x6F, 0x60, 0x65, 0x90, 0x92,
+0xD4, 0x74, 0x03, 0xF0, 0x90, 0x92, 0xE2, 0x74, 0x08, 0xF0, 0xEE, 0x04, 0x54, 0x0F, 0xFF, 0xE4,
+0xFE, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5,
+0x82, 0x2E, 0xB1, 0xBA, 0xE0, 0xFD, 0x74, 0xD6, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83,
+0xED, 0xF0, 0x0E, 0xEE, 0xB4, 0x08, 0xDA, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0xD4, 0x12, 0x5E, 0x10,
+0x90, 0x92, 0xE3, 0xE0, 0x04, 0x54, 0x0F, 0xFF, 0xF0, 0xBF, 0x0F, 0x02, 0xE4, 0xF0, 0x90, 0x92,
+0xE3, 0xE0, 0x90, 0x04, 0x7F, 0xF0, 0x90, 0x92, 0xD3, 0xE0, 0x7F, 0x04, 0x70, 0x02, 0xA1, 0x2A,
+0x12, 0x87, 0xDA, 0x22, 0x12, 0x05, 0x28, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5,
+0x83, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x92, 0x01, 0xE0,
+0xFD, 0x70, 0x02, 0xC1, 0xD4, 0x90, 0x85, 0x1D, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09,
+0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x85, 0x1E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02,
+0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x93, 0xB7,
+0xE0, 0x12, 0xA9, 0x03, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D,
+0x70, 0x02, 0xC1, 0xB1, 0xE4, 0x90, 0x92, 0x02, 0xF0, 0x90, 0x92, 0x02, 0xE0, 0xF9, 0xC3, 0x94,
+0x04, 0x50, 0x3F, 0x90, 0x93, 0xB7, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00,
+0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0xD1, 0xD5, 0x90, 0x84, 0xCD, 0xB1, 0xB4, 0xEF,
+0xF0, 0x90, 0x93, 0xB7, 0xE0, 0x75, 0xF0, 0x04, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74,
+0xF0, 0xD1, 0xD5, 0x90, 0x84, 0xD1, 0xB1, 0xB4, 0xEF, 0xF0, 0x90, 0x92, 0x02, 0xE0, 0x04, 0xF0,
+0x80, 0xB7, 0x90, 0x92, 0x01, 0xE0, 0xFF, 0x90, 0x93, 0xB7, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06,
+0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x93, 0xB7,
+0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC,
+0xF0, 0x90, 0x93, 0xB7, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x85, 0x1E, 0xF1, 0x6A,
+0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0xA1, 0xCC, 0xE4, 0x90, 0x85, 0x1E, 0xF0, 0xA1,
+0xCC, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x93, 0xB7, 0xE0, 0x44, 0x80, 0x90, 0x00,
+0x8A, 0xF0, 0x90, 0x93, 0xB7, 0xE0, 0x75, 0xF0, 0x04, 0x90, 0x01, 0xD0, 0x12, 0x05, 0x28, 0xE0,
+0x90, 0x01, 0xC3, 0xF0, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90,
+0x85, 0x1E, 0xE0, 0x75, 0xF0, 0x08, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93,
+0xB9, 0xEF, 0xF0, 0x7F, 0x8F, 0x12, 0x7B, 0x51, 0xEF, 0x30, 0xE6, 0x3D, 0x7F, 0x8D, 0x12, 0x7B,
+0x51, 0xEF, 0x64, 0x01, 0x70, 0x33, 0x90, 0x93, 0xBA, 0xF0, 0x90, 0x93, 0xBA, 0xE0, 0xFD, 0x90,
+0x93, 0xB9, 0xE0, 0x12, 0x8F, 0x9B, 0xE5, 0x82, 0x2D, 0xB1, 0xBA, 0xE0, 0xFB, 0xE4, 0xFF, 0x12,
+0x8B, 0xB0, 0x90, 0x93, 0xBA, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xDC, 0x7F, 0x8F,
+0x12, 0x7B, 0x51, 0xEF, 0x30, 0xE0, 0x02, 0xF1, 0x71, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF,
+0xA1, 0x39, 0x90, 0x01, 0x02, 0xE0, 0x54, 0x03, 0x22, 0xF1, 0x42, 0xFF, 0xBF, 0x03, 0x02, 0xF1,
+0x62, 0x22, 0xE4, 0xF5, 0x77, 0xF5, 0x78, 0xF5, 0x79, 0xF1, 0x42, 0xFF, 0xBF, 0x03, 0x02, 0xF1,
+0x62, 0x22, 0x90, 0x05, 0x21, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00,
+0x22, 0xE4, 0xFD, 0x7F, 0x8D, 0x02, 0x7B, 0x3E, 0x12, 0x40, 0xB9, 0x7F, 0x02, 0xA1, 0x2A, 0x90,
+0x92, 0xFB, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x20, 0xB1, 0x2A, 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, 0x8B, 0xF0, 0x74, 0xA7,
+0xA3, 0xF0, 0x12, 0x71, 0x90, 0xE5, 0x4C, 0x30, 0xE1, 0x02, 0xF1, 0x3E, 0xE5, 0x4C, 0x30, 0xE3,
+0x02, 0xF1, 0x7F, 0xE5, 0x4C, 0x30, 0xE4, 0x02, 0xF1, 0x78, 0xE5, 0x4C, 0x30, 0xE5, 0x03, 0x12,
+0xBD, 0x0B, 0xE5, 0x4E, 0x30, 0xE0, 0x03, 0x12, 0x94, 0x2C, 0xE5, 0x4E, 0x30, 0xE1, 0x02, 0x91,
+0x44, 0xE5, 0x4E, 0x30, 0xE2, 0x03, 0x12, 0xB9, 0x22, 0xE5, 0x4E, 0x30, 0xE3, 0x03, 0x12, 0x95,
+0x7B, 0xE5, 0x4E, 0x30, 0xE4, 0x03, 0x12, 0x97, 0xB6, 0xE5, 0x4E, 0x30, 0xE5, 0x03, 0x12, 0xB9,
+0x34, 0xE5, 0x4E, 0x30, 0xE6, 0x02, 0x11, 0xCD, 0xE5, 0x4E, 0x30, 0xE7, 0x03, 0x12, 0xA7, 0x52,
+0xE5, 0x4F, 0x30, 0xE0, 0x03, 0x12, 0xA7, 0x49, 0xE5, 0x4F, 0x30, 0xE1, 0x02, 0x11, 0xC3, 0xE5,
+0x4F, 0x30, 0xE4, 0x02, 0xF1, 0xF0, 0xE5, 0x4F, 0x30, 0xE5, 0x02, 0x11, 0x53, 0x74, 0x8B, 0x04,
+0x90, 0x01, 0xC4, 0xF0, 0x74, 0xA7, 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, 0x77, 0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE5, 0x77, 0xC3, 0x9F, 0x50,
+0x61, 0xAF, 0x77, 0x12, 0x77, 0x39, 0xEF, 0x60, 0x55, 0xE5, 0x77, 0x13, 0x13, 0x13, 0x54, 0x1F,
+0xFF, 0xE5, 0x77, 0x54, 0x07, 0xFE, 0x74, 0x75, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83,
+0xE0, 0xFD, 0xAF, 0x06, 0x31, 0x04, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF,
+0xEF, 0x5D, 0x60, 0x2A, 0xE5, 0x77, 0xF1, 0xF5, 0x20, 0xE7, 0x02, 0x80, 0x13, 0xE5, 0x77, 0xC4,
+0x54, 0xF0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0x20, 0xE7, 0x09,
+0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x05, 0xAD, 0x77, 0x12, 0x8F, 0x0A, 0x05, 0x77,
+0x80, 0x94, 0x22, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x03, 0x12, 0xC3, 0x3D, 0x22, 0xE4, 0xFF, 0x12,
+0x77, 0x39, 0xBF, 0x01, 0x10, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0A, 0x11, 0xE6, 0xF0, 0x54, 0x07,
+0x70, 0x03, 0x12, 0x97, 0xD1, 0x22, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xFE, 0x22, 0x13, 0x13, 0x13,
+0x54, 0x1F, 0x24, 0x75, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFD, 0x7C, 0x00, 0xE5,
+0x62, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0x90, 0x04, 0x85, 0xE0,
+0xF5, 0x6B, 0x90, 0x93, 0x77, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x62, 0x90, 0x85, 0xBB, 0xE0, 0xFF,
+0xE5, 0x62, 0xC3, 0x9F, 0x40, 0x02, 0xC1, 0xB5, 0xE5, 0x62, 0x12, 0x8F, 0x9B, 0xE0, 0xF5, 0x6D,
+0x12, 0xC4, 0x6C, 0xF5, 0x83, 0xE0, 0x65, 0x6D, 0x60, 0x18, 0x90, 0x8A, 0x71, 0xE5, 0x6D, 0xF0,
+0xE4, 0xA3, 0xF0, 0xAB, 0x62, 0xFD, 0xFF, 0x12, 0x52, 0xC3, 0x12, 0xC4, 0x6C, 0xF5, 0x83, 0xE5,
+0x6D, 0xF0, 0x90, 0x04, 0xA0, 0xE0, 0x64, 0x01, 0x70, 0x50, 0xA3, 0xE0, 0x65, 0x62, 0x70, 0x4A,
+0xA3, 0xE0, 0xF5, 0x63, 0xA3, 0xE0, 0x90, 0x92, 0x56, 0xF0, 0xE5, 0x62, 0x12, 0x8F, 0x9B, 0xE0,
+0x65, 0x63, 0x70, 0x02, 0xC1, 0xB1, 0xE5, 0x62, 0x12, 0x8F, 0x9B, 0xE5, 0x63, 0xF0, 0xE5, 0x62,
+0x12, 0x8F, 0xAC, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0x92, 0x56, 0xE0, 0x54, 0x03, 0x4F, 0xFF, 0xE5,
+0x62, 0x12, 0x8F, 0xAC, 0xEF, 0xF0, 0x90, 0x8A, 0x71, 0xE5, 0x63, 0xF0, 0xA3, 0x74, 0xFF, 0xF0,
+0xAB, 0x62, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0xC3, 0xC1, 0xB1, 0xAF, 0x62, 0x12, 0x77, 0x39, 0x75,
+0xF0, 0x12, 0xE5, 0x62, 0x12, 0x8A, 0x79, 0x12, 0x8B, 0xF0, 0xFD, 0xF1, 0xE9, 0xED, 0xF0, 0x90,
+0x92, 0x5F, 0xE4, 0x12, 0xC3, 0xF6, 0xE4, 0xF0, 0xA3, 0xE5, 0x62, 0xF0, 0x11, 0xED, 0x80, 0x05,
+0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0xFF, 0x90, 0x92,
+0x63, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7B, 0x02, 0x7A, 0x00, 0xE4, 0xFD, 0x7F, 0x01, 0xD1, 0xF6,
+0x12, 0xB9, 0xFD, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0xB9, 0xF2, 0xE0, 0xFD, 0xE5, 0x62, 0xF1,
+0xF5, 0x54, 0x80, 0xFB, 0xF1, 0xE9, 0xEB, 0xF0, 0x12, 0xC4, 0x52, 0xED, 0xF0, 0x90, 0x92, 0x5D,
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x92, 0x63, 0xF0, 0xA3, 0xF0, 0x7B, 0x03, 0xFA, 0xFD,
+0x7F, 0x01, 0xD1, 0xF6, 0xAF, 0x62, 0x12, 0x77, 0x39, 0xEF, 0x70, 0x02, 0xC1, 0xB1, 0x75, 0xF0,
+0x12, 0xE5, 0x62, 0x12, 0x8A, 0x79, 0x12, 0x8B, 0xF0, 0x30, 0xE0, 0x02, 0xC1, 0xB1, 0xE5, 0x62,
+0x11, 0xED, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF,
+0x5D, 0x4E, 0x60, 0x02, 0xC1, 0xB1, 0x12, 0xB9, 0xFD, 0xE0, 0xFE, 0xA3, 0xE0, 0x4E, 0x70, 0x08,
+0x12, 0xB9, 0xF2, 0xE0, 0x70, 0x02, 0xC1, 0xB1, 0xE5, 0x62, 0x75, 0xF0, 0x12, 0xA4, 0x24, 0x44,
+0xF9, 0x74, 0x89, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0x92, 0x4B, 0x12, 0x87, 0x03, 0x12, 0xC4,
+0x28, 0x12, 0x03, 0xED, 0x2F, 0xFF, 0xF1, 0x6D, 0x2F, 0xFF, 0xF1, 0xE3, 0x2F, 0xFF, 0xF1, 0xBF,
+0x2F, 0xF5, 0x6C, 0x12, 0xB9, 0xFD, 0xE0, 0xF5, 0x68, 0xA3, 0xE0, 0xF5, 0x69, 0x12, 0xB9, 0xF2,
+0xE0, 0xFF, 0x90, 0x92, 0x4E, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x62, 0x12, 0x8F, 0x9B, 0xE0,
+0xF5, 0x63, 0x54, 0x80, 0xF5, 0x65, 0xE5, 0x63, 0x54, 0x7F, 0xF5, 0x64, 0x12, 0xC4, 0x63, 0xF1,
+0x73, 0x12, 0xC4, 0x2E, 0x90, 0x92, 0x5F, 0xF1, 0x77, 0xF1, 0x6D, 0xFF, 0x90, 0x92, 0x61, 0xF1,
+0x77, 0xF1, 0xE3, 0xFF, 0x90, 0x92, 0x63, 0xF1, 0x77, 0x7B, 0x01, 0xF1, 0xA5, 0xF1, 0xB9, 0xF1,
+0x73, 0x90, 0x92, 0x4E, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92, 0x5F, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0,
+0xA3, 0x12, 0xC4, 0x85, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x63, 0xF0, 0x7B, 0x02, 0xF1, 0xA5, 0x74,
0x7C, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02,
-0xA1, 0x4F, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0x8F, 0xDE, 0xFF, 0xE5, 0x64, 0xD3, 0x9F, 0x40,
+0xA1, 0x25, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0x8F, 0xFB, 0xFF, 0xE5, 0x64, 0xD3, 0x9F, 0x40,
0x08, 0x8F, 0x64, 0xE5, 0x64, 0x45, 0x65, 0xF5, 0x63, 0xE5, 0x64, 0x90, 0x82, 0xE1, 0x93, 0xF5,
0x6A, 0xE5, 0x65, 0x60, 0x04, 0x05, 0x6A, 0x05, 0x6A, 0x90, 0x04, 0x8C, 0xE0, 0x64, 0x01, 0x70,
0x28, 0xE5, 0x64, 0xC3, 0x94, 0x0C, 0x40, 0x21, 0x74, 0x84, 0x25, 0x64, 0xF5, 0x82, 0xE4, 0x34,
0x04, 0xF5, 0x83, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0xEF, 0x30, 0xE7, 0x06, 0xE5, 0x6A, 0x2E, 0xFF,
0x80, 0x05, 0xC3, 0xE5, 0x6A, 0x9E, 0xFF, 0x8F, 0x6A, 0xE5, 0x6A, 0xD3, 0x94, 0x1A, 0xAF, 0x6A,
-0x40, 0x02, 0x7F, 0x1A, 0x8F, 0x6A, 0x11, 0xFB, 0x7B, 0x03, 0xFA, 0xF1, 0xDA, 0xE5, 0x63, 0x90,
-0x83, 0x59, 0x93, 0xFF, 0xD3, 0x90, 0x92, 0x37, 0xE0, 0x9F, 0x90, 0x92, 0x36, 0xE0, 0x94, 0x00,
-0x40, 0x02, 0x80, 0x6A, 0xC3, 0xE5, 0x69, 0x94, 0x0A, 0xE5, 0x68, 0x94, 0x00, 0x40, 0x02, 0x81,
-0x87, 0xF1, 0x87, 0xE0, 0xC3, 0x94, 0x01, 0x40, 0x05, 0xF1, 0x87, 0xE0, 0x14, 0xF0, 0xF1, 0xEC,
-0xFF, 0x90, 0x92, 0x37, 0xE0, 0x2F, 0xFF, 0x90, 0x92, 0x36, 0xE0, 0x12, 0xC3, 0x46, 0xF1, 0x9F,
+0x40, 0x02, 0x7F, 0x1A, 0x8F, 0x6A, 0x12, 0x9E, 0x17, 0x7B, 0x03, 0xFA, 0xF1, 0xA7, 0xE5, 0x63,
+0x90, 0x83, 0x59, 0x93, 0xFF, 0xD3, 0x90, 0x92, 0x4F, 0xE0, 0x9F, 0x90, 0x92, 0x4E, 0xE0, 0x94,
+0x00, 0x40, 0x02, 0x80, 0x65, 0xC3, 0xE5, 0x69, 0x94, 0x0A, 0xE5, 0x68, 0x94, 0x00, 0x40, 0x02,
+0x81, 0x6E, 0xD1, 0xE4, 0xE0, 0xC3, 0x94, 0x01, 0x40, 0x05, 0xD1, 0xE4, 0xE0, 0x14, 0xF0, 0xF1,
+0xB9, 0xFF, 0x90, 0x92, 0x4F, 0xE0, 0x2F, 0xFF, 0x90, 0x92, 0x4E, 0xE0, 0xF1, 0xC5, 0xF1, 0x6C,
0x2F, 0xFD, 0xEE, 0x35, 0xF0, 0xFC, 0xE5, 0x68, 0xC3, 0x13, 0xFE, 0xE5, 0x69, 0x13, 0xFF, 0xD3,
-0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x31, 0xE5, 0x62, 0x94, 0x05, 0x50, 0x05, 0xF1, 0x87, 0x74, 0x03,
-0xF0, 0x90, 0x92, 0x45, 0xE5, 0x68, 0xF0, 0xA3, 0xE5, 0x69, 0xF0, 0xE5, 0x68, 0xC3, 0x13, 0xA3,
-0xF0, 0xE5, 0x69, 0x13, 0xA3, 0xF1, 0x59, 0x12, 0xC3, 0x64, 0x7B, 0x01, 0xD1, 0xEB, 0x7D, 0x01,
-0xAF, 0x62, 0x12, 0xBA, 0xB6, 0xA1, 0x4F, 0x12, 0xC3, 0xBC, 0x65, 0x6C, 0x70, 0x02, 0xE5, 0xF0,
-0x70, 0x55, 0x90, 0x92, 0x45, 0xF0, 0xA3, 0xE5, 0x6C, 0xF0, 0xC3, 0x13, 0xFF, 0xA3, 0xE4, 0xF0,
-0xA3, 0xEF, 0xF1, 0x59, 0x12, 0xC3, 0x64, 0x7B, 0x02, 0xD1, 0xEB, 0xE5, 0x62, 0xC3, 0x94, 0x05,
-0x50, 0x0E, 0xF1, 0x87, 0xE0, 0xD3, 0x94, 0x00, 0x40, 0x06, 0x11, 0xF6, 0x7B, 0x03, 0x80, 0x0B,
-0xE5, 0x6C, 0xC3, 0x94, 0x03, 0x50, 0x10, 0x11, 0xF6, 0x7B, 0x04, 0xFA, 0xD1, 0xED, 0x7D, 0x06,
-0xAF, 0x62, 0x12, 0xB9, 0x46, 0xC1, 0xE6, 0xE4, 0xFD, 0xAF, 0x62, 0x12, 0x8B, 0xF7, 0x7D, 0x07,
-0xAF, 0x62, 0x12, 0xB9, 0x46, 0xA1, 0x4F, 0x11, 0xF6, 0x7B, 0x08, 0xFA, 0xD1, 0xED, 0x7D, 0x01,
-0xAF, 0x62, 0x12, 0x65, 0xC2, 0xA1, 0x4F, 0xF1, 0x87, 0xE4, 0xF0, 0x90, 0x92, 0x43, 0x74, 0x02,
-0xF0, 0xAB, 0x6A, 0xAD, 0x62, 0xAF, 0x69, 0xAE, 0x68, 0x12, 0xB9, 0xC6, 0x8E, 0x66, 0x8F, 0x67,
-0x12, 0xC3, 0x97, 0xC3, 0x74, 0x01, 0x93, 0x95, 0x67, 0xE4, 0x93, 0x95, 0x66, 0x50, 0x1F, 0xF1,
-0x93, 0xE4, 0xF0, 0x7D, 0x01, 0xAF, 0x62, 0x12, 0x8B, 0xF7, 0x12, 0xC3, 0x14, 0xE5, 0x66, 0xF0,
-0xA3, 0xE5, 0x67, 0xF0, 0xE4, 0x90, 0x92, 0x49, 0x31, 0x09, 0x7B, 0x01, 0x80, 0x28, 0x12, 0xC3,
-0x5C, 0xC3, 0xE5, 0x67, 0x9F, 0xE5, 0x66, 0x94, 0x00, 0x50, 0x24, 0xF1, 0x93, 0xE4, 0xF0, 0x7D,
-0x01, 0xAF, 0x62, 0x12, 0xBA, 0xB6, 0x90, 0x92, 0x45, 0x12, 0xC3, 0x55, 0x12, 0x8F, 0xF4, 0xEF,
-0xF0, 0xE4, 0x31, 0x08, 0x7B, 0x02, 0xFA, 0x7D, 0x05, 0x7F, 0x01, 0xD1, 0xF1, 0x80, 0x50, 0x7D,
-0x07, 0xAF, 0x62, 0x12, 0xB9, 0x46, 0x12, 0xC3, 0x14, 0x12, 0xC3, 0x55, 0x12, 0xC3, 0xAB, 0xEF,
-0xF0, 0xF1, 0x93, 0x12, 0xC3, 0x64, 0x7B, 0x03, 0x7A, 0x00, 0x7D, 0x05, 0x7F, 0x01, 0xD1, 0xF1,
-0xF1, 0x93, 0xE0, 0x04, 0xF0, 0xE5, 0x64, 0x90, 0x83, 0x6D, 0x93, 0xFF, 0xF1, 0x93, 0xE0, 0xC3,
-0x9F, 0x40, 0x1C, 0xF1, 0x93, 0xE4, 0x12, 0xC3, 0x5B, 0x12, 0xC3, 0x97, 0x74, 0x01, 0x93, 0x2F,
-0xFF, 0xE4, 0x93, 0x34, 0x00, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xE5, 0x62, 0xF1, 0xC7, 0x75,
-0xF0, 0x12, 0xE5, 0x62, 0x90, 0x89, 0x43, 0x12, 0x05, 0x28, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1,
-0xCB, 0x12, 0xC3, 0x7B, 0xAE, 0xF0, 0x12, 0x03, 0xED, 0x2F, 0xFF, 0xE5, 0xF0, 0x3E, 0xF1, 0x9F,
-0x2F, 0xFF, 0xEE, 0x12, 0xC3, 0x46, 0xFE, 0x90, 0x00, 0x08, 0x12, 0xC3, 0x4C, 0x90, 0x92, 0x38,
-0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x03, 0xED, 0xFF, 0xC3, 0x90, 0x92, 0x39, 0xE0, 0x9F, 0xFE, 0x90,
-0x92, 0x38, 0xE0, 0x95, 0xF0, 0x90, 0x92, 0x3A, 0xF0, 0xA3, 0xCE, 0xF0, 0x12, 0xC3, 0xA5, 0xFD,
-0xAC, 0xF0, 0x25, 0xE0, 0xFF, 0xEC, 0x33, 0xFE, 0xEF, 0x2D, 0xFD, 0xEE, 0x3C, 0xFC, 0xF1, 0xA0,
-0x25, 0xE0, 0xFF, 0xE5, 0xF0, 0x33, 0xFE, 0x90, 0x00, 0x02, 0x12, 0xC3, 0x4C, 0xCF, 0x2D, 0xFD,
-0xEF, 0x3C, 0xFC, 0xF1, 0xEC, 0xAE, 0xF0, 0x78, 0x02, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9,
-0x2D, 0xFF, 0xEC, 0x3E, 0x90, 0x92, 0x3C, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x36, 0x12, 0xC3,
-0x33, 0x24, 0x0C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF1, 0xE0, 0x50, 0x08, 0x90, 0x92, 0x36, 0x12,
-0xC3, 0x6F, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, 0xE5, 0x62, 0x25, 0xE0, 0x24, 0x0C, 0xF5, 0x82,
-0xE4, 0x34, 0x90, 0xF1, 0xD0, 0x90, 0x92, 0x38, 0x12, 0xC3, 0x33, 0x24, 0x2C, 0xF5, 0x82, 0xE4,
-0x34, 0x90, 0xF1, 0xE0, 0x50, 0x08, 0x90, 0x92, 0x38, 0x12, 0xC3, 0x6F, 0x80, 0x04, 0x7E, 0xFF,
-0x7F, 0xFF, 0xE5, 0x62, 0x25, 0xE0, 0x24, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF1, 0xD0, 0x90,
-0x92, 0x3C, 0x12, 0xC3, 0x33, 0x24, 0x5C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF1, 0xE0, 0x50, 0x08,
-0x90, 0x92, 0x3C, 0x12, 0xC3, 0x6F, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, 0xE5, 0x62, 0x25, 0xE0,
-0x24, 0x5C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF1, 0xD0, 0xC3, 0x74, 0xFF, 0x95, 0x69, 0xFF, 0x74,
-0xFF, 0x95, 0x68, 0xFE, 0x12, 0xC3, 0xB2, 0x34, 0x90, 0xF1, 0xE0, 0x50, 0x0A, 0xE5, 0x69, 0x2D,
-0xFF, 0xE5, 0x68, 0x3C, 0xFE, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, 0x12, 0xC3, 0xB2, 0x34, 0x90,
-0xF1, 0xD0, 0x90, 0x92, 0x3A, 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, 0x8F, 0x77,
-0x12, 0x86, 0xEE, 0xD3, 0x12, 0x04, 0xB4, 0x50, 0x16, 0x90, 0x92, 0x3A, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0xE4, 0xFC, 0xFD, 0x90, 0x8F, 0x77, 0x12, 0x86, 0xEE, 0x12, 0x86, 0xAD, 0x80, 0x06, 0x74,
-0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90, 0x8F, 0x77, 0x12, 0x04, 0xEB, 0xE4, 0xF5, 0x6C, 0xFD, 0xAF,
-0x62, 0x12, 0x65, 0xC2, 0xE4, 0x90, 0x92, 0x45, 0xF0, 0x31, 0x04, 0xA3, 0xF0, 0x7B, 0x01, 0xFA,
-0x7D, 0xFF, 0x7F, 0x01, 0xD1, 0xF1, 0x05, 0x62, 0x21, 0x20, 0x22, 0x7A, 0x00, 0x7D, 0x03, 0x7F,
-0x01, 0x90, 0x04, 0x84, 0xE0, 0xFE, 0x60, 0x60, 0x90, 0x92, 0x4F, 0xEF, 0xF0, 0xA3, 0xED, 0xF0,
-0xEB, 0xA3, 0xF0, 0xEA, 0xA3, 0xF0, 0x90, 0x92, 0x45, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92, 0x53,
-0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x47, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92, 0x55, 0xF0, 0xEC,
-0xA3, 0xF0, 0x90, 0x92, 0x49, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92, 0x57, 0xF0, 0xEC, 0xA3, 0xF0,
-0x90, 0x92, 0x4B, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92, 0x59, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92,
-0x4D, 0x74, 0xFE, 0xF0, 0x90, 0x92, 0x5B, 0x74, 0x0C, 0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x4D,
-0x12, 0x5E, 0x10, 0x7F, 0x04, 0x12, 0x87, 0xDA, 0x22, 0xF0, 0x90, 0x92, 0x33, 0x12, 0x86, 0xFA,
-0x90, 0x00, 0x06, 0x12, 0x04, 0x18, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x04, 0x18, 0x2F,
-0xFF, 0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x04, 0x18, 0x2F, 0xFF, 0xEE, 0x35, 0xF0,
-0x90, 0x92, 0x49, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x70, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x93,
-0xF5, 0x83, 0x22, 0x74, 0xAC, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0xFE,
-0x90, 0x00, 0x04, 0x02, 0x04, 0x18, 0xFF, 0x90, 0x92, 0x45, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0,
-0x22, 0xE5, 0x71, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4, 0x93,
-0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x6E, 0x25, 0xE0, 0x24, 0x7B, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
-0xF5, 0x83, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x7A, 0x00, 0x7D, 0x01, 0x7F, 0x01, 0xC1, 0xF1,
-0xF5, 0x83, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x9E, 0x22, 0x90, 0x92, 0x33, 0x12,
-0x86, 0xFA, 0x90, 0x00, 0x08, 0x02, 0x04, 0x18, 0x12, 0x8F, 0xC3, 0x12, 0x88, 0xFD, 0x11, 0x0C,
-0x75, 0x1E, 0x05, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0xFB, 0x02, 0x6A, 0x21, 0x8B, 0x1B, 0x8A, 0x1C,
-0x89, 0x1D, 0x22, 0x12, 0x8F, 0xC3, 0x12, 0x88, 0xFD, 0x11, 0x0C, 0x75, 0x1E, 0x05, 0x7B, 0x01,
-0x7A, 0x93, 0x79, 0x00, 0x02, 0x6A, 0x21, 0x90, 0x92, 0x21, 0xEF, 0xF0, 0xA3, 0x12, 0x87, 0x03,
-0x90, 0x93, 0xA0, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x03, 0x4E, 0x74, 0x00,
-0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x92,
-0x22, 0x12, 0x86, 0xFA, 0x11, 0x0C, 0x75, 0x1E, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12,
-0x6A, 0x21, 0x90, 0x92, 0x21, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0,
-0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x86, 0xFA, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B,
-0x1B, 0xF5, 0x1C, 0x89, 0x1D, 0x90, 0x92, 0x22, 0x11, 0x95, 0xF5, 0x1E, 0xD0, 0x01, 0xD0, 0x02,
-0xD0, 0x03, 0x02, 0x6A, 0x21, 0x12, 0x86, 0xFA, 0x90, 0x00, 0x0E, 0x02, 0x03, 0x0F, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x25, 0x12, 0x87, 0x03, 0x7F, 0x96, 0x7E, 0x02, 0x12,
-0x66, 0x80, 0xEF, 0x60, 0x45, 0x11, 0xFF, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90,
-0x92, 0x28, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x92, 0x28, 0xE0, 0xFD, 0x90,
-0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x25, 0x11, 0x95, 0x24, 0x02, 0xFF, 0xE4, 0x33,
-0xFE, 0x12, 0x5A, 0xA5, 0x90, 0x92, 0x28, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x92, 0x25, 0x12, 0x86,
-0xFA, 0x12, 0x56, 0xF4, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90,
-0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0xEC, 0x3E, 0x22,
-0x90, 0x93, 0x00, 0xE0, 0x90, 0x92, 0x96, 0xF0, 0x90, 0x93, 0x01, 0xE0, 0x90, 0x92, 0x97, 0xF0,
-0x90, 0x93, 0x02, 0xE0, 0x90, 0x92, 0x98, 0xF0, 0x90, 0x93, 0x03, 0xE0, 0x90, 0x92, 0x99, 0xF0,
-0x90, 0x93, 0x04, 0xE0, 0x90, 0x92, 0x9A, 0xF0, 0x90, 0x92, 0xF1, 0xE0, 0x90, 0x92, 0x9B, 0xF0,
-0x90, 0x92, 0xF2, 0xE0, 0x90, 0x92, 0x9C, 0xF0, 0x90, 0x92, 0xF3, 0xE0, 0x90, 0x92, 0x9D, 0xF0,
-0x90, 0x92, 0xF4, 0xE0, 0x90, 0x92, 0x9E, 0xF0, 0x90, 0x92, 0xF5, 0xE0, 0x90, 0x92, 0x9F, 0xF0,
-0x90, 0x92, 0xF6, 0xE0, 0x90, 0x92, 0xA0, 0xF0, 0x90, 0x92, 0xF7, 0xE0, 0x90, 0x92, 0xA1, 0xF0,
-0x90, 0x92, 0xF8, 0xE0, 0x90, 0x92, 0xA2, 0xF0, 0x90, 0x92, 0xF9, 0xE0, 0x90, 0x92, 0xA3, 0xF0,
-0x90, 0x92, 0xFA, 0xE0, 0x90, 0x92, 0xA4, 0xF0, 0xE4, 0x90, 0x92, 0x3F, 0xF0, 0x90, 0x92, 0xAA,
-0x12, 0x99, 0x07, 0x90, 0x92, 0x3E, 0xF0, 0xD1, 0x40, 0x50, 0x04, 0xD1, 0x4D, 0x80, 0xF8, 0x90,
-0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0x31, 0x07, 0x90, 0x92, 0x33, 0xF0, 0xA3, 0xEF, 0xF0,
-0xE4, 0x90, 0x92, 0x3E, 0xF0, 0xD1, 0x40, 0x50, 0x4A, 0xD1, 0x6F, 0x90, 0x92, 0x3E, 0xE0, 0xFE,
-0x24, 0xA5, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xD1, 0xD7, 0xE0, 0x24, 0x4D, 0xF5, 0x82, 0xE4, 0x34,
-0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x40, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xD1, 0xD7, 0xE0,
-0x24, 0x4E, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xEE, 0xF1, 0x07, 0x12, 0x87, 0x03, 0xD1,
-0xDB, 0xE0, 0x24, 0x38, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0xEE, 0xD1, 0xC9, 0x12, 0x87, 0x03, 0xD1,
-0x5A, 0x80, 0xB2, 0x90, 0x02, 0x87, 0xE0, 0x70, 0x02, 0xC1, 0x32, 0x90, 0x92, 0xE3, 0xE0, 0x20,
-0xE0, 0x02, 0xC1, 0x32, 0xE4, 0x90, 0x92, 0xAF, 0x12, 0x99, 0x07, 0x90, 0x92, 0x33, 0xE0, 0xFF,
-0xA3, 0xE0, 0xA3, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x35, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
-0xEC, 0x90, 0xFD, 0x11, 0xF0, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0,
-0xFE, 0xD1, 0xF0, 0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x54, 0x3F, 0x90, 0x92, 0x37,
-0xF0, 0xA3, 0xF1, 0x58, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x90, 0x92, 0x3A, 0xF0, 0xFC,
-0x74, 0x07, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0x90, 0x92, 0x3C,
-0xF0, 0xEC, 0x24, 0x18, 0x90, 0x92, 0x39, 0xF0, 0xFD, 0x90, 0x92, 0x35, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0x12, 0x55, 0x36, 0xEF, 0x54, 0xFC, 0x90, 0x92, 0x3B, 0xF0, 0x90, 0x92, 0x3A, 0xE0, 0x24,
-0x18, 0xFF, 0xE4, 0x33, 0x90, 0x92, 0x37, 0x8F, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x92, 0x37, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x7A, 0xD0, 0x90, 0x92, 0x33, 0xEE, 0x8F, 0xF0, 0x12, 0x07, 0x0A,
-0x90, 0x85, 0xB7, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x33, 0x12, 0x9F, 0xE2, 0x40, 0x1B,
-0x90, 0x85, 0xB8, 0xE0, 0x24, 0x01, 0xFF, 0x90, 0x85, 0xB7, 0xE0, 0x34, 0x00, 0xFE, 0xC3, 0xED,
-0x9F, 0xFF, 0xEC, 0x9E, 0x90, 0x92, 0x33, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x09, 0xE0, 0x30,
-0xE0, 0x09, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x02, 0xC1, 0x25, 0x90, 0x92, 0x3B, 0xE0, 0x24,
-0xC0, 0x60, 0x02, 0x81, 0xFB, 0xD1, 0x33, 0x24, 0x18, 0xFD, 0x12, 0x55, 0x36, 0xEF, 0x60, 0x02,
-0x81, 0xE8, 0xD1, 0x33, 0x24, 0x19, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x92, 0x54, 0xEF, 0xF0, 0xE4,
-0x90, 0x92, 0x3D, 0xF0, 0x90, 0x92, 0x54, 0xE0, 0xFF, 0x90, 0x92, 0x3D, 0xE0, 0xFD, 0xC3, 0x9F,
-0x50, 0x1A, 0xD1, 0x33, 0x24, 0x1A, 0xFC, 0xED, 0x2C, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x92, 0x3D,
-0xE0, 0x24, 0x55, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xD1, 0xB2, 0x80, 0xD8, 0x90, 0x92, 0x54, 0xE0,
-0x70, 0x02, 0x81, 0x12, 0xE4, 0x90, 0x92, 0x3E, 0xF0, 0xD1, 0x40, 0x40, 0x02, 0x61, 0xFA, 0xD1,
-0x6F, 0x90, 0x92, 0x3E, 0xE0, 0xFF, 0x24, 0x40, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0,
-0xFE, 0x90, 0x92, 0x54, 0xE0, 0xFD, 0xEE, 0x6D, 0x70, 0x20, 0xEF, 0xF1, 0x07, 0x12, 0x86, 0xFA,
-0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xD1, 0xBD, 0x90, 0x92, 0xBA, 0xED, 0xF0, 0xD0, 0x01, 0xD0,
-0x02, 0xD0, 0x03, 0xD1, 0x89, 0xEF, 0x60, 0x02, 0x80, 0x53, 0x90, 0x92, 0x54, 0xE0, 0x64, 0x03,
-0x70, 0x5A, 0xD1, 0xBD, 0x90, 0x92, 0xBA, 0x74, 0x03, 0xF0, 0x7A, 0x93, 0x79, 0x8B, 0xD1, 0x89,
-0xEF, 0x70, 0x11, 0xD1, 0xBD, 0x90, 0x92, 0xBA, 0x74, 0x03, 0xF0, 0x7A, 0x93, 0x79, 0x87, 0xD1,
-0x89, 0xEF, 0x60, 0x30, 0x90, 0x92, 0x3E, 0xE0, 0xFF, 0x24, 0xA0, 0xF5, 0x82, 0xE4, 0x34, 0x92,
-0xF5, 0x83, 0xE0, 0x60, 0x02, 0x80, 0x11, 0x90, 0x92, 0x3E, 0xE0, 0xFF, 0x24, 0x9B, 0xF5, 0x82,
-0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x60, 0x05, 0x74, 0xAF, 0x2F, 0x80, 0x15, 0xD1, 0x61, 0x74,
-0x01, 0xF0, 0x80, 0x12, 0x90, 0x92, 0x3E, 0xE0, 0x24, 0xAF, 0x80, 0x06, 0x90, 0x92, 0x3E, 0xE0,
-0x24, 0xAF, 0xD1, 0x67, 0xE4, 0xF0, 0xD1, 0x5A, 0x61, 0x49, 0x90, 0x92, 0xAF, 0xE0, 0x70, 0x55,
-0xA3, 0xE0, 0x70, 0x51, 0xA3, 0xE0, 0x70, 0x4D, 0xA3, 0xE0, 0x70, 0x49, 0xA3, 0xE0, 0x70, 0x45,
-0x81, 0xE8, 0xE4, 0x90, 0x92, 0x3E, 0xF0, 0xD1, 0x40, 0x50, 0x22, 0x74, 0x9B, 0x2E, 0xF5, 0x82,
-0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x60, 0x09, 0x74, 0xAF, 0x2E, 0xD1, 0x67, 0xE4, 0xF0, 0x80,
-0x08, 0x74, 0xAF, 0x2E, 0xD1, 0x67, 0x74, 0x01, 0xF0, 0xD1, 0x5A, 0x80, 0xDA, 0x90, 0x92, 0xAF,
-0xE0, 0x70, 0x12, 0xA3, 0xE0, 0x70, 0x0E, 0xA3, 0xE0, 0x70, 0x0A, 0xA3, 0xE0, 0x70, 0x06, 0xA3,
-0xE0, 0x70, 0x02, 0x81, 0xE8, 0xE4, 0x90, 0x92, 0x3E, 0xF0, 0xD1, 0x40, 0x40, 0x02, 0x81, 0xE8,
-0xD1, 0x6F, 0xD1, 0x61, 0xE0, 0x60, 0x7D, 0xE4, 0xFF, 0xFE, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x10,
-0xD3, 0xEF, 0x94, 0xE8, 0xEE, 0x94, 0x03, 0x50, 0x07, 0x0F, 0xBF, 0x00, 0x01, 0x0E, 0x80, 0xEA,
-0x90, 0x04, 0x1D, 0xE0, 0x70, 0x5E, 0x90, 0x92, 0x3E, 0xE0, 0x24, 0x96, 0xF5, 0x82, 0xE4, 0x34,
-0x92, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x92, 0x74, 0x06, 0xF0, 0x7B, 0x08, 0x7D, 0x01, 0x12,
-0xBC, 0xC5, 0x90, 0x92, 0x37, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x92, 0x3D, 0xF0, 0x90,
-0x92, 0x3D, 0xE0, 0xFD, 0xC3, 0x94, 0x06, 0x50, 0x21, 0xD1, 0x33, 0x24, 0x0A, 0xFC, 0xED, 0x2C,
-0xFD, 0x12, 0x55, 0x36, 0x90, 0x92, 0x37, 0xA3, 0xE0, 0xFE, 0x90, 0x92, 0x3D, 0xE0, 0x2E, 0x24,
-0x2C, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xD1, 0xB2, 0x80, 0xD5, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0,
-0x90, 0x06, 0x35, 0xF0, 0xD1, 0x5A, 0x81, 0x5A, 0x90, 0x92, 0x33, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-0x12, 0x7C, 0x0B, 0x90, 0x06, 0x36, 0x74, 0xDD, 0xF0, 0x41, 0x03, 0x90, 0x92, 0x3C, 0xE0, 0x60,
-0x02, 0xC1, 0x25, 0xD1, 0x33, 0x24, 0x16, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x06, 0x34, 0xEF, 0xF0,
-0xD1, 0x33, 0x24, 0x17, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x06, 0x37, 0xEF, 0xF0, 0xE4, 0x90, 0x92,
-0x3E, 0xF0, 0xD1, 0x40, 0x50, 0x67, 0xD1, 0x6F, 0xE4, 0x90, 0x92, 0x3D, 0xF0, 0x90, 0x92, 0x3D,
-0xE0, 0xFF, 0xC3, 0x94, 0x06, 0x50, 0x52, 0xEF, 0x60, 0x04, 0x64, 0x01, 0x70, 0x20, 0xD1, 0x33,
-0xD1, 0xFB, 0x90, 0x92, 0x3D, 0xE0, 0xFE, 0x24, 0xA0, 0xD1, 0xE6, 0x90, 0x92, 0x3E, 0xE0, 0xD1,
-0xC9, 0x12, 0x86, 0xFA, 0x8E, 0x82, 0xD1, 0x83, 0xFF, 0x74, 0xA2, 0x2E, 0xD1, 0xE6, 0xD1, 0x33,
-0xD1, 0xFB, 0x90, 0x92, 0x3E, 0xE0, 0xFE, 0xD1, 0xC9, 0x12, 0x86, 0xFA, 0x90, 0x92, 0x3D, 0xE0,
-0xF5, 0x82, 0xD1, 0x83, 0x6F, 0x60, 0x0E, 0x74, 0xAA, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5,
-0x83, 0xE4, 0xF0, 0x80, 0x04, 0xD1, 0xB6, 0x80, 0xA4, 0xD1, 0x5A, 0x80, 0x95, 0x90, 0x92, 0xAA,
-0xE0, 0x64, 0x01, 0x60, 0x17, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x11, 0xA3, 0xE0, 0x64, 0x01, 0x60,
-0x0B, 0xA3, 0xE0, 0x64, 0x01, 0x60, 0x05, 0xA3, 0xE0, 0xB4, 0x01, 0x06, 0x90, 0x92, 0x3F, 0x74,
-0x01, 0xF0, 0x90, 0x92, 0x3F, 0xE0, 0x64, 0x01, 0x70, 0x54, 0xF1, 0xCA, 0x90, 0x01, 0xC7, 0x74,
-0x66, 0xF0, 0xE4, 0xFF, 0x12, 0x5F, 0xE9, 0x90, 0x93, 0x05, 0xE0, 0x70, 0x02, 0x41, 0x03, 0x90,
-0x01, 0x3C, 0xE0, 0x30, 0xE4, 0x03, 0x74, 0x10, 0xF0, 0x7D, 0x10, 0xE4, 0xFF, 0x12, 0x7B, 0xFD,
-0x90, 0x93, 0x06, 0xE0, 0x60, 0x08, 0xF5, 0x25, 0xE4, 0xF5, 0x26, 0xFB, 0x80, 0x15, 0x90, 0x93,
-0x07, 0xE0, 0x60, 0x08, 0xFB, 0xE4, 0xF5, 0x25, 0xF5, 0x26, 0x80, 0x07, 0x75, 0x25, 0x20, 0xE4,
-0xF5, 0x26, 0xFB, 0x7D, 0x01, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x76, 0x3D, 0x41, 0x03, 0xE4, 0x90,
-0x92, 0x3F, 0xF0, 0x90, 0x92, 0xAA, 0x12, 0x99, 0x07, 0x90, 0x92, 0x3E, 0xF0, 0xD1, 0x40, 0x50,
-0x04, 0xD1, 0x4D, 0x80, 0xF8, 0x90, 0x92, 0x33, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x7C, 0x0B,
-0x41, 0x03, 0x22, 0x90, 0x92, 0x35, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x39, 0xE0, 0x22,
-0x90, 0x92, 0xEE, 0xE0, 0xFF, 0x90, 0x92, 0x3E, 0xE0, 0xFE, 0xC3, 0x9F, 0x22, 0x74, 0xAA, 0x2E,
-0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x3E, 0xE0, 0x04, 0xF0,
-0x22, 0x90, 0x92, 0x3E, 0xE0, 0x24, 0xAF, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0x74,
-0x96, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0x02, 0x7B, 0x2A, 0x12, 0x86,
-0xFA, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x02, 0x03, 0x0F, 0x90, 0x92, 0xB4, 0x12, 0x87, 0x03, 0xE4,
-0xFF, 0x90, 0x92, 0xBA, 0xE0, 0xFE, 0xEF, 0xC3, 0x9E, 0x50, 0x14, 0x90, 0x92, 0xB7, 0xD1, 0x7E,
-0xFE, 0x90, 0x92, 0xB4, 0xD1, 0x7E, 0x6E, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x0F, 0x80, 0xE2, 0x7F,
-0x01, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x92, 0x3D, 0xE0, 0x04, 0xF0, 0x22, 0x7B, 0x01, 0x7A,
-0x92, 0x79, 0x55, 0x90, 0x92, 0xB7, 0x02, 0x87, 0x03, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x87, 0xF5,
-0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0xA5, 0x2E, 0xF5, 0x82,
-0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xEF, 0xF0, 0x22,
-0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0x24, 0x04, 0xFD, 0x90, 0x92,
-0x3D, 0xE0, 0x2D, 0xFD, 0x02, 0x55, 0x36, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0x45, 0xF5, 0x82, 0xE4,
-0x34, 0x92, 0xF5, 0x83, 0x22, 0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0xD1, 0xF3, 0xE4, 0xF0, 0x0C,
-0xEC, 0xB4, 0x18, 0xF3, 0xD1, 0xF0, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x74, 0x01, 0x2D, 0xF5,
-0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xF1, 0x58, 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, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4,
-0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x86, 0x4E, 0x90,
-0x92, 0x32, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60,
-0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE0, 0x0F, 0x90, 0x84, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xFF,
-0x12, 0x2D, 0xBD, 0x12, 0x99, 0x11, 0xF1, 0xC0, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0x60,
-0x5D, 0xF1, 0xC0, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x6A, 0x6D, 0xF1, 0xC0, 0x30, 0xE5,
-0x0B, 0x54, 0xDF, 0xF0, 0x12, 0x6F, 0x22, 0xBF, 0x01, 0x02, 0x31, 0x10, 0xD2, 0xAF, 0x80, 0xB6,
-0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x22, 0xC2, 0xAF, 0x90, 0x92, 0xE3, 0xE0,
-0x54, 0xFE, 0xF0, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x7C, 0x41, 0xE4, 0x90, 0x92, 0xEF, 0xF0, 0xA3,
-0xF0, 0xD2, 0xAF, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x93, 0x08, 0xF0, 0xBF, 0x01, 0x08, 0x12,
-0xB1, 0x18, 0xE4, 0x90, 0x93, 0x08, 0xF0, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x54, 0x80, 0xFE, 0x90,
-0x89, 0x16, 0xE0, 0x54, 0x7F, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x40, 0xFF, 0xEE, 0x54, 0xBF, 0x4F,
-0xFF, 0xF0, 0x12, 0x02, 0xF6, 0xFE, 0x54, 0x20, 0xFD, 0xEF, 0x54, 0xDF, 0x4D, 0xFF, 0x90, 0x89,
-0x16, 0xF0, 0xEE, 0x54, 0x10, 0xFE, 0xEF, 0x54, 0xEF, 0x4E, 0xFF, 0xF0, 0x12, 0x02, 0xF6, 0x54,
-0x0F, 0xFE, 0xEF, 0x54, 0xF0, 0x4E, 0x90, 0x89, 0x16, 0xF0, 0x12, 0x8E, 0xF7, 0xFF, 0x54, 0x7F,
-0x90, 0x89, 0x18, 0xF0, 0xEF, 0x12, 0x8B, 0xE1, 0xFF, 0x90, 0x89, 0x17, 0xE0, 0x54, 0xFE, 0x12,
-0x8B, 0xD7, 0x90, 0x89, 0x19, 0x11, 0x6C, 0x25, 0xE0, 0xFF, 0x90, 0x89, 0x17, 0xE0, 0x54, 0xFD,
-0x4F, 0xF0, 0x11, 0x76, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x02, 0x54, 0x9F, 0xF0, 0x90, 0x00, 0x03,
-0x12, 0x03, 0x0F, 0x54, 0x01, 0x22, 0x90, 0x89, 0x16, 0xE0, 0xFE, 0x54, 0x0F, 0xFF, 0xEE, 0xC4,
-0x13, 0x13, 0x54, 0x03, 0x7D, 0x00, 0x22, 0x90, 0x89, 0x16, 0xE0, 0xFF, 0x12, 0x8B, 0xE3, 0x30,
-0xE0, 0x1B, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x12, 0xBC, 0x6B, 0x90, 0x89, 0x17, 0xE0,
-0x30, 0xE0, 0x0A, 0x11, 0x76, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x54, 0x9F, 0x22, 0x90, 0x85,
-0xC5, 0xE0, 0x60, 0x15, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x05, 0x12, 0x6B, 0x98, 0x80, 0x09,
-0x90, 0x85, 0xC1, 0xE0, 0x54, 0xF7, 0xF0, 0x11, 0xCB, 0x80, 0xBC, 0x90, 0x85, 0xC7, 0xE0, 0xFF,
-0x7D, 0x01, 0x02, 0x8D, 0x34, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF, 0x01, 0x0F, 0x90, 0x85, 0xC5,
-0xE0, 0x60, 0x09, 0x11, 0xED, 0xF0, 0x54, 0x07, 0x70, 0x02, 0x11, 0xCB, 0x22, 0x90, 0x85, 0xC9,
-0xE0, 0x54, 0xFE, 0x22, 0xE4, 0xF5, 0x77, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x77, 0x54, 0xC0, 0x70,
-0x08, 0x11, 0xED, 0xF0, 0x54, 0xFD, 0xF0, 0x80, 0xC2, 0xE5, 0x77, 0x30, 0xE6, 0x1F, 0x90, 0x85,
-0xC5, 0xE0, 0x64, 0x01, 0x70, 0x1A, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x01, 0x12, 0x8F, 0xC9, 0x64,
-0x02, 0x60, 0x05, 0x12, 0x77, 0x61, 0x80, 0x08, 0x12, 0x79, 0x41, 0x80, 0x03, 0x11, 0xED, 0xF0,
-0xE5, 0x77, 0x90, 0x85, 0xC9, 0x30, 0xE7, 0x0E, 0xE0, 0x44, 0x02, 0x12, 0x92, 0x68, 0x90, 0x85,
-0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x12, 0x97, 0x4C, 0x70, 0x14,
-0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0E, 0x12, 0x97, 0xEB, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0x91, 0x2A,
-0x70, 0x02, 0x11, 0xCB, 0x22, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30,
-0xE0, 0x1E, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x85, 0xC2, 0x30, 0xE0, 0x06,
-0xE0, 0x44, 0x01, 0xF0, 0x80, 0x08, 0xE0, 0x54, 0xFE, 0x51, 0x4C, 0x74, 0x04, 0xF0, 0x11, 0xCB,
-0x22, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x12, 0x8B, 0xE3, 0x30, 0xE0, 0x23, 0xEF, 0x54, 0x7F, 0xF0,
-0x90, 0x04, 0xE0, 0xE0, 0x90, 0x85, 0xC2, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x07,
-0xE0, 0x54, 0xFD, 0x51, 0x4C, 0x04, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x02, 0x11, 0xCB, 0x22,
+0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x29, 0xE5, 0x62, 0x94, 0x05, 0x50, 0x05, 0xD1, 0xE4, 0x74, 0x03,
+0xF0, 0x90, 0x92, 0x5D, 0x12, 0xC4, 0x85, 0xE5, 0x68, 0xC3, 0x13, 0xA3, 0xF0, 0xE5, 0x69, 0x13,
+0xA3, 0xD1, 0xB6, 0x12, 0xC4, 0x11, 0x7B, 0x01, 0xD1, 0xF0, 0x12, 0xBB, 0x78, 0xA1, 0x25, 0x12,
+0xC4, 0x63, 0x65, 0x6C, 0x70, 0x02, 0xE5, 0xF0, 0x70, 0x53, 0x90, 0x92, 0x5D, 0xF0, 0xA3, 0xE5,
+0x6C, 0xF0, 0xC3, 0x13, 0xFF, 0xA3, 0xE4, 0xF0, 0xA3, 0xEF, 0xD1, 0xB6, 0x12, 0xC4, 0x11, 0x7B,
+0x02, 0xD1, 0xF0, 0xE5, 0x62, 0xC3, 0x94, 0x05, 0x50, 0x0F, 0xD1, 0xE4, 0xE0, 0xD3, 0x94, 0x00,
+0x40, 0x07, 0x12, 0x9E, 0x12, 0x7B, 0x03, 0x80, 0x0C, 0xE5, 0x6C, 0xC3, 0x94, 0x03, 0x50, 0x11,
+0x12, 0x9E, 0x12, 0x7B, 0x04, 0xFA, 0xD1, 0xF2, 0x7D, 0x06, 0xAF, 0x62, 0x12, 0xB9, 0x88, 0xC1,
+0xB1, 0xE4, 0xFD, 0xAF, 0x62, 0x12, 0x8C, 0x04, 0x12, 0xB9, 0x84, 0xA1, 0x25, 0x12, 0x9E, 0x12,
+0x7B, 0x08, 0xFA, 0xD1, 0xF2, 0x7D, 0x01, 0xAF, 0x62, 0x12, 0x65, 0xC2, 0xA1, 0x25, 0xD1, 0xE4,
+0xE4, 0xF0, 0x90, 0x92, 0x5B, 0x74, 0x02, 0xF0, 0xAB, 0x6A, 0xAD, 0x62, 0xAF, 0x69, 0xAE, 0x68,
+0x12, 0xBA, 0x8A, 0x8E, 0x66, 0x8F, 0x67, 0x12, 0xC4, 0x44, 0xC3, 0x74, 0x01, 0x93, 0x95, 0x67,
+0xE4, 0x93, 0x95, 0x66, 0x50, 0x20, 0xF1, 0x60, 0xE4, 0xF0, 0x7D, 0x01, 0xAF, 0x62, 0x12, 0x8C,
+0x04, 0x12, 0xC3, 0xDF, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, 0x67, 0xF0, 0xE4, 0x90, 0x92, 0x61, 0x12,
+0x9E, 0x25, 0x7B, 0x01, 0x80, 0x23, 0xF1, 0xDB, 0xC3, 0xE5, 0x67, 0x9F, 0xE5, 0x66, 0x94, 0x00,
+0x50, 0x1D, 0xF1, 0x60, 0xE4, 0xF0, 0x12, 0xBB, 0x78, 0x90, 0x92, 0x5D, 0xF1, 0xD4, 0x12, 0xC4,
+0x52, 0xEF, 0xF0, 0xE4, 0x12, 0x9E, 0x24, 0x7B, 0x02, 0xFA, 0x12, 0xC4, 0x7E, 0x80, 0x46, 0x12,
+0xB9, 0x84, 0x12, 0xC3, 0xDF, 0xF1, 0xD4, 0xF1, 0xE9, 0xEF, 0xF0, 0xF1, 0x60, 0x12, 0xC4, 0x11,
+0x7B, 0x03, 0x7A, 0x00, 0x12, 0xC4, 0x7E, 0xF1, 0x60, 0xE0, 0x04, 0xF0, 0xE5, 0x64, 0x90, 0x83,
+0x6D, 0x93, 0xFF, 0xF1, 0x60, 0xE0, 0xC3, 0x9F, 0x40, 0x1B, 0xF1, 0x60, 0xE4, 0xF1, 0xDA, 0x12,
+0xC4, 0x44, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x34, 0x00, 0xC3, 0x13, 0xFE, 0xEF, 0x13,
+0xFF, 0xE5, 0x62, 0xF1, 0x94, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x90, 0x89, 0x43, 0x12, 0x05, 0x28,
+0xE0, 0x64, 0x01, 0x60, 0x02, 0xC1, 0x95, 0x12, 0xC4, 0x28, 0xAE, 0xF0, 0x12, 0x03, 0xED, 0x2F,
+0xFF, 0xE5, 0xF0, 0x3E, 0xF1, 0x6C, 0x2F, 0xFF, 0xEE, 0xF1, 0xC5, 0xFE, 0x90, 0x00, 0x08, 0xF1,
+0xCB, 0x90, 0x92, 0x50, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x03, 0xED, 0xFF, 0xC3, 0x90, 0x92, 0x51,
+0xE0, 0x9F, 0xFE, 0x90, 0x92, 0x50, 0xE0, 0x95, 0xF0, 0x90, 0x92, 0x52, 0xF0, 0xA3, 0xCE, 0xF0,
+0xF1, 0xE3, 0xFD, 0xAC, 0xF0, 0x25, 0xE0, 0xFF, 0xEC, 0x33, 0xFE, 0xEF, 0x2D, 0xFD, 0xEE, 0x3C,
+0xFC, 0xF1, 0x6D, 0x25, 0xE0, 0xFF, 0xE5, 0xF0, 0x33, 0xFE, 0x90, 0x00, 0x02, 0xF1, 0xCB, 0xCF,
+0x2D, 0xFD, 0xEF, 0x3C, 0xFC, 0xF1, 0xB9, 0xAE, 0xF0, 0x78, 0x02, 0xC3, 0x33, 0xCE, 0x33, 0xCE,
+0xD8, 0xF9, 0x2D, 0xFF, 0xEC, 0x3E, 0x90, 0x92, 0x54, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x4E,
+0x12, 0xC3, 0xFE, 0x24, 0x0C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF1, 0xAD, 0x50, 0x08, 0x90, 0x92,
+0x4E, 0x12, 0xC4, 0x1C, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, 0xE5, 0x62, 0x25, 0xE0, 0x24, 0x0C,
+0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF1, 0x9D, 0x90, 0x92, 0x50, 0x12, 0xC3, 0xFE, 0x24, 0x2C, 0xF5,
+0x82, 0xE4, 0x34, 0x90, 0xF1, 0xAD, 0x50, 0x08, 0x90, 0x92, 0x50, 0x12, 0xC4, 0x1C, 0x80, 0x04,
+0x7E, 0xFF, 0x7F, 0xFF, 0xE5, 0x62, 0x25, 0xE0, 0x24, 0x2C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF1,
+0x9D, 0x90, 0x92, 0x54, 0x12, 0xC3, 0xFE, 0x24, 0x5C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF1, 0xAD,
+0x50, 0x08, 0x90, 0x92, 0x54, 0x12, 0xC4, 0x1C, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, 0xE5, 0x62,
+0x25, 0xE0, 0x24, 0x5C, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF1, 0x9D, 0xC3, 0x74, 0xFF, 0x95, 0x69,
+0xFF, 0x74, 0xFF, 0x95, 0x68, 0xFE, 0x12, 0xC4, 0x59, 0x34, 0x90, 0xF1, 0xAD, 0x50, 0x0A, 0xE5,
+0x69, 0x2D, 0xFF, 0xE5, 0x68, 0x3C, 0xFE, 0x80, 0x04, 0x7E, 0xFF, 0x7F, 0xFF, 0x12, 0xC4, 0x59,
+0x34, 0x90, 0xF1, 0x9D, 0x12, 0xC4, 0x76, 0xFB, 0xC3, 0x74, 0xFF, 0x9B, 0xFF, 0x74, 0xFF, 0x9E,
+0xFE, 0x74, 0xFF, 0x94, 0x00, 0xFD, 0x74, 0xFF, 0x94, 0x00, 0xFC, 0x90, 0x8F, 0x77, 0x12, 0x86,
+0xEE, 0xD3, 0x12, 0x04, 0xB4, 0x50, 0x12, 0x12, 0xC4, 0x76, 0xFF, 0xE4, 0xFC, 0xFD, 0x90, 0x8F,
+0x77, 0x12, 0x86, 0xEE, 0x12, 0x86, 0xAD, 0x80, 0x06, 0x74, 0xFF, 0xFF, 0xFE, 0xFD, 0xFC, 0x90,
+0x8F, 0x77, 0x12, 0x04, 0xEB, 0xE4, 0xF5, 0x6C, 0xFD, 0xAF, 0x62, 0x12, 0x65, 0xC2, 0xE4, 0x90,
+0x92, 0x5D, 0xF0, 0x12, 0x9E, 0x20, 0xA3, 0xF0, 0x7B, 0x01, 0xFA, 0x7D, 0xFF, 0x7F, 0x01, 0xD1,
+0xF6, 0x05, 0x62, 0x21, 0x1B, 0x22, 0xF0, 0x90, 0x92, 0x4B, 0x12, 0x86, 0xFA, 0x90, 0x00, 0x06,
+0x12, 0x04, 0x18, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x04, 0x18, 0x2F, 0xFF, 0xE5, 0xF0,
+0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x04, 0x18, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0x92, 0x61,
+0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x88, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22,
+0x7A, 0x00, 0x7D, 0x03, 0x7F, 0x01, 0x90, 0x01, 0xC6, 0xE0, 0xFE, 0x64, 0x80, 0x70, 0x60, 0x90,
+0x92, 0x67, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEB, 0xA3, 0xF0, 0xEA, 0xA3, 0xF0, 0x90, 0x92, 0x5D,
+0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92, 0x6B, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x5F, 0xE0, 0xFC,
+0xA3, 0xE0, 0x90, 0x92, 0x6D, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x61, 0xE0, 0xFC, 0xA3, 0xE0,
+0x90, 0x92, 0x6F, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x63, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92,
+0x71, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x65, 0x74, 0xFE, 0xF0, 0x90, 0x92, 0x73, 0x74, 0x0C,
+0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x65, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x12, 0x87, 0xDA, 0x22,
+0x74, 0xAC, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0xFE, 0x90, 0x00, 0x04,
+0x02, 0x04, 0x18, 0xFF, 0x90, 0x92, 0x5D, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xE5, 0x71,
+0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01,
+0x93, 0xFF, 0xE5, 0x6E, 0x25, 0xE0, 0x24, 0x7B, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xEE,
+0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x7A, 0x00, 0x7D, 0x01, 0x7F, 0x01, 0xC1, 0xF6, 0xF5, 0x83, 0xE0,
+0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x9E, 0x22, 0x90, 0x92, 0x4B, 0x12, 0x86, 0xFA, 0x90,
+0x00, 0x08, 0x02, 0x04, 0x18, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x04, 0x18, 0x2F, 0xFF,
+0xEE, 0x35, 0xF0, 0x22, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, 0x67, 0xF0, 0xE5, 0x64, 0x90, 0x83, 0x1D,
+0x93, 0xFF, 0x22, 0x90, 0x00, 0x06, 0x02, 0x04, 0x18, 0x90, 0x92, 0x61, 0xE4, 0xF0, 0xA3, 0x22,
+0xE4, 0xFF, 0x02, 0x2D, 0xBD, 0xC4, 0x54, 0xF0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5,
+0x83, 0xE0, 0x22, 0x12, 0x02, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x36, 0xE0, 0x54, 0xFE, 0x4F,
+0xF0, 0x22, 0x12, 0x02, 0xF6, 0x90, 0x86, 0x71, 0xF0, 0x22, 0x12, 0x02, 0xF6, 0x90, 0x93, 0x29,
+0xF0, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x93, 0x2A, 0xF0, 0xBF, 0x01, 0x09, 0x7F, 0x01, 0x11,
+0x37, 0xE4, 0x90, 0x93, 0x2A, 0xF0, 0x22, 0x90, 0x92, 0x29, 0xEF, 0xF0, 0x31, 0xCC, 0x7F, 0xF4,
+0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x3B, 0xF0,
+0x31, 0xCC, 0x7F, 0xF5, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x39, 0xE0,
+0x90, 0x92, 0x3C, 0xF0, 0x31, 0xCC, 0x7F, 0xF6, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08,
+0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x3D, 0xF0, 0x31, 0xCC, 0x7F, 0xF7, 0x7E, 0x00, 0x12, 0x64,
+0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x3E, 0xF0, 0x31, 0xCC, 0x7F, 0xF8,
+0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x3F, 0xF0,
+0x31, 0xCC, 0x51, 0x6C, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x40, 0xF0, 0x31,
+0xCC, 0x31, 0xD3, 0x70, 0x52, 0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x41, 0xF0, 0x54, 0x07, 0x60,
+0x08, 0x90, 0x92, 0x39, 0xE0, 0x54, 0xE0, 0x70, 0x3E, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x3A, 0x7F,
+0xFA, 0x31, 0xD5, 0x70, 0x32, 0x90, 0x92, 0x39, 0xE0, 0xFC, 0x54, 0x07, 0x70, 0x12, 0x90, 0x92,
+0x41, 0xE0, 0xFE, 0x90, 0x92, 0x3A, 0xE0, 0x54, 0x07, 0xFD, 0xEE, 0x4D, 0x90, 0x92, 0x41, 0xF0,
+0xEC, 0x54, 0xE0, 0x70, 0x12, 0x90, 0x92, 0x41, 0xE0, 0xFF, 0x90, 0x92, 0x3A, 0xE0, 0x54, 0xE0,
+0xFE, 0xEF, 0x4E, 0x90, 0x92, 0x41, 0xF0, 0x31, 0xCC, 0x7F, 0xFD, 0x31, 0xD5, 0x70, 0x47, 0x90,
+0x92, 0x39, 0xE0, 0xFE, 0x54, 0xCC, 0x90, 0x92, 0x42, 0xF0, 0xEE, 0x54, 0x0C, 0xFF, 0x60, 0x08,
+0x90, 0x92, 0x39, 0xE0, 0x54, 0xC0, 0x70, 0x2E, 0xEF, 0x70, 0x12, 0x90, 0x92, 0x42, 0xE0, 0xFF,
+0x90, 0x92, 0x39, 0xE0, 0x54, 0x03, 0x71, 0xB0, 0x4E, 0x90, 0x92, 0x42, 0xF0, 0x90, 0x92, 0x39,
+0xE0, 0xFF, 0x54, 0xC0, 0x70, 0x10, 0x90, 0x92, 0x42, 0xE0, 0xFE, 0xEF, 0x54, 0x30, 0x25, 0xE0,
+0x25, 0xE0, 0xFF, 0xEE, 0x4F, 0xF0, 0x90, 0x92, 0x2A, 0x74, 0x19, 0xF0, 0x90, 0x92, 0x38, 0x74,
+0x08, 0xF0, 0x90, 0x92, 0x3B, 0xE0, 0x90, 0x92, 0x2C, 0xF0, 0x90, 0x92, 0x3C, 0xE0, 0x90, 0x92,
+0x2D, 0xF0, 0x90, 0x92, 0x3D, 0xE0, 0x90, 0x92, 0x2E, 0xF0, 0x90, 0x92, 0x3E, 0xE0, 0x90, 0x92,
+0x2F, 0xF0, 0x90, 0x92, 0x3F, 0xE0, 0x90, 0x92, 0x30, 0xF0, 0x90, 0x92, 0x40, 0xE0, 0x90, 0x92,
+0x31, 0xF0, 0x90, 0x92, 0x41, 0xE0, 0x90, 0x92, 0x32, 0xF0, 0x90, 0x92, 0x42, 0xE0, 0x90, 0x92,
+0x33, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0xB4, 0x01, 0x0E, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x2A, 0x12,
+0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xDA, 0x75, 0x1B, 0x01, 0x75, 0x1C, 0x92, 0x75, 0x1D, 0x2A,
+0x75, 0x1E, 0x0A, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x02, 0x6A, 0x21, 0x7B, 0x01, 0x7A, 0x92,
+0x79, 0x39, 0x22, 0x7F, 0xFB, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xEF, 0x64, 0x01, 0x22, 0x7E, 0x00,
+0x7F, 0x0B, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x2B, 0x12, 0x06, 0xDE, 0x51, 0x65, 0x51,
+0x6C, 0xBF, 0x01, 0x1C, 0x90, 0x92, 0x29, 0xE0, 0xFE, 0x54, 0x01, 0x90, 0x93, 0x2B, 0xF0, 0xEE,
+0x54, 0x04, 0x90, 0x93, 0x2D, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0x54, 0x08, 0x90, 0x93, 0x2C, 0xF0,
+0x51, 0x65, 0x31, 0xD3, 0x70, 0x34, 0x90, 0x92, 0x29, 0xE0, 0x54, 0x07, 0x70, 0x14, 0x7B, 0x01,
+0x7A, 0x92, 0x79, 0x2A, 0x7F, 0xFA, 0xFE, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x0F, 0x90, 0x92, 0x2A,
+0x80, 0x03, 0x90, 0x92, 0x29, 0xE0, 0x54, 0x07, 0x90, 0x93, 0x2F, 0xF0, 0x90, 0x92, 0x29, 0xE0,
+0x54, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0x93, 0x2E, 0xF0, 0x51, 0x65, 0x7F, 0xFD, 0x7E, 0x00,
+0x12, 0x64, 0x37, 0xBF, 0x01, 0x0E, 0x90, 0x92, 0x29, 0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F,
+0x90, 0x93, 0x30, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x29, 0x22, 0x7F, 0xF9, 0x7E, 0x00,
+0x02, 0x64, 0x37, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x7B, 0x3E, 0x71,
+0xEA, 0x71, 0xDD, 0x12, 0x7B, 0x9C, 0x91, 0x3C, 0x71, 0xD1, 0x7F, 0x01, 0x12, 0x85, 0x15, 0x90,
+0x93, 0x28, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x85, 0x15, 0x90, 0x93, 0x28, 0xE0, 0x04, 0xF0, 0x51,
+0xFB, 0x12, 0x9E, 0xCC, 0x90, 0x01, 0xCC, 0x74, 0x0F, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40,
+0xFD, 0x7F, 0x80, 0x12, 0x7B, 0x3E, 0x75, 0x20, 0xFF, 0x12, 0x7C, 0xCD, 0xE4, 0xFF, 0x11, 0x37,
+0x71, 0x5F, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x7B, 0x3E, 0x71, 0xC6,
+0x31, 0xDE, 0x90, 0x00, 0x00, 0xE0, 0x54, 0xFB, 0xFD, 0xE4, 0xFF, 0x71, 0xBE, 0x44, 0x04, 0xFD,
+0x7F, 0x01, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x98, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x88, 0xF0, 0xA3,
+0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xE4, 0xFF, 0x02, 0x85, 0x9E, 0x12, 0x7C, 0x4E, 0x90, 0x84,
+0xC5, 0xEF, 0xF0, 0x71, 0x2F, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44,
+0x80, 0xF0, 0x90, 0x00, 0x17, 0xE0, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x7B, 0x3E,
+0x90, 0x00, 0x38, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x38, 0x12, 0x7B, 0x3E, 0x02, 0x68, 0xE2, 0x12,
+0x75, 0xB6, 0x12, 0x75, 0x58, 0x91, 0x5F, 0x91, 0x1D, 0xE4, 0xF5, 0x40, 0xF5, 0x41, 0xF5, 0x42,
+0x75, 0x43, 0x80, 0xAD, 0x40, 0x7F, 0x50, 0x12, 0x7B, 0x3E, 0xAD, 0x41, 0x7F, 0x51, 0x12, 0x7B,
+0x3E, 0xAD, 0x42, 0x7F, 0x52, 0x12, 0x7B, 0x3E, 0xAD, 0x43, 0x7F, 0x53, 0x02, 0x7B, 0x3E, 0xE4,
+0x90, 0x92, 0x29, 0xF0, 0xA3, 0xF0, 0x71, 0xFF, 0xEF, 0x64, 0x01, 0x60, 0x3C, 0xC3, 0x90, 0x92,
+0x2A, 0xE0, 0x94, 0x88, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0,
+0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x1E, 0x90, 0x92, 0x29, 0x12, 0x97,
+0xE5, 0x71, 0xB7, 0xD3, 0x90, 0x92, 0x2A, 0xE0, 0x94, 0x32, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x00,
+0x40, 0xC4, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xBD, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22,
+0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x22, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0x12, 0x7B,
+0x3E, 0x90, 0x01, 0x01, 0xE0, 0x22, 0x90, 0x01, 0xE4, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x0D, 0xF0,
+0x22, 0xE4, 0x90, 0x84, 0xC1, 0x12, 0x9E, 0x25, 0x90, 0x92, 0xF9, 0xF0, 0x22, 0x90, 0x01, 0x94,
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x84, 0xA1, 0x74, 0x02, 0xF0,
+0xA3, 0x74, 0x10, 0xF0, 0x90, 0x84, 0xA7, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0x90,
+0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90,
+0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x75, 0x52, 0x06,
+0x75, 0x53, 0x01, 0x75, 0x54, 0x03, 0x75, 0x55, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x52, 0xF0, 0xA3,
+0xE5, 0x53, 0xF0, 0xA3, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0,
+0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x7C,
+0x9F, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x75,
+0x48, 0x12, 0xE4, 0xF5, 0x49, 0x75, 0x4A, 0x87, 0x75, 0x4B, 0x33, 0xF5, 0x50, 0x90, 0x01, 0x30,
+0xE5, 0x48, 0xF0, 0xA3, 0xE5, 0x49, 0xF0, 0xA3, 0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0x90,
+0x01, 0x20, 0xE5, 0x50, 0xF0, 0x22, 0x90, 0x93, 0xB1, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0,
+0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x93, 0xB1, 0xE0, 0x6F,
+0x60, 0x35, 0xC3, 0x90, 0x93, 0xB3, 0xE0, 0x94, 0x88, 0x90, 0x93, 0xB2, 0xE0, 0x94, 0x13, 0x40,
+0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x93, 0xB2, 0x12, 0x97, 0xE5, 0x71,
+0xB7, 0xD3, 0x90, 0x93, 0xB3, 0xE0, 0x94, 0x32, 0x90, 0x93, 0xB2, 0xE0, 0x94, 0x00, 0x40, 0xC0,
+0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB9, 0x22, 0xB1, 0x87, 0x7F, 0x08, 0x12, 0x7B, 0x51, 0xEF,
+0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x7B, 0x3E, 0xE4, 0xFF, 0x91, 0x86, 0x7D, 0x35, 0x7F, 0x27,
+0x12, 0x7B, 0x3E, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
+0xC0, 0xD0, 0xB1, 0x0B, 0x91, 0xD8, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x44,
+0x10, 0xF0, 0x90, 0x85, 0xD0, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xC6, 0xE0,
+0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01,
+0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12,
+0x7B, 0x3E, 0x7F, 0x01, 0x91, 0x86, 0x7D, 0x34, 0x7F, 0x27, 0x12, 0x7B, 0x3E, 0x7F, 0x90, 0xB1,
+0x75, 0x7F, 0x90, 0x12, 0x7B, 0x3E, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0x90, 0x85, 0xC8,
+0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0D, 0xB1, 0xA6, 0xBF, 0x01, 0x08, 0x91, 0xFB, 0x90, 0x01,
+0xE5, 0xE0, 0x04, 0xF0, 0x22, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x01, 0xFD, 0x22, 0x90, 0x85, 0xC1,
+0xE0, 0x30, 0xE0, 0x02, 0xB1, 0x5D, 0x22, 0x90, 0x01, 0xC4, 0x74, 0x87, 0xF0, 0x74, 0xB5, 0xA3,
+0xF0, 0x7F, 0x90, 0x12, 0x7B, 0x51, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x87, 0x04, 0x90, 0x01, 0xC4,
+0xF0, 0x74, 0xB5, 0xA3, 0xF0, 0x22, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x02, 0x80, 0x08, 0x90, 0x01,
+0x00, 0xE0, 0x64, 0x3F, 0x60, 0x05, 0x75, 0x61, 0x01, 0x80, 0x28, 0x90, 0x02, 0x96, 0xE0, 0x60,
+0x05, 0x75, 0x61, 0x10, 0x80, 0x1D, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x02, 0x80, 0x07, 0x90,
+0x02, 0x86, 0xE0, 0x30, 0xE3, 0x05, 0x75, 0x61, 0x04, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0,
+0x7F, 0x01, 0x22, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x61, 0xF0, 0x7F,
+0x00, 0x22, 0xE4, 0x90, 0x92, 0x43, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x92, 0x43, 0xE0, 0x64,
+0x01, 0xF0, 0x24, 0xF2, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xB5, 0xA3, 0xF0, 0x12, 0x7C, 0x66, 0xBF,
+0x01, 0x03, 0x12, 0x5B, 0x25, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0F, 0x90, 0x85, 0xC8, 0xE0, 0xFF,
+0x90, 0x85, 0xC7, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x97, 0xD1, 0xC2, 0xAF, 0xD1, 0xC2, 0xBF, 0x01,
+0x02, 0xB1, 0x7D, 0xD2, 0xAF, 0xD1, 0x58, 0x90, 0x92, 0x44, 0x12, 0x97, 0xE5, 0x54, 0x7F, 0x45,
+0xF0, 0x70, 0x0D, 0x7F, 0xFF, 0x12, 0x7B, 0x51, 0xEF, 0x04, 0xFD, 0x7F, 0xFF, 0x12, 0x7B, 0x3E,
+0x12, 0x8F, 0xF6, 0x12, 0x84, 0x4D, 0x80, 0xA3, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
+0x93, 0x31, 0xE0, 0x60, 0x24, 0x7F, 0x54, 0x7E, 0x09, 0x12, 0x70, 0x61, 0xD1, 0xAF, 0x12, 0x86,
+0xE2, 0xEF, 0x44, 0xFE, 0xFF, 0xEE, 0x44, 0x03, 0xFE, 0xED, 0x44, 0x04, 0xFD, 0xEC, 0xD1, 0xAF,
+0xD1, 0xB9, 0x7F, 0x54, 0x7E, 0x09, 0x12, 0x71, 0x18, 0x90, 0x93, 0x2C, 0xE0, 0x70, 0x04, 0x90,
+0x07, 0xCC, 0xF0, 0x90, 0x93, 0x34, 0xE0, 0x70, 0x0A, 0x90, 0x93, 0x31, 0xE0, 0x70, 0x04, 0xA3,
+0xE0, 0x60, 0x07, 0x90, 0x00, 0x1F, 0xE0, 0x54, 0xF0, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90,
+0x92, 0x46, 0x12, 0x04, 0xEB, 0x90, 0x92, 0x46, 0x22, 0x12, 0x86, 0xE2, 0x90, 0x91, 0x66, 0x02,
+0x04, 0xEB, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0xC2, 0xF0, 0x74, 0xB6, 0xA3, 0xF0, 0x90, 0x93,
+0x28, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x18, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30,
+0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xDE,
+0x7F, 0x01, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x8D, 0xEE, 0xF0, 0xA3,
+0xEF, 0xF0, 0x12, 0x70, 0x61, 0x90, 0x93, 0x97, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x8F, 0x12, 0x86,
+0xE2, 0x12, 0x04, 0xA7, 0x90, 0x93, 0x97, 0x12, 0x86, 0xEE, 0x12, 0x86, 0xC8, 0xC0, 0x04, 0xC0,
+0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x8F, 0x12, 0x86, 0xE2, 0x90, 0x93, 0x93, 0x12, 0x86,
+0xEE, 0x12, 0x86, 0xC8, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x86, 0xD5, 0x90,
+0x93, 0x9B, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x9B, 0xD1, 0xB9, 0x90, 0x93, 0x8D, 0xE0, 0xFE, 0xA3,
+0xE0, 0xFF, 0x12, 0x71, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x02, 0xF6, 0x90, 0x93, 0x1D,
+0xF0, 0x12, 0x8E, 0xF8, 0x90, 0x93, 0x1E, 0x12, 0x8B, 0xE5, 0x90, 0x93, 0x1F, 0xF0, 0x22, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x1E, 0xE0, 0xFF, 0x90, 0x85, 0x1D, 0xE0, 0xB5,
+0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x48, 0x90, 0x85, 0x1D, 0xE0, 0xFE,
+0x75, 0xF0, 0x08, 0x90, 0x84, 0xCD, 0x12, 0x05, 0x28, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4,
+0x24, 0xCE, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x94, 0x6F, 0x90,
+0x85, 0x1D, 0x12, 0xA7, 0x6A, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85,
+0x1D, 0xF0, 0x7D, 0x68, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x12, 0x40, 0xB9, 0x90, 0x84, 0xC1, 0xE0,
+0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x85, 0xB5, 0xE0, 0xFF, 0x70, 0x06, 0xA3,
+0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x85, 0xB6, 0xE0, 0xB5, 0x07, 0x04, 0x7F,
+0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x22,
+0xC0, 0x01, 0x90, 0x85, 0xB6, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x1F, 0xF9, 0x74, 0x85, 0x35,
+0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x02, 0xD0, 0x7D,
+0xCC, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xB6, 0x12, 0xA7, 0x6A, 0xB4, 0x0A, 0x02, 0x7F,
+0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85, 0xB6, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01,
+0x12, 0x86, 0x4E, 0x90, 0x92, 0x4A, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x70,
+0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE0, 0x0F, 0x90, 0x84, 0xC1, 0xE0, 0x54,
+0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x2D, 0xBD, 0x12, 0xA9, 0x0C, 0x11, 0x95, 0x30, 0xE1, 0x06, 0x54,
+0xFD, 0xF0, 0x12, 0x60, 0x5D, 0x11, 0x95, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x6A, 0x6D,
+0x11, 0x95, 0x30, 0xE5, 0x0C, 0x54, 0xDF, 0xF0, 0x12, 0x6F, 0x22, 0xBF, 0x01, 0x03, 0x12, 0x98,
+0xE0, 0xD2, 0xAF, 0x80, 0xB5, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x22, 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, 0xC0, 0xF0, 0x74, 0xA9, 0xA3, 0xF0, 0x12, 0x75, 0x28, 0xE5, 0x56, 0x30, 0xE1, 0x03, 0x12,
-0x97, 0x32, 0xE5, 0x56, 0x30, 0xE2, 0x02, 0x11, 0xAE, 0xE5, 0x56, 0x30, 0xE4, 0x02, 0xF1, 0x8C,
-0xE5, 0x57, 0x30, 0xE0, 0x02, 0x51, 0x57, 0xE5, 0x59, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0xB1, 0xED,
-0xE5, 0x59, 0x30, 0xE4, 0x03, 0x12, 0x97, 0xE2, 0xE5, 0x59, 0x30, 0xE5, 0x02, 0x31, 0x65, 0xE5,
-0x59, 0x30, 0xE6, 0x02, 0x31, 0x91, 0x74, 0xC0, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xA9, 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, 0xF0, 0x90, 0x01, 0xB9,
-0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x22, 0x12, 0xBD, 0xEC, 0x90, 0x92, 0xCC, 0xEF, 0xF0, 0x30,
-0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x57, 0x82, 0x90, 0x92, 0xCC,
-0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90,
-0x01, 0x2F, 0x74, 0x80, 0xF0, 0xF1, 0x97, 0x02, 0x51, 0x7D, 0x71, 0x06, 0x13, 0x54, 0x1F, 0x30,
-0xE0, 0x10, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x07, 0x7D, 0x02, 0x7F, 0x02, 0x12,
-0x7C, 0x41, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x07, 0xEF, 0x91,
-0x2A, 0x70, 0x52, 0x80, 0x4E, 0x90, 0x85, 0xCE, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54,
-0xEF, 0xF0, 0xF1, 0x78, 0xD3, 0x9F, 0x40, 0x3B, 0x12, 0x97, 0x4C, 0x70, 0x38, 0x12, 0x8F, 0xCA,
-0x70, 0x0B, 0x12, 0x70, 0xDB, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x70, 0xDB,
-0x90, 0x85, 0xCF, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, 0x40, 0x0E, 0x90, 0x85, 0xC2, 0xE0,
-0x54, 0xFB, 0xF0, 0xE4, 0x90, 0x85, 0xCF, 0xF0, 0x80, 0x03, 0x12, 0x79, 0x41, 0xE4, 0x90, 0x85,
-0xCE, 0xF0, 0x22, 0x11, 0xCB, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0xFF, 0x13, 0x13, 0x22, 0x12, 0x97,
-0x4C, 0x60, 0x02, 0x81, 0x29, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x81, 0x29, 0x90, 0x05, 0x63,
-0xE0, 0x90, 0x93, 0x24, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x93, 0x25, 0xF0, 0x90, 0x05, 0x61,
-0xE0, 0x90, 0x93, 0x26, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x93, 0x27, 0xF0, 0x12, 0x97, 0xEB,
-0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEC, 0xF0, 0x90, 0x85, 0xC3, 0xE0, 0xFF, 0xC4, 0x54, 0x0F,
-0x24, 0xFD, 0x50, 0x02, 0x80, 0x02, 0x11, 0xF4, 0x90, 0x85, 0xC3, 0xE0, 0xFF, 0xC4, 0x54, 0x0F,
-0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x85, 0xCC, 0xF0, 0x90, 0x06, 0xAA, 0xE0,
-0x90, 0x85, 0xCB, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xFE, 0xFF, 0x80,
-0x00, 0x90, 0x85, 0xCC, 0xEF, 0xF0, 0x12, 0xC0, 0x7F, 0xE4, 0x90, 0x85, 0xCE, 0xF0, 0xF1, 0x82,
-0x71, 0x06, 0x13, 0x54, 0x1F, 0x20, 0xE0, 0x02, 0x81, 0x22, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03,
-0x20, 0xE0, 0x3B, 0x90, 0x85, 0xCB, 0xE0, 0xFF, 0xA3, 0xE0, 0x6F, 0x70, 0x75, 0x90, 0x85, 0xC2,
-0xE0, 0x44, 0x40, 0xF0, 0x90, 0x85, 0xCB, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x90, 0x01, 0x3F, 0x74,
-0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x12, 0x7B, 0xFD, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x7C, 0x41, 0x7D,
-0x02, 0x7F, 0x02, 0x12, 0x7C, 0x41, 0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0, 0x80, 0x44, 0x90, 0x85,
-0xC3, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x39, 0x90, 0x85, 0xCB, 0xE0, 0xFF, 0xA3, 0xE0,
-0xFE, 0x6F, 0x60, 0x2E, 0x90, 0x05, 0x73, 0xE0, 0xFF, 0xEE, 0x6F, 0x60, 0x25, 0x71, 0x06, 0x54,
-0x3F, 0x30, 0xE0, 0x1E, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x01, 0x3F, 0x74, 0x10, 0xF0, 0xFD, 0x7F,
-0x03, 0x12, 0x7B, 0xBF, 0x7D, 0x01, 0x7F, 0x02, 0x12, 0x7C, 0xA9, 0x7D, 0x02, 0x7F, 0x02, 0x12,
-0x7C, 0xA9, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x54, 0xFB, 0xF0, 0x90, 0x85, 0xC9,
-0xE0, 0x54, 0xFD, 0xF0, 0x54, 0x07, 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, 0x37, 0xF0, 0x74, 0xAC, 0xA3, 0xF0, 0x12, 0x71,
-0x90, 0xE5, 0x4C, 0x30, 0xE1, 0x02, 0xB1, 0x6B, 0xE5, 0x4C, 0x30, 0xE3, 0x02, 0xD1, 0x06, 0xE5,
-0x4C, 0x30, 0xE4, 0x02, 0xB1, 0xE8, 0xE5, 0x4C, 0x30, 0xE5, 0x03, 0x12, 0xBC, 0x89, 0xE5, 0x4E,
-0x30, 0xE0, 0x03, 0x12, 0x94, 0x53, 0xE5, 0x4E, 0x30, 0xE1, 0x03, 0x12, 0x95, 0x51, 0xE5, 0x4E,
-0x30, 0xE2, 0x02, 0xF1, 0x3C, 0xE5, 0x4E, 0x30, 0xE3, 0x03, 0x12, 0x97, 0x3D, 0xE5, 0x4E, 0x30,
-0xE4, 0x02, 0x31, 0x4B, 0xE5, 0x4E, 0x30, 0xE5, 0x02, 0xF1, 0xD8, 0xE5, 0x4E, 0x30, 0xE6, 0x02,
-0x11, 0xD5, 0xE5, 0x4E, 0x30, 0xE7, 0x02, 0xF1, 0xC2, 0xE5, 0x4F, 0x30, 0xE0, 0x02, 0xF1, 0xB3,
-0xE5, 0x4F, 0x30, 0xE1, 0x02, 0xB1, 0xFC, 0xE5, 0x4F, 0x30, 0xE4, 0x02, 0xF1, 0x6C, 0xE5, 0x4F,
-0x30, 0xE5, 0x02, 0x91, 0xFB, 0x74, 0x37, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xAC, 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, 0x77, 0x90, 0x85,
-0xBB, 0xE0, 0xFF, 0xE5, 0x77, 0xC3, 0x9F, 0x50, 0x61, 0xAF, 0x77, 0x12, 0x77, 0x39, 0xEF, 0x60,
-0x55, 0xE5, 0x77, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x77, 0x54, 0x07, 0xFE, 0x74, 0x75,
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0xF1, 0x64, 0x80, 0x05,
-0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x60, 0x2A, 0xE5, 0x77, 0xF1, 0xA5,
-0x20, 0xE7, 0x02, 0x80, 0x13, 0xE5, 0x77, 0xC4, 0x54, 0xF0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
-0x81, 0xF5, 0x83, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80,
-0x05, 0xAD, 0x77, 0x12, 0x8F, 0x09, 0x05, 0x77, 0x80, 0x94, 0x22, 0xE4, 0xFF, 0x90, 0x92, 0xBB,
-0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92, 0xCB, 0xF0, 0xE0, 0xFE, 0x6F,
-0x60, 0x65, 0x90, 0x92, 0xBC, 0x74, 0x03, 0xF0, 0x90, 0x92, 0xCA, 0x74, 0x08, 0xF0, 0xEE, 0x04,
-0x54, 0x0F, 0xFF, 0xE4, 0xFE, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
-0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2E, 0xD1, 0x18, 0xE0, 0xFD, 0x74, 0xBE, 0x2E, 0xF5, 0x82, 0xE4,
-0x34, 0x92, 0xF5, 0x83, 0xED, 0xF0, 0x0E, 0xEE, 0xB4, 0x08, 0xDA, 0x7B, 0x01, 0x7A, 0x92, 0x79,
-0xBC, 0x12, 0x5E, 0x10, 0x90, 0x92, 0xCB, 0xE0, 0x04, 0x54, 0x0F, 0xFF, 0xF0, 0xBF, 0x0F, 0x02,
-0xE4, 0xF0, 0x90, 0x92, 0xCB, 0xE0, 0x90, 0x04, 0x7F, 0xF0, 0x90, 0x92, 0xBB, 0xE0, 0x7F, 0x04,
-0x70, 0x02, 0x80, 0x09, 0x12, 0x87, 0xDA, 0x22, 0x12, 0x40, 0xB9, 0x7F, 0x02, 0x8F, 0x0D, 0x7F,
-0x02, 0x12, 0x86, 0x27, 0x90, 0x84, 0xC1, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0x90, 0x85, 0xC5, 0xE0,
-0x60, 0x03, 0x12, 0xC2, 0x72, 0x22, 0x90, 0x92, 0xE3, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x20, 0xB1,
-0xED, 0x22, 0x12, 0x05, 0x28, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x22,
-0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x92, 0x01, 0xE0, 0xFD, 0x70,
-0x02, 0xE1, 0x20, 0x90, 0x85, 0x1D, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A,
-0xEF, 0x14, 0xFF, 0x90, 0x85, 0x1E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00,
-0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x93, 0x9F, 0xE0, 0xF1,
-0x63, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0xE1,
-0x03, 0xE4, 0x90, 0x92, 0x02, 0xF0, 0x90, 0x92, 0x02, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x34,
-0xF1, 0x22, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0,
-0xF1, 0x2A, 0x90, 0x84, 0xCD, 0xD1, 0x12, 0xEF, 0xF1, 0x21, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0,
-0xFE, 0x74, 0xF0, 0xF1, 0x2A, 0x90, 0x84, 0xD1, 0xD1, 0x12, 0xEF, 0xF0, 0x90, 0x92, 0x02, 0xE0,
-0x04, 0xF0, 0x80, 0xC2, 0x90, 0x92, 0x01, 0xE0, 0xFF, 0x90, 0x93, 0x9F, 0xE0, 0xFE, 0x74, 0x01,
-0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x92, 0x01, 0xF0, 0x90,
-0x93, 0x9F, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90,
-0x01, 0xCC, 0xF0, 0x90, 0x93, 0x9F, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x85, 0x1E,
-0xF1, 0x71, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x02, 0xC1, 0x2A, 0xE4, 0x90, 0x85, 0x1E,
-0xF0, 0xC1, 0x2A, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x93, 0x9F, 0xE0, 0x44, 0x80,
-0x90, 0x00, 0x8A, 0xF1, 0x21, 0x90, 0x01, 0xD0, 0x12, 0x05, 0x28, 0xE0, 0x90, 0x01, 0xC3, 0xF0,
-0x22, 0xF0, 0x90, 0x93, 0x9F, 0xE0, 0x75, 0xF0, 0x04, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E,
-0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x85, 0x1E, 0xE0, 0x75, 0xF0, 0x08, 0x22, 0x90, 0x85, 0xC8, 0xE0,
-0x64, 0x02, 0x60, 0x08, 0x71, 0x0E, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0x13, 0x13, 0x13,
-0x54, 0x1F, 0x24, 0x75, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFD, 0x7C, 0x00, 0xE5,
-0x62, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0xE4, 0xFF, 0x02, 0x2D,
-0xBD, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0x90, 0x86, 0x6D, 0xE0, 0xFF, 0x90, 0x85, 0xCE,
-0xE0, 0x22, 0x90, 0x85, 0xD1, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x90, 0x01, 0xC7, 0x74,
-0x66, 0xF0, 0xE4, 0xFF, 0x02, 0x5F, 0xE9, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90,
-0x85, 0xDE, 0xE0, 0xFB, 0x22, 0xC4, 0x54, 0xF0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5,
-0x83, 0xE0, 0x22, 0x12, 0x97, 0xCB, 0xFF, 0xBF, 0x03, 0x07, 0x90, 0x05, 0x21, 0xE0, 0x54, 0x7F,
-0xF0, 0x22, 0xE4, 0xF5, 0x77, 0xF5, 0x78, 0xF5, 0x79, 0x12, 0x97, 0xCB, 0xFF, 0xBF, 0x03, 0x07,
-0x90, 0x05, 0x21, 0xE0, 0x54, 0x7F, 0xF0, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF, 0x01, 0x13,
-0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0D, 0x12, 0x8F, 0xCA, 0x64, 0x02, 0x60, 0x03, 0x02, 0x77, 0x61,
-0x12, 0x79, 0x41, 0x22, 0x12, 0x02, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x93, 0x1E, 0xE0, 0x54, 0xFE,
-0x4F, 0xF0, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x93, 0x12, 0xF0, 0xBF, 0x01, 0x07, 0x11, 0x16,
-0xE4, 0x90, 0x93, 0x12, 0xF0, 0x22, 0x31, 0x0A, 0x7F, 0xF4, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF,
-0x01, 0x06, 0x90, 0x92, 0x16, 0xE0, 0xA3, 0xF0, 0x31, 0x0A, 0x7F, 0xF5, 0x7E, 0x00, 0x12, 0x64,
-0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x18, 0xF0, 0x31, 0x0A, 0x7F, 0xF6,
-0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x19, 0xF0,
-0x31, 0x0A, 0x7F, 0xF7, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0,
-0x90, 0x92, 0x1A, 0xF0, 0x31, 0x0A, 0x7F, 0xF8, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08,
-0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x1B, 0xF0, 0x31, 0x0A, 0x7F, 0xF9, 0x7E, 0x00, 0x12, 0x64,
-0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x1C, 0xF0, 0x31, 0x0A, 0x7F, 0xFB,
-0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x1D, 0xF0,
-0x31, 0x0A, 0x7F, 0xFD, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0,
-0x90, 0x92, 0x1E, 0xF0, 0x90, 0x92, 0x07, 0x74, 0x19, 0xF0, 0x90, 0x92, 0x15, 0x74, 0x08, 0xF0,
-0x90, 0x92, 0x17, 0xE0, 0x90, 0x92, 0x09, 0xF0, 0x90, 0x92, 0x18, 0xE0, 0x90, 0x92, 0x0A, 0xF0,
-0x90, 0x92, 0x19, 0xE0, 0x90, 0x92, 0x0B, 0xF0, 0x90, 0x92, 0x1A, 0xE0, 0x90, 0x92, 0x0C, 0xF0,
-0x90, 0x92, 0x1B, 0xE0, 0x90, 0x92, 0x0D, 0xF0, 0x90, 0x92, 0x1C, 0xE0, 0x90, 0x92, 0x0E, 0xF0,
-0x90, 0x92, 0x1D, 0xE0, 0x90, 0x92, 0x0F, 0xF0, 0x90, 0x92, 0x1E, 0xE0, 0x90, 0x92, 0x10, 0xF0,
-0x31, 0x11, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xDA, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x16,
-0x22, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x07, 0x22, 0x31, 0x11, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x64,
-0x37, 0xBF, 0x01, 0x06, 0x90, 0x92, 0x07, 0xE0, 0xA3, 0xF0, 0x31, 0x11, 0x7F, 0xF6, 0x7E, 0x01,
-0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x09, 0xF0, 0x31, 0x11,
-0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92,
-0x0A, 0xF0, 0x31, 0x11, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92,
-0x07, 0xE0, 0x90, 0x92, 0x0B, 0xF0, 0x31, 0x11, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF,
-0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x0C, 0xF0, 0x90, 0x92, 0x08, 0xE0, 0xFF, 0xA3,
-0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x92, 0x10, 0xF0, 0x90, 0x92, 0x0C, 0xE0, 0x90,
-0x92, 0x11, 0xF0, 0x90, 0x92, 0x12, 0x74, 0x12, 0xF0, 0x90, 0x92, 0x20, 0x74, 0x05, 0xF0, 0x90,
-0x92, 0x14, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x92, 0x10, 0xE0, 0x90, 0x92,
-0x17, 0xF0, 0x90, 0x92, 0x11, 0xE0, 0x90, 0x92, 0x18, 0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x12,
-0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xDA, 0x12, 0x02, 0xF6, 0x90, 0x93, 0x05, 0xF0, 0x12,
-0x8E, 0xF7, 0x90, 0x93, 0x06, 0x12, 0x8B, 0xD8, 0x90, 0x93, 0x07, 0xF0, 0x22, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x1E, 0xE0, 0xFF, 0x90, 0x85, 0x1D, 0xE0, 0xB5, 0x07, 0x04,
-0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x48, 0x90, 0x85, 0x1D, 0xE0, 0xFE, 0x75, 0xF0,
-0x08, 0x90, 0x84, 0xCD, 0x12, 0x05, 0x28, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xCE,
-0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x96, 0x33, 0x90, 0x85, 0x1D,
-0x12, 0xAF, 0x71, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85, 0x1D, 0xF0,
-0x7D, 0x68, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x12, 0x40, 0xB9, 0x90, 0x84, 0xC1, 0xE0, 0x44, 0x02,
-0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x85, 0xB5, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64,
-0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x85, 0xB6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80,
-0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xC0, 0x01,
-0x90, 0x85, 0xB6, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x1F, 0xF9, 0x74, 0x85, 0x35, 0xF0, 0xA8,
-0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x02, 0xD0, 0x7D, 0xCC, 0x7F,
-0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xB6, 0x12, 0xAF, 0x71, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF,
-0x60, 0x05, 0xE4, 0x90, 0x85, 0xB6, 0xF0, 0x22, 0xE4, 0x90, 0x84, 0xC1, 0x12, 0x99, 0x09, 0x90,
-0x92, 0xE1, 0xF0, 0x22, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80, 0x12, 0x7B, 0x3E,
-0xB1, 0x56, 0xB1, 0x49, 0x12, 0x7B, 0x9C, 0xB1, 0xC5, 0x51, 0xA8, 0x7F, 0x01, 0x12, 0x85, 0x15,
-0x90, 0x93, 0x10, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x85, 0x15, 0x90, 0x93, 0x10, 0xE0, 0x04, 0xF0,
-0x91, 0x80, 0x71, 0xB7, 0x90, 0x01, 0xCC, 0x74, 0x0F, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40,
-0xFD, 0x7F, 0x80, 0x12, 0x7B, 0x3E, 0x75, 0x20, 0xFF, 0x12, 0x7C, 0xCD, 0x91, 0xE4, 0x90, 0x00,
-0x81, 0xE0, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x7B, 0x3E, 0xB1, 0x40, 0x71, 0x3C, 0x90, 0x00,
-0x00, 0xE0, 0x54, 0xFB, 0xFD, 0xE4, 0xFF, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04,
-0xFD, 0x7F, 0x01, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x98, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x88, 0xF0,
-0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xE4, 0xFF, 0x02, 0x85, 0x9E, 0x7E, 0x00, 0x7F, 0x0B,
-0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x13, 0x12, 0x06, 0xDE, 0x71, 0xB0, 0x7F, 0xF9, 0x7E,
-0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x1C, 0x90, 0x92, 0x29, 0xE0, 0xFE, 0x54, 0x01, 0x90, 0x93,
-0x13, 0xF0, 0xEE, 0x54, 0x04, 0x90, 0x93, 0x15, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0x54, 0x08, 0x90,
-0x93, 0x14, 0xF0, 0x71, 0xB0, 0x7F, 0xFB, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x16, 0x90,
-0x92, 0x29, 0xE0, 0xFE, 0x54, 0x07, 0x90, 0x93, 0x17, 0xF0, 0xEE, 0x54, 0xE0, 0xC4, 0x13, 0x54,
-0x07, 0x90, 0x93, 0x16, 0xF0, 0x71, 0xB0, 0x7F, 0xFD, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01,
-0x0E, 0x90, 0x92, 0x29, 0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x93, 0x18, 0xF0, 0x22,
-0x7B, 0x01, 0x7A, 0x92, 0x79, 0x29, 0x22, 0xB1, 0x3A, 0x12, 0x7B, 0xEF, 0x12, 0x3C, 0x03, 0xD1,
-0x0F, 0x12, 0x94, 0x92, 0x71, 0xD2, 0x12, 0x98, 0xE0, 0xB1, 0x6B, 0x90, 0x93, 0x11, 0x74, 0x01,
-0xF0, 0x22, 0x90, 0x93, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x54, 0xFD, 0xF0, 0x54, 0xFB, 0xF0, 0x44,
-0x10, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x2D, 0x90, 0xFD, 0x80, 0xE0, 0x7E,
-0x00, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x93, 0x0F, 0x91, 0x79, 0x7E, 0x00, 0x30, 0xE1, 0x02,
-0x7E, 0x01, 0x90, 0x93, 0x0D, 0x91, 0x79, 0x7E, 0x00, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x93,
-0x0E, 0x91, 0x79, 0x90, 0x02, 0xFB, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x21, 0x91, 0x72, 0x30,
-0xE0, 0x02, 0x7F, 0x01, 0x90, 0x93, 0x0F, 0xEF, 0xF0, 0x91, 0x72, 0x30, 0xE1, 0x02, 0x7F, 0x01,
-0x90, 0x93, 0x0D, 0xEF, 0xF0, 0x91, 0x72, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x27, 0x90, 0x84,
-0xC5, 0xE0, 0x64, 0x03, 0x70, 0x24, 0x91, 0x6B, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x93, 0x0F,
-0xEF, 0xF0, 0x91, 0x6B, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x93, 0x0D, 0xEF, 0xF0, 0x91, 0x6B,
-0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90, 0x93, 0x0E, 0xEF, 0xF0, 0x22, 0x90, 0xFD, 0x78, 0xE0, 0x7F,
-0x00, 0x22, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x22,
-0x12, 0x7C, 0x4E, 0x90, 0x84, 0xC5, 0xEF, 0xF0, 0x91, 0xB4, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0,
-0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x00, 0x17, 0xE0, 0x54, 0xFC, 0x44, 0x04, 0xFD,
-0x7F, 0x17, 0x12, 0x7B, 0x3E, 0x90, 0x00, 0x38, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x38, 0x12, 0x7B,
-0x3E, 0x02, 0x68, 0xE2, 0x12, 0x75, 0xB6, 0x12, 0x75, 0x58, 0xB1, 0xE8, 0xB1, 0xA6, 0xE4, 0xF5,
-0x40, 0xF5, 0x41, 0xF5, 0x42, 0x75, 0x43, 0x80, 0xAD, 0x40, 0x7F, 0x50, 0x12, 0x7B, 0x3E, 0xAD,
-0x41, 0x7F, 0x51, 0x12, 0x7B, 0x3E, 0xAD, 0x42, 0x7F, 0x52, 0x12, 0x7B, 0x3E, 0xAD, 0x43, 0x7F,
-0x53, 0x02, 0x7B, 0x3E, 0xE4, 0x90, 0x92, 0x29, 0xF0, 0xA3, 0xF0, 0xB1, 0x88, 0xEF, 0x64, 0x01,
-0x60, 0x41, 0xC3, 0x90, 0x92, 0x2A, 0xE0, 0x94, 0x88, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x13, 0x40,
-0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x23,
-0x90, 0x92, 0x29, 0x12, 0x97, 0xC4, 0x7F, 0x14, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0xD3, 0x90, 0x92,
-0x2A, 0xE0, 0x94, 0x32, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC6, 0xE0,
-0x30, 0xE3, 0xB8, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0xE4, 0xFD, 0xFF, 0x02, 0x6E, 0x5F,
-0x90, 0x01, 0xE4, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0,
-0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x84, 0xA1, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x10, 0xF0,
-0x90, 0x84, 0xA7, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0x90, 0x89, 0x16, 0xE0, 0x54,
-0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x89, 0x18, 0xF0,
-0x90, 0x89, 0x16, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x44, 0x0B,
-0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00,
-0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x75, 0x52, 0x06, 0x75, 0x53, 0x01, 0x75, 0x54, 0x03, 0x75,
-0x55, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x52, 0xF0, 0xA3, 0xE5, 0x53, 0xF0, 0xA3, 0xE5, 0x54, 0xF0,
-0xA3, 0xE5, 0x55, 0xF0, 0x22, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0,
-0x54, 0xC0, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0,
-0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0x75, 0x48, 0x12, 0xE4, 0xF5, 0x49, 0x75, 0x4A,
-0x87, 0x75, 0x4B, 0x33, 0xF5, 0x50, 0x90, 0x01, 0x30, 0xE5, 0x48, 0xF0, 0xA3, 0xE5, 0x49, 0xF0,
-0xA3, 0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0x90, 0x01, 0x20, 0xE5, 0x50, 0xF0, 0x22, 0x7B,
-0x00, 0x7A, 0x00, 0x79, 0x00, 0x90, 0x89, 0x1B, 0x12, 0x87, 0x03, 0x7B, 0xFF, 0x7A, 0x82, 0x79,
-0x00, 0x90, 0x89, 0x1E, 0x12, 0x87, 0x03, 0x7A, 0x82, 0x79, 0x3F, 0x90, 0x89, 0x21, 0x12, 0x87,
-0x03, 0x7A, 0x82, 0x79, 0xE1, 0x90, 0x89, 0x27, 0x12, 0x87, 0x03, 0x7A, 0x82, 0x79, 0xF5, 0x90,
-0x89, 0x2A, 0x12, 0x87, 0x03, 0x7A, 0x83, 0x79, 0x1D, 0x90, 0x89, 0x2D, 0x12, 0x87, 0x03, 0x7A,
-0x83, 0x79, 0x31, 0x90, 0x89, 0x33, 0x12, 0x87, 0x03, 0x7A, 0x83, 0x79, 0x59, 0x90, 0x89, 0x36,
-0x12, 0x87, 0x03, 0x7A, 0x83, 0x79, 0x81, 0x90, 0x89, 0x39, 0x12, 0x87, 0x03, 0xE4, 0x90, 0x93,
-0x5F, 0xF0, 0x90, 0x92, 0x29, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0xFF, 0xC3, 0x94, 0x05, 0x50, 0x10,
-0x74, 0x70, 0x2F, 0x12, 0x9F, 0x8B, 0xE4, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0x04, 0xF0, 0x80, 0xE6,
-0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x91, 0xF0, 0x74, 0xB6, 0xA3, 0xF0, 0x90, 0x93, 0x10,
-0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x18, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4,
-0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xDE, 0x7F,
-0x01, 0x22, 0xE4, 0x90, 0x92, 0x2B, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x92, 0x2B, 0xE0, 0x64,
-0x01, 0xF0, 0x24, 0xC2, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xB6, 0xA3, 0xF0, 0x12, 0x7C, 0x66, 0xBF,
-0x01, 0x03, 0x12, 0x5B, 0x25, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0F, 0x90, 0x85, 0xC8, 0xE0, 0xFF,
-0x90, 0x85, 0xC7, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0xA8, 0xCB, 0xC2, 0xAF, 0xD1, 0x91, 0xBF, 0x01,
-0x02, 0xF1, 0x29, 0xD2, 0xAF, 0x12, 0xB8, 0xAE, 0x90, 0x92, 0x2C, 0x12, 0x97, 0xC4, 0x54, 0x7F,
-0x45, 0xF0, 0x70, 0x0D, 0x7F, 0xFF, 0x12, 0x7B, 0x51, 0xEF, 0x04, 0xFD, 0x7F, 0xFF, 0x12, 0x7B,
-0x3E, 0x12, 0x8F, 0xF2, 0x12, 0x84, 0x4D, 0x80, 0xA2, 0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x02,
-0xF1, 0x33, 0x22, 0x90, 0x85, 0xC8, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0E, 0x12, 0xBF, 0x53,
-0xBF, 0x01, 0x08, 0xF1, 0x4C, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0xF1, 0x80, 0xF1, 0x5C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xBE, 0x31, 0x7F,
-0x08, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x7B, 0x3E, 0xE4, 0xFF, 0xF1,
-0xD7, 0x7D, 0x35, 0x7F, 0x27, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xEF, 0xF0, 0x22,
-0x90, 0x85, 0xC2, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x85, 0xD0, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x7B,
-0x3E, 0x90, 0x85, 0xC6, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10,
-0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x7B, 0x51, 0xEF, 0x44,
-0x10, 0xFD, 0x7F, 0x08, 0x12, 0x7B, 0x3E, 0x7F, 0x01, 0xF1, 0xD7, 0x7D, 0x34, 0x7F, 0x27, 0x12,
-0x7B, 0x3E, 0x7F, 0x90, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x01, 0xFD, 0x7F, 0x90, 0x12, 0x7B, 0x3E,
-0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0x90, 0x93, 0x99, 0xEF, 0x12, 0x98, 0xD9, 0x90, 0x01,
-0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x93, 0x99, 0xE0, 0x6F, 0x60, 0x3A,
-0xC3, 0x90, 0x93, 0x9B, 0xE0, 0x94, 0x88, 0x90, 0x93, 0x9A, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90,
-0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90, 0x93, 0x9A, 0x12, 0x97, 0xC4, 0x7F, 0x14, 0x7E,
-0x00, 0x12, 0x7C, 0x9F, 0xD3, 0x90, 0x93, 0x9B, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x9A, 0xE0, 0x94,
-0x00, 0x40, 0xBB, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xB4, 0x22, 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, 0x2C, 0xF0, 0x74,
-0xB8, 0xA3, 0xF0, 0x12, 0x6C, 0xBC, 0x74, 0x2C, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xB8, 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, 0x32, 0xC0, 0xE0, 0xC0,
-0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x7D, 0x90, 0x01,
-0xC4, 0xED, 0xF0, 0x74, 0xB8, 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, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x19, 0xE0, 0x60, 0x25, 0x7F, 0x54, 0x7E, 0x09, 0x12,
-0x70, 0x61, 0x31, 0x06, 0xEF, 0x44, 0xFE, 0xFF, 0xEE, 0x44, 0x03, 0xFE, 0xED, 0x44, 0x04, 0xFD,
-0xEC, 0x31, 0x06, 0x90, 0x91, 0x66, 0x12, 0x04, 0xEB, 0x7F, 0x54, 0x7E, 0x09, 0x12, 0x71, 0x18,
-0x90, 0x93, 0x14, 0xE0, 0x70, 0x04, 0x90, 0x07, 0xCC, 0xF0, 0x90, 0x93, 0x1C, 0xE0, 0x70, 0x0A,
-0x90, 0x93, 0x19, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x07, 0x90, 0x00, 0x1F, 0xE0, 0x54, 0xF0,
-0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x92, 0x2E, 0x12, 0x04, 0xEB, 0x90, 0x92, 0x2E, 0x02,
-0x86, 0xE2, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x02, 0x12, 0x7B, 0x51, 0xEF, 0x54,
-0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0x90, 0x01, 0x34,
-0x74, 0x08, 0xF0, 0x90, 0x01, 0x01, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20,
-0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xED, 0x30, 0xE0, 0x26, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89,
-0x44, 0x31, 0x97, 0xEF, 0x90, 0x89, 0x46, 0x31, 0x97, 0xEF, 0x90, 0x89, 0x48, 0x31, 0x97, 0xEF,
-0x90, 0x89, 0x4A, 0x31, 0x97, 0xEF, 0x90, 0x89, 0x4C, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3, 0xF0,
-0xED, 0x30, 0xE1, 0x0A, 0x75, 0xF0, 0x12, 0xEF, 0x31, 0xC0, 0xE4, 0xF0, 0xA3, 0xF0, 0xED, 0x30,
-0xE2, 0x08, 0x75, 0xF0, 0x12, 0xEF, 0x31, 0xB5, 0xE4, 0xF0, 0x31, 0xA2, 0xE0, 0x54, 0xBF, 0x44,
-0x80, 0xFE, 0x31, 0xA2, 0xEE, 0xF0, 0x22, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0,
-0x12, 0x22, 0xEF, 0xC4, 0x54, 0xF0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22,
-0x75, 0xF0, 0x12, 0xE5, 0x62, 0x90, 0x89, 0x42, 0x02, 0x05, 0x28, 0x75, 0xF0, 0x12, 0xE5, 0x62,
-0x90, 0x89, 0x40, 0x02, 0x05, 0x28, 0x90, 0x92, 0x3F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED,
-0xF0, 0xEB, 0x75, 0xF0, 0x06, 0xA4, 0xFF, 0x90, 0x89, 0x21, 0x12, 0x86, 0xFA, 0xE9, 0x2F, 0xF9,
-0xEA, 0x35, 0xF0, 0xFA, 0x90, 0x92, 0x47, 0x12, 0x87, 0x03, 0x90, 0x92, 0x41, 0xE0, 0x51, 0xAA,
-0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92, 0x44, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90,
-0x92, 0x47, 0x12, 0x86, 0xFA, 0x90, 0x92, 0x46, 0xE0, 0xFF, 0xF5, 0x82, 0x12, 0xA6, 0x83, 0xFD,
-0x7C, 0x00, 0x90, 0x92, 0x41, 0xE0, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x44, 0x12, 0x05, 0x28, 0x75,
-0xF0, 0x02, 0xEF, 0x12, 0x05, 0x28, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x43, 0xE0, 0xFB,
-0xEF, 0xA8, 0x03, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x03,
-0x70, 0x90, 0x92, 0x44, 0xEE, 0x8F, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x92, 0x46, 0xE0, 0x04, 0xF0,
-0xE0, 0xB4, 0x05, 0xAB, 0x90, 0x92, 0x47, 0x12, 0x86, 0xFA, 0x90, 0x00, 0x05, 0x12, 0x03, 0x0F,
-0xFD, 0x7C, 0x00, 0x90, 0x92, 0x43, 0xE0, 0xFF, 0x90, 0x92, 0x3F, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8,
-0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xFF, 0x12, 0x03, 0x70, 0x90,
-0x92, 0x44, 0x12, 0x9F, 0xE2, 0x40, 0x08, 0xED, 0x9F, 0xFF, 0xEC, 0x9E, 0xFE, 0x80, 0x04, 0x7E,
-0x00, 0x7F, 0x00, 0x90, 0x92, 0x44, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x44, 0xE0, 0xFE,
-0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x41, 0xE0, 0x02, 0x9F, 0xC7, 0x25, 0xE0, 0x24, 0x7B, 0xF5, 0x82,
-0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0xAC, 0x05, 0x90, 0x92, 0x3F, 0xEF, 0xF0, 0xFD, 0xE0, 0xFF,
-0x12, 0x8F, 0x8A, 0xE0, 0xF5, 0x6E, 0x54, 0x7F, 0xF5, 0x70, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89,
-0x3D, 0x12, 0x05, 0x28, 0xE0, 0xF9, 0x90, 0x92, 0x3F, 0xE0, 0x12, 0x8F, 0xDB, 0xFE, 0xEF, 0x12,
-0x8F, 0xAF, 0xE0, 0x54, 0x03, 0xF5, 0x6F, 0xE5, 0x70, 0x90, 0x83, 0x1D, 0x93, 0xFB, 0xED, 0x51,
-0xAA, 0xE4, 0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x8A, 0x6C, 0xC4, 0x54, 0x03, 0x90, 0x92, 0x40, 0xF0,
-0x74, 0xCC, 0x2D, 0x12, 0x8F, 0xEA, 0xE5, 0x70, 0xF0, 0x74, 0x4C, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
-0x90, 0xF5, 0x83, 0xE5, 0x6F, 0xF0, 0xE5, 0x70, 0xD3, 0x9E, 0x40, 0x06, 0x8E, 0x70, 0xAF, 0x06,
+0x74, 0xA0, 0xF0, 0x74, 0xB8, 0xA3, 0xF0, 0x12, 0x6C, 0xBC, 0x74, 0xA0, 0x04, 0x90, 0x01, 0xC4,
+0xF0, 0x74, 0xB8, 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,
+0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07,
+0x7D, 0xF1, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0xB8, 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, 0x85, 0xC8, 0xE0, 0x64, 0x02, 0x60, 0x09, 0x12, 0x96, 0x54, 0x90, 0x01, 0xE6,
+0xE0, 0x04, 0xF0, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF, 0x01, 0x13, 0x90, 0x85, 0xC5, 0xE0,
+0x60, 0x0D, 0x12, 0x8F, 0xDB, 0x64, 0x02, 0x60, 0x03, 0x02, 0x77, 0x61, 0x12, 0x79, 0x41, 0x22,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x02, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0xFE, 0xFD,
+0x7F, 0x02, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x08,
+0xF0, 0x90, 0x01, 0x01, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x07, 0xAF, 0x62, 0xED, 0x30, 0xE0, 0x26, 0x75, 0xF0, 0x12, 0xEF,
+0x90, 0x89, 0x44, 0x31, 0xD9, 0xEF, 0x90, 0x89, 0x46, 0x31, 0xD9, 0xEF, 0x90, 0x89, 0x48, 0x31,
+0xD9, 0xEF, 0x90, 0x89, 0x4A, 0x31, 0xD9, 0xEF, 0x90, 0x89, 0x4C, 0x12, 0x05, 0x28, 0xE4, 0xF0,
+0xA3, 0xF0, 0xED, 0x30, 0xE1, 0x0A, 0x75, 0xF0, 0x12, 0xEF, 0x51, 0x02, 0xE4, 0xF0, 0xA3, 0xF0,
+0xED, 0x30, 0xE2, 0x08, 0x75, 0xF0, 0x12, 0xEF, 0x31, 0xF7, 0xE4, 0xF0, 0x31, 0xE4, 0xE0, 0x54,
+0xBF, 0x44, 0x80, 0xFE, 0x31, 0xE4, 0xEE, 0xF0, 0x22, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3, 0xF0,
+0x75, 0xF0, 0x12, 0x22, 0xEF, 0xC4, 0x54, 0xF0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5,
+0x83, 0x22, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x90, 0x89, 0x42, 0x02, 0x05, 0x28, 0x75, 0xF0, 0x12,
+0xE5, 0x62, 0x90, 0x89, 0x40, 0x02, 0x05, 0x28, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0x90, 0x89,
+0x1B, 0x12, 0x87, 0x03, 0x7B, 0xFF, 0x7A, 0x82, 0x79, 0x00, 0x90, 0x89, 0x1E, 0x12, 0x87, 0x03,
+0x7A, 0x82, 0x79, 0x3F, 0x90, 0x89, 0x21, 0x12, 0x87, 0x03, 0x7A, 0x82, 0x79, 0xE1, 0x90, 0x89,
+0x27, 0x12, 0x87, 0x03, 0x7A, 0x82, 0x79, 0xF5, 0x90, 0x89, 0x2A, 0x12, 0x87, 0x03, 0x7A, 0x83,
+0x79, 0x1D, 0x90, 0x89, 0x2D, 0x12, 0x87, 0x03, 0x7A, 0x83, 0x79, 0x31, 0x90, 0x89, 0x33, 0x12,
+0x87, 0x03, 0x7A, 0x83, 0x79, 0x59, 0x90, 0x89, 0x36, 0x12, 0x87, 0x03, 0x7A, 0x83, 0x79, 0x81,
+0x90, 0x89, 0x39, 0x12, 0x87, 0x03, 0xE4, 0x90, 0x93, 0x77, 0xF0, 0x90, 0x92, 0x29, 0xF0, 0x90,
+0x92, 0x29, 0xE0, 0xFF, 0xC3, 0x94, 0x05, 0x50, 0x10, 0x74, 0x88, 0x2F, 0x12, 0xAE, 0xE8, 0xE4,
+0xF0, 0x90, 0x92, 0x29, 0xE0, 0x04, 0xF0, 0x80, 0xE6, 0x22, 0x90, 0x92, 0x57, 0xEE, 0xF0, 0xA3,
+0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEB, 0x75, 0xF0, 0x06, 0xA4, 0xFF, 0x90, 0x89, 0x21, 0x12, 0x86,
+0xFA, 0xE9, 0x2F, 0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x90, 0x92, 0x5F, 0x12, 0x87, 0x03, 0x90, 0x92,
+0x59, 0xE0, 0x71, 0x6C, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92, 0x5C, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0,
+0xE4, 0xA3, 0xF0, 0x90, 0x92, 0x5F, 0x12, 0x86, 0xFA, 0x90, 0x92, 0x5E, 0xE0, 0xFF, 0xF5, 0x82,
+0x12, 0x9E, 0x5B, 0xFD, 0x7C, 0x00, 0x90, 0x92, 0x59, 0xE0, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x44,
+0x12, 0x05, 0x28, 0x75, 0xF0, 0x02, 0xEF, 0x12, 0x05, 0x28, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90,
+0x92, 0x5B, 0xE0, 0xFB, 0xEF, 0xA8, 0x03, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8,
+0xF9, 0x71, 0x64, 0xEE, 0x8F, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x92, 0x5E, 0xE0, 0x04, 0xF0, 0xE0,
+0xB4, 0x05, 0xB0, 0x90, 0x92, 0x5F, 0x12, 0x86, 0xFA, 0x90, 0x00, 0x05, 0x12, 0x03, 0x0F, 0xFD,
+0x7C, 0x00, 0x90, 0x92, 0x5B, 0xE0, 0xFF, 0x90, 0x92, 0x57, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07,
+0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x71, 0x64, 0x12, 0xAF, 0xAF, 0x40,
+0x08, 0xED, 0x9F, 0xFF, 0xEC, 0x9E, 0xFE, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x00, 0x90, 0x92, 0x5C,
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x5C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x59,
+0xE0, 0x02, 0xAF, 0x94, 0xFF, 0x12, 0x03, 0x70, 0x90, 0x92, 0x5C, 0x22, 0x25, 0xE0, 0x24, 0x7B,
+0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0x7D, 0x01, 0xAF, 0x62, 0xAC, 0x05, 0x90, 0x92,
+0x57, 0xEF, 0xF0, 0xFD, 0xE0, 0xFF, 0x12, 0x8F, 0x9B, 0xE0, 0xF5, 0x6E, 0x54, 0x7F, 0xF5, 0x70,
+0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x3D, 0x12, 0x05, 0x28, 0xE0, 0xF9, 0x90, 0x92, 0x57, 0xE0,
+0x12, 0x8F, 0xF8, 0xFE, 0xEF, 0x12, 0x8F, 0xAC, 0xE0, 0x54, 0x03, 0xF5, 0x6F, 0xE5, 0x70, 0x90,
+0x83, 0x1D, 0x93, 0xFB, 0xED, 0x71, 0x6C, 0xE4, 0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x8A, 0x75, 0xC4,
+0x54, 0x03, 0x90, 0x92, 0x58, 0xF0, 0x74, 0xCC, 0x2D, 0x91, 0x56, 0xE5, 0x70, 0xF0, 0x74, 0x4C,
+0x2D, 0x91, 0xD8, 0xE5, 0x6F, 0xF0, 0xE5, 0x70, 0xD3, 0x9E, 0x40, 0x06, 0x8E, 0x70, 0xAF, 0x06,
0x8F, 0x6E, 0x8C, 0x71, 0xE4, 0xFF, 0xEF, 0xC3, 0x95, 0x71, 0x50, 0x2F, 0xE5, 0x6E, 0x30, 0xE7,
0x09, 0x85, 0x70, 0x6E, 0x1C, 0xEC, 0x70, 0x20, 0x80, 0x21, 0xE5, 0x70, 0xD3, 0x99, 0x40, 0x14,
-0xAD, 0x01, 0x90, 0x92, 0x3F, 0xE0, 0xFB, 0x90, 0x92, 0x44, 0xEC, 0xF0, 0xAF, 0x70, 0x71, 0x94,
-0x8F, 0x6E, 0x80, 0x07, 0x89, 0x6E, 0x80, 0x03, 0x0F, 0x80, 0xCB, 0x90, 0x92, 0x3F, 0xE0, 0xFF,
-0x90, 0x92, 0x45, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x6E, 0xF0, 0xA3,
-0xE4, 0xF0, 0xA3, 0xE5, 0x6F, 0x12, 0x98, 0xD9, 0x7B, 0x01, 0xFA, 0x7D, 0x05, 0x7F, 0x08, 0x12,
-0x9E, 0xF1, 0x90, 0x92, 0x3F, 0xE0, 0xFF, 0x90, 0x91, 0x0B, 0xE5, 0x6F, 0xF0, 0xE4, 0xFB, 0xAD,
-0x6E, 0x02, 0x27, 0x3D, 0xE4, 0xF5, 0x73, 0xEF, 0x14, 0xF5, 0x72, 0xED, 0xFF, 0xE5, 0x72, 0xF5,
-0x82, 0x33, 0x95, 0xE0, 0xF5, 0x83, 0xC3, 0xE5, 0x82, 0x9F, 0x74, 0x80, 0xF8, 0x65, 0x83, 0x98,
-0x40, 0x51, 0xE5, 0x72, 0x78, 0x03, 0xA2, 0xE7, 0x13, 0xD8, 0xFB, 0xFF, 0x33, 0x95, 0xE0, 0xFE,
-0xEB, 0x91, 0x06, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE5, 0x83, 0x3E, 0xF5, 0x83, 0xE0, 0xF5, 0x82,
-0x75, 0x83, 0x00, 0xE5, 0x72, 0x12, 0xAF, 0x61, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8,
-0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x13, 0x85, 0x72, 0x74, 0x05,
-0x73, 0x90, 0x92, 0x44, 0xE0, 0x65, 0x73, 0x60, 0x0A, 0xE5, 0x74, 0xD3, 0x9D, 0x40, 0x04, 0x15,
-0x72, 0x80, 0x98, 0xAF, 0x74, 0x22, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34,
-0x82, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xA1, 0xEF, 0xF0,
-0x12, 0x8F, 0xBC, 0x30, 0xE6, 0x40, 0x7F, 0x8D, 0x12, 0x7B, 0x51, 0xEF, 0x64, 0x01, 0x70, 0x36,
-0x90, 0x93, 0xA2, 0xF0, 0x90, 0x93, 0xA2, 0xE0, 0xFD, 0x90, 0x93, 0xA1, 0xE0, 0x12, 0x8F, 0x8A,
-0xE5, 0x82, 0x2D, 0x12, 0xAE, 0x18, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x8B, 0xA3, 0x90, 0x93, 0xA2,
-0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xDB, 0x12, 0x8F, 0xBC, 0x30, 0xE0, 0x07, 0xE4,
-0xFD, 0x7F, 0x8D, 0x12, 0x7B, 0x3E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x92, 0xCE, 0xF0,
-0x90, 0x92, 0xCC, 0x74, 0x14, 0xF0, 0x90, 0x92, 0xDA, 0x74, 0x01, 0xF0, 0xFB, 0x7A, 0x92, 0x79,
-0xCC, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xDA, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x92, 0xBB,
-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, 0x75, 0xB6, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12,
-0x7B, 0x3E, 0x80, 0xFE, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x90, 0xED,
-0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x8F, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x7B, 0x2A, 0x7C,
-0x00, 0xAD, 0x07, 0x90, 0x93, 0x8F, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x93, 0x90, 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, 0x93, 0x92,
-0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x18, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0,
-0x74, 0x12, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFF, 0x90, 0x93,
-0x91, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x44, 0x02, 0x4E, 0xFF, 0xAE, 0x05, 0x74, 0x12,
-0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x11, 0x2E, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2E, 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, 0x93, 0x75, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x70, 0x61,
-0x90, 0x93, 0x7F, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x77, 0x12, 0x86, 0xE2, 0x12, 0x04, 0xA7, 0x90,
-0x93, 0x7F, 0x12, 0x86, 0xEE, 0x12, 0x86, 0xC8, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07,
-0x90, 0x93, 0x77, 0x12, 0x86, 0xE2, 0x90, 0x93, 0x7B, 0x12, 0x86, 0xEE, 0x12, 0x86, 0xC8, 0xD0,
-0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x86, 0xD5, 0x90, 0x93, 0x83, 0x12, 0x04, 0xEB,
-0x90, 0x93, 0x83, 0x12, 0x86, 0xE2, 0x90, 0x91, 0x66, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x75, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x71, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x92, 0xCE,
-0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51, 0x90, 0x92, 0xCD, 0xEF, 0xF0, 0x7F, 0x83, 0x12,
-0x7B, 0x51, 0xAE, 0x07, 0x90, 0x92, 0xCD, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x92,
-0xCF, 0xE0, 0x94, 0x64, 0x90, 0x92, 0xCE, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0,
-0x44, 0x40, 0xF0, 0x90, 0x92, 0xCD, 0xE0, 0xFF, 0x22, 0x90, 0x92, 0xCE, 0x12, 0x97, 0xC4, 0x80,
-0xC2, 0x90, 0x01, 0xC4, 0x74, 0x31, 0xF0, 0x74, 0xBE, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x7B, 0x51,
-0xEF, 0x20, 0xE0, 0xF7, 0x74, 0x31, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xBE, 0xA3, 0xF0, 0x22,
-0x90, 0x04, 0x24, 0xEF, 0xF0, 0x90, 0x04, 0x57, 0xF0, 0x22, 0x90, 0x92, 0xEE, 0xE0, 0xFD, 0x7C,
-0x00, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x03, 0x82, 0xED, 0x4C, 0x70, 0x05, 0x90, 0x92,
-0xFB, 0x80, 0x2A, 0xED, 0x64, 0x01, 0x4C, 0x70, 0x05, 0x90, 0x92, 0xFC, 0x80, 0x1F, 0xED, 0x64,
-0x02, 0x4C, 0x70, 0x05, 0x90, 0x92, 0xFD, 0x80, 0x14, 0xED, 0x64, 0x03, 0x4C, 0x70, 0x05, 0x90,
-0x92, 0xFE, 0x80, 0x09, 0xED, 0x64, 0x04, 0x4C, 0x70, 0x0D, 0x90, 0x92, 0xFF, 0xE0, 0xFF, 0xD1,
-0x50, 0x90, 0x92, 0xEF, 0x12, 0x97, 0xC4, 0x22, 0x90, 0x93, 0x9C, 0x12, 0x87, 0x03, 0x12, 0x71,
-0x54, 0x90, 0x85, 0xC5, 0xE0, 0xFF, 0x12, 0x60, 0xD0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x16, 0x90,
-0x93, 0x9C, 0x12, 0x8E, 0xF4, 0x54, 0x0F, 0xFF, 0x12, 0x8B, 0xD9, 0xFD, 0x12, 0x6A, 0xB8, 0x12,
-0xAF, 0x97, 0x12, 0x51, 0x7D, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7A, 0x29,
-0xEF, 0x64, 0x01, 0x60, 0x05, 0x75, 0x0F, 0x01, 0x80, 0x56, 0x90, 0x85, 0xC9, 0xE0, 0xFF, 0x54,
-0x03, 0x60, 0x05, 0x75, 0x0F, 0x02, 0x80, 0x48, 0x90, 0x85, 0xC7, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E,
-0x50, 0x05, 0x75, 0x0F, 0x04, 0x80, 0x39, 0xEF, 0x30, 0xE2, 0x05, 0x75, 0x0F, 0x08, 0x80, 0x30,
-0x90, 0x85, 0xC9, 0xE0, 0x30, 0xE4, 0x05, 0x75, 0x0F, 0x10, 0x80, 0x24, 0x90, 0x85, 0xC2, 0xE0,
-0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x05, 0x75, 0x0F, 0x20, 0x80, 0x14, 0x90, 0x86, 0x71, 0xE0,
-0x60, 0x05, 0x75, 0x0F, 0x80, 0x80, 0x09, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x80, 0x0E,
-0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x0F, 0xF0, 0x7F, 0x00, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x02, 0x80, 0x08, 0x90, 0x01, 0x00, 0xE0, 0x64,
-0x3F, 0x60, 0x05, 0x75, 0x61, 0x01, 0x80, 0x28, 0x90, 0x02, 0x96, 0xE0, 0x60, 0x05, 0x75, 0x61,
-0x10, 0x80, 0x1D, 0x90, 0x02, 0x86, 0xE0, 0x20, 0xE1, 0x02, 0x80, 0x07, 0x90, 0x02, 0x86, 0xE0,
-0x30, 0xE3, 0x05, 0x75, 0x61, 0x04, 0x80, 0x08, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22,
-0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x61, 0xF0, 0x7F, 0x00, 0x22, 0xAC,
-0x07, 0x90, 0x93, 0x1F, 0xE0, 0xF9, 0x30, 0xE0, 0x03, 0x02, 0xC0, 0x55, 0x90, 0x85, 0xC1, 0xE0,
-0x30, 0xE0, 0x16, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90, 0x85, 0xDA, 0xF0, 0x90, 0x85, 0xFB,
-0xE0, 0x24, 0x03, 0x90, 0x85, 0xD9, 0xF0, 0x80, 0x0D, 0x90, 0x85, 0xDA, 0x74, 0x02, 0xF0, 0x90,
-0x85, 0xD9, 0x14, 0xF0, 0x0B, 0x0B, 0x90, 0x85, 0xD9, 0xE0, 0xFA, 0x90, 0x85, 0xD8, 0xE0, 0xD3,
-0x9A, 0x50, 0x0E, 0x90, 0x85, 0xCD, 0xEB, 0xF0, 0x90, 0x85, 0xDA, 0xE0, 0xC3, 0x9D, 0x2C, 0x80,
-0x11, 0xC3, 0xED, 0x9A, 0x2B, 0x90, 0x85, 0xCD, 0xF0, 0x90, 0x85, 0xD9, 0xE0, 0xFF, 0xA3, 0xE0,
-0xC3, 0x9F, 0x90, 0x85, 0xDD, 0xF0, 0x90, 0x85, 0xDA, 0xE0, 0xFF, 0x24, 0x0A, 0xFD, 0xE4, 0x33,
-0xFC, 0x90, 0x85, 0xDD, 0x11, 0x5D, 0x98, 0x40, 0x04, 0xEF, 0x24, 0x0A, 0xF0, 0x90, 0x85, 0xDD,
-0xE0, 0xFF, 0x24, 0x23, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85, 0xCD, 0x11, 0x5D, 0x98, 0x40, 0x04,
-0xEF, 0x24, 0x23, 0xF0, 0x90, 0x85, 0xDD, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x85, 0xD1, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xE0, 0x6F, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x12, 0xAF, 0x82,
-0xE9, 0x54, 0xFD, 0x80, 0x03, 0xE9, 0x44, 0x02, 0x90, 0x93, 0x1F, 0xF0, 0x22, 0xE0, 0xD3, 0x9D,
-0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x22, 0x90, 0x93, 0x59, 0x74, 0x04, 0xF0, 0x14, 0xF0, 0xA3,
-0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x64, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0x22, 0xE4,
-0x90, 0x92, 0xBB, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93, 0x28, 0x12, 0x86, 0xE2, 0x90, 0x93,
-0x24, 0x12, 0x86, 0xEE, 0xC3, 0x12, 0x04, 0xB4, 0x40, 0x4B, 0x90, 0x85, 0xC1, 0xE0, 0x90, 0x93,
-0x28, 0x30, 0xE0, 0x0F, 0x31, 0xF6, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x2F, 0xFF, 0x90, 0x93,
-0x59, 0x80, 0x05, 0x31, 0xF6, 0x90, 0x93, 0x5A, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0x90, 0x92, 0xBC,
-0xF0, 0x90, 0x92, 0xBC, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x1A, 0x74, 0x2C, 0x2F, 0xF5, 0x82,
-0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xDB, 0xE0, 0x04, 0xF0, 0xE0, 0xFD,
-0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xDB, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x5C, 0xE0, 0x9F,
-0x90, 0x93, 0x5B, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x21, 0xD3, 0x31, 0xD4, 0x90, 0x92, 0xBB, 0xE0,
-0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x1C, 0x31, 0xDE, 0x90, 0x92, 0xBD, 0xE0, 0xD3, 0x9F, 0x40, 0x0A,
-0x90, 0x92, 0xBB, 0xE0, 0x90, 0x92, 0xBE, 0xF0, 0x80, 0x08, 0x90, 0x92, 0xBB, 0xE0, 0x04, 0xF0,
-0x80, 0xDA, 0x31, 0xD4, 0x90, 0x92, 0xBB, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x2C, 0x31, 0xDE,
-0xC3, 0x90, 0x93, 0x5C, 0xE0, 0x9F, 0xFF, 0x90, 0x93, 0x5B, 0xE0, 0x94, 0x00, 0xFE, 0x90, 0x92,
-0xBD, 0xE0, 0xD3, 0x9F, 0xE4, 0x9E, 0x40, 0x0A, 0x90, 0x92, 0xBB, 0xE0, 0x90, 0x92, 0xBF, 0xF0,
-0x80, 0x08, 0x90, 0x92, 0xBB, 0xE0, 0x04, 0xF0, 0x80, 0xCA, 0x90, 0x92, 0xBE, 0xE0, 0x90, 0x85,
-0xE0, 0xF0, 0x90, 0x92, 0xBF, 0xE0, 0x90, 0x85, 0xE1, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xC3,
-0x94, 0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x85, 0xD8, 0xF0, 0xE4, 0x80, 0x0E, 0xE4, 0x90,
-0x85, 0xD8, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xC3, 0x74, 0x0A, 0x9F, 0x90, 0x85, 0xD7, 0xF0,
-0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x85, 0xDE, 0xF0, 0x90, 0x85, 0xC1,
-0xE0, 0x30, 0xE0, 0x05, 0x90, 0x93, 0x59, 0x80, 0x03, 0x90, 0x93, 0x5A, 0xE0, 0xFF, 0x90, 0x85,
-0xDE, 0xE0, 0x2F, 0x04, 0xF0, 0x90, 0x85, 0xDE, 0xE0, 0xC3, 0x94, 0x0A, 0x50, 0x03, 0x74, 0x0A,
-0xF0, 0x90, 0x85, 0xDE, 0xE0, 0x24, 0x02, 0xF0, 0x12, 0xAF, 0x97, 0x12, 0x51, 0x7D, 0xE4, 0xFF,
-0x12, 0x69, 0x33, 0x22, 0xE4, 0x90, 0x92, 0xBD, 0xF0, 0x90, 0x92, 0xBB, 0xF0, 0x22, 0x74, 0x2C,
-0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x92, 0xBD, 0xE0, 0x2F, 0xF0,
-0x90, 0x93, 0x5D, 0xE0, 0xFF, 0x22, 0x12, 0x86, 0xEE, 0x90, 0x93, 0x24, 0x12, 0x86, 0xE2, 0x12,
-0x86, 0xBA, 0x78, 0x0A, 0x12, 0x04, 0xC5, 0x90, 0x85, 0xDD, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E,
-0x2F, 0xFF, 0x22, 0x12, 0xAF, 0x78, 0xD3, 0x9F, 0x40, 0x2B, 0x90, 0x85, 0xDF, 0xE0, 0x04, 0xF0,
-0x90, 0x93, 0x5E, 0xE0, 0xFF, 0x90, 0x85, 0xDF, 0xE0, 0xD3, 0x9F, 0x50, 0x18, 0x90, 0x85, 0xD7,
-0xE0, 0x04, 0x12, 0x93, 0x10, 0x90, 0x85, 0xDE, 0xF0, 0xFB, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3,
-0xE0, 0xFD, 0x12, 0x51, 0x7D, 0x22, 0xE4, 0xFE, 0x74, 0x2C, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x93,
-0xF5, 0x83, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x2D, 0xEF, 0xE4, 0x90, 0x85, 0xDC, 0xF0, 0x90, 0x85,
-0xDB, 0xF0, 0x90, 0x85, 0xDF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0xA3, 0x74, 0x2D, 0xF0, 0xE4, 0xA3,
-0xF0, 0x22, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x01, 0x70, 0x22, 0x12, 0x8F, 0xCA, 0x60, 0x10, 0xE4,
-0xFD, 0x7F, 0x0C, 0x12, 0x8D, 0x34, 0xE4, 0xFD, 0xFF, 0x12, 0x90, 0xEF, 0x02, 0x6B, 0x98, 0x90,
-0x85, 0xC8, 0xE0, 0x70, 0x07, 0x7D, 0x01, 0x7F, 0x04, 0x12, 0x8D, 0x34, 0x22, 0x90, 0x93, 0x09,
-0xE0, 0x30, 0xE0, 0x34, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x2D, 0x90, 0x93, 0xA7, 0xE0, 0x04,
-0xF0, 0xE0, 0xD3, 0x94, 0xC8, 0x40, 0x21, 0x90, 0x93, 0x09, 0xE0, 0x44, 0x20, 0xF0, 0xE4, 0x90,
-0x93, 0xA7, 0xF0, 0x90, 0x93, 0x09, 0xE0, 0x13, 0x30, 0xE0, 0x0D, 0x90, 0x85, 0xC1, 0xE0, 0x44,
-0x01, 0xF0, 0x90, 0x85, 0xD0, 0x74, 0xD0, 0xF0, 0x22, 0x90, 0x92, 0xE0, 0xEF, 0xF0, 0x90, 0x84,
-0xC5, 0xE0, 0xB4, 0x02, 0x12, 0x90, 0x92, 0xE0, 0xE0, 0xFF, 0x64, 0x01, 0x60, 0x25, 0x90, 0x01,
-0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, 0x19, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x7F, 0x64, 0x7E,
-0x00, 0x12, 0x7C, 0x9F, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0xE0, 0xE0, 0xFF,
-0x12, 0x2A, 0x87, 0x22, 0xE5, 0x64, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5,
-0x83, 0xE4, 0x93, 0xFF, 0x74, 0x01, 0x93, 0x90, 0x92, 0x47, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
-0x92, 0x45, 0x22, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E,
-0xFE, 0xE5, 0x62, 0x25, 0xE0, 0x22, 0x35, 0xF0, 0xFE, 0x90, 0x00, 0x06, 0x12, 0x04, 0x18, 0x2F,
-0xFF, 0xEE, 0x35, 0xF0, 0x22, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, 0x67, 0xF0, 0xE5, 0x64, 0x90, 0x83,
-0x1D, 0x93, 0xFF, 0x22, 0xE0, 0xFF, 0x90, 0x92, 0x4B, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0x22, 0x90, 0x92, 0x33, 0x12, 0x86,
-0xFA, 0x90, 0x00, 0x02, 0x12, 0x04, 0x18, 0xFF, 0x22, 0xE0, 0x54, 0x03, 0x90, 0x91, 0x0B, 0xF0,
-0x7B, 0x01, 0xAF, 0x78, 0x02, 0x27, 0x3D, 0xE5, 0x64, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4,
-0x34, 0x82, 0xF5, 0x83, 0x22, 0x90, 0x00, 0x06, 0x02, 0x04, 0x18, 0x90, 0x92, 0x49, 0xE4, 0xF0,
-0xA3, 0x22, 0xE5, 0x62, 0x25, 0xE0, 0x24, 0x8C, 0xF5, 0x82, 0xE4, 0x22, 0x90, 0x92, 0x33, 0x12,
-0x86, 0xFA, 0x02, 0x03, 0xED, 0x74, 0xBC, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x22, 0x00,
-0x79, 0xEA,
+0xAD, 0x01, 0x90, 0x92, 0x57, 0xE0, 0xFB, 0x90, 0x92, 0x5C, 0xEC, 0xF0, 0xAF, 0x70, 0x91, 0x5E,
+0x8F, 0x6E, 0x80, 0x07, 0x89, 0x6E, 0x80, 0x03, 0x0F, 0x80, 0xCB, 0x90, 0x92, 0x57, 0xE0, 0xFF,
+0x90, 0x92, 0x5D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x6E, 0x91, 0xD0,
+0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x7B, 0x01, 0xFA, 0x7D, 0x05, 0x7F, 0x08, 0x12, 0xAE, 0xF6,
+0x90, 0x92, 0x57, 0xE0, 0xFF, 0x90, 0x91, 0x0B, 0xE5, 0x6F, 0xF0, 0xE4, 0xFB, 0xAD, 0x6E, 0x02,
+0x27, 0x3D, 0x74, 0xCC, 0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x22, 0xE4, 0xF5,
+0x73, 0xEF, 0x14, 0xF5, 0x72, 0xED, 0xFF, 0xE5, 0x72, 0xF5, 0x82, 0x33, 0x95, 0xE0, 0xF5, 0x83,
+0xC3, 0xE5, 0x82, 0x9F, 0x74, 0x80, 0xF8, 0x65, 0x83, 0x98, 0x40, 0x51, 0xE5, 0x72, 0x78, 0x03,
+0xA2, 0xE7, 0x13, 0xD8, 0xFB, 0xFF, 0x33, 0x95, 0xE0, 0xFE, 0xEB, 0x91, 0xE0, 0xE5, 0x82, 0x2F,
+0xF5, 0x82, 0xE5, 0x83, 0x3E, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xE5, 0x72, 0x12,
+0xA9, 0x01, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE,
+0xEF, 0x55, 0x82, 0x4E, 0x60, 0x13, 0x85, 0x72, 0x74, 0x05, 0x73, 0x90, 0x92, 0x5C, 0xE0, 0x65,
+0x73, 0x60, 0x0A, 0xE5, 0x74, 0xD3, 0x9D, 0x40, 0x04, 0x15, 0x72, 0x80, 0x98, 0xAF, 0x74, 0x22,
+0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x6F, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x22,
+0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0x90, 0x89,
+0x16, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90,
+0x89, 0x18, 0xF0, 0x90, 0x89, 0x16, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90,
+0x92, 0xD3, 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, 0x75, 0xB6, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F,
+0x03, 0x12, 0x7B, 0x3E, 0x80, 0xFE, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93,
+0xA8, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0xA7, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0x7B,
+0x2A, 0x7C, 0x00, 0xAD, 0x07, 0x90, 0x93, 0xA7, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x93, 0xA8,
+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,
+0x93, 0xAA, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x18, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xEF, 0xF0, 0x74, 0x12, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFF,
+0x90, 0x93, 0xA9, 0xE0, 0x12, 0xB3, 0xB0, 0x44, 0x02, 0x4E, 0xFF, 0xAE, 0x05, 0x74, 0x12, 0x2E,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x74, 0x11, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xE0, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x92,
+0xE6, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51, 0x90, 0x92, 0xE5, 0xEF, 0xF0, 0x7F, 0x83,
+0x12, 0x7B, 0x51, 0xAE, 0x07, 0x90, 0x92, 0xE5, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90,
+0x92, 0xE7, 0xE0, 0x94, 0x64, 0x90, 0x92, 0xE6, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0,
+0xE0, 0x44, 0x40, 0xF0, 0x90, 0x92, 0xE5, 0xE0, 0xFF, 0x22, 0x90, 0x92, 0xE6, 0x12, 0x97, 0xE5,
+0x80, 0xC2, 0x90, 0x04, 0x24, 0xEF, 0xF0, 0x90, 0x04, 0x57, 0xF0, 0x22, 0x90, 0x93, 0x06, 0xE0,
+0xFD, 0x7C, 0x00, 0xA3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x03, 0x82, 0xED, 0x4C, 0x70, 0x05,
+0x90, 0x93, 0x13, 0x80, 0x2A, 0xED, 0x64, 0x01, 0x4C, 0x70, 0x05, 0x90, 0x93, 0x14, 0x80, 0x1F,
+0xED, 0x64, 0x02, 0x4C, 0x70, 0x05, 0x90, 0x93, 0x15, 0x80, 0x14, 0xED, 0x64, 0x03, 0x4C, 0x70,
+0x05, 0x90, 0x93, 0x16, 0x80, 0x09, 0xED, 0x64, 0x04, 0x4C, 0x70, 0x0D, 0x90, 0x93, 0x17, 0xE0,
+0xFF, 0xD1, 0x42, 0x90, 0x93, 0x07, 0x12, 0x97, 0xE5, 0x22, 0x7E, 0x00, 0x7F, 0xAC, 0x7D, 0x00,
+0x7B, 0x01, 0x7A, 0x85, 0x79, 0xC1, 0x12, 0x06, 0xDE, 0x90, 0x85, 0xC4, 0x74, 0x02, 0xF0, 0x90,
+0x85, 0xCB, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x90, 0x85, 0xD1, 0xE4, 0xF0, 0xA3,
+0x74, 0x02, 0xF1, 0x48, 0xF1, 0x58, 0xE4, 0xFD, 0xFF, 0x12, 0x57, 0x82, 0x7D, 0x0C, 0x7F, 0x02,
+0x12, 0x57, 0x82, 0x12, 0x93, 0x71, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x85,
+0xD0, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x85, 0xD0, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0,
+0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x2C, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0x0F, 0xFF, 0xBF, 0x05,
+0x08, 0x90, 0x85, 0xFB, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x85, 0xFB, 0xF0, 0x90, 0x86,
+0x6D, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3,
+0x74, 0x07, 0xF1, 0x48, 0xE4, 0x90, 0x85, 0xD7, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x12, 0x69, 0x33,
+0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x90, 0x05,
+0x22, 0xE4, 0xF0, 0x90, 0x86, 0x71, 0xF0, 0x22, 0xF0, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90,
+0x85, 0xDD, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0x90, 0x93, 0x71, 0x74, 0x04, 0xF0, 0x14, 0xF0,
+0xA3, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x64, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0x22,
+0x90, 0x93, 0xB4, 0x12, 0x87, 0x03, 0x12, 0x71, 0x54, 0x90, 0x85, 0xC5, 0xE0, 0xFF, 0x12, 0x60,
+0xD0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x16, 0x90, 0x93, 0xB4, 0x12, 0x8E, 0xF5, 0x54, 0x0F, 0xFF,
+0x12, 0x8B, 0xE6, 0xFD, 0x12, 0x6A, 0xB8, 0x12, 0xA4, 0x36, 0x12, 0x51, 0x7D, 0x22, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7A, 0x29, 0xEF, 0x64, 0x01, 0x60, 0x05, 0x75, 0x0F, 0x01,
+0x80, 0x56, 0x90, 0x85, 0xC9, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x05, 0x75, 0x0F, 0x02, 0x80, 0x48,
+0x90, 0x85, 0xC7, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x05, 0x75, 0x0F, 0x04, 0x80, 0x39, 0xEF,
+0x30, 0xE2, 0x05, 0x75, 0x0F, 0x08, 0x80, 0x30, 0x90, 0x85, 0xC9, 0xE0, 0x30, 0xE4, 0x05, 0x75,
+0x0F, 0x10, 0x80, 0x24, 0x90, 0x85, 0xC2, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x05, 0x75,
+0x0F, 0x20, 0x80, 0x14, 0x90, 0x86, 0x71, 0xE0, 0x60, 0x05, 0x75, 0x0F, 0x80, 0x80, 0x09, 0x90,
+0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x80, 0x0E, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x90, 0x01,
+0xB8, 0xE5, 0x0F, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xF5, 0x77, 0x90, 0x06,
+0xA9, 0xE0, 0xF5, 0x77, 0x54, 0xC0, 0x70, 0x0A, 0x12, 0xA8, 0xE6, 0xF0, 0x54, 0xFD, 0xF0, 0x02,
+0x97, 0xD1, 0xE5, 0x77, 0x30, 0xE6, 0x1F, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x01, 0x70, 0x1B, 0x90,
+0x85, 0xC9, 0xE0, 0x44, 0x01, 0x12, 0x8F, 0xDA, 0x64, 0x02, 0x60, 0x05, 0x12, 0x77, 0x61, 0x80,
+0x09, 0x12, 0x79, 0x41, 0x80, 0x04, 0x12, 0xA8, 0xE6, 0xF0, 0xE5, 0x77, 0x90, 0x85, 0xC9, 0x30,
+0xE7, 0x0E, 0xE0, 0x44, 0x02, 0x12, 0x93, 0x80, 0x90, 0x85, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x22,
+0xE0, 0x54, 0xFD, 0xF0, 0x22, 0xAC, 0x07, 0x90, 0x93, 0x37, 0xE0, 0xF9, 0x30, 0xE0, 0x02, 0x21,
+0x29, 0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90, 0x85,
+0xDA, 0xF0, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x03, 0x90, 0x85, 0xD9, 0xF0, 0x80, 0x0D, 0x90, 0x85,
+0xDA, 0x74, 0x02, 0xF0, 0x90, 0x85, 0xD9, 0x14, 0xF0, 0x0B, 0x0B, 0x90, 0x85, 0xD9, 0xE0, 0xFA,
+0x90, 0x85, 0xD8, 0xE0, 0xD3, 0x9A, 0x50, 0x0E, 0x90, 0x85, 0xCD, 0xEB, 0xF0, 0x90, 0x85, 0xDA,
+0xE0, 0xC3, 0x9D, 0x2C, 0x80, 0x11, 0xC3, 0xED, 0x9A, 0x2B, 0x90, 0x85, 0xCD, 0xF0, 0x90, 0x85,
+0xD9, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x85, 0xDD, 0xF0, 0x90, 0x85, 0xDA, 0xE0, 0xFF,
+0x24, 0x0A, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85, 0xDD, 0x31, 0x31, 0x98, 0x40, 0x04, 0xEF, 0x24,
+0x0A, 0xF0, 0x90, 0x85, 0xDD, 0xE0, 0xFF, 0x24, 0x23, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85, 0xCD,
+0x31, 0x31, 0x98, 0x40, 0x04, 0xEF, 0x24, 0x23, 0xF0, 0x90, 0x85, 0xDD, 0xE0, 0xFF, 0x7E, 0x00,
+0x90, 0x85, 0xD1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xE0, 0x6F, 0x70, 0x01, 0xE4,
+0x60, 0x02, 0x31, 0x3B, 0xE9, 0x54, 0xFD, 0x80, 0x03, 0xE9, 0x44, 0x02, 0x90, 0x93, 0x37, 0xF0,
+0x22, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x22, 0x90, 0x85, 0xD1, 0xA3, 0xE0,
+0x90, 0x05, 0x58, 0xF0, 0x22, 0xE4, 0x90, 0x92, 0xD3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x93,
+0x40, 0x12, 0x86, 0xE2, 0x90, 0x93, 0x3C, 0x12, 0x86, 0xEE, 0xC3, 0x12, 0x04, 0xB4, 0x40, 0x46,
+0x90, 0x85, 0xC1, 0xE0, 0x90, 0x93, 0x40, 0x30, 0xE0, 0x0F, 0x51, 0xB5, 0x90, 0x85, 0xFB, 0xE0,
+0x24, 0x04, 0x2F, 0xFF, 0x90, 0x93, 0x71, 0x80, 0x05, 0x51, 0xB5, 0x90, 0x93, 0x72, 0xE0, 0xFE,
+0xC3, 0xEF, 0x9E, 0x90, 0x92, 0xD4, 0xF0, 0x90, 0x92, 0xD4, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50,
+0x15, 0x74, 0x44, 0x2F, 0x51, 0xD2, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xDB, 0xE0, 0x04, 0xF0, 0xE0,
+0xFD, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xDB, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x74, 0xE0,
+0x9F, 0x90, 0x93, 0x73, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x41, 0x8A, 0x51, 0x93, 0x90, 0x92, 0xD3,
+0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x1C, 0x51, 0x9D, 0x90, 0x92, 0xD5, 0xE0, 0xD3, 0x9F, 0x40,
+0x0A, 0x90, 0x92, 0xD3, 0xE0, 0x90, 0x92, 0xD6, 0xF0, 0x80, 0x08, 0x90, 0x92, 0xD3, 0xE0, 0x04,
+0xF0, 0x80, 0xDA, 0x51, 0x93, 0x90, 0x92, 0xD3, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x2C, 0x51,
+0x9D, 0xC3, 0x90, 0x93, 0x74, 0xE0, 0x9F, 0xFF, 0x90, 0x93, 0x73, 0xE0, 0x94, 0x00, 0xFE, 0x90,
+0x92, 0xD5, 0xE0, 0xD3, 0x9F, 0xE4, 0x9E, 0x40, 0x0A, 0x90, 0x92, 0xD3, 0xE0, 0x90, 0x92, 0xD7,
+0xF0, 0x80, 0x08, 0x90, 0x92, 0xD3, 0xE0, 0x04, 0xF0, 0x80, 0xCA, 0x90, 0x92, 0xD6, 0xE0, 0x90,
+0x85, 0xE0, 0xF0, 0x90, 0x92, 0xD7, 0xE0, 0x90, 0x85, 0xE1, 0x51, 0x8B, 0x94, 0x0A, 0x40, 0x0A,
+0xEF, 0x24, 0xF6, 0x90, 0x85, 0xD8, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x85, 0xD8, 0x51, 0x8B,
+0x74, 0x0A, 0x9F, 0x90, 0x85, 0xD7, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F,
+0x90, 0x85, 0xDE, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x93, 0x71, 0x80, 0x03,
+0x90, 0x93, 0x72, 0xE0, 0xFF, 0x90, 0x85, 0xDE, 0xE0, 0x2F, 0x04, 0xF0, 0x90, 0x85, 0xDE, 0xE0,
+0xC3, 0x94, 0x0A, 0x50, 0x03, 0x74, 0x0A, 0xF0, 0x90, 0x85, 0xDE, 0xE0, 0x24, 0x02, 0xF0, 0x12,
+0xA4, 0x36, 0x12, 0x51, 0x7D, 0xE4, 0xFF, 0x12, 0x69, 0x33, 0x22, 0xF0, 0x90, 0x85, 0xE0, 0xE0,
+0xFF, 0xC3, 0x22, 0xE4, 0x90, 0x92, 0xD5, 0xF0, 0x90, 0x92, 0xD3, 0xF0, 0x22, 0x74, 0x44, 0x2F,
+0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x92, 0xD5, 0xE0, 0x2F, 0xF0, 0x90,
+0x93, 0x75, 0xE0, 0xFF, 0x22, 0x12, 0x86, 0xEE, 0x90, 0x93, 0x3C, 0x12, 0x86, 0xE2, 0x12, 0x86,
+0xBA, 0x78, 0x0A, 0x12, 0x04, 0xC5, 0x90, 0x85, 0xDD, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F,
+0xFF, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22, 0xE4, 0xFE, 0x74, 0x44, 0x2E, 0x51,
+0xD2, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x2D, 0xF4, 0xE4, 0x90, 0x85, 0xDC, 0xF0, 0x90, 0x85, 0xDB,
+0xF0, 0x90, 0x85, 0xDF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0xA3, 0x74, 0x2D, 0xF0, 0xE4, 0xA3, 0xF0,
+0x22, 0x71, 0x33, 0xD3, 0x9F, 0x40, 0x2B, 0x90, 0x85, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x76,
+0xE0, 0xFF, 0x90, 0x85, 0xDF, 0xE0, 0xD3, 0x9F, 0x50, 0x18, 0x90, 0x85, 0xD7, 0xE0, 0x04, 0x12,
+0x94, 0x1A, 0x90, 0x85, 0xDE, 0xF0, 0xFB, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12,
+0x51, 0x7D, 0x22, 0x90, 0x86, 0x6D, 0xE0, 0xFF, 0x90, 0x85, 0xCE, 0xE0, 0x22, 0x90, 0x85, 0xC5,
+0xE0, 0x64, 0x01, 0x70, 0x22, 0x12, 0x8F, 0xDB, 0x60, 0x10, 0xE4, 0xFD, 0x7F, 0x0C, 0x12, 0x8D,
+0x32, 0xE4, 0xFD, 0xFF, 0x12, 0x90, 0xE6, 0x02, 0x6B, 0x98, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x07,
+0x7D, 0x01, 0x7F, 0x04, 0x12, 0x8D, 0x32, 0x22, 0x90, 0x93, 0x21, 0xE0, 0x30, 0xE0, 0x34, 0xC4,
+0x13, 0x54, 0x07, 0x20, 0xE0, 0x2D, 0x90, 0x93, 0xBF, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0xC8,
+0x40, 0x21, 0x90, 0x93, 0x21, 0xE0, 0x44, 0x20, 0xF0, 0xE4, 0x90, 0x93, 0xBF, 0xF0, 0x90, 0x93,
+0x21, 0xE0, 0x13, 0x30, 0xE0, 0x0D, 0x90, 0x85, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x85, 0xD0,
+0x74, 0xD0, 0xF0, 0x22, 0x90, 0x92, 0xF8, 0xEF, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0xB4, 0x02, 0x12,
+0x90, 0x92, 0xF8, 0xE0, 0xFF, 0x64, 0x01, 0x60, 0x25, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0,
+0x80, 0x19, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90,
+0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0xF8, 0xE0, 0xFF, 0x12, 0x2A, 0x87, 0x22, 0xE5,
+0x64, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4, 0x93, 0xFF, 0x74,
+0x01, 0x93, 0x90, 0x92, 0x5F, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x5D, 0x22, 0xE0, 0xFE,
+0xA3, 0xE0, 0xFF, 0xC3, 0x74, 0xFF, 0x9F, 0xFF, 0x74, 0xFF, 0x9E, 0xFE, 0xE5, 0x62, 0x25, 0xE0,
+0x22, 0xE0, 0xFF, 0x90, 0x92, 0x63, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xE0, 0xFE, 0xA3, 0xE0,
+0xFF, 0xED, 0x2F, 0xFF, 0xEC, 0x3E, 0xFE, 0x22, 0x90, 0x92, 0x4B, 0x12, 0x86, 0xFA, 0x90, 0x00,
+0x02, 0x12, 0x04, 0x18, 0xFF, 0x22, 0xE0, 0x54, 0x03, 0x90, 0x91, 0x0B, 0xF0, 0x7B, 0x01, 0xAF,
+0x78, 0x02, 0x27, 0x3D, 0xE5, 0x64, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5,
+0x83, 0x22, 0x90, 0x92, 0x5F, 0xE4, 0xF0, 0xA3, 0x22, 0xE5, 0x62, 0x25, 0xE0, 0x24, 0x8C, 0xF5,
+0x82, 0xE4, 0x22, 0x90, 0x92, 0x4B, 0x12, 0x86, 0xFA, 0x02, 0x03, 0xED, 0x74, 0xBC, 0x25, 0x62,
+0xF5, 0x82, 0xE4, 0x34, 0x8F, 0x22, 0x90, 0x92, 0x52, 0xE0, 0xFE, 0xA3, 0xE0, 0x22, 0x7D, 0x05,
+0x7F, 0x01, 0x02, 0xAE, 0xF6, 0xE5, 0x68, 0xF0, 0xA3, 0xE5, 0x69, 0xF0, 0x22, 0x00, 0x8B, 0x34,
+
};
-u4Byte ArrayLength_MP_8188F_FW_AP = 17394;
+u4Byte ArrayLength_MP_8188F_FW_AP = 17584;
void
@@ -1142,31 +1154,31 @@ ODM_ReadFirmware_MP_8188F_FW_AP( u1Byte Array_MP_8188F_FW_NIC[] = {
-0xF1, 0x88, 0x10, 0x00, 0x01, 0x00, 0x01, 0x00, 0x09, 0x22, 0x15, 0x56, 0xB4, 0x48, 0x02, 0x00,
-0xAF, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x02, 0x86, 0xAD, 0x02, 0xBD, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xA6, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xBD, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0xF1, 0x88, 0x10, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x11, 0x25, 0x17, 0x05, 0xAA, 0x5A, 0x02, 0x00,
+0x2F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x02, 0x86, 0xAD, 0x02, 0xC9, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xC1, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xC9, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xBD, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xB9, 0x35, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xBD, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xC9, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC6, 0x5A, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xC9, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x87, 0xBB, 0x02, 0x88, 0xD7, 0x02, 0x80, 0x86, 0x02, 0x80, 0x89, 0x02, 0x80, 0x8C, 0x02,
-0x9D, 0x7D, 0x02, 0xB9, 0x13, 0x02, 0x80, 0x95, 0x02, 0x80, 0x98, 0x02, 0x80, 0x9B, 0x02, 0x80,
+0x02, 0x87, 0xBB, 0x02, 0x89, 0xB4, 0x02, 0x80, 0x86, 0x02, 0x80, 0x89, 0x02, 0x98, 0xC4, 0x02,
+0x9A, 0xFC, 0x02, 0xC1, 0xA2, 0x02, 0x80, 0x95, 0x02, 0x80, 0x98, 0x02, 0x80, 0x9B, 0x02, 0x80,
0x9E, 0x02, 0x80, 0xA1, 0x02, 0x80, 0xA4, 0x02, 0x80, 0xA7, 0x02, 0x80, 0xAA, 0x02, 0x80, 0xAD,
-0x02, 0x80, 0xB0, 0x02, 0x89, 0xA5, 0x02, 0x80, 0xB6, 0x02, 0x80, 0xB9, 0x02, 0xB0, 0x57, 0x02,
-0xB1, 0x34, 0x02, 0xB0, 0xB9, 0x02, 0xAF, 0x5E, 0x02, 0xA8, 0x5B, 0x02, 0xAF, 0xEE, 0x02, 0x80,
-0xCE, 0x02, 0x80, 0xD1, 0x02, 0xC5, 0xC9, 0x02, 0x80, 0xD7, 0x00, 0x00, 0x00, 0x02, 0x80, 0xDD,
-0x02, 0x80, 0xE0, 0x02, 0x80, 0xE3, 0x02, 0x80, 0xE6, 0x02, 0xC5, 0x72, 0x02, 0x80, 0xEC, 0x02,
+0x02, 0x80, 0xB0, 0x02, 0x8B, 0xD7, 0x02, 0x80, 0xB6, 0x02, 0x80, 0xB9, 0x02, 0xB8, 0x4F, 0x02,
+0xC0, 0x5C, 0x02, 0xBF, 0xE1, 0x02, 0xB8, 0xB0, 0x02, 0xAF, 0xE9, 0x02, 0xB7, 0xE0, 0x02, 0x80,
+0xCE, 0x02, 0x80, 0xD1, 0x02, 0xBF, 0x4B, 0x02, 0x80, 0xD7, 0x00, 0x00, 0x00, 0x02, 0x80, 0xDD,
+0x02, 0x80, 0xE0, 0x02, 0x80, 0xE3, 0x02, 0x80, 0xE6, 0x02, 0xD6, 0x84, 0x02, 0x80, 0xEC, 0x02,
0x80, 0xEF, 0x02, 0x80, 0xF2, 0x02, 0x80, 0xF5, 0x02, 0x80, 0xF8, 0x02, 0x80, 0xFB, 0x02, 0x80,
0xFE, 0x02, 0x81, 0x01, 0x02, 0x81, 0x04, 0x02, 0x81, 0x07, 0x02, 0x81, 0x0A, 0x02, 0x81, 0x0D,
0x02, 0x81, 0x10, 0x02, 0x81, 0x13, 0x02, 0x81, 0x16, 0x02, 0x81, 0x19, 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, 0xB3, 0xD0, 0x02, 0xB5, 0xA0, 0x02, 0x90, 0xE9, 0x02, 0x90, 0xDE,
-0x02, 0x81, 0x40, 0x02, 0x9E, 0xDD, 0x02, 0xB7, 0x60, 0x02, 0x81, 0x49, 0x02, 0x81, 0x4C, 0x02,
-0x81, 0x4F, 0x02, 0x81, 0x52, 0x02, 0x81, 0x55, 0x02, 0x81, 0x58, 0x02, 0x81, 0x5B, 0x02, 0x91,
-0x47, 0x02, 0x81, 0x61, 0x02, 0x81, 0x64, 0x02, 0xC4, 0x71, 0x02, 0xC5, 0x41, 0x02, 0xBC, 0x1A,
+0x00, 0x00, 0x00, 0x00, 0x02, 0xA5, 0x1C, 0x02, 0xA4, 0xA7, 0x02, 0x93, 0xCB, 0x02, 0x90, 0xDE,
+0x02, 0x81, 0x40, 0x02, 0x9C, 0x5B, 0x02, 0xD4, 0xE0, 0x02, 0x81, 0x49, 0x02, 0x81, 0x4C, 0x02,
+0x81, 0x4F, 0x02, 0x81, 0x52, 0x02, 0x81, 0x55, 0x02, 0x81, 0x58, 0x02, 0x81, 0x5B, 0x02, 0xD4,
+0x1C, 0x02, 0x81, 0x61, 0x02, 0x81, 0x64, 0x02, 0xD5, 0x60, 0x02, 0xD6, 0x3E, 0x02, 0xCB, 0xC2,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1190,10 +1202,10 @@ u1Byte Array_MP_8188F_FW_NIC[] = { 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, 0x08, 0x08, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x0B, 0x0D,
-0x0E, 0x0F, 0x11, 0x12, 0x14, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x23, 0x00,
-0x2D, 0x00, 0x50, 0x00, 0x91, 0x00, 0xC3, 0x01, 0x27, 0x01, 0x31, 0x01, 0x5E, 0x00, 0xC8, 0x00,
-0xF0, 0x00, 0xDC, 0x01, 0x5E, 0x01, 0x68, 0x01, 0x9A, 0x01, 0xCC, 0x01, 0xEA, 0x02, 0x02, 0x04,
+0x30, 0x02, 0x02, 0x03, 0x04, 0x04, 0x08, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x02, 0x09, 0x0B,
+0x0E, 0x0D, 0x0F, 0x10, 0x12, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x23, 0x00,
+0x2D, 0x00, 0x50, 0x00, 0x91, 0x00, 0xC3, 0x01, 0x27, 0x01, 0x31, 0x01, 0x5E, 0x00, 0x8C, 0x00,
+0xC8, 0x00, 0xDC, 0x01, 0x5E, 0x01, 0x68, 0x01, 0x9A, 0x01, 0xCC, 0x01, 0xEA, 0x02, 0x02, 0x04,
0x08, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x14, 0x28, 0x32, 0x50, 0x78, 0xA0, 0xC8,
0xE6, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x02, 0x04, 0x06,
0x07, 0x07, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
@@ -1266,1050 +1278,1337 @@ u1Byte Array_MP_8188F_FW_NIC[] = { 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, 0x41, 0x93, 0x17, 0x00, 0x41, 0x93, 0x18, 0x00,
-0x41, 0x93, 0x1D, 0x00, 0x00, 0x9A, 0x47, 0xB1, 0x9B, 0xB8, 0xAE, 0x90, 0x93, 0x1B, 0xEF, 0xF0,
-0x7F, 0x02, 0xD1, 0x27, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x90, 0x93, 0x1B, 0xE0, 0xFE, 0xEF, 0x4E,
+0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x41, 0x94, 0x0C, 0x00, 0x41, 0x94, 0x0D, 0x00,
+0x41, 0x94, 0x14, 0x00, 0x00, 0xAA, 0x4B, 0xC8, 0x58, 0xBD, 0x7A, 0x90, 0x94, 0x12, 0xEF, 0xF0,
+0x7F, 0x02, 0xD1, 0x27, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x90, 0x94, 0x12, 0xE0, 0xFE, 0xEF, 0x4E,
0x90, 0x84, 0xC1, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x5B, 0x12, 0x02, 0xF6, 0x25, 0x5B,
-0x90, 0x84, 0xC6, 0x12, 0x8D, 0x61, 0x25, 0x5B, 0x90, 0x84, 0xC7, 0x12, 0x8C, 0x6E, 0x25, 0x5B,
-0x90, 0x84, 0xC8, 0x12, 0x8F, 0xD8, 0x25, 0x5B, 0x90, 0x84, 0xC9, 0xF0, 0x90, 0x00, 0x04, 0x12,
-0x03, 0x0F, 0x25, 0x5B, 0x90, 0x84, 0xCA, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x03, 0x0F, 0x25, 0x5B,
-0x90, 0x84, 0xCB, 0xF0, 0x11, 0x1D, 0x25, 0x5B, 0x90, 0x84, 0xCC, 0xF0, 0x22, 0x90, 0x00, 0x06,
-0x02, 0x03, 0x0F, 0x12, 0xC8, 0x5E, 0xFF, 0x54, 0x7F, 0x90, 0x85, 0xC5, 0xF0, 0xEF, 0xB1, 0x59,
-0xA3, 0xB1, 0x61, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x85, 0xC3, 0xE0, 0x54, 0xF0,
-0x4E, 0xF1, 0xD8, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xFD, 0x4E, 0xF0,
-0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x12, 0x9F, 0xE4, 0x91, 0x6D, 0x90, 0x85, 0xC4, 0xF0,
-0x11, 0x1D, 0x30, 0xE0, 0x4D, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x85, 0xD8,
-0x50, 0x04, 0xEF, 0xF0, 0x80, 0x25, 0x74, 0x03, 0xF0, 0x31, 0x9F, 0xE9, 0x24, 0x06, 0xF1, 0xED,
-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, 0x03, 0x3C, 0x31, 0x9F, 0x11, 0x1D, 0xC4,
-0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x85, 0xCD, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02,
-0xEF, 0xF0, 0x31, 0x9F, 0x90, 0x00, 0x04, 0x12, 0x03, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x57, 0x82,
-0x31, 0x9F, 0x12, 0x71, 0xCB, 0x12, 0xBA, 0x2E, 0xF0, 0x90, 0x85, 0xC5, 0x12, 0xC8, 0x2A, 0x12,
-0x9F, 0xE3, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x92, 0x04, 0x12, 0x87, 0x79, 0x90, 0x92, 0x03,
-0xEF, 0xF0, 0x12, 0x87, 0x82, 0x89, 0x28, 0x00, 0x89, 0x2D, 0x01, 0x89, 0x32, 0x03, 0x89, 0x37,
-0x04, 0x89, 0x3C, 0x12, 0x89, 0x41, 0x14, 0x89, 0x46, 0x20, 0x89, 0x4A, 0x24, 0x89, 0x4F, 0x25,
-0x89, 0x54, 0x27, 0x89, 0x59, 0x40, 0x89, 0x5D, 0x42, 0x89, 0x92, 0x47, 0x89, 0x92, 0x49, 0x89,
-0x66, 0x80, 0x89, 0x62, 0x81, 0x89, 0x6A, 0x82, 0x89, 0x6F, 0x83, 0x89, 0x74, 0x84, 0x89, 0x79,
-0x88, 0x89, 0x7E, 0xC3, 0x00, 0x00, 0x89, 0x83, 0x31, 0x93, 0x02, 0x87, 0xD5, 0x31, 0x93, 0x02,
-0x90, 0x03, 0x31, 0x93, 0x02, 0x78, 0x94, 0x31, 0x93, 0x02, 0x6B, 0x03, 0x31, 0x93, 0x02, 0x97,
-0xFD, 0x31, 0x93, 0x02, 0xA0, 0x12, 0x31, 0x93, 0x01, 0x23, 0x31, 0x93, 0x02, 0x9C, 0x13, 0x31,
-0x93, 0x02, 0xA0, 0x21, 0x31, 0x93, 0x02, 0xA0, 0x29, 0x31, 0x93, 0x80, 0x48, 0x31, 0x93, 0x02,
-0x4E, 0x29, 0x31, 0x93, 0xA1, 0x75, 0x31, 0x93, 0x81, 0x75, 0x31, 0x93, 0x02, 0x7A, 0xFE, 0x31,
-0x93, 0x02, 0x6F, 0x63, 0x31, 0x93, 0x02, 0x6F, 0xA4, 0x31, 0x93, 0x02, 0x7B, 0xD0, 0x31, 0x93,
-0x02, 0x9A, 0x34, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0x03, 0xE0, 0x90, 0x01,
-0xC2, 0xF0, 0x22, 0x90, 0x92, 0x04, 0x02, 0x87, 0x70, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90,
-0x92, 0x07, 0x02, 0x87, 0x70, 0x90, 0x92, 0x07, 0x12, 0x87, 0x79, 0x31, 0x9F, 0x12, 0x02, 0xF6,
-0x54, 0x7F, 0xFD, 0xB1, 0x62, 0xFE, 0x54, 0x1F, 0x90, 0x92, 0x0B, 0xF0, 0xEE, 0x54, 0x80, 0xB1,
-0x59, 0x90, 0x92, 0x0A, 0x91, 0x6E, 0xFE, 0x54, 0x03, 0xFC, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F,
-0x90, 0x92, 0x0D, 0x91, 0x6E, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x92, 0x0C,
-0xF0, 0xEE, 0x54, 0x80, 0xB1, 0x59, 0xFF, 0x91, 0x6F, 0xFB, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54,
-0x1F, 0x90, 0x92, 0x0F, 0xF0, 0xFA, 0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEF,
-0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x71, 0x06, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x92,
-0x0C, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x71, 0x06, 0x54, 0xBF, 0x4F, 0xF0, 0xEA,
-0x60, 0x02, 0x61, 0x05, 0x90, 0x92, 0x0B, 0xE0, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0xB1,
-0x6D, 0x54, 0xE0, 0x4F, 0xF0, 0xEC, 0x54, 0x03, 0x71, 0x06, 0x54, 0xFC, 0x4F, 0xF0, 0xEC, 0x54,
-0x03, 0x25, 0xE0, 0x25, 0xE0, 0x71, 0x06, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0x92, 0x0A, 0xE0, 0x54,
-0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0xB1, 0x6D, 0x54, 0xDF, 0x4F, 0xF0,
-0x90, 0x92, 0x0D, 0xE0, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0x71, 0x06, 0x54, 0xCF, 0x4F, 0x12, 0xC8,
-0x3F, 0xE0, 0x54, 0xFB, 0x12, 0xC8, 0x3F, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0x92, 0x10,
-0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0x92, 0x85,
-0xE0, 0x60, 0x2F, 0x31, 0x9F, 0xE9, 0x24, 0x03, 0xF1, 0xED, 0x54, 0x1F, 0x12, 0x03, 0x3C, 0x90,
-0x92, 0x0E, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x13, 0xEF,
-0x31, 0x99, 0x8F, 0x82, 0x8E, 0x83, 0xE4, 0x12, 0x03, 0x4E, 0x90, 0x92, 0x0E, 0xE0, 0x04, 0xF0,
-0x80, 0xE3, 0x90, 0x92, 0x83, 0xE0, 0x54, 0x07, 0xFF, 0xBF, 0x05, 0x0A, 0xEC, 0xB4, 0x01, 0x06,
-0x90, 0x92, 0x88, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x92, 0x0E, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0xFC,
-0x31, 0x99, 0x8F, 0x82, 0x8E, 0x83, 0x12, 0x03, 0x0F, 0xFF, 0xED, 0x12, 0xAF, 0xE0, 0xE5, 0x82,
-0x2C, 0x12, 0xA8, 0x53, 0xEF, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x04, 0xDB,
-0xAF, 0x05, 0x12, 0x17, 0x8E, 0x22, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0x90, 0x89, 0x3F, 0x12, 0x05,
-0x28, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x6B, 0x20, 0xE6, 0x02, 0x81,
-0x34, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0x93, 0x0E, 0xF0, 0x7F, 0x8D, 0x12, 0x7B, 0x51, 0x90, 0x93,
-0x0F, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x24,
-0xFC, 0x60, 0x0F, 0x24, 0x03, 0x60, 0x02, 0x81, 0x2D, 0x90, 0x93, 0x0E, 0xE0, 0xFF, 0xF1, 0x72,
-0x81, 0x2D, 0x90, 0x93, 0x0E, 0xE0, 0x24, 0xDC, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0,
-0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x66, 0x75, 0xF0, 0x12, 0x71, 0x0B, 0x13, 0x13, 0x54, 0x03, 0xFB,
-0x0D, 0xE4, 0xFF, 0x91, 0x66, 0x75, 0xF0, 0x12, 0x71, 0x0B, 0xB1, 0x59, 0xFB, 0x0D, 0xE4, 0xFF,
-0x91, 0x66, 0x75, 0xF0, 0x12, 0x71, 0x0B, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x66,
-0x12, 0xAF, 0xD5, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x66, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x3D, 0x12,
-0x05, 0x28, 0x91, 0x63, 0x75, 0xF0, 0x12, 0xB1, 0x6D, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F,
-0x01, 0x91, 0x66, 0x75, 0xF0, 0x12, 0xB1, 0x6D, 0x54, 0x1F, 0x91, 0x64, 0x12, 0xAF, 0xE0, 0xE0,
-0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34,
-0x82, 0x91, 0x61, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x61,
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x61, 0x75, 0xF0, 0x08,
-0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91,
-0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x61, 0x75, 0xF0,
-0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x61, 0x75, 0xF0, 0x08, 0xA4, 0x24,
-0x07, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x39, 0xF1, 0x6B, 0x30,
-0xE0, 0x02, 0xF1, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 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, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x39, 0x90, 0x93, 0x0E, 0xE0, 0x22, 0x4F, 0xF0, 0x90,
-0x00, 0x02, 0x02, 0x03, 0x0F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0xC8, 0x5E, 0x20,
-0xE0, 0x05, 0x12, 0xB6, 0x3E, 0xA1, 0x50, 0x31, 0x9F, 0x12, 0xC8, 0x37, 0x90, 0x86, 0x75, 0xD1,
-0x00, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0xF1, 0x47, 0x12, 0xC8, 0x79, 0xD1, 0x0E, 0x54, 0x10,
-0xFD, 0xEF, 0x54, 0xEF, 0xF1, 0x47, 0x12, 0xC8, 0x81, 0xD1, 0x0E, 0x54, 0x40, 0xFD, 0xEF, 0x54,
-0xBF, 0xF1, 0x47, 0x12, 0xC8, 0x89, 0xB1, 0x61, 0x54, 0x80, 0xFF, 0x90, 0x86, 0x76, 0xE0, 0x54,
-0x7F, 0x4F, 0xF0, 0x12, 0xC8, 0x91, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0,
-0x31, 0x9F, 0x12, 0x02, 0xF6, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90,
-0xE0, 0x44, 0x08, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0xB4, 0x02, 0x05, 0xB1, 0x55, 0x20, 0xE0, 0x3D,
-0xB1, 0x62, 0x54, 0x7F, 0xFF, 0x90, 0x86, 0x76, 0xE0, 0x54, 0x80, 0x91, 0x6D, 0x90, 0x86, 0x77,
-0xF1, 0xD8, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x86, 0x78, 0xF1, 0xFB, 0x54, 0xFE, 0xFF, 0xEE, 0x54,
-0x01, 0x4F, 0xF0, 0x90, 0x86, 0x76, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x86, 0x75, 0xE0, 0xFE, 0xC4,
-0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x54, 0x9F, 0x90, 0x84, 0xC5,
-0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x87, 0x4A, 0x74, 0x05,
-0xF0, 0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x87, 0x79, 0x95, 0x12, 0x06, 0xDE,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x86, 0x76, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22,
-0x4F, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x03, 0x0F, 0x75, 0xF0, 0x12, 0xE5, 0x6E, 0x90, 0x89, 0x3E,
-0x12, 0x05, 0x28, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0xC8, 0x37, 0x90,
-0x86, 0x72, 0xD1, 0x00, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0xF1, 0x3F, 0x12, 0xC8, 0x79, 0xD1,
-0x0E, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0xF1, 0x3F, 0x12, 0xC8, 0x81, 0xD1, 0x0E, 0x54, 0x40,
-0xFD, 0xEF, 0x54, 0xBF, 0xF1, 0x3F, 0x12, 0xC8, 0x89, 0x91, 0x6E, 0x54, 0x01, 0xFF, 0x90, 0x86,
-0x74, 0xE0, 0x54, 0xFE, 0xB1, 0x60, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x86, 0x73, 0xF1, 0xFB, 0x54,
-0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF,
-0x12, 0x7C, 0x72, 0xF1, 0xDF, 0x54, 0x01, 0xFF, 0x12, 0x7C, 0x7E, 0xF1, 0xDF, 0x13, 0x54, 0x01,
-0xFF, 0x12, 0x66, 0xDA, 0x90, 0x86, 0x72, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x12, 0xC1,
-0x61, 0x90, 0x86, 0x72, 0xE0, 0x54, 0x01, 0xFF, 0x12, 0xB5, 0xD4, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0,
-0x12, 0x02, 0xF6, 0xFE, 0x22, 0x8F, 0x6E, 0x8D, 0x6F, 0xEF, 0xF1, 0x5E, 0xE0, 0xF5, 0x70, 0x54,
-0x7F, 0xF5, 0x71, 0xE5, 0x70, 0x54, 0x80, 0xF5, 0x73, 0x75, 0xF0, 0x12, 0xEF, 0x12, 0xAF, 0xD8,
-0xF5, 0x75, 0x75, 0xF0, 0x12, 0xEF, 0x71, 0x0B, 0xC4, 0x54, 0x03, 0xF5, 0x76, 0xF1, 0xCC, 0x74,
-0xFF, 0xF0, 0x12, 0xAA, 0xF2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x70, 0x45, 0x73, 0xFF, 0x12,
-0xAA, 0xE6, 0xEF, 0xF0, 0xE5, 0x6E, 0x12, 0x91, 0xDB, 0xE0, 0x54, 0x03, 0xF5, 0x74, 0x74, 0x4C,
-0x25, 0x6E, 0x12, 0xAF, 0xC4, 0xE5, 0x74, 0xF0, 0xE5, 0x71, 0x65, 0x75, 0x70, 0x40, 0xB1, 0x68,
-0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x73, 0x70, 0x08, 0xE5, 0x71, 0x44, 0x80, 0xF5,
-0x70, 0xE1, 0x12, 0x12, 0xAA, 0xF2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0xAB, 0x06, 0x12, 0xC8,
-0x70, 0xF1, 0xC1, 0xE5, 0x6E, 0xF0, 0xE4, 0x90, 0x92, 0x43, 0x12, 0x96, 0x40, 0x7B, 0x01, 0xFA,
-0x7D, 0x02, 0x7F, 0x04, 0x12, 0x96, 0x88, 0x7D, 0x07, 0xAF, 0x6E, 0x02, 0xBE, 0x4C, 0xE5, 0x71,
-0xC3, 0x95, 0x75, 0x50, 0x55, 0xAB, 0x6E, 0xAD, 0x75, 0xAF, 0x71, 0x12, 0x72, 0xEA, 0x8F, 0x72,
-0x85, 0x72, 0x70, 0xB1, 0x68, 0xC4, 0x13, 0x54, 0x01, 0xFF, 0x90, 0x92, 0x43, 0xF1, 0xC0, 0xE5,
-0x72, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x71, 0xF0, 0xE5, 0x73, 0xB1, 0x59, 0x12, 0x97, 0xD3,
-0xE4, 0xFB, 0xFA, 0xF1, 0xF4, 0xE5, 0x71, 0xC3, 0x94, 0x0C, 0x40, 0x26, 0xB1, 0x68, 0xC4, 0x13,
-0x54, 0x07, 0x30, 0xE0, 0x1D, 0xE5, 0x6F, 0x60, 0x19, 0xE5, 0x73, 0x70, 0x15, 0xE5, 0x71, 0x44,
-0x80, 0xF5, 0x70, 0xF1, 0xCC, 0xE5, 0x72, 0xF0, 0x80, 0x08, 0x12, 0xAA, 0xE6, 0xE5, 0x75, 0xF0,
-0xF5, 0x70, 0xF1, 0xC5, 0xE5, 0x70, 0xF0, 0xF1, 0xCC, 0xE0, 0xFF, 0x12, 0xC8, 0x57, 0xEF, 0xF0,
-0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x74, 0x12, 0xAF, 0xBC, 0xF0, 0x7B, 0x01, 0x7A, 0x00, 0xF1, 0xF4,
-0x90, 0x91, 0x0B, 0xE5, 0x74, 0xF0, 0xAB, 0x6F, 0xAD, 0x70, 0xAF, 0x6E, 0x02, 0x27, 0x3D, 0x4D,
-0xFF, 0x90, 0x86, 0x72, 0xF0, 0xEE, 0x22, 0x4D, 0xFF, 0x90, 0x86, 0x75, 0xF0, 0xEE, 0x22, 0x74,
-0xBC, 0x25, 0x78, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xE5, 0x78, 0xC4, 0x54,
-0xF0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x7F, 0x8F, 0x12, 0x7B, 0x51,
-0xEF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x19, 0xEF, 0xF0, 0xF1, 0x6B,
-0x30, 0xE6, 0x38, 0x7F, 0x8D, 0x12, 0x7B, 0x51, 0xEF, 0x64, 0x01, 0x70, 0x2E, 0x90, 0x93, 0x1A,
-0xF0, 0x90, 0x93, 0x1A, 0xE0, 0xFD, 0x90, 0x93, 0x19, 0xE0, 0xF1, 0x5E, 0xE5, 0x82, 0x2D, 0x12,
-0xA8, 0x53, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x39, 0x90, 0x93, 0x1A, 0xE0, 0x04, 0xF0, 0xE0, 0xC3,
-0x94, 0x10, 0x40, 0xDD, 0xF1, 0x6B, 0x30, 0xE0, 0x02, 0xF1, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x3F, 0xE4, 0xF0, 0xA3, 0x22, 0x74, 0xCC, 0x25, 0x6E,
-0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xF0, 0x90, 0x00, 0x03, 0x02, 0x03, 0x0F, 0x90,
-0x86, 0x72, 0xE0, 0x13, 0x13, 0x22, 0xE4, 0xFD, 0x7F, 0x8D, 0x02, 0x7B, 0x3E, 0xF9, 0xE4, 0x3A,
-0xFA, 0x02, 0x02, 0xF6, 0x7D, 0x05, 0x7F, 0x04, 0x02, 0x96, 0x88, 0xE0, 0x54, 0xFE, 0x4E, 0xFE,
-0xF0, 0xEF, 0x22, 0x8B, 0x5B, 0x8A, 0x5C, 0x89, 0x5D, 0x90, 0x92, 0x7F, 0xE0, 0x70, 0x0C, 0x12,
-0xC8, 0x91, 0x30, 0xE0, 0x06, 0x90, 0x92, 0x85, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x81, 0xE0, 0x70,
-0x0F, 0x31, 0xC4, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x05, 0x06, 0x90, 0x92, 0x86, 0x74, 0x01, 0xF0,
-0xAB, 0x5B, 0xAA, 0x5C, 0xA9, 0x5D, 0x12, 0x8D, 0x62, 0xFF, 0xF5, 0x5F, 0x12, 0x02, 0xF6, 0xFE,
-0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x8C, 0x6F, 0xF5, 0x60, 0x80, 0x02, 0x8F, 0x60, 0x85, 0x5F,
-0x5E, 0xE5, 0x5E, 0xD3, 0x95, 0x60, 0x50, 0x28, 0x31, 0xC4, 0x54, 0x01, 0xFD, 0xAF, 0x5E, 0x12,
-0x6E, 0x5F, 0xAF, 0x5E, 0x12, 0x77, 0x39, 0xEF, 0xAF, 0x5E, 0x70, 0x04, 0x11, 0x9B, 0x80, 0x02,
-0xF1, 0xE9, 0x90, 0x92, 0x86, 0xE0, 0x60, 0x04, 0xAF, 0x5E, 0x11, 0x9B, 0x05, 0x5E, 0x80, 0xD1,
-0xE5, 0x5F, 0x70, 0x16, 0xFF, 0x12, 0x77, 0x39, 0xEF, 0x70, 0x0F, 0x12, 0xB3, 0xD0, 0x12, 0x79,
-0x61, 0x12, 0xC8, 0xA9, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x7D, 0x01, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x07, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x7D, 0x44, 0x7F, 0x6F,
-0x11, 0xDE, 0x11, 0xE9, 0x90, 0x92, 0x08, 0xE0, 0x90, 0x92, 0x07, 0xB4, 0x01, 0x09, 0xE0, 0x31,
-0xDB, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x07, 0xE0, 0x31, 0xDB, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xFD,
-0xFF, 0x11, 0xDE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xB3, 0xD0, 0xE4, 0xFD, 0xFF, 0x90, 0x05,
-0x22, 0xEF, 0xF0, 0x90, 0x92, 0x76, 0xED, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0B, 0xF0, 0xA3, 0xF0,
-0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0x0D, 0xF0, 0x7D, 0x47, 0x7F, 0xFF, 0x11, 0xDE, 0x90, 0x05,
-0xF8, 0xE0, 0x70, 0x13, 0xA3, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07,
-0x31, 0xBC, 0x11, 0xDE, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x93, 0x0C, 0xE0, 0x94, 0xE8, 0x90, 0x93,
-0x0B, 0xE0, 0x94, 0x03, 0x40, 0x0E, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x31, 0xBC, 0x11,
-0xDE, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90, 0x93, 0x0B, 0xE4, 0x75,
-0xF0, 0x01, 0x12, 0x07, 0x0A, 0x80, 0xB7, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92,
-0x6B, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x84, 0xC3, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0,
-0x60, 0x2D, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x92, 0x6F, 0xF0, 0x7D, 0x26, 0x7F, 0xFF, 0x11, 0xDE,
-0x11, 0xE9, 0xEF, 0x64, 0x01, 0x70, 0x0B, 0x31, 0xCD, 0xFB, 0x7D, 0x01, 0x12, 0x3A, 0xC2, 0x12,
-0xC7, 0xE1, 0x90, 0x92, 0x6F, 0xE0, 0xFF, 0x7D, 0x27, 0x11, 0xDE, 0x31, 0xB4, 0x80, 0x13, 0x31,
-0xB4, 0x31, 0xCD, 0xFB, 0x90, 0x93, 0x0A, 0x74, 0x0A, 0xF0, 0x7D, 0x01, 0x12, 0xBF, 0xCB, 0x12,
-0xC7, 0xE1, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x12, 0xC6, 0x67, 0x74, 0x01, 0xF0, 0xFF, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x92, 0x6B, 0xE0, 0xFF, 0x02, 0x5C, 0xA3, 0x90, 0x93, 0x0D, 0xE0,
-0xFF, 0x7D, 0x48, 0x22, 0xAB, 0x5B, 0xAA, 0x5C, 0xA9, 0x5D, 0x02, 0x02, 0xF6, 0x90, 0x84, 0xC8,
-0xE0, 0xFF, 0x90, 0x92, 0x6C, 0xE0, 0x22, 0xE0, 0xFD, 0xE5, 0x78, 0xC4, 0x54, 0xF0, 0x24, 0x05,
-0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x90, 0x04, 0x85, 0xE0, 0xF5, 0x6B, 0x90, 0x92,
-0xCB, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x62, 0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE5, 0x62, 0xC3, 0x9F,
-0x40, 0x02, 0xC1, 0x2C, 0xE5, 0x62, 0x12, 0x8F, 0x5E, 0xE0, 0xF5, 0x6D, 0x12, 0xC8, 0x4B, 0xE0,
-0x65, 0x6D, 0x60, 0x16, 0x90, 0x8A, 0x71, 0xE5, 0x6D, 0xF0, 0xE4, 0xA3, 0xF0, 0xAB, 0x62, 0xFD,
-0xFF, 0x12, 0x52, 0xC3, 0x12, 0xC8, 0x4B, 0xE5, 0x6D, 0xF0, 0x90, 0x04, 0xA0, 0xE0, 0x64, 0x01,
-0x70, 0x4E, 0xA3, 0xE0, 0x65, 0x62, 0x70, 0x48, 0xA3, 0xE0, 0xF5, 0x63, 0xA3, 0xE0, 0x90, 0x92,
-0x38, 0xF0, 0xE5, 0x62, 0x12, 0x8F, 0x5E, 0xE0, 0x65, 0x63, 0x70, 0x02, 0xC1, 0x28, 0xE5, 0x62,
-0x12, 0x8F, 0x5E, 0xE5, 0x63, 0xF0, 0xE5, 0x62, 0x31, 0xDB, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0x92,
-0x38, 0xE0, 0x54, 0x03, 0x4F, 0xFF, 0xE5, 0x62, 0x31, 0xDB, 0xEF, 0xF0, 0x90, 0x8A, 0x71, 0xE5,
-0x63, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xAB, 0x62, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0xC3, 0xC1, 0x28,
-0xAF, 0x62, 0x12, 0x77, 0x39, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0x8B, 0x0B, 0x12, 0x8D, 0x59,
-0xFD, 0xF1, 0xB4, 0xED, 0xF0, 0x90, 0x92, 0x41, 0x12, 0x8F, 0xC0, 0xE5, 0x62, 0xF0, 0x12, 0xA9,
-0x84, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF,
-0x5D, 0xFF, 0x90, 0x92, 0x45, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7B, 0x02, 0x7A, 0x00, 0xE4, 0xFD,
-0x7F, 0x01, 0xD1, 0x88, 0x12, 0xAB, 0xFF, 0xFF, 0xF1, 0xC9, 0x12, 0x05, 0x28, 0xE0, 0xFD, 0xE5,
-0x62, 0x12, 0xC8, 0x1C, 0x54, 0x80, 0xFB, 0xF1, 0xB4, 0xEB, 0xF0, 0x12, 0xC8, 0x57, 0xED, 0xF0,
-0x90, 0x92, 0x3F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x92, 0x45, 0xF0, 0xA3, 0xF0, 0x7B,
-0x03, 0xFA, 0xFD, 0x7F, 0x01, 0xD1, 0x88, 0xAF, 0x62, 0x12, 0x77, 0x39, 0xEF, 0x70, 0x02, 0xC1,
-0x28, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0x8B, 0x0B, 0x12, 0x8D, 0x59, 0x30, 0xE0, 0x02, 0xC1,
-0x28, 0xE5, 0x62, 0x12, 0xA9, 0x84, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9,
-0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x60, 0x02, 0xC1, 0x28, 0x12, 0xAB, 0xFF, 0x4E, 0x70,
-0x0A, 0xF1, 0xC9, 0x12, 0x05, 0x28, 0xE0, 0x70, 0x02, 0xC1, 0x28, 0xE5, 0x62, 0x75, 0xF0, 0x12,
-0xA4, 0x24, 0x44, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0x92, 0x33, 0x12, 0x87,
-0x79, 0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0x12, 0xC8, 0xA1, 0x12, 0x03, 0xED, 0x2F, 0xFF, 0xF1,
-0xA2, 0x2F, 0xFF, 0xF1, 0xA8, 0x2F, 0xFF, 0xF1, 0xAE, 0x2F, 0xF5, 0x6C, 0x75, 0xF0, 0x12, 0xE5,
-0x62, 0x90, 0x89, 0x40, 0x12, 0x05, 0x28, 0xE0, 0xF5, 0x68, 0xA3, 0xE0, 0xF5, 0x69, 0xF1, 0xC9,
-0x12, 0x05, 0x28, 0xE0, 0xFF, 0x90, 0x92, 0x36, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x62, 0x12,
-0x8F, 0x5E, 0xE0, 0xF5, 0x63, 0x54, 0x80, 0xF5, 0x65, 0xE5, 0x63, 0x54, 0x7F, 0xF5, 0x64, 0x12,
-0xC8, 0x67, 0xD1, 0xFC, 0x12, 0xC8, 0xA1, 0x90, 0x92, 0x41, 0xF1, 0x00, 0xF1, 0xA2, 0xFF, 0x90,
-0x92, 0x43, 0xF1, 0x00, 0xF1, 0xA8, 0xFF, 0x90, 0x92, 0x45, 0xF1, 0x00, 0x7B, 0x01, 0xF1, 0x9A,
-0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0xF1, 0xAE, 0xD1, 0xFC, 0x90, 0x92, 0x36, 0x12, 0xC8, 0x70,
-0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0x12, 0xC8, 0x99, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x63, 0xF0, 0x7B,
-0x02, 0xF1, 0x9A, 0x74, 0x7C, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xC3,
-0x94, 0x05, 0x40, 0x02, 0xC1, 0x0D, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0xAF, 0xD8, 0xFF, 0xE5,
-0x64, 0xD3, 0x9F, 0x40, 0x08, 0x8F, 0x64, 0xE5, 0x64, 0x45, 0x65, 0xF5, 0x63, 0xE5, 0x64, 0x90,
-0x82, 0xE1, 0x93, 0xF5, 0x6A, 0xE5, 0x65, 0x60, 0x04, 0x05, 0x6A, 0x05, 0x6A, 0x90, 0x04, 0x8C,
-0xE0, 0x64, 0x01, 0x70, 0x28, 0xE5, 0x64, 0xC3, 0x94, 0x0C, 0x40, 0x21, 0x74, 0x84, 0x25, 0x64,
-0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0xEF, 0x30, 0xE7, 0x06,
-0xE5, 0x6A, 0x2E, 0xFF, 0x80, 0x05, 0xC3, 0xE5, 0x6A, 0x9E, 0xFF, 0x8F, 0x6A, 0xE5, 0x6A, 0xD3,
-0x94, 0x1A, 0xAF, 0x6A, 0x40, 0x02, 0x7F, 0x1A, 0x8F, 0x6A, 0xD1, 0x32, 0x7B, 0x03, 0xFA, 0xF1,
-0x9C, 0xE5, 0x63, 0x90, 0x83, 0x59, 0x93, 0xFF, 0xD3, 0x90, 0x92, 0x37, 0xE0, 0x9F, 0x90, 0x92,
-0x36, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x80, 0x73, 0xC3, 0xE5, 0x69, 0x94, 0x0A, 0xE5, 0x68, 0x94,
-0x00, 0x40, 0x02, 0xA1, 0x5B, 0xD1, 0x76, 0xE0, 0xC3, 0x94, 0x01, 0x40, 0x05, 0xD1, 0x76, 0xE0,
-0x14, 0xF0, 0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0xF1, 0xAE, 0xFF, 0x90, 0x92, 0x37, 0xE0, 0x2F,
-0xFF, 0x90, 0x92, 0x36, 0xE0, 0x35, 0xF0, 0xFE, 0xF1, 0xA8, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE,
-0xF1, 0xA2, 0x2F, 0xFD, 0xEE, 0x35, 0xF0, 0xFC, 0xE5, 0x68, 0xC3, 0x13, 0xFE, 0xE5, 0x69, 0x13,
-0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x28, 0xE5, 0x62, 0x94, 0x05, 0x50, 0x05, 0xD1, 0x76,
-0x74, 0x03, 0xF0, 0x90, 0x92, 0x3F, 0x12, 0xC8, 0x99, 0xE5, 0x68, 0xC3, 0x13, 0xA3, 0xF0, 0xE5,
-0x69, 0x13, 0xA3, 0xD1, 0x48, 0xF1, 0xD2, 0x7B, 0x01, 0xD1, 0x82, 0x12, 0xAA, 0x14, 0xC1, 0x0D,
-0x12, 0xC8, 0x67, 0x65, 0x6C, 0x70, 0x02, 0xE5, 0xF0, 0x70, 0x50, 0x90, 0x92, 0x3F, 0xF0, 0xA3,
-0xE5, 0x6C, 0xF0, 0xC3, 0x13, 0xFF, 0xA3, 0xE4, 0xF0, 0xA3, 0xEF, 0xD1, 0x48, 0xF1, 0xD2, 0x7B,
-0x02, 0xD1, 0x82, 0xE5, 0x62, 0xC3, 0x94, 0x05, 0x50, 0x0E, 0xD1, 0x76, 0xE0, 0xD3, 0x94, 0x00,
-0x40, 0x06, 0xD1, 0x2D, 0x7B, 0x03, 0x80, 0x0B, 0xE5, 0x6C, 0xC3, 0x94, 0x03, 0x50, 0x10, 0xD1,
-0x2D, 0x7B, 0x04, 0xFA, 0xD1, 0x84, 0x7D, 0x06, 0xAF, 0x62, 0x12, 0xBE, 0x4C, 0xC1, 0x28, 0xE4,
-0xFD, 0xAF, 0x62, 0x12, 0x8E, 0x15, 0x12, 0xBE, 0x48, 0xC1, 0x0D, 0xD1, 0x2D, 0x7B, 0x08, 0xFA,
-0xD1, 0x84, 0x7D, 0x01, 0xAF, 0x62, 0x12, 0x65, 0xC2, 0xC1, 0x0D, 0xD1, 0x76, 0xE4, 0xF0, 0x90,
-0x92, 0x3D, 0x74, 0x02, 0xF0, 0xAB, 0x6A, 0xAD, 0x62, 0xAF, 0x69, 0xAE, 0x68, 0x12, 0xAB, 0x14,
-0x8E, 0x66, 0x8F, 0x67, 0x12, 0xC8, 0x0E, 0xC3, 0x74, 0x01, 0x93, 0x95, 0x67, 0xE4, 0x93, 0x95,
-0x66, 0x50, 0x18, 0xD1, 0xF0, 0xE4, 0xF0, 0x7D, 0x01, 0xAF, 0x62, 0x12, 0x8E, 0x15, 0x12, 0xC7,
-0x93, 0xE4, 0x90, 0x92, 0x43, 0xD1, 0x40, 0x7B, 0x01, 0x80, 0x22, 0xF1, 0x92, 0xC3, 0xE5, 0x67,
-0x9F, 0xE5, 0x66, 0x94, 0x00, 0x50, 0x1B, 0xD1, 0xF0, 0xE4, 0xF0, 0x12, 0xAA, 0x14, 0x12, 0xC7,
-0xAE, 0xF1, 0x92, 0x12, 0xC8, 0x57, 0xEF, 0xF0, 0xE4, 0xD1, 0x3F, 0x7B, 0x02, 0xFA, 0xF1, 0xBB,
-0x80, 0x4B, 0x12, 0xBE, 0x48, 0x12, 0xC7, 0x93, 0xF1, 0x92, 0xF1, 0xB4, 0xEF, 0xF0, 0xD1, 0xF0,
-0xF1, 0xD2, 0x7B, 0x03, 0x7A, 0x00, 0xF1, 0xBB, 0xD1, 0xF0, 0xE0, 0x04, 0xF0, 0xE5, 0x64, 0x90,
-0x83, 0x6D, 0x93, 0xFF, 0xD1, 0xF0, 0xE0, 0xC3, 0x9F, 0x40, 0x22, 0xD1, 0xF0, 0xE4, 0xF0, 0xF1,
-0x92, 0x12, 0xC8, 0x0E, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x34, 0x00, 0xC3, 0x13, 0xFE,
-0xEF, 0x13, 0xFF, 0xE5, 0x62, 0x12, 0xAB, 0x08, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x6C,
-0xFD, 0xAF, 0x62, 0x12, 0x65, 0xC2, 0xE4, 0x90, 0x92, 0x3F, 0xF0, 0xD1, 0x3B, 0xA3, 0xF0, 0x7B,
-0x01, 0xFA, 0x7D, 0xFF, 0x7F, 0x01, 0xD1, 0x88, 0x05, 0x62, 0x21, 0xF7, 0x22, 0x90, 0x92, 0xCB,
-0xE0, 0xFF, 0x90, 0x92, 0x3F, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xF0, 0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0x90,
+0x90, 0x84, 0xC6, 0x12, 0x8F, 0xB9, 0x25, 0x5B, 0x90, 0x84, 0xC7, 0x12, 0x8E, 0x8F, 0x25, 0x5B,
+0x90, 0x84, 0xC8, 0xF0, 0x12, 0x8F, 0xCD, 0x25, 0x5B, 0x90, 0x84, 0xC9, 0x12, 0x8F, 0xEB, 0x25,
+0x5B, 0x90, 0x84, 0xCA, 0xF1, 0xF2, 0x25, 0x5B, 0x90, 0x84, 0xCB, 0xF0, 0x11, 0x15, 0x25, 0x5B,
+0x90, 0x84, 0xCC, 0xF0, 0x22, 0x90, 0x00, 0x06, 0x02, 0x03, 0x0F, 0x12, 0xA0, 0x4F, 0xFF, 0x54,
+0x0F, 0xF5, 0x5E, 0xEF, 0xC4, 0x54, 0x0F, 0x64, 0x0F, 0x70, 0x4C, 0x90, 0x01, 0xA4, 0x04, 0xF0,
+0x90, 0x92, 0x0A, 0xE0, 0x54, 0xFE, 0xFF, 0xF0, 0xE5, 0x5E, 0x54, 0x07, 0x25, 0xE0, 0xFE, 0xEF,
+0x54, 0xF1, 0x4E, 0x12, 0xDA, 0x3E, 0x60, 0x03, 0xBF, 0x01, 0x0F, 0x90, 0x05, 0x27, 0xE0, 0x54,
+0xED, 0xF0, 0x90, 0x01, 0xA4, 0x74, 0x02, 0xF0, 0x80, 0x02, 0xF1, 0xFB, 0xAF, 0x5E, 0x12, 0x98,
+0x46, 0xBF, 0x01, 0x08, 0xE4, 0xFD, 0xFF, 0x12, 0xD2, 0x77, 0x80, 0x00, 0x7F, 0x02, 0x51, 0xA8,
+0x90, 0x01, 0xA4, 0x74, 0x04, 0xF0, 0x22, 0xE5, 0x5E, 0x75, 0xF0, 0x13, 0xA4, 0x24, 0x37, 0xF9,
+0x74, 0x92, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xC0, 0x02, 0xC0, 0x01, 0xE5, 0x5D, 0x24, 0x01, 0xF9,
+0xE4, 0x35, 0x5C, 0x85, 0x5B, 0x1B, 0xF5, 0x1C, 0x89, 0x1D, 0x75, 0x1E, 0x04, 0xD0, 0x01, 0xD0,
+0x02, 0x12, 0x6A, 0x21, 0xF1, 0x5B, 0x11, 0x15, 0xF1, 0x64, 0xFF, 0xE5, 0x5E, 0x12, 0xD9, 0xAD,
+0x54, 0xFE, 0x4F, 0xF0, 0xE5, 0x5E, 0x12, 0xC7, 0x85, 0x54, 0xF7, 0xF0, 0x12, 0xDA, 0x49, 0x14,
+0x65, 0x5E, 0x60, 0x02, 0x21, 0xB3, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x07, 0x90, 0x85, 0xBC, 0xE0,
+0x30, 0xE0, 0x04, 0x7F, 0x05, 0x41, 0xA8, 0x90, 0x01, 0xA4, 0xE4, 0xF0, 0xA3, 0xF0, 0xF1, 0x5B,
+0x12, 0xDA, 0x49, 0x90, 0x92, 0x0B, 0xF0, 0x11, 0x15, 0xFF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFE,
+0x90, 0x92, 0x0A, 0xE0, 0x54, 0x0F, 0x4E, 0xF0, 0xEF, 0x54, 0x10, 0x25, 0xE0, 0xFF, 0x90, 0x92,
+0x72, 0xE0, 0x54, 0xDF, 0x4F, 0xFF, 0xF0, 0x11, 0x15, 0x54, 0x60, 0xC4, 0x54, 0x0F, 0xFE, 0xEF,
+0x54, 0xF9, 0x4E, 0x90, 0x92, 0x72, 0xF0, 0x90, 0x92, 0x0A, 0xE0, 0x54, 0xF1, 0xF0, 0x90, 0x05,
+0x58, 0x74, 0x02, 0x12, 0xDA, 0x1E, 0x44, 0x40, 0xF0, 0xE0, 0xFF, 0xC4, 0x13, 0x54, 0x07, 0x30,
+0xE0, 0x06, 0xEF, 0x54, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0x0A, 0xE0, 0x44, 0x01, 0x12, 0xDA,
+0x3E, 0x60, 0x05, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0x90, 0x92, 0xA9, 0xE0, 0xFF, 0xC4, 0x13, 0x54,
+0x07, 0x30, 0xE0, 0x08, 0xEF, 0x54, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x2D, 0x90, 0x05, 0x27, 0xE0,
+0x44, 0x12, 0xF0, 0x80, 0x24, 0x12, 0xDA, 0x98, 0xE4, 0xFF, 0xEF, 0xFD, 0xC3, 0x74, 0x87, 0x12,
+0xD9, 0x9D, 0x74, 0x03, 0x12, 0xD9, 0x81, 0xEF, 0xFD, 0xC3, 0x74, 0x8B, 0x12, 0xD9, 0x9D, 0x74,
+0x07, 0x12, 0xD9, 0x81, 0x0F, 0xEF, 0xB4, 0x04, 0xE1, 0x7F, 0x03, 0x51, 0xA8, 0x90, 0x92, 0x39,
+0xE0, 0x90, 0x92, 0xA7, 0xB4, 0x64, 0x05, 0x74, 0xC8, 0xF0, 0x80, 0x03, 0x74, 0x64, 0xF0, 0x90,
+0x92, 0x9F, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x90, 0x92, 0xA3, 0x12, 0x04, 0xF7, 0x00,
+0x00, 0x00, 0x00, 0x22, 0x90, 0x93, 0x03, 0x12, 0x87, 0x79, 0x90, 0x93, 0x02, 0xEF, 0xF0, 0x12,
+0x87, 0x82, 0x8A, 0x1A, 0x00, 0x8A, 0x1F, 0x01, 0x8A, 0x24, 0x03, 0x8A, 0x29, 0x04, 0x8A, 0x2E,
+0x10, 0x8A, 0x33, 0x11, 0x8A, 0x37, 0x12, 0x8A, 0x3C, 0x14, 0x8A, 0xA1, 0x15, 0x8A, 0x41, 0x16,
+0x8A, 0x46, 0x18, 0x8A, 0x4A, 0x19, 0x8A, 0x4F, 0x1C, 0x8A, 0x53, 0x20, 0x8A, 0x57, 0x24, 0x8A,
+0x5C, 0x25, 0x8A, 0x61, 0x27, 0x8A, 0x66, 0x40, 0x8A, 0x6A, 0x42, 0x8A, 0xA1, 0x47, 0x8A, 0xA1,
+0x49, 0x8A, 0x74, 0x80, 0x8A, 0x6F, 0x81, 0x8A, 0x79, 0x82, 0x8A, 0x7E, 0x83, 0x8A, 0x83, 0x84,
+0x8A, 0x88, 0x88, 0x8A, 0x8D, 0xC3, 0x00, 0x00, 0x8A, 0x92, 0x51, 0xA2, 0x02, 0x87, 0xD5, 0x51,
+0xA2, 0x02, 0x90, 0x02, 0x51, 0xA2, 0x02, 0x78, 0x94, 0x51, 0xA2, 0x02, 0x6B, 0x03, 0x51, 0xA2,
+0x02, 0x97, 0xFD, 0x51, 0xA2, 0xC1, 0x96, 0x51, 0xA2, 0x02, 0xA0, 0x58, 0x51, 0xA2, 0x02, 0xA1,
+0x22, 0x51, 0xA2, 0x02, 0x9F, 0xF5, 0x51, 0xA2, 0x01, 0x1B, 0x51, 0xA2, 0x02, 0xA0, 0x1C, 0x51,
+0xA2, 0xE1, 0x6D, 0x51, 0xA2, 0x61, 0x0C, 0x51, 0xA2, 0x02, 0x9C, 0xA6, 0x51, 0xA2, 0x02, 0xA1,
+0x31, 0x51, 0xA2, 0x02, 0xA1, 0x39, 0x51, 0xA2, 0x61, 0xD7, 0x51, 0xA2, 0x02, 0x4E, 0x29, 0x51,
+0xA2, 0x02, 0xA6, 0x9D, 0x51, 0xA2, 0x02, 0xD7, 0x13, 0x51, 0xA2, 0x02, 0x7A, 0xFE, 0x51, 0xA2,
+0x02, 0x6F, 0x63, 0x51, 0xA2, 0x02, 0x6F, 0xA4, 0x51, 0xA2, 0x02, 0x7B, 0xD0, 0x51, 0xA2, 0x02,
+0xA7, 0xE1, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0x02, 0xE0, 0x90, 0x01, 0xC2,
+0xF0, 0x22, 0x90, 0x93, 0x03, 0x02, 0x87, 0x70, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xA9,
+0x07, 0x90, 0x05, 0x63, 0xE0, 0xFE, 0x90, 0x05, 0x62, 0x12, 0xBC, 0x4B, 0xAD, 0x07, 0xFC, 0x90,
+0x05, 0x61, 0xE0, 0xFE, 0x90, 0x05, 0x60, 0x12, 0xD8, 0xB0, 0xFE, 0x90, 0x93, 0x84, 0x74, 0x17,
+0xF0, 0x90, 0x93, 0x92, 0x74, 0x06, 0xF0, 0x90, 0x93, 0x86, 0xE9, 0xF0, 0x12, 0x92, 0x32, 0x12,
+0xD8, 0xFD, 0xE0, 0x90, 0x93, 0x87, 0xF0, 0xAB, 0x07, 0xA3, 0xEB, 0xF0, 0xEE, 0xA3, 0xF0, 0xAF,
+0x05, 0xA3, 0xEF, 0xF0, 0xAE, 0x04, 0xEE, 0xA3, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x84, 0x12,
+0x5E, 0x10, 0x7F, 0x04, 0x12, 0x87, 0xBB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xD9, 0x94, 0xFF,
+0x54, 0x7F, 0x90, 0x85, 0xC5, 0xF0, 0xEF, 0xF1, 0x66, 0xA3, 0xF1, 0xB9, 0xFD, 0x54, 0xF0, 0xC4,
+0x54, 0x0F, 0xFF, 0x90, 0x85, 0xC3, 0xE0, 0x54, 0xF0, 0x4F, 0xF0, 0xF1, 0xCD, 0xFC, 0x54, 0x01,
+0x25, 0xE0, 0xFF, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0xEC, 0x54, 0x04, 0xFF, 0x90,
+0x92, 0xC0, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x12, 0x9F,
+0xBF, 0xD1, 0x8E, 0x90, 0x85, 0xC4, 0xF0, 0x11, 0x15, 0x30, 0xE0, 0x4E, 0xC3, 0x13, 0x54, 0x07,
+0xFF, 0xC3, 0x94, 0x04, 0x90, 0x85, 0xD8, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x26, 0x74, 0x03, 0xF0,
+0x71, 0xD1, 0xE9, 0x24, 0x06, 0x12, 0xDA, 0x79, 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, 0x03, 0x3C, 0x71, 0xD1, 0x11, 0x15, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x85,
+0xCD, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x71, 0xD1, 0xF1, 0xEC, 0xFD, 0x7F,
+0x02, 0x12, 0x57, 0x82, 0x71, 0xD1, 0x12, 0x71, 0xCB, 0x12, 0xCD, 0x14, 0xF0, 0x90, 0x85, 0xC5,
+0x12, 0xD9, 0xD8, 0x12, 0x9F, 0xBE, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x24, 0x03, 0xFF, 0xE4, 0x33,
+0xFE, 0x90, 0x93, 0x06, 0x02, 0x87, 0x70, 0x90, 0x93, 0x06, 0x12, 0x87, 0x79, 0x71, 0xD1, 0x12,
+0x02, 0xF6, 0x54, 0x7F, 0xFD, 0xF1, 0xBA, 0xFE, 0x54, 0x1F, 0x90, 0x93, 0x0A, 0xF1, 0x62, 0x90,
+0x93, 0x09, 0xD1, 0x8F, 0xFE, 0x54, 0x03, 0xFC, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0x93,
+0x0C, 0xD1, 0x8F, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x93, 0x0B, 0xF1, 0x62,
+0xFF, 0xD1, 0x90, 0xFB, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x93, 0x0E, 0xF0, 0xFA,
+0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEF, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33,
+0x54, 0x80, 0xB1, 0x2D, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x93, 0x0B, 0xE0, 0x54, 0x01, 0xC4, 0x33,
+0x33, 0x54, 0xC0, 0xB1, 0x2D, 0x54, 0xBF, 0x4F, 0xF0, 0xEA, 0x60, 0x02, 0xA1, 0x2C, 0x90, 0x93,
+0x0A, 0xE0, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0xF1, 0xC5, 0x54, 0xE0, 0x4F, 0xF0, 0xEC,
+0x54, 0x03, 0xB1, 0x2D, 0x54, 0xFC, 0x4F, 0xF0, 0xEC, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0xB1,
+0x2D, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0x93, 0x09, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF,
+0x75, 0xF0, 0x12, 0xED, 0xF1, 0xC5, 0x54, 0xDF, 0x4F, 0xF0, 0x90, 0x93, 0x0C, 0xE0, 0x54, 0x03,
+0xC4, 0x54, 0xF0, 0xB1, 0x2D, 0x54, 0xCF, 0x4F, 0x12, 0xDA, 0x06, 0xE0, 0x54, 0xFB, 0x12, 0xDA,
+0x06, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0x93, 0x0F, 0xE0, 0x12, 0xDA, 0x80, 0xD0, 0x82,
+0xD0, 0x83, 0xF0, 0x90, 0x92, 0xBA, 0xE0, 0x60, 0x30, 0x71, 0xD1, 0xE9, 0x24, 0x03, 0x12, 0xDA,
+0x79, 0x54, 0x1F, 0x12, 0x03, 0x3C, 0x90, 0x93, 0x0D, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x0D, 0xE0,
+0xFF, 0xC3, 0x94, 0x04, 0x50, 0x13, 0xEF, 0x71, 0xCB, 0x8F, 0x82, 0x8E, 0x83, 0xE4, 0x12, 0x03,
+0x4E, 0x90, 0x93, 0x0D, 0xE0, 0x04, 0xF0, 0x80, 0xE3, 0x90, 0x92, 0xB8, 0xE0, 0x54, 0x07, 0xFF,
+0xBF, 0x05, 0x0A, 0xEC, 0xB4, 0x01, 0x06, 0x90, 0x92, 0xBD, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x93,
+0x0D, 0xF0, 0x90, 0x93, 0x0D, 0xE0, 0xFC, 0x71, 0xCB, 0x8F, 0x82, 0x8E, 0x83, 0x12, 0x03, 0x0F,
+0xFF, 0xED, 0x12, 0xD9, 0x6C, 0xF5, 0x83, 0xE5, 0x82, 0x2C, 0x12, 0xB0, 0xF5, 0x90, 0x93, 0x0D,
+0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x04, 0xDB, 0xAF, 0x05, 0x12, 0x17, 0x8E, 0x22, 0xFF, 0x75, 0xF0,
+0x12, 0xED, 0x90, 0x89, 0x3F, 0x12, 0x05, 0x28, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x12, 0xC1, 0x94, 0x20, 0xE6, 0x02, 0xC1, 0x55, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0x94, 0x03,
+0xF0, 0x7F, 0x8D, 0x12, 0x7B, 0x51, 0x90, 0x94, 0x04, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90,
+0x94, 0x05, 0xF0, 0x90, 0x94, 0x04, 0xE0, 0x24, 0xFC, 0x60, 0x10, 0x24, 0x03, 0x60, 0x02, 0xC1,
+0x4C, 0x90, 0x94, 0x03, 0xE0, 0xFF, 0x12, 0xC1, 0x45, 0xC1, 0x4C, 0x90, 0x94, 0x03, 0xE0, 0x24,
+0xDC, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF1, 0xD3, 0xFF, 0xD1, 0x87, 0x75, 0xF0, 0x12, 0xB1, 0x32,
+0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0xD1, 0x87, 0x75, 0xF0, 0x12, 0xB1, 0x32, 0xF1,
+0x66, 0xFB, 0x0D, 0xE4, 0xFF, 0xD1, 0x87, 0x75, 0xF0, 0x12, 0xB1, 0x32, 0xC4, 0x54, 0x03, 0xFB,
+0x0D, 0xE4, 0xFF, 0xD1, 0x87, 0x12, 0xCF, 0x87, 0xFB, 0xE4, 0xFD, 0x0F, 0xD1, 0x87, 0x75, 0xF0,
+0x12, 0x90, 0x89, 0x3D, 0x12, 0x05, 0x28, 0xD1, 0x84, 0x75, 0xF0, 0x12, 0xF1, 0xC5, 0xC4, 0x13,
+0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0xD1, 0x87, 0x75, 0xF0, 0x12, 0xF1, 0xC5, 0x54, 0x1F, 0xD1,
+0x85, 0x12, 0xD9, 0x6C, 0xF1, 0xD3, 0x0F, 0xD1, 0x87, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5,
+0x82, 0xE4, 0x34, 0x82, 0xD1, 0x82, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
+0x82, 0xD1, 0x82, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xD1, 0x82,
+0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF1, 0xD3, 0x0F, 0xD1, 0x87,
+0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xD1, 0x82, 0x75, 0xF0, 0x08,
+0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xD1, 0x82, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07,
+0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0xD1, 0x5A, 0x12, 0xC1, 0x94, 0x30,
+0xE0, 0x03, 0x12, 0xC1, 0x9B, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 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, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0xD1, 0x5A, 0x90, 0x94, 0x03, 0xE0, 0x22, 0x4F, 0xF0,
+0x90, 0x00, 0x02, 0x02, 0x03, 0x0F, 0x12, 0xA0, 0x4F, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x17,
+0x90, 0x92, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0xF1, 0xFB, 0xF1, 0x5B, 0x12, 0x02, 0xF6, 0x54, 0x0F,
+0xFF, 0x12, 0x97, 0xB1, 0x02, 0xD1, 0x6E, 0xF1, 0x5B, 0xF1, 0xBA, 0x12, 0xDA, 0x9F, 0x12, 0xD9,
+0x5F, 0xF5, 0x83, 0xEF, 0xD1, 0x8F, 0x54, 0x03, 0xFF, 0xED, 0xF1, 0xDC, 0x54, 0xFC, 0xD1, 0x8E,
+0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE, 0xF1, 0xDC, 0x54, 0xE3, 0xD1, 0x8E, 0x54, 0xE0, 0xFF,
+0xEE, 0xF1, 0xDC, 0x54, 0x1F, 0x4F, 0xF1, 0xEB, 0x12, 0xDA, 0x5A, 0xE4, 0xFB, 0x12, 0xD1, 0xEA,
+0xF1, 0x5B, 0xF1, 0xF3, 0x12, 0xDA, 0x5A, 0x7B, 0x01, 0x12, 0xD1, 0xEA, 0xF1, 0x5B, 0xF1, 0xCD,
+0x33, 0x33, 0x33, 0x54, 0xF8, 0x12, 0xDA, 0x9F, 0xFD, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x16, 0xF5,
+0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xF1, 0xCD, 0xC4, 0x13, 0x54, 0x07, 0xFF, 0xED,
+0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x17, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0, 0xEE,
+0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70, 0x22, 0x90, 0x92, 0x0B, 0xEF, 0xF0, 0x11, 0x15, 0x54,
+0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x92, 0x0A, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0,
+0x90, 0x92, 0x09, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0xDA, 0x98, 0x22, 0xAB, 0x5B, 0xAA, 0x5C, 0xA9,
+0x5D, 0x22, 0xF0, 0xEE, 0x54, 0x80, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22, 0x12, 0xD9, 0x94,
+0xFF, 0xF1, 0xBA, 0xFE, 0x54, 0x03, 0xFD, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xC0, 0x03, 0x71,
+0xD1, 0xD1, 0x90, 0x54, 0x0F, 0x90, 0x93, 0xFF, 0xF0, 0xD0, 0x03, 0x12, 0x98, 0xC4, 0x71, 0xD1,
+0xF1, 0xBA, 0x12, 0x95, 0x52, 0x90, 0x93, 0x09, 0x74, 0x10, 0xF0, 0x90, 0x93, 0x17, 0x74, 0x07,
+0xF0, 0x71, 0xD1, 0x12, 0x02, 0xF6, 0x90, 0x93, 0x0B, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x09,
+0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB, 0x4F, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x03, 0x0F,
+0x75, 0xF0, 0x12, 0xE5, 0x6F, 0x90, 0x89, 0x3E, 0x12, 0x05, 0x28, 0xE0, 0x22, 0x90, 0x00, 0x03,
+0x02, 0x03, 0x0F, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x22, 0xE5, 0x5E, 0x75, 0xF0, 0x0E, 0xA4,
+0x24, 0x0E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x22, 0xF0, 0x90, 0x00, 0x04, 0x02,
+0x03, 0x0F, 0xF0, 0x90, 0x00, 0x05, 0x02, 0x03, 0x0F, 0xA1, 0x3A, 0x7D, 0x20, 0xE4, 0xFF, 0x02,
+0x7B, 0xBF, 0x8B, 0x5B, 0x8A, 0x5C, 0x89, 0x5D, 0x90, 0x92, 0xB4, 0xE0, 0x70, 0x0C, 0x12, 0xDA,
+0x69, 0x30, 0xE0, 0x06, 0x90, 0x92, 0xBA, 0x74, 0x01, 0xF0, 0x90, 0x92, 0xB6, 0xE0, 0x70, 0x10,
+0x12, 0x8F, 0x5B, 0x12, 0xDA, 0x49, 0xFF, 0xBF, 0x05, 0x06, 0x90, 0x92, 0xBB, 0x74, 0x01, 0xF0,
+0x12, 0x8F, 0x5B, 0x12, 0x8F, 0xBA, 0xFF, 0xF5, 0x5F, 0x12, 0x02, 0xF6, 0xFE, 0xC3, 0x13, 0x30,
+0xE0, 0x07, 0x12, 0x8E, 0x90, 0xF5, 0x60, 0x80, 0x02, 0x8F, 0x60, 0x85, 0x5F, 0x5E, 0xE5, 0x5E,
+0xD3, 0x95, 0x60, 0x50, 0x2C, 0x12, 0x8F, 0x5B, 0x12, 0x02, 0xF6, 0x54, 0x01, 0xFD, 0xAF, 0x5E,
+0x12, 0x6E, 0x5F, 0xAF, 0x5E, 0x12, 0x77, 0x39, 0xEF, 0xAF, 0x5E, 0x70, 0x04, 0x11, 0x9C, 0x80,
+0x02, 0xF1, 0xF1, 0x90, 0x92, 0xBB, 0xE0, 0x60, 0x04, 0xAF, 0x5E, 0x11, 0x9C, 0x05, 0x5E, 0x80,
+0xCD, 0xE5, 0x5F, 0x70, 0x16, 0xFF, 0x12, 0x77, 0x39, 0xEF, 0x70, 0x0F, 0x12, 0xA5, 0x1C, 0x12,
+0x79, 0x61, 0x12, 0xC7, 0x62, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x7D, 0x01, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x06, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x7D, 0x44, 0x7F,
+0x6F, 0x11, 0xDE, 0x71, 0xCB, 0x90, 0x93, 0x07, 0xE0, 0x90, 0x93, 0x06, 0xB4, 0x01, 0x0A, 0xE0,
+0x12, 0xB6, 0x9A, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x08, 0xE0, 0x12, 0xB6, 0x9A, 0xE0, 0x54, 0xFB,
+0xF0, 0xF1, 0xD7, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xA5, 0x1C, 0xE4, 0xFD, 0xFF, 0x90, 0x05,
+0x22, 0xEF, 0xF0, 0x90, 0x92, 0x01, 0xED, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x81, 0xF0, 0x90, 0x92,
+0x0A, 0xE0, 0x20, 0xE0, 0x02, 0x41, 0x2F, 0x90, 0x92, 0x0C, 0xE0, 0xB4, 0x14, 0x0B, 0x7F, 0x01,
+0x51, 0x3B, 0xEF, 0x60, 0x02, 0x41, 0x2F, 0x41, 0x2A, 0x51, 0x32, 0x12, 0xC7, 0x85, 0x54, 0x07,
+0x90, 0x93, 0x7F, 0xF0, 0x60, 0x07, 0xE0, 0x64, 0x02, 0x60, 0x02, 0x21, 0xF1, 0x90, 0x92, 0x0C,
+0xE0, 0x70, 0x35, 0xF1, 0xDC, 0x54, 0x07, 0x30, 0xE0, 0x02, 0x21, 0xE1, 0x12, 0xDA, 0x71, 0xF0,
+0x7D, 0x4E, 0x7F, 0x6F, 0x51, 0x30, 0x12, 0x98, 0x3A, 0xB1, 0x3D, 0x7B, 0x04, 0x7D, 0x01, 0x71,
+0x1D, 0xBF, 0x01, 0x0D, 0xF1, 0x26, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0x0C, 0x74, 0x01, 0xF0,
+0x22, 0x12, 0xD9, 0xE5, 0x7D, 0x4F, 0x80, 0x7B, 0x90, 0x92, 0x0C, 0xE0, 0x64, 0x01, 0x60, 0x02,
+0x21, 0xE1, 0xF1, 0x26, 0xE0, 0xFF, 0x30, 0xE0, 0x08, 0x90, 0x93, 0x81, 0x74, 0x01, 0xF0, 0x80,
+0x16, 0xEF, 0xC3, 0x13, 0x20, 0xE0, 0x10, 0x90, 0x93, 0x81, 0x74, 0x01, 0xF0, 0x12, 0xDA, 0x71,
+0xF0, 0x7D, 0x50, 0x7F, 0x6F, 0x11, 0xDE, 0x90, 0x93, 0x81, 0xE0, 0x60, 0x54, 0x90, 0x92, 0xB2,
+0xE0, 0x64, 0x06, 0x60, 0x40, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x01, 0x40, 0x08, 0x90, 0x93,
+0x82, 0x74, 0x04, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x93, 0x82, 0xF0, 0x51, 0x32, 0x12, 0x98, 0x3A,
+0xB1, 0x3D, 0x90, 0x93, 0x82, 0xE0, 0xFB, 0x7D, 0x01, 0x71, 0x1D, 0xBF, 0x01, 0x10, 0x12, 0xC6,
+0x53, 0x74, 0x03, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x58, 0x7E, 0x01, 0x02, 0x61, 0x41, 0x12, 0xD9,
+0xE5, 0x7D, 0x51, 0x01, 0xDE, 0xE4, 0x90, 0x92, 0xB2, 0xF1, 0xF5, 0xF1, 0x26, 0xE0, 0x54, 0xFB,
+0xF0, 0x90, 0x92, 0x0C, 0xE0, 0x64, 0x05, 0x70, 0x46, 0xFF, 0x51, 0x3B, 0xEF, 0x70, 0x40, 0x80,
+0x39, 0x90, 0x93, 0x7F, 0xE0, 0x64, 0x03, 0x70, 0x36, 0x90, 0x92, 0x0C, 0xE0, 0x64, 0x05, 0x70,
+0x2E, 0xF1, 0xDC, 0x54, 0x07, 0x20, 0xE0, 0x13, 0x51, 0x32, 0x04, 0xFF, 0xA3, 0xE0, 0xB5, 0x07,
+0x02, 0xE4, 0xFF, 0xEF, 0x12, 0xC6, 0x42, 0xEF, 0x12, 0xC3, 0xFE, 0x51, 0x32, 0xFD, 0x7F, 0x02,
+0x12, 0xD2, 0x77, 0xE4, 0xFF, 0x51, 0x3B, 0xEF, 0x70, 0x05, 0x7F, 0x06, 0x12, 0x8A, 0xA8, 0x22,
+0x11, 0xDE, 0x90, 0x92, 0x0A, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0x22, 0x90, 0x93, 0x83, 0xEF, 0xF0,
+0x71, 0xCB, 0xEF, 0x70, 0x02, 0xFF, 0x22, 0x51, 0x32, 0x90, 0x92, 0x70, 0xF0, 0x12, 0xD9, 0x32,
+0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x51, 0x32, 0xF5, 0x7A, 0x90, 0x93, 0x83, 0xE0, 0x90,
+0x92, 0x0C, 0x70, 0x03, 0xF0, 0x80, 0x03, 0x74, 0x14, 0xF0, 0xE5, 0x7A, 0x12, 0xD9, 0xAD, 0x30,
+0xE0, 0x29, 0xF1, 0x13, 0xE0, 0x24, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF,
+0x12, 0xD8, 0xFB, 0xEF, 0xF0, 0xF1, 0x13, 0xE0, 0x04, 0xF0, 0xF1, 0x13, 0xE0, 0xFF, 0x90, 0x92,
+0x78, 0xE0, 0xFE, 0xEF, 0xB5, 0x06, 0x04, 0xF1, 0x13, 0xE4, 0xF0, 0x12, 0xD8, 0xFB, 0xE0, 0xFC,
+0x90, 0x92, 0x70, 0xE0, 0x12, 0xD8, 0xFD, 0xE0, 0x6C, 0x60, 0x09, 0xE5, 0x7A, 0x12, 0x98, 0x9E,
+0xE5, 0x7A, 0xB1, 0x44, 0xE5, 0x7A, 0x75, 0xF0, 0x13, 0xA4, 0x24, 0x3F, 0xF5, 0x82, 0xE4, 0x34,
+0x92, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0x90, 0x93, 0x83, 0xE0, 0x70, 0x21, 0xF1, 0xDC, 0x54, 0x07,
+0x20, 0xE0, 0x1A, 0xE5, 0x7A, 0x12, 0xC7, 0x85, 0x54, 0x07, 0xFF, 0x60, 0x03, 0xBF, 0x02, 0x0D,
+0xE5, 0x7A, 0x12, 0x98, 0x3A, 0xB1, 0x3D, 0x7B, 0x04, 0xE4, 0xFD, 0x71, 0x1D, 0xAD, 0x7A, 0x7F,
+0x01, 0x12, 0xD2, 0x77, 0x90, 0x92, 0x72, 0xE0, 0xC3, 0x13, 0x54, 0x03, 0xFF, 0xBF, 0x02, 0x05,
+0xE4, 0xFF, 0x12, 0x8A, 0xA8, 0x90, 0x01, 0xA5, 0xE0, 0xB4, 0xFF, 0x04, 0xE4, 0xF0, 0x80, 0x06,
+0x90, 0x01, 0xA5, 0xE0, 0x04, 0xF0, 0x7F, 0x01, 0x22, 0xE4, 0xFB, 0x7D, 0x01, 0xD3, 0x10, 0xAF,
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xED, 0x12, 0xBD, 0x5D, 0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D,
+0xE0, 0x60, 0x25, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0xF3, 0xF0, 0x7D, 0x14, 0x71, 0xC7, 0xEF,
+0x64, 0x01, 0x70, 0x05, 0x12, 0xD8, 0xC5, 0x80, 0x04, 0x7F, 0x00, 0x80, 0x13, 0x90, 0x93, 0xF3,
+0xE0, 0xFF, 0x7D, 0x15, 0x11, 0xDE, 0x80, 0x03, 0x12, 0xD8, 0xC5, 0x12, 0xAF, 0xD6, 0x7F, 0x01,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x92, 0x09, 0xE0, 0x30, 0xE0, 0x58, 0x90, 0x92, 0x0C, 0xE0,
+0x70, 0x28, 0x7D, 0x16, 0x7F, 0x6F, 0x11, 0xDE, 0x71, 0xCB, 0x51, 0x32, 0xB1, 0x32, 0x71, 0x19,
+0x51, 0x32, 0x12, 0xCD, 0x8B, 0xF5, 0x83, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0xC6, 0x53, 0x74, 0x03,
+0x12, 0xC3, 0xFE, 0x90, 0x92, 0x0C, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x92, 0x0C, 0xE0, 0x64, 0x01,
+0x70, 0x20, 0x51, 0x32, 0xFF, 0x12, 0xCD, 0x8B, 0xF5, 0x83, 0xE0, 0x30, 0xE0, 0x14, 0xB1, 0x31,
+0x71, 0x19, 0x12, 0xC6, 0x53, 0x74, 0x03, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02,
+0x61, 0x41, 0x91, 0x23, 0x22, 0x7D, 0x17, 0x7F, 0xFF, 0x11, 0xDE, 0xE4, 0x90, 0x94, 0x00, 0xF0,
+0xA3, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x94, 0x02, 0xF0, 0x7D, 0x47, 0x7F, 0xFF, 0x11, 0xDE,
+0x90, 0x05, 0xF8, 0xE0, 0x70, 0x12, 0xA3, 0xE0, 0x70, 0x0E, 0xA3, 0xE0, 0x70, 0x0A, 0xA3, 0xE0,
+0x70, 0x06, 0x12, 0xDA, 0x34, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x94, 0x01, 0xE0, 0x94, 0xE8, 0x90,
+0x94, 0x00, 0xE0, 0x94, 0x03, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x12, 0xDA,
+0x34, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90, 0x94, 0x00, 0x12, 0xAD,
+0x64, 0x80, 0xBD, 0x12, 0xD9, 0x32, 0xB5, 0x07, 0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x12, 0xC3, 0xCF,
+0xE4, 0x90, 0x92, 0x0C, 0xF0, 0x71, 0xCB, 0x12, 0xD9, 0x49, 0x12, 0xD9, 0x5F, 0xF5, 0x83, 0xE0,
+0xFA, 0xED, 0x12, 0x8F, 0xDC, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13, 0x54, 0x07, 0xFB, 0xEE,
+0xC4, 0x54, 0x0F, 0x90, 0x93, 0xFF, 0xF0, 0xAF, 0x02, 0x12, 0x98, 0xC4, 0x51, 0x32, 0x12, 0x8F,
+0xDC, 0xB1, 0x52, 0x51, 0x32, 0xFF, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x18, 0xF5, 0x82, 0xE4, 0x34,
+0x92, 0xF5, 0x83, 0xE0, 0x04, 0xF0, 0xB1, 0x31, 0xF1, 0xE3, 0xE4, 0xFD, 0xFF, 0x51, 0x30, 0xFD,
+0x7F, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xF4, 0xEF, 0xF0, 0xA3, 0xED,
+0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0xF6, 0xE0, 0xFF, 0xC3, 0x94, 0x03, 0x40, 0x02, 0xA1, 0x2C,
+0x90, 0x93, 0xF5, 0xE0, 0xFE, 0x12, 0xD2, 0x6B, 0xF5, 0x83, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0xD9,
+0xFA, 0xE0, 0x90, 0x93, 0xF7, 0xF0, 0x90, 0x93, 0xF4, 0xE0, 0xFC, 0xB4, 0x02, 0x23, 0x90, 0x93,
+0xF7, 0xE0, 0xFD, 0xEE, 0x12, 0xD2, 0x5F, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0x93, 0xF6,
+0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0xB1, 0x11, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4D, 0x80,
+0x23, 0xEC, 0xB4, 0x01, 0x23, 0x12, 0xDA, 0x50, 0x12, 0xD2, 0x5F, 0xF5, 0x83, 0xC0, 0x83, 0xC0,
+0x82, 0x90, 0x93, 0xF6, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x12, 0xB1, 0x11, 0x80, 0x02, 0xC3, 0x33,
+0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0xF7, 0xF0, 0x12, 0xDA, 0x50, 0x12, 0xD2, 0x6B, 0xF5, 0x83,
+0xC0, 0x83, 0xC0, 0x82, 0x90, 0x93, 0xF6, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12,
+0xD9, 0xFA, 0xEF, 0xF0, 0x90, 0x93, 0xF6, 0xE0, 0x04, 0xF0, 0x81, 0x94, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0xEF, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x19, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0,
+0xFF, 0x7E, 0x00, 0x22, 0x75, 0xF0, 0x13, 0xA4, 0x24, 0x38, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5,
+0x83, 0xE0, 0xFE, 0x54, 0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x10, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0xEF, 0x14, 0x60, 0x02, 0xC1,
+0x3E, 0x90, 0x06, 0x03, 0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x94, 0x10, 0xE0, 0xFB, 0xC4, 0x33, 0x54,
+0xE0, 0xFE, 0x90, 0x04, 0x42, 0xE0, 0x54, 0x9F, 0x4E, 0xFE, 0xF0, 0xE4, 0xFD, 0x12, 0xD3, 0xC8,
+0x90, 0x94, 0x11, 0xEF, 0xF0, 0x90, 0x04, 0x83, 0xF0, 0x90, 0x93, 0xDD, 0x12, 0x04, 0xF7, 0x00,
+0x00, 0x00, 0x01, 0x90, 0x93, 0xE1, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x01, 0xF1, 0x09, 0x12,
+0x04, 0xF7, 0x00, 0x00, 0x00, 0x01, 0x90, 0x93, 0xE1, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x01,
+0x7F, 0x00, 0x7E, 0x09, 0xF1, 0x0D, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x10, 0x12, 0x99, 0xC2,
+0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x04, 0xC5, 0x78, 0x04, 0xF1, 0xE8, 0x7F, 0x00,
+0x7E, 0x0A, 0xF1, 0x0D, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x99, 0xC2, 0xEF, 0x54,
+0x03, 0xFF, 0xE4, 0x78, 0x0A, 0xF1, 0xE8, 0x7F, 0x00, 0x7E, 0x0D, 0xF1, 0x0D, 0x12, 0x04, 0xF7,
+0x0C, 0x00, 0x00, 0x00, 0x90, 0x94, 0x11, 0x12, 0x99, 0xC5, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78,
+0x1A, 0xF1, 0xE8, 0x7F, 0x18, 0xF1, 0x0B, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x93,
+0xE1, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x12, 0xDA, 0x29, 0x12, 0x04, 0xF7, 0x00, 0x00,
+0x0C, 0x00, 0x90, 0x93, 0xCF, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x04, 0x00, 0x80, 0x59, 0x90, 0x06,
+0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0xDD, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x01, 0x90,
+0x93, 0xE1, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x00, 0xF1, 0x09, 0x12, 0x04, 0xF7, 0x00, 0x00,
+0x00, 0x01, 0x90, 0x93, 0xE1, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09,
+0xF1, 0x0D, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x93, 0xE1, 0x12, 0x04, 0xF7, 0x00,
+0x00, 0x0C, 0x00, 0x12, 0xDA, 0x29, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x93, 0xCF,
+0x12, 0x04, 0xF7, 0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x12, 0x99, 0x35, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xDB, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x12, 0x70, 0x61, 0x90, 0x93, 0xE5, 0x12, 0x04, 0xEB, 0x90, 0x93, 0xDD, 0x12, 0x87, 0x58, 0x12,
+0x04, 0xA7, 0x90, 0x93, 0xE5, 0x12, 0x99, 0xBC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07,
+0x90, 0x93, 0xDD, 0x12, 0x87, 0x58, 0x90, 0x93, 0xE1, 0x12, 0x99, 0xBC, 0xD0, 0x03, 0xD0, 0x02,
+0xD0, 0x01, 0xD0, 0x00, 0x12, 0x87, 0x4B, 0x90, 0x93, 0xE9, 0x12, 0x04, 0xEB, 0x90, 0x93, 0xE9,
+0x12, 0x87, 0x58, 0x90, 0x91, 0x66, 0x12, 0x04, 0xEB, 0x90, 0x93, 0xDB, 0xE0, 0xFE, 0xA3, 0xE0,
+0xFF, 0x12, 0x71, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x00, 0x7E, 0x08, 0xD1, 0xA1, 0x90,
+0x93, 0xDD, 0x22, 0x74, 0x9C, 0x25, 0x7A, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xE4,
+0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x90, 0x92, 0x0A, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0x75, 0xF0,
+0x13, 0xA4, 0x24, 0x3E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xE4, 0x90, 0x93, 0x7E,
+0xF0, 0x90, 0x92, 0x0A, 0xE0, 0xFF, 0x30, 0xE0, 0x67, 0xF1, 0xDC, 0x54, 0x07, 0x20, 0xE0, 0x60,
+0xEF, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xF1, 0x2E, 0xE0, 0xFE, 0x30, 0xE0, 0x53, 0xEF, 0xF1, 0x2E,
+0xEE, 0x54, 0xFE, 0xF0, 0xEF, 0xF1, 0x2E, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x0B, 0x90,
+0x92, 0x76, 0xF1, 0x1F, 0xE0, 0x54, 0xFB, 0x12, 0xC4, 0xC1, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1,
+0x24, 0xF1, 0xF6, 0xF1, 0x26, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0x92, 0xB2, 0xF0, 0x51, 0x32,
+0xFD, 0x7F, 0x02, 0x12, 0xD2, 0x77, 0x90, 0x93, 0x7E, 0xE0, 0x60, 0x14, 0xE4, 0x90, 0x92, 0x74,
+0xF0, 0xA3, 0xF0, 0x01, 0xE9, 0x90, 0x92, 0x74, 0xF1, 0x1F, 0xE0, 0x54, 0xFD, 0xF0, 0xF1, 0xD7,
+0x22, 0x8F, 0x5E, 0x71, 0xC5, 0xE5, 0x5E, 0x12, 0xD9, 0x60, 0xF5, 0x83, 0xE0, 0xFC, 0x12, 0x8F,
+0xDA, 0x12, 0x98, 0xAC, 0x12, 0x8F, 0xDA, 0xB1, 0x52, 0xE5, 0x5E, 0xB1, 0x32, 0xF1, 0xE3, 0xF1,
+0xD7, 0xAD, 0x5E, 0x7F, 0x01, 0x81, 0x82, 0xE4, 0xFD, 0xFF, 0x01, 0xDE, 0x90, 0x92, 0x72, 0xE0,
+0xC4, 0x13, 0x22, 0xE4, 0xFB, 0xFD, 0x61, 0x1D, 0x12, 0x04, 0xD8, 0x90, 0x93, 0xE1, 0x02, 0x04,
+0xEB, 0xE4, 0xFD, 0x01, 0x9E, 0xF0, 0x90, 0x92, 0x0C, 0x74, 0x05, 0xF0, 0x22, 0x90, 0x93, 0x06,
+0x12, 0x87, 0x79, 0x90, 0x04, 0x24, 0xE0, 0xF5, 0x5B, 0xE4, 0xFF, 0x12, 0x8B, 0xD1, 0x11, 0x2D,
+0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x19, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0x11,
+0x2D, 0x11, 0x3A, 0xF5, 0x83, 0xEE, 0xF0, 0x0F, 0xEF, 0xB4, 0x03, 0xDF, 0x22, 0x8F, 0x82, 0x75,
+0x83, 0x00, 0x12, 0x03, 0x0F, 0x25, 0x5B, 0xFE, 0xEF, 0x22, 0x75, 0xF0, 0x13, 0xA4, 0x24, 0x40,
+0xF5, 0x82, 0xE4, 0x34, 0x92, 0x22, 0x8F, 0x5F, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0x0E, 0xF0,
+0x12, 0x93, 0xC5, 0xEF, 0x64, 0x01, 0x70, 0x39, 0xE5, 0x5F, 0x12, 0xD8, 0xFD, 0xE0, 0xFC, 0xE5,
+0x5F, 0x11, 0x9E, 0xE5, 0x5F, 0x12, 0x95, 0x44, 0x12, 0x97, 0xDC, 0x54, 0x07, 0x20, 0xE0, 0x17,
+0xE5, 0x5F, 0x12, 0xC7, 0x85, 0x54, 0x07, 0xFF, 0x60, 0x03, 0xBF, 0x02, 0x0A, 0xE5, 0x5F, 0x11,
+0x3A, 0x12, 0x95, 0x3D, 0x12, 0x97, 0xE3, 0xAD, 0x5F, 0x7F, 0x01, 0x12, 0xD2, 0x77, 0x7F, 0x01,
+0x22, 0x90, 0x93, 0x0E, 0xE0, 0xFF, 0x7D, 0x49, 0x12, 0x90, 0xDE, 0x7F, 0x00, 0x22, 0x75, 0xF0,
+0x13, 0xA4, 0x24, 0x38, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0x54, 0x03, 0xFD,
+0xEE, 0x13, 0x13, 0x54, 0x07, 0xFB, 0x90, 0x92, 0x0A, 0xE0, 0xFE, 0xC4, 0x54, 0x0F, 0x90, 0x93,
+0xFF, 0xF0, 0xAF, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xFC, 0xEF, 0xF0,
+0xED, 0x64, 0x01, 0x70, 0x31, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x0E, 0x80, 0x08,
+0x90, 0x93, 0xFC, 0xE0, 0x24, 0xFE, 0xF5, 0x0E, 0x90, 0x93, 0xCB, 0x12, 0x04, 0xF7, 0x00, 0x00,
+0x00, 0xFF, 0xAF, 0x0E, 0x31, 0xAF, 0x31, 0x35, 0x90, 0x93, 0xCB, 0x12, 0x04, 0xF7, 0x00, 0x00,
+0x00, 0xFF, 0xAF, 0x0E, 0x80, 0x22, 0x90, 0x93, 0xCB, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0xFF,
+0x90, 0x93, 0xFC, 0x31, 0xC5, 0x31, 0xB3, 0x31, 0x35, 0x90, 0x93, 0xCB, 0x12, 0x04, 0xF7, 0x00,
+0x00, 0x00, 0xFF, 0x90, 0x93, 0xFC, 0xE0, 0xFF, 0x31, 0xAF, 0x7C, 0x00, 0x7F, 0x01, 0x31, 0x39,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7C, 0x00, 0xE4, 0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0,
+0x90, 0x93, 0xC9, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x93, 0xC8, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0,
+0xFD, 0x12, 0x7B, 0xE0, 0x90, 0x93, 0xD3, 0x12, 0x04, 0xEB, 0x90, 0x93, 0xCB, 0x12, 0x87, 0x58,
+0x12, 0x04, 0xA7, 0x90, 0x93, 0xD3, 0x31, 0xBC, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07,
+0x90, 0x93, 0xCB, 0x12, 0x87, 0x58, 0x90, 0x93, 0xCF, 0x31, 0xBC, 0xD0, 0x03, 0xD0, 0x02, 0xD0,
+0x01, 0xD0, 0x00, 0x12, 0x87, 0x4B, 0x90, 0x93, 0xD7, 0x12, 0x04, 0xEB, 0x90, 0x93, 0xC9, 0xA3,
+0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x93, 0xD7, 0x12, 0x87, 0x58, 0x90, 0x8D, 0x9D, 0x12, 0x04, 0xEB,
+0x90, 0x93, 0xC8, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x78, 0xDD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4,
+0xFC, 0xFD, 0xFE, 0x90, 0x93, 0xCF, 0x12, 0x04, 0xEB, 0x7D, 0x18, 0x22, 0x12, 0x87, 0x64, 0x02,
+0x87, 0x3E, 0x90, 0x94, 0x10, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0x90, 0x85, 0xBC, 0xE0,
+0x30, 0xE0, 0x06, 0x90, 0x85, 0xBE, 0x74, 0x01, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x41,
+0x85, 0x90, 0x85, 0xDC, 0xE0, 0x04, 0xF0, 0x90, 0x05, 0x61, 0x31, 0xC5, 0x78, 0x08, 0x12, 0x04,
+0xD8, 0xA8, 0x04, 0xA9, 0x05, 0xAA, 0x06, 0xAB, 0x07, 0x90, 0x05, 0x60, 0x31, 0xC5, 0x12, 0x87,
+0x4B, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x31, 0xC5, 0x78, 0x10,
+0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x87, 0x4B, 0xC0, 0x04,
+0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0xA3, 0x31, 0xC5, 0x78, 0x18, 0x12, 0x04, 0xD8, 0xD0, 0x03,
+0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x87, 0x4B, 0x90, 0x85, 0xFC, 0xEE, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0x92, 0xC0, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x12, 0xCA,
+0x1D, 0xFB, 0x12, 0x51, 0x7D, 0x90, 0x92, 0xC0, 0xE0, 0x54, 0xFD, 0xF0, 0x51, 0xF0, 0x13, 0x54,
+0x1F, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x03, 0x12, 0xA3, 0x04, 0x90, 0x94,
+0x13, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE,
+0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x5D, 0x1F, 0x12, 0x6E, 0x1D, 0xE4, 0x90, 0x88, 0xE0, 0xF0,
+0x7F, 0x01, 0x12, 0xC1, 0xA2, 0x12, 0xD6, 0x72, 0xF1, 0x1C, 0x30, 0xE0, 0x52, 0x90, 0x88, 0x76,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x7D, 0x64, 0x12, 0x03, 0x82, 0x90, 0x88, 0xCA, 0xE0,
+0x6E, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x60, 0x0A, 0x90, 0x88, 0xCA, 0xE4, 0x75, 0xF0, 0x01, 0x02,
+0x07, 0x0A, 0x90, 0x88, 0x7A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x88, 0x88, 0xE0, 0xB5, 0x06,
+0x14, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0xEF, 0x4E, 0x60, 0x0B, 0x90, 0x01, 0xC7, 0x74, 0x31, 0xF0,
+0x7F, 0x01, 0x02, 0x5F, 0xE9, 0x12, 0xAD, 0x8E, 0xE4, 0x90, 0x88, 0xCA, 0xF0, 0xA3, 0xF0, 0x22,
+0x90, 0x85, 0xC2, 0xE0, 0xFF, 0x13, 0x13, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x16, 0xED, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0xFE, 0xC4, 0x13, 0x13,
+0x54, 0x03, 0x30, 0xE0, 0x02, 0x81, 0x56, 0xEE, 0x12, 0x8F, 0x66, 0x30, 0xE0, 0x02, 0x81, 0x56,
+0x90, 0x85, 0xC8, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0x81, 0x56, 0xEF, 0x70, 0x02, 0x61, 0xC2, 0x24,
+0xFE, 0x70, 0x02, 0x61, 0xFF, 0x24, 0xFE, 0x60, 0x4D, 0x24, 0xFC, 0x70, 0x02, 0x81, 0x3E, 0x24,
+0xFC, 0x60, 0x02, 0x81, 0x4F, 0xEE, 0xB4, 0x0E, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0,
+0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73,
+0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x94, 0x16, 0xE0, 0xFF, 0x60, 0x05, 0x12,
+0x6D, 0x4C, 0x80, 0x03, 0x12, 0x79, 0x61, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x81,
+0x4F, 0x12, 0x7A, 0xB9, 0x81, 0x4F, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79,
+0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4,
+0x0E, 0x08, 0x91, 0x5B, 0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x0C,
+0x60, 0x02, 0x81, 0x4F, 0x91, 0x5B, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x81, 0x4F, 0x12, 0x70, 0x9E,
+0x81, 0x4F, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0x91, 0x5B, 0xBF, 0x01, 0x03, 0x12, 0x74,
+0x93, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4,
+0x0C, 0x08, 0x91, 0x5B, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x04,
+0x70, 0x5D, 0x12, 0xD4, 0xE0, 0xEF, 0x64, 0x01, 0x70, 0x55, 0x12, 0x77, 0xFE, 0x80, 0x50, 0x90,
+0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0x91, 0x5B, 0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85,
+0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x08, 0x91,
+0x5B, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12,
+0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x16, 0x12, 0x79, 0xF3, 0x80, 0x11, 0x90, 0x85,
+0xC8, 0xE0, 0xB4, 0x0C, 0x0A, 0x51, 0xF0, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x7A, 0x8A, 0x90,
+0x85, 0xC8, 0x12, 0xD9, 0xD8, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
+0xC0, 0xD0, 0x12, 0x7A, 0x29, 0xEF, 0x64, 0x01, 0x60, 0x05, 0x75, 0x0F, 0x01, 0x80, 0x24, 0x90,
+0x85, 0xC1, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x0F, 0x02, 0x80, 0x13,
+0x90, 0x85, 0xC7, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x05, 0x75, 0x0F, 0x08, 0x80, 0x05, 0x12, 0xD5,
+0x58, 0x80, 0x0E, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x0F, 0xF0, 0x7F,
+0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x5B, 0x8A,
+0x5C, 0x89, 0x5D, 0x90, 0x05, 0x27, 0xE0, 0xF5, 0x5E, 0x8B, 0x1B, 0x8A, 0x1C, 0x89, 0x1D, 0x75,
+0x1E, 0x01, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xBC, 0x12, 0x6A, 0x21, 0x12, 0x8F, 0x5B, 0x12, 0x02,
+0xF6, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0xA1, 0x6A, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x78,
+0xD1, 0x1B, 0x75, 0x5E, 0x21, 0x90, 0x85, 0xBC, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x04,
+0xD1, 0xF1, 0x80, 0x0D, 0xE4, 0x90, 0x85, 0xBD, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x7C,
+0x41, 0xD1, 0x2A, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x12, 0xEF, 0xC4, 0x54, 0x0F,
+0x30, 0xE0, 0x03, 0x43, 0x5E, 0x14, 0x90, 0x85, 0xBC, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0,
+0x03, 0x43, 0x5E, 0x80, 0x90, 0x85, 0xBC, 0xF1, 0x1F, 0x20, 0xE0, 0x03, 0x43, 0x5E, 0x40, 0xD1,
+0x14, 0x90, 0x85, 0xBF, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0xA3, 0x81, 0x90, 0x85, 0xBC, 0xD1,
+0x22, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x0B, 0xD1, 0x32, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80,
+0x02, 0x7F, 0x02, 0x12, 0xA3, 0x81, 0xA1, 0xDE, 0xD1, 0x11, 0x90, 0x85, 0xBF, 0xE0, 0x64, 0x04,
+0x60, 0x02, 0xC1, 0x0C, 0xFF, 0x12, 0xA3, 0x81, 0xC1, 0x0C, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0,
+0x75, 0xD1, 0x1B, 0x43, 0x5E, 0x31, 0x90, 0x85, 0xBC, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0,
+0x04, 0xD1, 0xF1, 0x80, 0x07, 0x7D, 0x40, 0xE4, 0xFF, 0x12, 0x7C, 0x41, 0xD1, 0x2A, 0x13, 0x54,
+0x1F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x5E,
+0x04, 0xD1, 0x14, 0x90, 0x85, 0xBC, 0xD1, 0x22, 0x30, 0xE0, 0x0A, 0xF1, 0x3F, 0x60, 0x2F, 0xE4,
+0xFD, 0x7F, 0x02, 0x80, 0x1D, 0xF1, 0xDF, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x18, 0x12, 0x7A,
+0xA2, 0xD1, 0x32, 0xBF, 0x01, 0x09, 0x90, 0x85, 0xC7, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4,
+0xFD, 0xFF, 0x51, 0xFC, 0x80, 0x08, 0x90, 0x85, 0xC8, 0xE0, 0x90, 0x85, 0xC0, 0xF0, 0x90, 0x05,
+0x40, 0x74, 0x22, 0xF0, 0x80, 0x26, 0xD1, 0x11, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x06, 0x7D,
+0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x08, 0x06, 0x7D, 0x01, 0x7F, 0x0C,
+0x51, 0xFC, 0xF1, 0xA3, 0x90, 0x85, 0xC7, 0xF1, 0x9D, 0x12, 0xAB, 0x17, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0x75, 0x5E, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x5E, 0xF0, 0x22, 0x7D, 0x03, 0x7F, 0x02, 0x02,
+0x7B, 0xFD, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x13,
+0x13, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0xF5,
+0x78, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0xC1, 0xDD, 0xF1, 0xD8, 0x64, 0x01, 0x60, 0x02, 0xC1,
+0xDD, 0x12, 0xD9, 0x0B, 0x12, 0xA2, 0xB5, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E,
+0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x85, 0xCE, 0xE0, 0x60, 0x0E,
+0xEF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x78, 0x01, 0x90, 0x85,
+0xBC, 0xE0, 0x30, 0xE0, 0x11, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x78, 0xD1,
+0x32, 0xEF, 0x70, 0x02, 0xF5, 0x78, 0xE5, 0x78, 0x60, 0x43, 0x90, 0x85, 0xC8, 0xE0, 0x20, 0xE2,
+0x02, 0x51, 0xF8, 0x12, 0xC4, 0xB9, 0x90, 0x85, 0xCE, 0xE0, 0x60, 0x04, 0x64, 0x01, 0x70, 0x17,
+0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCE, 0xE0, 0xD1, 0xDE, 0x90, 0x91, 0x6F, 0x12, 0xC3,
+0xFE, 0x90, 0x85, 0xCE, 0xE0, 0x80, 0x10, 0xE4, 0x90, 0x91, 0x6E, 0xD1, 0xE5, 0xD1, 0xDE, 0x90,
+0x91, 0x6F, 0x12, 0xC3, 0xFE, 0xD1, 0xE6, 0xD1, 0xDE, 0x90, 0x85, 0xDE, 0xF0, 0x22, 0xFF, 0x90,
+0x85, 0xCD, 0xE0, 0x2F, 0x22, 0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE,
+0x22, 0x90, 0x01, 0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x7C, 0xA9, 0x43, 0x5E, 0x08,
+0x22, 0xAE, 0x07, 0xD1, 0x32, 0xBF, 0x01, 0x11, 0x90, 0x85, 0xBC, 0xF1, 0x1F, 0x20, 0xE0, 0x09,
+0xAF, 0x06, 0x7D, 0x01, 0x51, 0xFC, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x86, 0x72, 0xE0,
+0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x85, 0xBC, 0xD1, 0x22, 0x30, 0xE0, 0x0A, 0xF1, 0x3F,
+0x60, 0x06, 0x7D, 0x01, 0x7F, 0x02, 0x51, 0xFC, 0xF1, 0x3F, 0x60, 0x02, 0xF1, 0x46, 0x22, 0x90,
+0x85, 0xC0, 0xE0, 0x64, 0x02, 0x22, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x02, 0x60, 0x0F, 0xF1, 0xBF,
+0x60, 0x0B, 0x12, 0x7A, 0x29, 0xEF, 0x70, 0x05, 0xFD, 0x7F, 0x0C, 0x51, 0xFC, 0x22, 0x90, 0x85,
+0xC5, 0xE0, 0x70, 0x07, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x10, 0x90, 0x85, 0xBC, 0xE0, 0x30,
+0xE0, 0x07, 0xD1, 0x32, 0xBF, 0x01, 0x04, 0x80, 0xCD, 0xF1, 0x7C, 0x22, 0x90, 0x85, 0xC5, 0xE0,
+0x64, 0x01, 0x70, 0x18, 0xF1, 0xBF, 0x60, 0x0C, 0xE4, 0xFD, 0x7F, 0x0C, 0x51, 0xFC, 0x12, 0x97,
+0xD7, 0x02, 0x6B, 0x98, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x02, 0x51, 0xF8, 0x22, 0xE0, 0xFF, 0x7D,
+0x01, 0x41, 0xFC, 0x12, 0x7A, 0x29, 0xEF, 0x70, 0x02, 0xF1, 0x7C, 0x22, 0x90, 0x86, 0x72, 0xD1,
+0x22, 0x30, 0xE0, 0x03, 0x12, 0xA6, 0x65, 0x22, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x01, 0xF0, 0x90,
+0x85, 0xC3, 0xE0, 0x54, 0x0F, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x90, 0x85, 0xC7, 0x30, 0xE0, 0x04,
+0xE0, 0xFF, 0xE1, 0x01, 0x80, 0xC7, 0x80, 0xD4, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xEF, 0x22, 0x90,
+0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x12, 0x97, 0xD7, 0xF1, 0xDF, 0x90, 0x85, 0xBF, 0x74,
+0x01, 0xF0, 0x22, 0x80, 0xF7, 0x12, 0xA0, 0x4F, 0x90, 0x92, 0x3C, 0x12, 0x8F, 0xB9, 0x90, 0x92,
+0x3D, 0x12, 0x8E, 0x8F, 0x90, 0x92, 0x4F, 0xF0, 0x12, 0x8F, 0xCD, 0x90, 0x92, 0x50, 0x12, 0x8F,
+0xEB, 0x90, 0x92, 0x62, 0x12, 0x8F, 0xF2, 0x90, 0x92, 0x63, 0xF0, 0x22, 0x11, 0x4F, 0xFF, 0x54,
+0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFE, 0x90, 0x92, 0xA9, 0xE0, 0x54, 0xDF, 0x4E, 0xF0, 0xEF, 0x54,
+0xFE, 0xC3, 0x13, 0xFF, 0x90, 0x92, 0xA8, 0xE0, 0x54, 0x80, 0x12, 0x8F, 0xB8, 0x90, 0x92, 0xAA,
+0x12, 0x8E, 0x8F, 0x90, 0x92, 0xAB, 0xF0, 0x12, 0x8F, 0xCD, 0x90, 0x92, 0xAC, 0xF0, 0x22, 0x8B,
+0x5B, 0x8A, 0x5C, 0x89, 0x5D, 0x02, 0x02, 0xF6, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x92, 0x03, 0xF0,
+0xBF, 0x01, 0x07, 0x11, 0x6B, 0xE4, 0x90, 0x92, 0x03, 0xF0, 0x22, 0x31, 0x1B, 0x7F, 0xF5, 0x7E,
+0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x06, 0x90, 0x93, 0x06, 0xE0, 0xA3, 0xF0, 0x31, 0x1B, 0x7F,
+0xF6, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x06, 0xE0, 0x90, 0x93, 0x08,
+0xF0, 0x31, 0x1B, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x06,
+0xE0, 0x90, 0x93, 0x09, 0xF0, 0x31, 0x1B, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01,
+0x08, 0x90, 0x93, 0x06, 0xE0, 0x90, 0x93, 0x0A, 0xF0, 0x31, 0x1B, 0x7F, 0xF2, 0x7E, 0x01, 0x12,
+0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x06, 0xE0, 0x90, 0x93, 0x0B, 0xF0, 0x90, 0x93, 0x07,
+0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x93, 0x0F, 0xF0, 0x90, 0x93,
+0x0B, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x11, 0x74, 0x12, 0xF0, 0x90, 0x93, 0x1F, 0x74,
+0x05, 0xF0, 0x90, 0x93, 0x13, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x0F,
+0xE0, 0x90, 0x93, 0x16, 0xF0, 0x90, 0x93, 0x10, 0xE0, 0x90, 0x93, 0x17, 0xF0, 0x7B, 0x01, 0x7A,
+0x93, 0x79, 0x11, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB, 0x7B, 0x01, 0x7A, 0x93, 0x79,
+0x06, 0x22, 0x12, 0x02, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x92, 0xBF, 0xE0, 0x54, 0xFE, 0x4F, 0xF0,
+0x22, 0x12, 0x02, 0xF6, 0x90, 0x86, 0x71, 0xF0, 0x22, 0xF1, 0x57, 0x90, 0x92, 0x04, 0xF1, 0x4F,
+0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x12, 0x8F, 0xB8, 0x90, 0x92, 0x05, 0x12, 0x8E, 0x8F, 0x90,
+0x92, 0x06, 0xF0, 0x51, 0xFA, 0x90, 0x92, 0x04, 0xE0, 0x54, 0x01, 0xFF, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0xEF, 0x64, 0x01, 0x70, 0x1A, 0x31, 0xA5, 0x60, 0x0A, 0x31, 0x9E, 0x12, 0x7B,
+0xFD, 0x51, 0xF2, 0xF0, 0x80, 0x07, 0x31, 0x9E, 0x12, 0x7B, 0xBF, 0x71, 0x04, 0x12, 0x7A, 0x8A,
+0x80, 0x17, 0x31, 0xA5, 0x60, 0x07, 0x31, 0x9E, 0x12, 0x7B, 0xFD, 0x80, 0x05, 0x31, 0x9E, 0x12,
+0x7B, 0xBF, 0x51, 0xBF, 0x51, 0xC6, 0x12, 0x7A, 0xB9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x10,
+0xF0, 0xFD, 0x7F, 0x03, 0x22, 0x90, 0x92, 0x06, 0xE0, 0x90, 0x01, 0x3F, 0x22, 0x12, 0x9F, 0xD8,
+0x64, 0x01, 0x60, 0x02, 0x41, 0x99, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x41, 0x99, 0x90, 0x05,
+0x63, 0xE0, 0x90, 0x92, 0xC5, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x92, 0xC6, 0xF0, 0x90, 0x05,
+0x61, 0xE0, 0x90, 0x92, 0xC7, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x92, 0xC8, 0xF0, 0xF1, 0xD6,
+0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEC, 0x51, 0xB5, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0F, 0x90,
+0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0xC3, 0x5E, 0x80, 0x03, 0x12, 0xC3, 0x13, 0x51, 0xB6,
+0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x85, 0xCC, 0xF0, 0x90, 0x06, 0xAA, 0xE0,
+0x90, 0x85, 0xCB, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xFE, 0xFF, 0x80,
+0x00, 0x90, 0x85, 0xCC, 0xEF, 0xF0, 0x12, 0xCA, 0x2A, 0xE4, 0x90, 0x85, 0xCE, 0xF0, 0xF1, 0xCC,
+0x12, 0x9A, 0xF0, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x5E, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20,
+0xE0, 0x23, 0x51, 0xAD, 0x6F, 0x70, 0x50, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x40, 0xF0, 0xF1, 0xB4,
+0xF0, 0x90, 0x01, 0x3F, 0x31, 0x9E, 0x12, 0x7B, 0xFD, 0x71, 0x0B, 0xF1, 0x8D, 0x90, 0x85, 0xCC,
+0xE0, 0x14, 0xF0, 0x80, 0x32, 0x90, 0x85, 0xC3, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x27,
+0x51, 0xAD, 0xFE, 0x6F, 0x60, 0x21, 0x90, 0x05, 0x73, 0xE0, 0xFF, 0xEE, 0x6F, 0x60, 0x18, 0x12,
+0x9A, 0xF0, 0x54, 0x3F, 0x30, 0xE0, 0x10, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x01, 0x3F, 0x31, 0x9E,
+0x12, 0x7B, 0xBF, 0x51, 0xC6, 0x51, 0xBF, 0x51, 0xA5, 0x90, 0x85, 0xBC, 0xE0, 0xC3, 0x13, 0x20,
+0xE0, 0x02, 0x51, 0xA5, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x85, 0xCB,
+0xE0, 0xFF, 0xA3, 0xE0, 0x22, 0xF0, 0x90, 0x85, 0xC3, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0x7D,
+0x02, 0x7F, 0x02, 0x02, 0x7C, 0xA9, 0x7D, 0x01, 0x7F, 0x02, 0x02, 0x7C, 0xA9, 0x12, 0xC4, 0x56,
+0x51, 0xBF, 0x7F, 0x01, 0x71, 0x12, 0x90, 0x92, 0x04, 0xE0, 0x30, 0xE0, 0x14, 0x51, 0xF2, 0xF0,
+0x90, 0x92, 0x07, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x7A, 0x8A, 0x51, 0xFA, 0xE4, 0xFF, 0x31,
+0x5C, 0x22, 0x90, 0x92, 0x06, 0xE0, 0x90, 0x05, 0x73, 0x22, 0x90, 0x92, 0x05, 0xE0, 0x14, 0x90,
+0x92, 0x07, 0xF0, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x12, 0x7C, 0x41, 0x7D, 0x01, 0x7F, 0x02, 0x02,
+0x7C, 0x41, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0xC0, 0xE0, 0xFE, 0x13, 0x13,
+0x54, 0x3F, 0x30, 0xE0, 0x1F, 0x90, 0x93, 0x7E, 0x74, 0x1E, 0xF0, 0x90, 0x93, 0x8C, 0x74, 0x01,
+0xF0, 0x90, 0x93, 0x80, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x7E, 0x12, 0x5E, 0x10, 0x7F,
+0x04, 0x12, 0xC1, 0xA2, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x10,
+0xA3, 0x74, 0x01, 0xF0, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0x71, 0x67,
+0x12, 0x9E, 0x3E, 0xE4, 0xFF, 0x80, 0xAB, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x9E,
+0x32, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x71, 0x81, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0xBF, 0xE0, 0x90, 0x94, 0x15, 0xF0,
+0x6F, 0x70, 0x02, 0x81, 0x89, 0xEF, 0x14, 0x60, 0x42, 0x14, 0x60, 0x6E, 0x14, 0x70, 0x02, 0x81,
+0x35, 0x14, 0x70, 0x02, 0x81, 0x60, 0x24, 0x04, 0x60, 0x02, 0x81, 0x89, 0x90, 0x94, 0x15, 0xE0,
+0xB4, 0x04, 0x04, 0x91, 0xFE, 0x81, 0x89, 0x90, 0x94, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0xB1, 0x0E,
+0x81, 0x89, 0x90, 0x94, 0x15, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0x18, 0x81, 0x89, 0x90, 0x94, 0x15,
+0xE0, 0x64, 0x01, 0x60, 0x02, 0x81, 0x89, 0xB1, 0x01, 0x81, 0x89, 0x90, 0x94, 0x15, 0xE0, 0xB4,
+0x04, 0x05, 0x12, 0x9F, 0xE7, 0x81, 0x89, 0x90, 0x94, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0xB1, 0x12,
+0x81, 0x89, 0x90, 0x94, 0x15, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0x49, 0x81, 0x89, 0x90, 0x94, 0x15,
+0xE0, 0x60, 0x02, 0x81, 0x89, 0x12, 0x9F, 0xF3, 0x80, 0x7F, 0x90, 0x94, 0x15, 0xE0, 0xB4, 0x04,
+0x04, 0x91, 0xA0, 0x80, 0x74, 0x90, 0x94, 0x15, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0x90, 0x80, 0x69,
+0x90, 0x94, 0x15, 0xE0, 0xB4, 0x03, 0x04, 0x91, 0x8E, 0x80, 0x5E, 0x90, 0x94, 0x15, 0xE0, 0x70,
+0x58, 0x91, 0xE4, 0x80, 0x54, 0x90, 0x94, 0x15, 0xE0, 0xB4, 0x04, 0x04, 0xF1, 0x69, 0x80, 0x49,
+0x90, 0x94, 0x15, 0xE0, 0xB4, 0x01, 0x04, 0x91, 0xEC, 0x80, 0x3E, 0x90, 0x94, 0x15, 0xE0, 0xB4,
+0x02, 0x04, 0x91, 0xFA, 0x80, 0x33, 0x90, 0x94, 0x15, 0xE0, 0x70, 0x2D, 0x91, 0xE9, 0x80, 0x29,
+0x90, 0x94, 0x15, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0x87, 0x80, 0x1E, 0x90, 0x94, 0x15, 0xE0, 0xB4,
+0x01, 0x04, 0x91, 0xDE, 0x80, 0x13, 0x90, 0x94, 0x15, 0xE0, 0xB4, 0x02, 0x04, 0xB1, 0x45, 0x80,
+0x08, 0x90, 0x94, 0x15, 0xE0, 0x70, 0x02, 0x91, 0xDB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x80, 0x07,
+0x7D, 0x20, 0x7F, 0xFF, 0x12, 0x90, 0xDE, 0x91, 0xA7, 0x90, 0x85, 0xBF, 0x74, 0x02, 0xF0, 0x22,
+0x12, 0x9F, 0xDF, 0x7D, 0x23, 0x80, 0xEB, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x02,
+0x12, 0x7B, 0x51, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x00, 0x74,
+0x3F, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0x90, 0x01, 0x01, 0xE0, 0x54, 0xFD, 0xF0, 0x90,
+0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x9F, 0xF3, 0x7D, 0x1F,
+0xF1, 0x75, 0xF0, 0x22, 0x12, 0x9F, 0xF3, 0x80, 0xA7, 0x12, 0x9F, 0xF3, 0x7D, 0x21, 0x7F, 0xFF,
+0x12, 0x90, 0xDE, 0x90, 0x85, 0xBF, 0x74, 0x03, 0xF0, 0x22, 0xB1, 0x1C, 0x80, 0xF5, 0x12, 0x9F,
+0xE7, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x85, 0xBF, 0xF0, 0x22, 0xB1, 0x12,
+0x80, 0xEF, 0x12, 0x90, 0xD8, 0x02, 0x9F, 0xEC, 0xF1, 0x49, 0x80, 0xE5, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x7F, 0x02, 0xF1, 0xBC, 0x7F, 0x02, 0xF1, 0xC4, 0x44, 0x02, 0xF0, 0x90, 0x01,
+0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xB1, 0x1C, 0x7D, 0x24, 0xF1, 0x75, 0xF0, 0x22, 0xEF, 0x60, 0x47,
+0x90, 0x88, 0xCE, 0xE0, 0xFF, 0x60, 0x03, 0x12, 0x7B, 0x8A, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x12,
+0xBC, 0x43, 0x90, 0x85, 0xB7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0,
+0x7D, 0x35, 0x7F, 0xFF, 0x12, 0x90, 0xDE, 0x91, 0xA7, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0,
+0x12, 0x72, 0x79, 0xF1, 0x48, 0x12, 0x90, 0xD8, 0x12, 0x76, 0xE6, 0x90, 0x01, 0x34, 0x74, 0x08,
+0xF0, 0xFD, 0xE4, 0xFF, 0x02, 0x7C, 0xA9, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x7C, 0x41, 0x90, 0x06,
+0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0xD6, 0xED, 0x12,
+0x9F, 0xD6, 0x7E, 0x00, 0x7F, 0x24, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x86, 0x79, 0x72, 0x12, 0x06,
+0xDE, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0x12, 0xD6, 0xDA, 0xD1, 0x65, 0x90, 0x84, 0xC5,
+0xE0, 0xFF, 0x64, 0x02, 0x70, 0x29, 0xD1, 0x5E, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x86, 0x90,
+0xD1, 0x5C, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0x86, 0x8E, 0xD1, 0x5C, 0x30, 0xE2, 0x02, 0x7E,
+0x01, 0x90, 0x86, 0x8F, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x22, 0xEF,
+0x64, 0x01, 0x70, 0x1D, 0xD1, 0x55, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x90, 0xD1, 0x53,
+0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x8E, 0xD1, 0x53, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80,
+0x23, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x03, 0x70, 0x20, 0xD1, 0x4C, 0x30, 0xE0, 0x02, 0x7F, 0x01,
+0x90, 0x86, 0x90, 0xD1, 0x4A, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x8E, 0xD1, 0x4A, 0x30,
+0xE2, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x8F, 0xEF, 0xF0, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0,
+0x7F, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0xEE, 0xF0, 0x90, 0xFD,
+0x80, 0xE0, 0x7E, 0x00, 0x22, 0xF1, 0xAC, 0xE4, 0x90, 0x88, 0xD8, 0xD1, 0x95, 0x90, 0x88, 0x76,
+0xF0, 0xD1, 0x90, 0xD1, 0x96, 0x90, 0x88, 0x88, 0xF0, 0xA3, 0xF0, 0x90, 0x88, 0xCA, 0xF0, 0xA3,
+0xF0, 0x22, 0x90, 0x93, 0x9E, 0xE0, 0xFF, 0x90, 0x93, 0x56, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4,
+0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF,
+0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x57, 0x90, 0x86, 0x72, 0xF1, 0x2C, 0x54, 0x04, 0xFD, 0xEF, 0x54,
+0xFB, 0xF1, 0x24, 0xF1, 0x94, 0xF1, 0x3A, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0xF1, 0x24, 0xF1,
+0x9C, 0xF1, 0x3A, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0xF1, 0x24, 0xF1, 0xA4, 0x12, 0x8E, 0x8F,
+0x54, 0x01, 0xFF, 0x90, 0x86, 0x74, 0xE0, 0x54, 0xFE, 0x12, 0x8F, 0xB8, 0xFF, 0x54, 0x01, 0xFE,
+0x90, 0x86, 0x73, 0xF1, 0x4F, 0x54, 0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x90, 0x86, 0x72,
+0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x7C, 0x72, 0xF1, 0x41, 0x54, 0x01, 0xFF, 0x12, 0x7C,
+0x7E, 0xF1, 0x41, 0x13, 0x54, 0x01, 0xFF, 0x12, 0x66, 0xDA, 0x90, 0x86, 0x72, 0xE0, 0xC4, 0x13,
+0x13, 0x54, 0x01, 0xFF, 0xF1, 0x5F, 0x90, 0x86, 0x72, 0xE0, 0x54, 0x01, 0xFF, 0xB1, 0x4D, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0x4D, 0xFF, 0x90, 0x86, 0x72, 0xF0, 0xEE, 0x22, 0xE0, 0x54, 0xFE, 0x4E,
+0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x02, 0xF6, 0xFE,
+0x22, 0x90, 0x86, 0x72, 0xE0, 0x13, 0x13, 0x22, 0x22, 0x12, 0x97, 0xD7, 0x02, 0x9F, 0xEC, 0xE0,
+0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x22, 0xEF,
+0x60, 0x06, 0x12, 0xD8, 0x06, 0x12, 0xAF, 0x0D, 0x22, 0x7D, 0x22, 0x7F, 0xFF, 0x12, 0x90, 0xDE,
+0x12, 0x9F, 0xDF, 0x81, 0xF3, 0x7F, 0x6F, 0x12, 0x90, 0xDE, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF,
+0xF0, 0x90, 0x85, 0xBF, 0x74, 0x04, 0x22, 0x7D, 0x25, 0xF1, 0x75, 0xF0, 0x22, 0x7D, 0x02, 0x7F,
+0x02, 0x02, 0x7C, 0x41, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0x22, 0x54, 0x20, 0xFE, 0xEF,
+0x54, 0xDF, 0x4E, 0x22, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x22, 0x90, 0x86, 0x72, 0xE0,
+0x54, 0xBF, 0xF0, 0x22, 0x90, 0x85, 0xCB, 0xE0, 0x90, 0x05, 0x73, 0x22, 0x12, 0x7B, 0x51, 0xEF,
+0x44, 0x01, 0xFD, 0x22, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x01, 0xE0, 0x22, 0x90, 0x85, 0xD1, 0xA3,
+0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02,
+0x22, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x92, 0xB3, 0xF0, 0xBF, 0x01, 0x09, 0x7F, 0x01, 0xF1, 0xF6,
+0xE4, 0x90, 0x92, 0xB3, 0xF0, 0x22, 0x90, 0x93, 0x28, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79,
+0x38, 0x7F, 0xF4, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x38, 0xE0, 0x90,
+0x93, 0x3A, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x38, 0x7F, 0xF5, 0x7E, 0x00, 0x12, 0x64, 0x37,
+0xBF, 0x01, 0x08, 0x90, 0x93, 0x38, 0xE0, 0x90, 0x93, 0x3B, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79,
+0x38, 0x7F, 0xF6, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x38, 0xE0, 0x90,
+0x93, 0x3C, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x38, 0x7F, 0xF7, 0x7E, 0x00, 0x12, 0x64, 0x37,
+0xBF, 0x01, 0x08, 0x90, 0x93, 0x38, 0xE0, 0x90, 0x93, 0x3D, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79,
+0x38, 0x7F, 0xF8, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x93, 0x38, 0xE0, 0x90,
+0x93, 0x3E, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x38, 0x51, 0x44, 0xBF, 0x01, 0x08, 0x90, 0x93,
+0x38, 0xE0, 0x90, 0x93, 0x3F, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x38, 0x31, 0xAB, 0x70, 0x52,
+0x90, 0x93, 0x38, 0xE0, 0x90, 0x93, 0x40, 0xF0, 0x54, 0x07, 0x60, 0x08, 0x90, 0x93, 0x38, 0xE0,
+0x54, 0xE0, 0x70, 0x3E, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x39, 0x7F, 0xFA, 0x31, 0xAD, 0x70, 0x32,
+0x90, 0x93, 0x38, 0xE0, 0xFC, 0x54, 0x07, 0x70, 0x12, 0x90, 0x93, 0x40, 0xE0, 0xFE, 0x90, 0x93,
+0x39, 0xE0, 0x54, 0x07, 0xFD, 0xEE, 0x4D, 0x90, 0x93, 0x40, 0xF0, 0xEC, 0x54, 0xE0, 0x70, 0x12,
+0x90, 0x93, 0x40, 0xE0, 0xFF, 0x90, 0x93, 0x39, 0xE0, 0x54, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x93,
+0x40, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x38, 0x7F, 0xFD, 0x31, 0xAD, 0x70, 0x47, 0x90, 0x93,
+0x38, 0xE0, 0xFE, 0x54, 0xCC, 0x90, 0x93, 0x41, 0xF0, 0xEE, 0x54, 0x0C, 0xFF, 0x60, 0x08, 0x90,
+0x93, 0x38, 0xE0, 0x54, 0xC0, 0x70, 0x2E, 0xEF, 0x70, 0x12, 0x90, 0x93, 0x41, 0xE0, 0xFF, 0x90,
+0x93, 0x38, 0xE0, 0x54, 0x03, 0x12, 0xDA, 0x80, 0x90, 0x93, 0x41, 0xF0, 0x90, 0x93, 0x38, 0xE0,
+0xFF, 0x54, 0xC0, 0x70, 0x10, 0x90, 0x93, 0x41, 0xE0, 0xFE, 0xEF, 0x54, 0x30, 0x25, 0xE0, 0x25,
+0xE0, 0xFF, 0xEE, 0x4F, 0xF0, 0x90, 0x93, 0x29, 0x74, 0x19, 0xF0, 0x90, 0x93, 0x37, 0x74, 0x08,
+0xF0, 0x90, 0x93, 0x3A, 0xE0, 0x90, 0x93, 0x2B, 0xF0, 0x90, 0x93, 0x3B, 0xE0, 0x90, 0x93, 0x2C,
+0xF0, 0x90, 0x93, 0x3C, 0xE0, 0x90, 0x93, 0x2D, 0xF0, 0x90, 0x93, 0x3D, 0xE0, 0x90, 0x93, 0x2E,
+0xF0, 0x90, 0x93, 0x3E, 0xE0, 0x90, 0x93, 0x2F, 0xF0, 0x90, 0x93, 0x3F, 0xE0, 0x90, 0x93, 0x30,
+0xF0, 0x90, 0x93, 0x40, 0xE0, 0x90, 0x93, 0x31, 0xF0, 0x90, 0x93, 0x41, 0xE0, 0x90, 0x93, 0x32,
+0xF0, 0x90, 0x93, 0x28, 0xE0, 0xB4, 0x01, 0x0E, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x29, 0x12, 0x5E,
+0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB, 0x75, 0x1B, 0x01, 0x75, 0x1C, 0x93, 0x75, 0x1D, 0x29, 0x75,
+0x1E, 0x0A, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0, 0x02, 0x6A, 0x21, 0x7F, 0xFB, 0x7E, 0x00, 0x12,
+0x64, 0x37, 0xEF, 0x64, 0x01, 0x22, 0x7E, 0x00, 0x7F, 0x0B, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x92,
+0x79, 0xB4, 0x12, 0x06, 0xDE, 0x51, 0x3D, 0x51, 0x44, 0xBF, 0x01, 0x1C, 0x90, 0x93, 0x28, 0xE0,
+0xFE, 0x54, 0x01, 0x90, 0x92, 0xB4, 0xF0, 0xEE, 0x54, 0x04, 0x90, 0x92, 0xB6, 0xF0, 0x90, 0x93,
+0x28, 0xE0, 0x54, 0x08, 0x90, 0x92, 0xB5, 0xF0, 0x51, 0x3D, 0x31, 0xAB, 0x70, 0x34, 0x90, 0x93,
+0x28, 0xE0, 0x54, 0x07, 0x70, 0x14, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x29, 0x7F, 0xFA, 0xFE, 0x12,
+0x64, 0x37, 0xBF, 0x01, 0x0F, 0x90, 0x93, 0x29, 0x80, 0x03, 0x90, 0x93, 0x28, 0xE0, 0x54, 0x07,
+0x90, 0x92, 0xB8, 0xF0, 0x90, 0x93, 0x28, 0xE0, 0x54, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0x92,
+0xB7, 0xF0, 0x51, 0x3D, 0x7F, 0xFD, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x0E, 0x90, 0x93,
+0x28, 0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x92, 0xB9, 0xF0, 0x22, 0x7B, 0x01, 0x7A,
+0x93, 0x79, 0x28, 0x22, 0x7F, 0xF9, 0x7E, 0x00, 0x02, 0x64, 0x37, 0x90, 0x00, 0x80, 0xE0, 0x44,
+0x80, 0xFD, 0x7F, 0x80, 0x12, 0x7B, 0x3E, 0x12, 0xC9, 0x23, 0x12, 0xD2, 0xFF, 0x12, 0x7B, 0x9C,
+0x12, 0xD3, 0x0C, 0x12, 0xC7, 0xCA, 0x7F, 0x01, 0x12, 0x85, 0x15, 0x90, 0x92, 0x08, 0x74, 0x02,
+0xF0, 0xFF, 0x12, 0x85, 0x15, 0x90, 0x92, 0x08, 0xE0, 0x04, 0xF0, 0x71, 0x42, 0x51, 0xD9, 0x90,
+0x01, 0xCC, 0x74, 0x0F, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x7B,
+0x3E, 0x75, 0x20, 0xFF, 0x12, 0x7C, 0xCD, 0xE4, 0xFF, 0x12, 0xA7, 0xF6, 0x71, 0xA8, 0x90, 0x00,
+0x81, 0xE0, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12, 0x7B, 0x3E, 0x12, 0xC8, 0x1C, 0x31, 0xB6, 0x90,
+0x00, 0x00, 0xE0, 0x54, 0xFB, 0xFD, 0xE4, 0xFF, 0x12, 0xA7, 0xC4, 0x44, 0x04, 0xFD, 0x7F, 0x01,
+0x12, 0x7B, 0x3E, 0x90, 0x01, 0x98, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x88, 0xF0, 0xA3, 0xE4, 0xF0,
+0xA3, 0x74, 0x80, 0xF0, 0xE4, 0xFF, 0x02, 0x85, 0x9E, 0xB1, 0x5E, 0x12, 0x7B, 0xEF, 0x12, 0x3C,
+0x03, 0x71, 0xFA, 0x71, 0x17, 0x91, 0x83, 0x71, 0x12, 0x12, 0xA5, 0xB2, 0x12, 0x7B, 0x64, 0x12,
+0x78, 0xB9, 0x12, 0xD1, 0x6E, 0x90, 0x89, 0x16, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54,
+0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x89, 0x18, 0xF0, 0x90, 0x89, 0x16, 0xE0, 0x54, 0xEF,
+0xF0, 0x22, 0xB1, 0x51, 0x02, 0x06, 0xDE, 0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A,
+0x85, 0x79, 0xBC, 0x12, 0x06, 0xDE, 0x90, 0x85, 0xBC, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0x12, 0xA6,
+0x96, 0xA3, 0x74, 0x0C, 0xF0, 0x90, 0x92, 0xA9, 0xE0, 0x54, 0xDF, 0x12, 0xDA, 0x1E, 0x54, 0xE0,
+0xF0, 0x22, 0x12, 0x7C, 0x4E, 0x90, 0x84, 0xC5, 0xEF, 0xF0, 0x71, 0x76, 0x90, 0x01, 0x64, 0x74,
+0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x00, 0x17, 0xE0, 0x54, 0xFC, 0x44,
+0x04, 0xFD, 0x7F, 0x17, 0x12, 0x7B, 0x3E, 0x90, 0x00, 0x38, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x38,
+0x12, 0x7B, 0x3E, 0x02, 0x68, 0xE2, 0x12, 0x75, 0xB6, 0x12, 0x75, 0x58, 0x12, 0xC7, 0xD6, 0x12,
+0xC7, 0xFD, 0xE4, 0xF5, 0x40, 0xF5, 0x41, 0xF5, 0x42, 0x75, 0x43, 0x80, 0xAD, 0x40, 0x7F, 0x50,
+0x12, 0x7B, 0x3E, 0xAD, 0x41, 0x7F, 0x51, 0x12, 0x7B, 0x3E, 0xAD, 0x42, 0x7F, 0x52, 0x12, 0x7B,
+0x3E, 0xAD, 0x43, 0x7F, 0x53, 0x02, 0x7B, 0x3E, 0xE4, 0x90, 0x93, 0x28, 0xF0, 0xA3, 0xF0, 0x12,
+0xD3, 0x2F, 0xEF, 0x64, 0x01, 0x60, 0x3C, 0xC3, 0x90, 0x93, 0x29, 0xE0, 0x94, 0x88, 0x90, 0x93,
+0x28, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7,
+0x74, 0xFD, 0xF0, 0x80, 0x1E, 0x90, 0x93, 0x28, 0xB1, 0x64, 0x12, 0xDA, 0x62, 0xD3, 0x90, 0x93,
+0x29, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x28, 0xE0, 0x94, 0x00, 0x40, 0xC3, 0x90, 0x01, 0xC6, 0xE0,
+0x30, 0xE3, 0xBC, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00,
+0x90, 0x89, 0x1B, 0x12, 0x87, 0x79, 0x7B, 0xFF, 0x7A, 0x82, 0x79, 0x00, 0x90, 0x89, 0x1E, 0x12,
+0x87, 0x79, 0x7A, 0x82, 0x79, 0x3F, 0x90, 0x89, 0x21, 0x12, 0x87, 0x79, 0x7A, 0x82, 0x79, 0xE1,
+0x90, 0x89, 0x27, 0x12, 0x87, 0x79, 0x7A, 0x82, 0x79, 0xF5, 0x90, 0x89, 0x2A, 0x12, 0x87, 0x79,
+0x7A, 0x83, 0x79, 0x1D, 0x90, 0x89, 0x2D, 0x12, 0x87, 0x79, 0x7A, 0x83, 0x79, 0x31, 0x90, 0x89,
+0x33, 0x12, 0x87, 0x79, 0x7A, 0x83, 0x79, 0x59, 0x90, 0x89, 0x36, 0x12, 0x87, 0x79, 0x7A, 0x83,
+0x79, 0x81, 0x90, 0x89, 0x39, 0x12, 0x87, 0x79, 0xE4, 0x90, 0x93, 0x9E, 0xF0, 0x90, 0x93, 0x28,
+0xF0, 0x90, 0x93, 0x28, 0xE0, 0xFF, 0xC3, 0x94, 0x05, 0x50, 0x0F, 0x74, 0xAF, 0x2F, 0x91, 0x7B,
+0xE4, 0xF0, 0x90, 0x93, 0x28, 0xE0, 0x04, 0xF0, 0x80, 0xE7, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x93,
+0xF5, 0x83, 0x22, 0x7E, 0x00, 0x7F, 0xAC, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xC1, 0x12,
+0x06, 0xDE, 0xB1, 0x51, 0x12, 0x06, 0xDE, 0x90, 0x85, 0xC4, 0x74, 0x02, 0xF0, 0x90, 0x85, 0xCB,
+0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x90, 0x85, 0xD1, 0xE4, 0xF0, 0xA3, 0x74, 0x02,
+0xB1, 0x41, 0x12, 0xD6, 0x26, 0xE4, 0xFD, 0xFF, 0x12, 0x57, 0x82, 0x7D, 0x0C, 0x7F, 0x02, 0x12,
+0x57, 0x82, 0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x57, 0x82, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0xB4, 0x01,
+0x08, 0x90, 0x85, 0xD0, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x85, 0xD0, 0xB4, 0x03, 0x05,
+0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x2C, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0x0F,
+0xFF, 0xBF, 0x05, 0x08, 0x90, 0x85, 0xFB, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x85, 0xFB,
+0xF0, 0x90, 0x86, 0x6D, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44,
+0x28, 0xF0, 0xA3, 0x74, 0x07, 0xB1, 0x41, 0xE4, 0x90, 0x85, 0xD7, 0xF0, 0xA3, 0xF0, 0x7F, 0x01,
+0x12, 0x69, 0x33, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0,
+0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x86, 0x71, 0xF0,
+0x22, 0xF0, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90, 0x85, 0xDD, 0xF0, 0xA3, 0x74, 0x0A, 0xF0,
+0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x04, 0x22, 0xE4, 0xFD,
+0xFF, 0x02, 0x6E, 0x5F, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x07, 0x0A, 0xAD, 0x07, 0x90, 0x88, 0x80,
+0xB1, 0x64, 0x90, 0x88, 0x80, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x04, 0x2E, 0xF1, 0xCE, 0xEF, 0xF0,
+0x90, 0x88, 0x80, 0xA3, 0xE0, 0xFF, 0x74, 0x05, 0x2E, 0xF1, 0xC6, 0xEF, 0xF0, 0x22, 0xE4, 0x90,
+0x93, 0x70, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x20, 0xF0, 0x12, 0x75, 0xE4, 0xEF,
+0x64, 0x01, 0x60, 0x02, 0xC1, 0x25, 0x90, 0x88, 0xD9, 0xE0, 0xFF, 0x90, 0x93, 0xFB, 0x74, 0x0A,
+0xF0, 0x7B, 0x08, 0x7D, 0x01, 0xD1, 0x2E, 0x90, 0x93, 0x6D, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
+0x93, 0x6D, 0xA3, 0xD1, 0xF4, 0xFD, 0x74, 0x2C, 0x2E, 0xF1, 0xDD, 0x90, 0x93, 0x6F, 0xEF, 0xF0,
+0x90, 0x93, 0x6D, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xE4, 0xFD,
+0x12, 0x52, 0x21, 0x90, 0x93, 0x6F, 0xE0, 0xFF, 0x90, 0x93, 0x6E, 0xE0, 0x2F, 0xFF, 0x90, 0x93,
+0x6D, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x93, 0x70, 0xF0, 0xA3,
+0xEF, 0xF0, 0xB1, 0x6B, 0xD1, 0x26, 0xFD, 0x90, 0x88, 0xD9, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x15,
+0x44, 0xD1, 0x26, 0xFD, 0x90, 0x88, 0xD5, 0xE0, 0xFB, 0x7F, 0x11, 0x12, 0x15, 0x44, 0xF1, 0xD6,
+0x90, 0x88, 0x88, 0xB1, 0x64, 0x22, 0x90, 0x93, 0x70, 0xE0, 0xFC, 0xA3, 0xE0, 0x22, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0xF9, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0xF8,
+0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xD8, 0xA6, 0x90, 0x93, 0xF8, 0xE0, 0x90, 0x04, 0x25, 0xF0,
+0x90, 0x93, 0xF9, 0xE0, 0x60, 0x05, 0xD1, 0xE8, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0xD1, 0xE8, 0x54, 0xC0, 0xF0,
+0x90, 0x93, 0xFB, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x18, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xEF, 0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03, 0x74, 0x10, 0x40, 0x0D, 0x2E, 0xF5,
+0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0x04, 0xF0, 0x80, 0x0A, 0x2E, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xF5, 0x83, 0xE4, 0xF0, 0xAF, 0x05, 0xD1, 0xDD, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x93, 0xFA,
+0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0xD1, 0xDD, 0xEE, 0xF0, 0x74,
+0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, 0x29, 0x2F, 0xF1,
+0x04, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74, 0x12, 0x2F,
+0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
+0xF5, 0x83, 0xE0, 0x22, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
+0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x88, 0xD9,
+0xF1, 0xAD, 0xD1, 0xF4, 0xFD, 0x90, 0x93, 0x06, 0xE0, 0x24, 0x2C, 0xF1, 0xDD, 0x90, 0x93, 0x06,
+0xE0, 0x2F, 0x24, 0x30, 0xA3, 0xF0, 0xE0, 0xFD, 0x24, 0x04, 0xF1, 0xCE, 0xE0, 0xFE, 0x74, 0x05,
+0x2D, 0xF1, 0xC6, 0x12, 0xBC, 0x4B, 0x90, 0x88, 0x80, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x07,
+0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34, 0xFC, 0xF1, 0xBE, 0x75, 0x1E, 0x04, 0x7B, 0x01, 0x7A, 0x88,
+0x79, 0x82, 0x12, 0x6A, 0x21, 0x90, 0x93, 0x07, 0xE0, 0x24, 0x14, 0xF0, 0xE0, 0xFD, 0x24, 0x01,
+0x12, 0xD8, 0xB9, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x12, 0xBC, 0x4B, 0x90, 0x88,
+0x86, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x88, 0xDA, 0xF1, 0xAD, 0x90, 0x88, 0x7C, 0xE0, 0xFE, 0xA3,
+0xE0, 0xFF, 0x4E, 0x60, 0x11, 0x90, 0x93, 0x06, 0xE0, 0xF1, 0xB8, 0x8F, 0x1E, 0x7B, 0x01, 0x7A,
+0x88, 0x79, 0x8A, 0x12, 0x6A, 0x21, 0x90, 0x88, 0xDB, 0xF1, 0xAD, 0xF1, 0xB8, 0x90, 0x88, 0x7E,
+0xA3, 0xE0, 0xF5, 0x1E, 0x7B, 0x01, 0x7A, 0x88, 0x79, 0xAA, 0x02, 0x6A, 0x21, 0xE0, 0xFF, 0x12,
+0x7B, 0x2A, 0x90, 0x93, 0x06, 0xEF, 0xF0, 0x22, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x1B,
+0x01, 0xF5, 0x1C, 0x89, 0x1D, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0x02, 0x5D, 0x98, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90,
+0x93, 0x00, 0xF0, 0x90, 0x93, 0x00, 0xE0, 0xFD, 0x70, 0x03, 0x02, 0xB0, 0xE6, 0x90, 0x85, 0x1D,
+0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x85, 0x1E,
+0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1,
+0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x94, 0x0C, 0xE0, 0x31, 0x35, 0x80, 0x05, 0xC3, 0x33, 0xCE,
+0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x01, 0xC8, 0xE4, 0x90, 0x93, 0x01, 0xF0,
+0x90, 0x93, 0x01, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x31, 0x11, 0xE7, 0xA4, 0xFF, 0xE9, 0xFD,
+0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x11, 0xFF, 0x90, 0x84, 0xCD, 0x11,
+0xEF, 0x11, 0xE7, 0xA4, 0x2D, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x11, 0xFF, 0x90, 0x84,
+0xD1, 0x11, 0xEF, 0x90, 0x93, 0x01, 0xE0, 0x04, 0xF0, 0x80, 0xC5, 0x90, 0x93, 0x00, 0xE0, 0xFF,
+0x90, 0x94, 0x0C, 0x31, 0x17, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93, 0x00,
+0xF0, 0x90, 0x94, 0x0C, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8,
+0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x94, 0x0C, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90,
+0x85, 0x1E, 0x12, 0xB8, 0x48, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x70, 0x03, 0x02, 0xAF, 0xF3,
+0xE4, 0x90, 0x85, 0x1E, 0xF0, 0x02, 0xAF, 0xF3, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90,
+0x94, 0x0C, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0xF0, 0x11, 0xE7, 0x90, 0x01, 0xD0, 0x12, 0x05,
+0x28, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0x90, 0x94, 0x0C, 0xE0, 0x75, 0xF0, 0x04, 0x22, 0x12,
+0x05, 0x28, 0xE5, 0x82, 0x29, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x2F,
+0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x85, 0x1E, 0xE0, 0x75, 0xF0, 0x08,
+0x22, 0x75, 0xF0, 0x03, 0x12, 0x05, 0x28, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x22, 0x13,
+0x13, 0x13, 0x54, 0x1F, 0x24, 0x75, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFD, 0x7C,
+0x00, 0xE5, 0x63, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8, 0x07, 0x08, 0x22, 0x90, 0x04,
+0x85, 0xE0, 0xF5, 0x6C, 0x90, 0x93, 0x9E, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x63, 0x90, 0x85, 0xBB,
+0xE0, 0xFF, 0xE5, 0x63, 0xC3, 0x9F, 0x40, 0x02, 0xA1, 0x75, 0xE5, 0x63, 0xB1, 0x85, 0xE0, 0xF5,
+0x6E, 0x12, 0xDA, 0x12, 0xE0, 0x65, 0x6E, 0x60, 0x16, 0x90, 0x8A, 0x71, 0xE5, 0x6E, 0xF0, 0xE4,
+0xA3, 0xF0, 0xAB, 0x63, 0xFD, 0xFF, 0x12, 0x52, 0xC3, 0x12, 0xDA, 0x12, 0xE5, 0x6E, 0xF0, 0x90,
+0x04, 0xA0, 0xE0, 0x64, 0x01, 0x70, 0x4C, 0xA3, 0xE0, 0x65, 0x63, 0x70, 0x46, 0xA3, 0xE0, 0xF5,
+0x64, 0xA3, 0xE0, 0x90, 0x93, 0x4F, 0xF0, 0xE5, 0x63, 0xB1, 0x85, 0xE0, 0x65, 0x64, 0x70, 0x02,
+0xA1, 0x71, 0xE5, 0x63, 0xB1, 0x85, 0xE5, 0x64, 0xF0, 0xE5, 0x63, 0xD1, 0x9A, 0xE0, 0x54, 0xFC,
+0xFF, 0x90, 0x93, 0x4F, 0xE0, 0x54, 0x03, 0x4F, 0xFF, 0xE5, 0x63, 0xD1, 0x9A, 0xEF, 0xF0, 0x90,
+0x8A, 0x71, 0xE5, 0x64, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xAB, 0x63, 0xE4, 0xFD, 0xFF, 0x12, 0x52,
+0xC3, 0xA1, 0x71, 0xAF, 0x63, 0x12, 0x77, 0x39, 0x75, 0xF0, 0x12, 0xE5, 0x63, 0x12, 0x8D, 0x32,
+0x12, 0x8F, 0x66, 0xFD, 0xF1, 0x2A, 0xED, 0xF0, 0x90, 0x93, 0x58, 0xE4, 0xF1, 0x79, 0xE4, 0xF0,
+0xA3, 0xE5, 0x63, 0xF0, 0x31, 0x1F, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF,
+0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0xFF, 0x90, 0x93, 0x5C, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7B, 0x02,
+0x7A, 0x00, 0xE4, 0xFD, 0x7F, 0x01, 0xD1, 0x19, 0xF1, 0x55, 0xFE, 0xA3, 0xE0, 0xFF, 0xF1, 0x48,
+0xFD, 0xE5, 0x63, 0x12, 0xC7, 0x77, 0x54, 0x80, 0xFB, 0xF1, 0x2A, 0xEB, 0xF0, 0x12, 0xD1, 0x67,
+0xED, 0xF0, 0x90, 0x93, 0x56, 0x12, 0xBF, 0x44, 0x90, 0x93, 0x5C, 0xF0, 0xA3, 0xF0, 0x7B, 0x03,
+0xFA, 0xFD, 0x7F, 0x01, 0xD1, 0x19, 0xAF, 0x63, 0x12, 0x77, 0x39, 0xEF, 0x70, 0x02, 0xA1, 0x71,
+0x75, 0xF0, 0x12, 0xE5, 0x63, 0x12, 0x8D, 0x32, 0x12, 0x8F, 0x66, 0x30, 0xE0, 0x02, 0xA1, 0x71,
+0xE5, 0x63, 0x31, 0x1F, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C,
+0xFE, 0xEF, 0x5D, 0x4E, 0x60, 0x02, 0xA1, 0x71, 0xF1, 0x55, 0xFE, 0xA3, 0xE0, 0x4E, 0x70, 0x06,
+0xF1, 0x48, 0x70, 0x02, 0xA1, 0x71, 0xE5, 0x63, 0x75, 0xF0, 0x12, 0xA4, 0x24, 0x44, 0xF9, 0x74,
+0x89, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0x93, 0x4A, 0x12, 0x87, 0x79, 0xD1, 0xA7, 0x12, 0xDA,
+0x90, 0x12, 0x03, 0xED, 0x2F, 0xFF, 0xF1, 0x18, 0x2F, 0xFF, 0xF1, 0x1E, 0x2F, 0xFF, 0xF1, 0x24,
+0x2F, 0xF5, 0x6D, 0xF1, 0x55, 0xF5, 0x69, 0xA3, 0xE0, 0xF5, 0x6A, 0xF1, 0x48, 0xFF, 0x90, 0x93,
+0x4D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x63, 0xB1, 0x85, 0xE0, 0xF5, 0x64, 0x54, 0x80, 0xF5,
+0x66, 0xE5, 0x64, 0x54, 0x7F, 0xF5, 0x65, 0xD1, 0xA7, 0x12, 0x03, 0xED, 0xD1, 0xAD, 0x12, 0xDA,
+0x90, 0x90, 0x93, 0x58, 0xD1, 0xB1, 0xF1, 0x18, 0xFF, 0x90, 0x93, 0x5A, 0xD1, 0xB1, 0xF1, 0x1E,
+0xFF, 0x90, 0x93, 0x5C, 0xD1, 0xB1, 0x7B, 0x01, 0xF1, 0x03, 0xD1, 0xA7, 0xF1, 0x24, 0xD1, 0xAD,
+0x90, 0x93, 0x4D, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x58, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3,
+0x12, 0xDA, 0x88, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x64, 0xF0, 0x7B, 0x02, 0xF1, 0x03, 0x74, 0x7C,
+0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0xA1,
+0x55, 0x75, 0xF0, 0x12, 0xE5, 0x63, 0x12, 0xCF, 0x8A, 0xFF, 0xE5, 0x65, 0xD3, 0x9F, 0x40, 0x08,
+0x8F, 0x65, 0xE5, 0x65, 0x45, 0x66, 0xF5, 0x64, 0xE5, 0x65, 0x90, 0x82, 0xE1, 0x93, 0xF5, 0x6B,
+0xE5, 0x66, 0x60, 0x04, 0x05, 0x6B, 0x05, 0x6B, 0x90, 0x04, 0x8C, 0xE0, 0x64, 0x01, 0x70, 0x28,
+0xE5, 0x65, 0xC3, 0x94, 0x0C, 0x40, 0x21, 0x74, 0x84, 0x25, 0x65, 0xF5, 0x82, 0xE4, 0x34, 0x04,
+0xF5, 0x83, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0xEF, 0x30, 0xE7, 0x06, 0xE5, 0x6B, 0x2E, 0xFF, 0x80,
+0x05, 0xC3, 0xE5, 0x6B, 0x9E, 0xFF, 0x8F, 0x6B, 0xE5, 0x6B, 0xD3, 0x94, 0x1A, 0xAF, 0x6B, 0x40,
+0x02, 0x7F, 0x1A, 0x8F, 0x6B, 0x12, 0xA6, 0x87, 0x7B, 0x03, 0xFA, 0xF1, 0x05, 0xE5, 0x64, 0x90,
+0x83, 0x59, 0x93, 0xFF, 0xD3, 0x90, 0x93, 0x4E, 0xE0, 0x9F, 0x90, 0x93, 0x4D, 0xE0, 0x94, 0x00,
+0x40, 0x02, 0x80, 0x72, 0xC3, 0xE5, 0x6A, 0x94, 0x0A, 0xE5, 0x69, 0x94, 0x00, 0x40, 0x02, 0x81,
+0x98, 0xD1, 0xE6, 0xC3, 0x94, 0x01, 0x40, 0x04, 0xD1, 0xE6, 0x14, 0xF0, 0xD1, 0xA7, 0xF1, 0x24,
+0xFF, 0x90, 0x93, 0x4E, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x4D, 0xE0, 0x35, 0xF0, 0xFE, 0xF1, 0x1E,
+0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0xF1, 0x18, 0x2F, 0xFD, 0xEE, 0x35, 0xF0, 0xFC, 0xE5, 0x69,
+0xC3, 0x13, 0xFE, 0xE5, 0x6A, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x2D, 0xE5, 0x63,
+0x94, 0x05, 0x50, 0x0A, 0x74, 0xAF, 0x25, 0x63, 0x12, 0xAC, 0x7B, 0x74, 0x03, 0xF0, 0x90, 0x93,
+0x56, 0x12, 0xDA, 0x88, 0xE5, 0x69, 0xC3, 0x13, 0xA3, 0xF0, 0xE5, 0x6A, 0x13, 0xA3, 0xD1, 0xB8,
+0xF1, 0x3E, 0x7B, 0x01, 0xD1, 0x13, 0x12, 0xCE, 0xA1, 0xA1, 0x55, 0xD1, 0xA7, 0x12, 0x03, 0xED,
+0x65, 0x6D, 0x70, 0x02, 0xE5, 0xF0, 0x70, 0x4F, 0x90, 0x93, 0x56, 0xF0, 0xA3, 0xE5, 0x6D, 0xF0,
+0xC3, 0x13, 0xFF, 0xA3, 0xE4, 0xF0, 0xA3, 0xEF, 0xD1, 0xB8, 0xF1, 0x3E, 0x7B, 0x02, 0xD1, 0x13,
+0xE5, 0x63, 0xC3, 0x94, 0x05, 0x50, 0x0E, 0xD1, 0xE6, 0xD3, 0x94, 0x00, 0x40, 0x07, 0x12, 0xA6,
+0x82, 0x7B, 0x03, 0x80, 0x0C, 0xE5, 0x6D, 0xC3, 0x94, 0x03, 0x50, 0x10, 0x12, 0xA6, 0x82, 0x7B,
+0x04, 0xFA, 0xD1, 0x15, 0x7D, 0x06, 0xAF, 0x63, 0xF1, 0x85, 0xA1, 0x71, 0xE4, 0xFD, 0xAF, 0x63,
+0x12, 0xD0, 0x13, 0xF1, 0x81, 0xA1, 0x55, 0x12, 0xA6, 0x82, 0x7B, 0x08, 0xFA, 0xD1, 0x15, 0x7D,
+0x01, 0xAF, 0x63, 0x12, 0x65, 0xC2, 0xA1, 0x55, 0x74, 0xAF, 0x25, 0x63, 0x12, 0xAC, 0x7B, 0xE4,
+0xF0, 0x90, 0x93, 0x54, 0x74, 0x02, 0xF0, 0xAB, 0x6B, 0xAD, 0x63, 0xAF, 0x6A, 0xAE, 0x69, 0x12,
+0xCD, 0x97, 0x8E, 0x67, 0x8F, 0x68, 0x12, 0xD9, 0xBC, 0xC3, 0x74, 0x01, 0x93, 0x95, 0x68, 0xE4,
+0x93, 0x95, 0x67, 0x50, 0x1B, 0xD1, 0x8A, 0xE4, 0xF0, 0x7D, 0x01, 0xAF, 0x63, 0x12, 0xD0, 0x13,
+0xF1, 0x62, 0xF1, 0x31, 0xF0, 0xE4, 0x90, 0x93, 0x5A, 0x12, 0xA6, 0x95, 0x7B, 0x01, 0x80, 0x25,
+0xD1, 0xFB, 0xC3, 0xE5, 0x68, 0x9F, 0xE5, 0x67, 0x94, 0x00, 0x50, 0x1E, 0xD1, 0x8A, 0xE4, 0xF0,
+0x12, 0xCE, 0xA1, 0x90, 0x93, 0x56, 0xF1, 0x31, 0xD1, 0xFA, 0x12, 0xD1, 0x67, 0xEF, 0xF0, 0xE4,
+0x12, 0xA6, 0x94, 0x7B, 0x02, 0xFA, 0xF1, 0x38, 0x80, 0x4B, 0xF1, 0x81, 0xF1, 0x62, 0xF1, 0x31,
+0xD1, 0xFA, 0xF1, 0x2A, 0xEF, 0xF0, 0xD1, 0x8A, 0xE0, 0xF1, 0x3E, 0x7B, 0x03, 0x7A, 0x00, 0xF1,
+0x38, 0xD1, 0x8A, 0xE0, 0x04, 0xF0, 0xE5, 0x65, 0x90, 0x83, 0x6D, 0x93, 0xFF, 0xD1, 0x8A, 0xE0,
+0xC3, 0x9F, 0x40, 0x21, 0xD1, 0x8A, 0xE4, 0xD1, 0xFA, 0x12, 0xD9, 0xBC, 0x74, 0x01, 0x93, 0x2F,
+0xFF, 0xE4, 0x93, 0x34, 0x00, 0xC3, 0x13, 0xFE, 0xEF, 0x13, 0xFF, 0xE5, 0x63, 0x12, 0xCE, 0x95,
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x6D, 0xFD, 0xAF, 0x63, 0x12, 0x65, 0xC2, 0xE4, 0x90,
+0x93, 0x56, 0xF0, 0x12, 0xA6, 0x90, 0xA3, 0xF0, 0x7B, 0x01, 0xFA, 0x7D, 0xFF, 0x7F, 0x01, 0xD1,
+0x19, 0x05, 0x63, 0x21, 0x4D, 0x22, 0x74, 0xBC, 0x25, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5,
+0x83, 0xE4, 0xF0, 0xE5, 0x79, 0xC4, 0x54, 0xF0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5,
+0x83, 0x22, 0x8D, 0x79, 0xEF, 0x30, 0xE6, 0x16, 0xB1, 0x83, 0xD1, 0x96, 0xD1, 0xF3, 0xF0, 0xE4,
+0xFB, 0xAF, 0x79, 0x12, 0x27, 0x3D, 0xB1, 0x76, 0xD1, 0x83, 0x74, 0x01, 0x80, 0x5C, 0xF1, 0x0B,
+0x04, 0xF0, 0xF1, 0x0B, 0x64, 0x02, 0x70, 0x2A, 0x74, 0x9F, 0x25, 0x79, 0xF5, 0x82, 0xE4, 0x34,
+0x93, 0xF5, 0x83, 0xE0, 0xFD, 0xF4, 0x60, 0x02, 0x80, 0x04, 0xB1, 0x83, 0xE0, 0xFD, 0xD1, 0x98,
+0xD1, 0xF3, 0xF0, 0x7B, 0x01, 0xAF, 0x79, 0x12, 0x27, 0x3D, 0xB1, 0x83, 0xD1, 0x83, 0x74, 0x02,
+0x80, 0x28, 0xF1, 0x0B, 0xD3, 0x94, 0x03, 0x40, 0x0D, 0xAF, 0x79, 0x12, 0x6D, 0x94, 0xB1, 0x76,
+0xD1, 0x83, 0x74, 0x03, 0x80, 0x14, 0xB1, 0x83, 0xD1, 0x96, 0xD1, 0xF3, 0xF0, 0x7B, 0x01, 0xAF,
+0x79, 0x12, 0x27, 0x3D, 0xB1, 0x83, 0xD1, 0x83, 0x74, 0x02, 0xF0, 0xAB, 0x79, 0xE4, 0xFD, 0xFF,
+0x02, 0x52, 0xC3, 0x7A, 0x00, 0x7D, 0x03, 0x7F, 0x01, 0x90, 0x01, 0xC6, 0xE0, 0xFE, 0x64, 0x80,
+0x70, 0x60, 0x90, 0x93, 0x60, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEB, 0xA3, 0xF0, 0xEA, 0xA3, 0xF0,
+0x90, 0x93, 0x56, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x93, 0x64, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x93,
+0x58, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x93, 0x66, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x93, 0x5A, 0xE0,
+0xFC, 0xA3, 0xE0, 0x90, 0x93, 0x68, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x93, 0x5C, 0xE0, 0xFC, 0xA3,
+0xE0, 0x90, 0x93, 0x6A, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x93, 0x5E, 0x74, 0xFE, 0xF0, 0x90, 0x93,
+0x6C, 0x74, 0x0C, 0xF0, 0x7B, 0x01, 0x7A, 0x93, 0x79, 0x5E, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x12,
+0x87, 0xBB, 0x22, 0xE0, 0x90, 0x8A, 0x71, 0xF0, 0xA3, 0x22, 0x74, 0xAC, 0x25, 0x63, 0xF5, 0x82,
+0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0xE0, 0xFD, 0xE5, 0x79, 0xC4, 0x54, 0xF0, 0x24, 0x05, 0xF5,
+0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x90, 0x93, 0x4A, 0x02, 0x87, 0x70, 0xFF, 0x90, 0x93,
+0x56, 0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xF0, 0x90, 0x93, 0x4A, 0x12, 0x87, 0x70, 0x90,
0x00, 0x06, 0x12, 0x04, 0x18, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x04, 0x18, 0x2F, 0xFF,
0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x04, 0x18, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90,
-0x92, 0x43, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0xDC, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5,
-0x83, 0x22, 0x7A, 0x00, 0x7D, 0x03, 0x7F, 0x01, 0x90, 0x04, 0x84, 0xE0, 0xFE, 0x60, 0x60, 0x90,
-0x92, 0x49, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEB, 0xA3, 0xF0, 0xEA, 0xA3, 0xF0, 0x90, 0x92, 0x3F,
-0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92, 0x4D, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x41, 0xE0, 0xFC,
-0xA3, 0xE0, 0x90, 0x92, 0x4F, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x43, 0xE0, 0xFC, 0xA3, 0xE0,
-0x90, 0x92, 0x51, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x45, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92,
-0x53, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x47, 0x74, 0xFE, 0xF0, 0x90, 0x92, 0x55, 0x74, 0x0C,
-0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x47, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x12, 0x87, 0xBB, 0x22,
-0x74, 0xAC, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0xFF, 0x90, 0x92, 0x3F,
-0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x8D, 0x78, 0xEF, 0x30, 0xE6, 0x17, 0x12, 0x8F, 0x5C,
-0x31, 0xD7, 0xF1, 0xC1, 0xE4, 0xFB, 0xAF, 0x78, 0x12, 0x27, 0x3D, 0x12, 0x8F, 0x4F, 0xF1, 0x8B,
-0x74, 0x01, 0x80, 0x5E, 0xF1, 0xDD, 0xE0, 0x04, 0xF0, 0xF1, 0xDD, 0xE0, 0x64, 0x02, 0x70, 0x27,
-0x74, 0xCC, 0x25, 0x78, 0x12, 0x8F, 0xD0, 0xE0, 0xFD, 0xF4, 0x60, 0x02, 0x80, 0x05, 0x12, 0x8F,
-0x5C, 0xE0, 0xFD, 0x31, 0xD9, 0xF1, 0xC1, 0x7B, 0x01, 0xAF, 0x78, 0x12, 0x27, 0x3D, 0x12, 0x8F,
-0x5C, 0xF1, 0x8B, 0x74, 0x02, 0x80, 0x2B, 0xF1, 0xDD, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x0E, 0xAF,
-0x78, 0x12, 0x6D, 0x94, 0x12, 0x8F, 0x4F, 0xF1, 0x8B, 0x74, 0x03, 0x80, 0x15, 0x12, 0x8F, 0x5C,
-0x31, 0xD7, 0xF1, 0xC1, 0x7B, 0x01, 0xAF, 0x78, 0x12, 0x27, 0x3D, 0x12, 0x8F, 0x5C, 0xF1, 0x8B,
-0x74, 0x02, 0xF0, 0xAB, 0x78, 0xE4, 0xFD, 0xFF, 0x02, 0x52, 0xC3, 0xE0, 0x90, 0x8A, 0x71, 0xF0,
-0xA3, 0x22, 0xE5, 0x64, 0x90, 0x83, 0x1D, 0x93, 0xFF, 0x22, 0x7A, 0x00, 0x7D, 0x01, 0x7F, 0x01,
-0xC1, 0x88, 0x90, 0x00, 0x04, 0x02, 0x04, 0x18, 0x90, 0x00, 0x06, 0x02, 0x04, 0x18, 0x90, 0x00,
-0x08, 0x02, 0x04, 0x18, 0x90, 0x92, 0x43, 0xE4, 0xF0, 0xA3, 0x22, 0x7D, 0x05, 0x7F, 0x01, 0xC1,
-0x88, 0xE0, 0x54, 0x03, 0x90, 0x91, 0x0B, 0xF0, 0x22, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x90, 0x89,
-0x42, 0x22, 0xE0, 0xFF, 0x90, 0x92, 0x45, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x74, 0xBC, 0x25,
-0x78, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x22, 0xE4, 0xFD, 0x01, 0x9D, 0x7D, 0x20, 0x7F,
-0xFF, 0x11, 0xDE, 0x12, 0xB5, 0xA0, 0x90, 0x85, 0xBF, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x02, 0xF6,
-0xFF, 0x90, 0x92, 0x78, 0xF0, 0xBF, 0x01, 0x07, 0x11, 0x10, 0xE4, 0x90, 0x92, 0x78, 0xF0, 0x22,
-0x11, 0xC0, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x06, 0x90, 0x92, 0x07, 0xE0,
-0xA3, 0xF0, 0x11, 0xC0, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92,
-0x07, 0xE0, 0x90, 0x92, 0x09, 0xF0, 0x11, 0xC0, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF,
-0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x0A, 0xF0, 0x11, 0xC0, 0x7F, 0xF3, 0x7E, 0x01,
-0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x0B, 0xF0, 0x11, 0xC0,
-0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92,
-0x0C, 0xF0, 0x90, 0x92, 0x08, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90,
-0x92, 0x10, 0xF0, 0x90, 0x92, 0x0C, 0xE0, 0x90, 0x92, 0x11, 0xF0, 0x90, 0x92, 0x12, 0x74, 0x12,
-0xF0, 0x90, 0x92, 0x20, 0x74, 0x05, 0xF0, 0x90, 0x92, 0x14, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3,
-0xEB, 0xF0, 0x90, 0x92, 0x10, 0xE0, 0x90, 0x92, 0x17, 0xF0, 0x90, 0x92, 0x11, 0xE0, 0x90, 0x92,
-0x18, 0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x12, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB,
-0x7B, 0x01, 0x7A, 0x92, 0x79, 0x07, 0x22, 0x31, 0xAC, 0x7F, 0xF4, 0x7E, 0x00, 0x12, 0x64, 0x37,
-0xBF, 0x01, 0x06, 0x90, 0x92, 0x16, 0xE0, 0xA3, 0xF0, 0x31, 0xAC, 0x7F, 0xF5, 0x7E, 0x00, 0x12,
-0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x18, 0xF0, 0x31, 0xAC, 0x7F,
-0xF6, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x19,
-0xF0, 0x31, 0xAC, 0x7F, 0xF7, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16,
-0xE0, 0x90, 0x92, 0x1A, 0xF0, 0x31, 0xAC, 0x7F, 0xF8, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01,
-0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x1B, 0xF0, 0x31, 0xAC, 0x51, 0x2D, 0xBF, 0x01, 0x08,
-0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x1C, 0xF0, 0x31, 0xAC, 0x51, 0x26, 0xBF, 0x01, 0x08, 0x90,
-0x92, 0x16, 0xE0, 0x90, 0x92, 0x1D, 0xF0, 0x31, 0xAC, 0x31, 0xB3, 0xBF, 0x01, 0x08, 0x90, 0x92,
-0x16, 0xE0, 0x90, 0x92, 0x1E, 0xF0, 0x90, 0x92, 0x07, 0x74, 0x19, 0xF0, 0x90, 0x92, 0x15, 0x74,
-0x08, 0xF0, 0x90, 0x92, 0x17, 0xE0, 0x90, 0x92, 0x09, 0xF0, 0x90, 0x92, 0x18, 0xE0, 0x90, 0x92,
-0x0A, 0xF0, 0x90, 0x92, 0x19, 0xE0, 0x90, 0x92, 0x0B, 0xF0, 0x90, 0x92, 0x1A, 0xE0, 0x90, 0x92,
-0x0C, 0xF0, 0x90, 0x92, 0x1B, 0xE0, 0x90, 0x92, 0x0D, 0xF0, 0x90, 0x92, 0x1C, 0xE0, 0x90, 0x92,
-0x0E, 0xF0, 0x90, 0x92, 0x1D, 0xE0, 0x90, 0x92, 0x0F, 0xF0, 0x90, 0x92, 0x1E, 0xE0, 0x90, 0x92,
-0x10, 0xF0, 0x11, 0xC0, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB, 0x7B, 0x01, 0x7A, 0x92,
-0x79, 0x16, 0x22, 0x7F, 0xFD, 0x7E, 0x00, 0x02, 0x64, 0x37, 0x7E, 0x00, 0x7F, 0x0B, 0x7D, 0x00,
-0x7B, 0x01, 0x7A, 0x92, 0x79, 0x7F, 0x12, 0x06, 0xDE, 0x51, 0x1F, 0x51, 0x2D, 0xBF, 0x01, 0x1C,
-0x90, 0x92, 0x29, 0xE0, 0xFE, 0x54, 0x01, 0x90, 0x92, 0x7F, 0xF0, 0xEE, 0x54, 0x04, 0x90, 0x92,
-0x81, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0x54, 0x08, 0x90, 0x92, 0x80, 0xF0, 0x51, 0x1F, 0x51, 0x26,
-0xBF, 0x01, 0x16, 0x90, 0x92, 0x29, 0xE0, 0xFE, 0x54, 0x07, 0x90, 0x92, 0x83, 0xF0, 0xEE, 0x54,
-0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0x92, 0x82, 0xF0, 0x51, 0x1F, 0x31, 0xB3, 0xBF, 0x01, 0x0E,
-0x90, 0x92, 0x29, 0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x92, 0x84, 0xF0, 0x22, 0x7B,
-0x01, 0x7A, 0x92, 0x79, 0x29, 0x22, 0x7F, 0xFB, 0x7E, 0x00, 0x02, 0x64, 0x37, 0x7F, 0xF9, 0x7E,
-0x00, 0x02, 0x64, 0x37, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x92, 0x7E, 0xF0, 0xBF, 0x01, 0x07, 0x11,
-0xC7, 0xE4, 0x90, 0x92, 0x7E, 0xF0, 0x22, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80,
-0x12, 0x7B, 0x3E, 0x12, 0xB8, 0x99, 0x12, 0xBF, 0x3E, 0x12, 0x7B, 0x9C, 0x51, 0xD1, 0x12, 0xB7,
-0xD8, 0x7F, 0x01, 0x12, 0x85, 0x15, 0x90, 0x92, 0x7D, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x85, 0x15,
-0x90, 0x92, 0x7D, 0xE0, 0x04, 0xF0, 0x12, 0xB8, 0x5C, 0x51, 0xEF, 0x90, 0x01, 0xCC, 0x74, 0x0F,
-0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x7B, 0x3E, 0x75, 0x20, 0xFF,
-0x12, 0x7C, 0xCD, 0x12, 0xB6, 0x8F, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12,
-0x7B, 0x3E, 0x12, 0xB8, 0x90, 0x31, 0xBA, 0x90, 0x00, 0x00, 0xE0, 0x54, 0xFB, 0xFD, 0xE4, 0xFF,
-0x12, 0xB6, 0x6C, 0x44, 0x04, 0xFD, 0x7F, 0x01, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x98, 0x74, 0x80,
-0xF0, 0xA3, 0x74, 0x88, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xE4, 0xFF, 0x02, 0x85,
-0x9E, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x12, 0xB6,
-0xF5, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0xF1,
-0xED, 0x12, 0x7B, 0xEF, 0x12, 0x3C, 0x03, 0x12, 0xBE, 0xBC, 0xF1, 0xF3, 0x12, 0xC3, 0x7D, 0x71,
-0xD9, 0x71, 0x26, 0x12, 0x7B, 0x64, 0x12, 0x78, 0xB9, 0x90, 0x89, 0x16, 0xE0, 0x54, 0x7F, 0xF0,
-0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x89, 0x18, 0xF0, 0x90, 0x89,
-0x16, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x24, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x86,
-0x79, 0x72, 0x12, 0x06, 0xDE, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0x12, 0xB6, 0xFD, 0x71,
-0xDF, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x29, 0x71, 0xD2, 0x30, 0xE0, 0x02, 0x7E,
-0x01, 0x90, 0x86, 0x90, 0x71, 0xD0, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0x86, 0x8E, 0x71, 0xD0,
-0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x86, 0x8F, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02,
-0xFB, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0x71, 0xC9, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90,
-0x86, 0x90, 0x71, 0xC7, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x8E, 0x71, 0xC7, 0x30, 0xE2,
-0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x03, 0x70, 0x20, 0x71, 0xC0, 0x30,
-0xE0, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x90, 0x71, 0xBE, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x86,
-0x8E, 0x71, 0xBE, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x8F, 0xEF, 0xF0, 0x22, 0xEF, 0xF0,
-0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22,
-0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x22, 0x12, 0xC4, 0x4C, 0x02, 0x06, 0xDE, 0x12,
-0xC5, 0xC1, 0xE4, 0x90, 0x88, 0xD8, 0x12, 0x96, 0x40, 0x90, 0x88, 0x76, 0xF0, 0x12, 0x96, 0x3B,
-0x12, 0x96, 0x41, 0x90, 0x88, 0x88, 0xF0, 0xA3, 0xF0, 0x90, 0x88, 0xCA, 0xF0, 0xA3, 0xF0, 0x22,
-0x90, 0x86, 0x72, 0x91, 0x0B, 0x30, 0xE0, 0x02, 0x71, 0xDF, 0x22, 0xE0, 0xFF, 0xC4, 0x13, 0x13,
-0x54, 0x03, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x5B, 0x8A, 0x5C, 0x89, 0x5D,
-0x90, 0x05, 0x27, 0xE0, 0xF5, 0x5E, 0x8B, 0x1B, 0x8A, 0x1C, 0x89, 0x1D, 0x75, 0x1E, 0x01, 0x7B,
-0x01, 0x7A, 0x85, 0x79, 0xBC, 0x12, 0x6A, 0x21, 0x12, 0x91, 0xC4, 0xFF, 0xC3, 0x13, 0x20, 0xE0,
-0x02, 0x81, 0xCE, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x72, 0xF1, 0x28, 0x75, 0x5E, 0x21, 0xF1,
-0x9A, 0x30, 0xE0, 0x05, 0x12, 0xC7, 0xFE, 0x80, 0x0D, 0xE4, 0x90, 0x85, 0xBD, 0xF0, 0xA3, 0xF0,
-0x7D, 0x40, 0xFF, 0x12, 0x7C, 0x41, 0xF1, 0x91, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x12,
-0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x14, 0x90, 0x85, 0xBC, 0xE0, 0xC4, 0x13,
-0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x80, 0x90, 0x85, 0xBC, 0xF1, 0xD6, 0x20, 0xE0, 0x03,
-0x43, 0x5E, 0x40, 0xB1, 0x72, 0x90, 0x85, 0xBF, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0xB4, 0x03,
-0x90, 0x85, 0xBC, 0x91, 0x0B, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x0B, 0xF1, 0xAC, 0xEF, 0x60,
-0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0xB4, 0x03, 0xA1, 0x3D, 0xB1, 0x6F, 0x90, 0x85,
-0xBF, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0x6A, 0xFF, 0x12, 0xB4, 0x03, 0xA1, 0x6A, 0x90, 0x85,
-0xBC, 0xE0, 0x30, 0xE0, 0x70, 0xF1, 0x28, 0x43, 0x5E, 0x31, 0xF1, 0x9A, 0x30, 0xE0, 0x05, 0x12,
-0xC7, 0xFE, 0x80, 0x07, 0x7D, 0x40, 0xE4, 0xFF, 0x12, 0x7C, 0x41, 0xF1, 0x91, 0x54, 0x1F, 0x30,
-0xE0, 0x03, 0x43, 0x5E, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x04, 0xB1,
-0x72, 0x90, 0x85, 0xBC, 0x91, 0x0B, 0x30, 0xE0, 0x0A, 0xF1, 0x48, 0x60, 0x30, 0xE4, 0xFD, 0x7F,
-0x02, 0x80, 0x1E, 0x12, 0xB6, 0x64, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x18, 0x12, 0x7A, 0xA2,
-0xF1, 0xAC, 0xBF, 0x01, 0x09, 0x90, 0x85, 0xC7, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD,
-0xFF, 0xB1, 0x7D, 0x80, 0x08, 0x90, 0x85, 0xC8, 0xE0, 0x90, 0x85, 0xC0, 0xF0, 0x90, 0x05, 0x40,
-0x74, 0x22, 0xF0, 0x80, 0x25, 0xB1, 0x6F, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01,
-0x7F, 0x04, 0x80, 0x0B, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x08, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0xB1,
-0x7D, 0xF1, 0xA3, 0x90, 0x85, 0xC7, 0xF1, 0x8B, 0xF1, 0xF3, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75,
-0x5E, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x5E, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x1F, 0xED, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0xFE, 0xC4, 0x13,
-0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xC1, 0xD8, 0xEE, 0x12, 0x8D, 0x59, 0x30, 0xE0, 0x02, 0xC1,
-0xD8, 0x90, 0x85, 0xC8, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xC1, 0xD8, 0xEF, 0x70, 0x02, 0xC1, 0x43,
-0x24, 0xFE, 0x70, 0x02, 0xC1, 0x80, 0x24, 0xFE, 0x60, 0x4D, 0x24, 0xFC, 0x70, 0x02, 0xC1, 0xBF,
-0x24, 0xFC, 0x60, 0x02, 0xC1, 0xD1, 0xEE, 0xB4, 0x0E, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8,
-0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12,
-0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x60, 0x05,
-0x12, 0x6D, 0x4C, 0x80, 0x03, 0x12, 0x79, 0x61, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x08, 0x60, 0x02,
-0xC1, 0xD1, 0x12, 0x7A, 0xB9, 0xC1, 0xD1, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12,
-0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0,
-0xB4, 0x0E, 0x08, 0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0x64,
-0x0C, 0x60, 0x02, 0xC1, 0xD1, 0xD1, 0xDD, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xC1, 0xD1, 0x12, 0x70,
-0x9E, 0xC1, 0xD1, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12,
-0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0,
-0xB4, 0x0C, 0x08, 0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90, 0x85, 0xC8, 0xE0, 0x64,
-0x04, 0x70, 0x5E, 0x12, 0xB7, 0x60, 0xEF, 0x64, 0x01, 0x70, 0x56, 0x12, 0x77, 0xFE, 0x80, 0x51,
-0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90,
-0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x08,
-0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01,
-0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x17, 0x12, 0x79, 0xF3, 0x80, 0x12, 0x90,
-0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x0B, 0x12, 0xA1, 0x91, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x7A,
-0x8A, 0x90, 0x85, 0xC8, 0x12, 0xC8, 0x2A, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7A, 0x29, 0xEF, 0x64, 0x01, 0x60, 0x05, 0x75, 0x0E, 0x01, 0x80,
-0x24, 0x90, 0x85, 0xC1, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x0E, 0x02,
-0x80, 0x13, 0x90, 0x85, 0xC7, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x05, 0x75, 0x0E, 0x08, 0x80, 0x05,
-0x12, 0xB3, 0xC0, 0x80, 0x0E, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x0E,
-0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x03, 0x7F, 0x02, 0x02, 0x7B, 0xFD, 0x90,
-0x85, 0xBC, 0x91, 0x0B, 0x30, 0xE0, 0x0A, 0xF1, 0x48, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x02, 0xB1,
-0x7D, 0xF1, 0x48, 0x60, 0x02, 0xF1, 0x4F, 0x22, 0x90, 0x85, 0xC0, 0xE0, 0x64, 0x02, 0x22, 0x90,
-0x85, 0xC5, 0xE0, 0x64, 0x02, 0x60, 0x0F, 0xF1, 0xE4, 0x60, 0x0B, 0x12, 0x7A, 0x29, 0xEF, 0x70,
-0x05, 0xFD, 0x7F, 0x0C, 0xB1, 0x7D, 0x22, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x01, 0x70, 0x1B, 0xF1,
-0xE4, 0x60, 0x0F, 0xE4, 0xFD, 0x7F, 0x0C, 0xB1, 0x7D, 0xE4, 0xFD, 0xFF, 0x12, 0x90, 0xDE, 0x02,
-0x6B, 0x98, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x02, 0xB1, 0x79, 0x22, 0xE0, 0xFF, 0x7D, 0x01, 0xA1,
-0x7D, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x13, 0x13,
-0x54, 0x3F, 0x22, 0x12, 0x7A, 0x29, 0xEF, 0x70, 0x02, 0xF1, 0x67, 0x22, 0x90, 0x05, 0x43, 0xE0,
-0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xAE, 0x07, 0xF1, 0xAC, 0xBF, 0x01, 0x11, 0x90,
-0x85, 0xBC, 0xF1, 0xD6, 0x20, 0xE0, 0x09, 0xAF, 0x06, 0x7D, 0x01, 0xB1, 0x7D, 0x7F, 0x01, 0x22,
-0x7F, 0x00, 0x22, 0x90, 0x86, 0x72, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x85, 0xC9,
-0xE0, 0x44, 0x01, 0xF0, 0x90, 0x85, 0xC3, 0xE0, 0x54, 0x0F, 0x22, 0x81, 0x00, 0xE4, 0xFD, 0xFF,
-0x02, 0x6E, 0x5F, 0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xBC, 0x12,
-0x06, 0xDE, 0x90, 0x85, 0xBC, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0x12, 0x96, 0x41, 0xA3, 0x74, 0x0C,
-0xF0, 0x22, 0x12, 0x02, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x92, 0x8A, 0xE0, 0x54, 0xFE, 0x4F, 0xF0,
-0x22, 0x12, 0x02, 0xF6, 0x90, 0x86, 0x71, 0xF0, 0x22, 0x12, 0xC8, 0x37, 0x90, 0x92, 0x79, 0x12,
-0x8F, 0xFB, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x12, 0x8D, 0x60, 0x90, 0x92, 0x7A, 0x12, 0x8C,
-0x6E, 0x90, 0x92, 0x7B, 0xF0, 0xB1, 0x86, 0x90, 0x92, 0x79, 0xE0, 0x54, 0x01, 0xFF, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x64, 0x01, 0x70, 0x19, 0x11, 0x96, 0x60, 0x09, 0x11, 0x8F,
-0x12, 0x7B, 0xFD, 0xB1, 0x74, 0x80, 0x07, 0x11, 0x8F, 0x12, 0x7B, 0xBF, 0x91, 0x60, 0x12, 0x7A,
-0x8A, 0x80, 0x17, 0x11, 0x96, 0x60, 0x07, 0x11, 0x8F, 0x12, 0x7B, 0xFD, 0x80, 0x05, 0x11, 0x8F,
-0x12, 0x7B, 0xBF, 0xB1, 0x30, 0xB1, 0x5D, 0x12, 0x7A, 0xB9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74,
-0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x22, 0x90, 0x92, 0x7B, 0xE0, 0x90, 0x01, 0x3F, 0x22, 0x91, 0x6E,
-0x64, 0x01, 0x60, 0x02, 0x21, 0x85, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x21, 0x85, 0x90, 0x05,
-0x63, 0xE0, 0x90, 0x92, 0x90, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x92, 0x91, 0xF0, 0x90, 0x05,
-0x61, 0xE0, 0x90, 0x92, 0x92, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x92, 0x93, 0xF0, 0xB1, 0xE7,
-0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEC, 0xF0, 0x31, 0xA9, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0D, 0x90,
-0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x04, 0x51, 0xCA, 0x80, 0x02, 0x51, 0x7D, 0x31, 0xA9, 0x64, 0x01,
-0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x85, 0xCC, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x85,
-0xCB, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90,
-0x85, 0xCC, 0xEF, 0xF0, 0x12, 0xBA, 0x83, 0xE4, 0x90, 0x85, 0xCE, 0xF0, 0x12, 0xC5, 0x37, 0x31,
-0x91, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x5C, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x22,
-0x31, 0xA1, 0x6F, 0x70, 0x4E, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x40, 0xF0, 0xB1, 0x7D, 0x90, 0x01,
-0x3F, 0x11, 0x8F, 0x12, 0x7B, 0xFD, 0x91, 0x67, 0xB1, 0x56, 0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0,
-0x80, 0x31, 0x90, 0x85, 0xC3, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x31, 0xA1, 0xFE,
-0x6F, 0x60, 0x20, 0x90, 0x05, 0x73, 0xE0, 0xFF, 0xEE, 0x6F, 0x60, 0x17, 0x31, 0x91, 0x54, 0x3F,
-0x30, 0xE0, 0x10, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x01, 0x3F, 0x11, 0x8F, 0x12, 0x7B, 0xBF, 0xB1,
-0x5D, 0xB1, 0x30, 0x31, 0x99, 0x90, 0x85, 0xBC, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0x31, 0x99,
-0x22, 0x90, 0x85, 0xC2, 0xE0, 0xFF, 0x13, 0x13, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x04, 0xF0,
-0x22, 0x90, 0x85, 0xCB, 0xE0, 0xFF, 0xA3, 0xE0, 0x22, 0x90, 0x85, 0xC3, 0xE0, 0xFF, 0xC4, 0x54,
-0x0F, 0x22, 0xE4, 0xF5, 0x77, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x41, 0x4F, 0x91, 0x6E, 0x64,
-0x01, 0x60, 0x02, 0x41, 0x4F, 0x12, 0xC7, 0xB9, 0x31, 0xA9, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03,
-0x04, 0x70, 0x1E, 0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x85, 0xCE,
-0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x77,
-0x01, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x03, 0xE4,
-0xF5, 0x77, 0x12, 0x9F, 0xAC, 0xEF, 0x70, 0x02, 0xF5, 0x77, 0xE5, 0x77, 0x60, 0x41, 0x90, 0x85,
-0xC8, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x9D, 0x79, 0xB1, 0x6C, 0x90, 0x85, 0xCE, 0xE0, 0x60, 0x04,
-0x64, 0x01, 0x70, 0x13, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x51, 0x5B, 0x51,
-0x6F, 0x90, 0x85, 0xCE, 0xE0, 0x80, 0x12, 0xE4, 0x90, 0x91, 0x6E, 0x51, 0x50, 0x51, 0x6F, 0x90,
-0x85, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0x51, 0x5B, 0x90, 0x85, 0xDE, 0xF0, 0x22,
-0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x85, 0xCD, 0xE0,
-0x2F, 0x22, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x86, 0x6E, 0xE0, 0x90,
-0x91, 0x6F, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02, 0x61, 0x41, 0xE4, 0xF5, 0x77,
-0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x77, 0x54, 0xC0, 0x70, 0x07, 0x51, 0xC2, 0x54, 0xFD, 0xF0, 0xA1,
-0x90, 0xE5, 0x77, 0x30, 0xE6, 0x19, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x01, 0x70, 0x13, 0x12, 0x9F,
-0xDD, 0x64, 0x02, 0x60, 0x05, 0x12, 0x77, 0x61, 0x80, 0x07, 0x12, 0x79, 0x41, 0x80, 0x02, 0x51,
-0xC2, 0xE5, 0x77, 0x90, 0x85, 0xC9, 0x30, 0xE7, 0x04, 0x51, 0x62, 0xA1, 0x64, 0xE0, 0x54, 0xFD,
-0xF0, 0x22, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x92,
-0x56, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x04, 0x51, 0xC2, 0x80, 0x56, 0xED, 0x30, 0xE6, 0x41,
-0x90, 0x85, 0xC5, 0xE0, 0x64, 0x02, 0x70, 0x28, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0xC3, 0x13, 0x20,
-0xE0, 0x09, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x1C, 0x12, 0x9F, 0xE4, 0x64, 0x01,
-0x70, 0x21, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x62, 0x8E, 0x80, 0x13,
-0x12, 0x9F, 0xDD, 0x64, 0x02, 0x60, 0x05, 0x12, 0x77, 0x61, 0x80, 0x07, 0x12, 0x79, 0x41, 0x80,
-0x02, 0x51, 0xC2, 0x90, 0x92, 0x56, 0xE0, 0x90, 0x85, 0xC9, 0x30, 0xE7, 0x04, 0x51, 0x62, 0xA1,
-0x64, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x85, 0xBE,
-0x74, 0x01, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x61, 0xEE, 0x90, 0x85, 0xDC, 0xE0, 0x04,
-0xF0, 0x90, 0x05, 0x61, 0x91, 0x59, 0x78, 0x08, 0x12, 0x04, 0xD8, 0xA8, 0x04, 0xA9, 0x05, 0xAA,
-0x06, 0xAB, 0x07, 0x90, 0x05, 0x60, 0x91, 0x59, 0x12, 0x87, 0x4B, 0xC0, 0x04, 0xC0, 0x05, 0xC0,
-0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x91, 0x59, 0x78, 0x10, 0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0,
-0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x87, 0x4B, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07,
-0xA3, 0x91, 0x59, 0x78, 0x18, 0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00,
-0x12, 0x87, 0x4B, 0x90, 0x85, 0xFC, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x8B, 0xE0, 0x54,
-0xFE, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x12, 0xBA, 0x76, 0xFB, 0x12, 0x51, 0x7D, 0x90,
-0x92, 0x8B, 0xE0, 0x54, 0xFD, 0xF0, 0x31, 0x91, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x09, 0x90, 0x01,
-0x3B, 0xE0, 0x30, 0xE4, 0x02, 0x91, 0x60, 0x90, 0x93, 0x1C, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94,
-0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x5D,
-0x1F, 0x12, 0x6E, 0x1D, 0xE4, 0x90, 0x88, 0xE0, 0xF0, 0x7F, 0x01, 0x12, 0xB9, 0x13, 0xB1, 0xFD,
-0x12, 0x9F, 0xD3, 0x30, 0xE0, 0x52, 0x90, 0x88, 0x76, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7C, 0x00,
-0x7D, 0x64, 0x12, 0x03, 0x82, 0x90, 0x88, 0xCA, 0xE0, 0x6E, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x60,
-0x0A, 0x90, 0x88, 0xCA, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x07, 0x0A, 0x90, 0x88, 0x7A, 0xE0, 0xFE,
-0xA3, 0xE0, 0xFF, 0x90, 0x88, 0x88, 0xE0, 0xB5, 0x06, 0x14, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0xEF,
-0x4E, 0x60, 0x0B, 0x90, 0x01, 0xC7, 0x74, 0x31, 0xF0, 0x7F, 0x01, 0x02, 0x5F, 0xE9, 0x12, 0xC2,
-0x4A, 0xE4, 0x90, 0x88, 0xCA, 0xF0, 0xA3, 0xF0, 0x22, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22,
-0x7D, 0x02, 0x7F, 0x02, 0x12, 0x7C, 0x41, 0x7D, 0x01, 0x7F, 0x02, 0x02, 0x7C, 0x41, 0xE4, 0xFF,
-0x12, 0x77, 0x39, 0xEF, 0x22, 0xE4, 0x90, 0x92, 0x67, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x4F,
-0x91, 0x6E, 0x64, 0x01, 0x70, 0x49, 0xB1, 0x7D, 0x12, 0xC7, 0xB9, 0x90, 0x92, 0x67, 0x74, 0x01,
-0xF0, 0xE4, 0x90, 0x85, 0xCC, 0xF0, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x85, 0xC0,
-0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0x92, 0x67, 0xF0, 0x12, 0x9F, 0xAC, 0xEF, 0x70, 0x04, 0x90,
-0x92, 0x67, 0xF0, 0x90, 0x92, 0x67, 0xE0, 0x60, 0x16, 0x90, 0x85, 0xC8, 0xE0, 0x20, 0xE2, 0x03,
-0x12, 0x9D, 0x79, 0xB1, 0x6C, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCD, 0x51, 0x6E, 0x22,
-0x31, 0x91, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0,
-0x02, 0xB1, 0x56, 0xB1, 0xF3, 0x30, 0xE0, 0x08, 0xB1, 0xBD, 0x54, 0x07, 0x70, 0x39, 0x80, 0x35,
-0xF1, 0xA1, 0x40, 0x31, 0x91, 0x6E, 0x64, 0x01, 0x70, 0x2D, 0x12, 0x9F, 0xE4, 0x70, 0x05, 0x12,
-0x70, 0xDB, 0x80, 0x24, 0x12, 0x70, 0xDB, 0x90, 0x85, 0xCF, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94,
-0x02, 0x40, 0x09, 0xB1, 0x28, 0xE4, 0x90, 0x85, 0xCF, 0xF0, 0x80, 0x03, 0x12, 0x79, 0x41, 0xE4,
-0x90, 0x85, 0xCE, 0xF0, 0x22, 0xB1, 0x90, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xFB, 0xF0, 0x22,
-0x7D, 0x02, 0x7F, 0x02, 0x02, 0x7C, 0xA9, 0x91, 0x75, 0xB1, 0x30, 0x90, 0x92, 0x79, 0xE0, 0x30,
-0xE0, 0x13, 0xB1, 0x74, 0x90, 0x92, 0x7C, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x7A, 0x8A, 0xB1,
-0x86, 0xE4, 0xFF, 0x11, 0x4E, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x7C, 0x41, 0x7D, 0x01, 0x7F,
-0x02, 0x02, 0x7C, 0xA9, 0x90, 0x85, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x85, 0xC9, 0xE0,
-0x44, 0x10, 0xF0, 0x22, 0x90, 0x92, 0x7B, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x85, 0xCB,
-0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x92, 0x7A, 0xE0, 0x14, 0x90, 0x92, 0x7C, 0xF0, 0x22,
-0x90, 0x85, 0xBC, 0xE0, 0x90, 0x85, 0xC7, 0x30, 0xE0, 0x05, 0xE0, 0xFF, 0x02, 0x9F, 0xB8, 0x02,
-0x9F, 0x8B, 0x91, 0x6E, 0x64, 0x01, 0x70, 0x14, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0E, 0xB1, 0xE7,
-0x90, 0x85, 0xC1, 0xE0, 0xB1, 0xBE, 0x54, 0x07, 0x70, 0x02, 0xB1, 0x90, 0x22, 0xEF, 0x54, 0xFB,
-0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x17, 0xB1,
-0xEA, 0xB1, 0xF3, 0x30, 0xE0, 0x02, 0x80, 0xE5, 0xF1, 0xA1, 0x40, 0x0A, 0xE4, 0xFF, 0x12, 0x77,
-0x39, 0xBF, 0x01, 0x02, 0xB1, 0x28, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74,
-0x02, 0xF0, 0x22, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0x92, 0x79,
-0xE0, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x02, 0x91, 0x60, 0x22, 0x90, 0x85,
-0xC5, 0xE0, 0x60, 0x0F, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x6B, 0x98, 0x12, 0xC8,
-0xA9, 0xB1, 0x90, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF, 0x01, 0x0E, 0x90, 0x85, 0xC5, 0xE0,
-0x60, 0x08, 0x51, 0xC2, 0x54, 0x07, 0x70, 0x02, 0xB1, 0x90, 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, 0x3B, 0xF0, 0x74, 0xA6,
-0xA3, 0xF0, 0x12, 0x71, 0x90, 0xE5, 0x4C, 0x30, 0xE1, 0x02, 0xF1, 0xD5, 0xE5, 0x4C, 0x30, 0xE3,
-0x03, 0x12, 0xB9, 0x29, 0xE5, 0x4C, 0x30, 0xE4, 0x03, 0x12, 0xB9, 0x22, 0xE5, 0x4C, 0x30, 0xE5,
-0x03, 0x12, 0xBF, 0x4B, 0xE5, 0x4C, 0x30, 0xE6, 0x03, 0x12, 0xBD, 0xCF, 0xE5, 0x4E, 0x30, 0xE0,
-0x02, 0xD1, 0xFC, 0xE5, 0x4E, 0x30, 0xE1, 0x02, 0x71, 0x36, 0xE5, 0x4E, 0x30, 0xE2, 0x03, 0x12,
-0xBD, 0xDC, 0xE5, 0x4E, 0x30, 0xE3, 0x02, 0xF1, 0x15, 0xE5, 0x4E, 0x30, 0xE4, 0x02, 0xB1, 0xA2,
-0xE5, 0x4E, 0x30, 0xE5, 0x03, 0x12, 0xBE, 0x0B, 0xE5, 0x4E, 0x30, 0xE6, 0x02, 0xD1, 0x24, 0xE5,
-0x4F, 0x30, 0xE1, 0x03, 0x12, 0xBE, 0x27, 0xE5, 0x4F, 0x30, 0xE4, 0x03, 0x12, 0xBF, 0x87, 0xE5,
-0x4F, 0x30, 0xE5, 0x02, 0xF1, 0x2E, 0x74, 0x3B, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xA6, 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, 0x85, 0xBC, 0xE0,
-0x30, 0xE0, 0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0,
-0x02, 0xF1, 0xBA, 0x21, 0xB2, 0x91, 0x6E, 0x64, 0x01, 0x70, 0x12, 0x90, 0x85, 0xC5, 0xE0, 0x60,
-0x0C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x51, 0x65, 0x22, 0xE4, 0xF5,
-0x77, 0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE5, 0x77, 0xC3, 0x9F, 0x50, 0x64, 0xAF, 0x77, 0x12, 0x77,
-0x39, 0xEF, 0x60, 0x58, 0xE5, 0x77, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x77, 0x54, 0x07,
-0xFE, 0x74, 0x75, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x12,
-0xA9, 0x9B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x60,
-0x2B, 0xE5, 0x77, 0x12, 0xC8, 0x1C, 0x20, 0xE7, 0x02, 0x80, 0x13, 0xE5, 0x77, 0xC4, 0x54, 0xF0,
-0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01,
-0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x05, 0xAD, 0x77, 0x12, 0x97, 0x07, 0x05, 0x77, 0x80, 0x91,
-0x22, 0x90, 0x85, 0xCE, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x86,
-0x6D, 0xE0, 0xFF, 0x90, 0x85, 0xCE, 0xE0, 0xD3, 0x9F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x12, 0x9F, 0xAC, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0xB4, 0x03,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0x90, 0x92, 0x56, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0,
-0xFF, 0xA3, 0xE0, 0x90, 0x92, 0x66, 0xF0, 0xE0, 0xFE, 0x6F, 0x60, 0x66, 0x90, 0x92, 0x57, 0x74,
-0x03, 0xF0, 0x90, 0x92, 0x65, 0x74, 0x08, 0xF0, 0xEE, 0x04, 0x54, 0x0F, 0xFF, 0xE4, 0xFE, 0xEF,
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2E,
-0x11, 0x53, 0xE0, 0xFD, 0x74, 0x59, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xED, 0xF0,
-0x0E, 0xEE, 0xB4, 0x08, 0xDA, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x57, 0x12, 0x5E, 0x10, 0x90, 0x92,
-0x66, 0xE0, 0x04, 0x54, 0x0F, 0xFF, 0xF0, 0xBF, 0x0F, 0x02, 0xE4, 0xF0, 0x90, 0x92, 0x66, 0xE0,
-0x90, 0x04, 0x7F, 0xF0, 0x90, 0x92, 0x56, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, 0xB9, 0x13, 0x12,
-0x87, 0xBB, 0x22, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54,
-0x0F, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x92, 0x01, 0xE0, 0xFD, 0x70, 0x02, 0x21, 0x68, 0x90, 0x85,
-0x1D, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x85,
-0x1E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01,
-0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x93, 0x17, 0xE0, 0x31, 0x9A, 0x08, 0x80, 0x05, 0xC3,
-0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, 0x4B, 0xE4, 0x90, 0x92,
-0x02, 0xF0, 0x90, 0x92, 0x02, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x40, 0x31, 0x6A, 0xA4, 0xFF,
-0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x31, 0x72, 0x90, 0x84,
-0xCD, 0x12, 0x05, 0x28, 0xE5, 0x82, 0x29, 0x11, 0x53, 0xEF, 0x31, 0x69, 0xA4, 0x2D, 0xFF, 0xEC,
-0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x31, 0x72, 0x90, 0x84, 0xD1, 0x12, 0x05, 0x28, 0xE5, 0x82, 0x29,
-0x11, 0x53, 0xEF, 0xF0, 0x90, 0x92, 0x02, 0xE0, 0x04, 0xF0, 0x80, 0xB6, 0x90, 0x92, 0x01, 0xE0,
-0xFF, 0x90, 0x93, 0x17, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8,
-0xFC, 0xF4, 0x5F, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07,
-0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0x04,
-0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x85, 0x1E, 0xF1, 0xB5, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF,
-0x70, 0x02, 0x01, 0x65, 0xE4, 0x90, 0x85, 0x1E, 0xF0, 0x01, 0x65, 0x90, 0x01, 0xC0, 0xE0, 0x44,
-0x02, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0x31, 0x69, 0x90, 0x01, 0xD0,
-0x12, 0x05, 0x28, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0x75, 0xF0,
-0x04, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x85, 0x1E, 0xE0,
-0x75, 0xF0, 0x08, 0x22, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x24, 0x75, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
-0xF5, 0x83, 0xE0, 0xFD, 0x7C, 0x00, 0xE5, 0x62, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8,
-0x07, 0x22, 0xE4, 0xF5, 0x73, 0xEF, 0x14, 0xF5, 0x72, 0xED, 0xFF, 0xE5, 0x72, 0xF5, 0x82, 0x33,
-0x95, 0xE0, 0xF5, 0x83, 0xC3, 0xE5, 0x82, 0x9F, 0x74, 0x80, 0xF8, 0x65, 0x83, 0x98, 0x40, 0x51,
-0xE5, 0x72, 0x78, 0x03, 0xA2, 0xE7, 0x13, 0xD8, 0xFB, 0xFF, 0x33, 0x95, 0xE0, 0xFE, 0xEB, 0xF1,
-0xE0, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE5, 0x83, 0x3E, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83,
-0x00, 0xE5, 0x72, 0x31, 0x98, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF,
-0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x13, 0x85, 0x72, 0x74, 0x05, 0x73, 0x90,
-0x92, 0x3E, 0xE0, 0x65, 0x73, 0x60, 0x0A, 0xE5, 0x74, 0xD3, 0x9D, 0x40, 0x04, 0x15, 0x72, 0x80,
-0x98, 0xAF, 0x74, 0x22, 0x7D, 0x01, 0xAF, 0x62, 0xAC, 0x05, 0x90, 0x92, 0x39, 0xEF, 0xF0, 0xFD,
-0xE0, 0xFF, 0x12, 0x8F, 0x5E, 0xE0, 0xF5, 0x6E, 0x54, 0x7F, 0xF5, 0x70, 0x75, 0xF0, 0x12, 0xEF,
-0x90, 0x89, 0x3D, 0x12, 0x05, 0x28, 0xE0, 0xF9, 0x90, 0x92, 0x39, 0xE0, 0xF1, 0xD5, 0xFE, 0xEF,
-0x12, 0x91, 0xDB, 0xE0, 0x54, 0x03, 0xF5, 0x6F, 0xE5, 0x70, 0x90, 0x83, 0x1D, 0x93, 0xFB, 0xED,
-0x71, 0x08, 0xE4, 0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x8B, 0x07, 0xC4, 0x54, 0x03, 0x90, 0x92, 0x3A,
-0xF0, 0x74, 0xCC, 0x2D, 0x51, 0xEA, 0xE5, 0x70, 0xF0, 0x74, 0x4C, 0x2D, 0xF1, 0xC4, 0xE5, 0x6F,
-0xF0, 0xE5, 0x70, 0xD3, 0x9E, 0x40, 0x06, 0x8E, 0x70, 0xAF, 0x06, 0x8F, 0x6E, 0x8C, 0x71, 0xE4,
-0xFF, 0xEF, 0xC3, 0x95, 0x71, 0x50, 0x2F, 0xE5, 0x6E, 0x30, 0xE7, 0x09, 0x85, 0x70, 0x6E, 0x1C,
-0xEC, 0x70, 0x20, 0x80, 0x21, 0xE5, 0x70, 0xD3, 0x99, 0x40, 0x14, 0xAD, 0x01, 0x90, 0x92, 0x39,
-0xE0, 0xFB, 0x90, 0x92, 0x3E, 0xEC, 0xF0, 0xAF, 0x70, 0x31, 0xA2, 0x8F, 0x6E, 0x80, 0x07, 0x89,
-0x6E, 0x80, 0x03, 0x0F, 0x80, 0xCB, 0x90, 0x92, 0x39, 0xE0, 0xFF, 0x12, 0x8F, 0xC5, 0xEF, 0xF0,
-0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x6E, 0xF1, 0xBC, 0x91, 0x0F, 0x7B, 0x01, 0xFA, 0x7D, 0x05, 0x7F,
-0x08, 0x12, 0x96, 0x88, 0x90, 0x92, 0x39, 0xE0, 0xFF, 0x90, 0x91, 0x0B, 0xE5, 0x6F, 0xF0, 0xE4,
-0xFB, 0xAD, 0x6E, 0x02, 0x27, 0x3D, 0x74, 0xCC, 0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5,
-0x83, 0x22, 0xE5, 0x71, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4,
-0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x6E, 0x25, 0xE0, 0x24, 0x7B, 0xF5, 0x82, 0xE4, 0x34,
-0x8F, 0xF5, 0x83, 0x22, 0x90, 0x92, 0x39, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEB,
-0x75, 0xF0, 0x06, 0xA4, 0xFF, 0x90, 0x89, 0x21, 0x12, 0x87, 0x70, 0xE9, 0x2F, 0xF9, 0xEA, 0x35,
-0xF0, 0xFA, 0x90, 0x92, 0x41, 0x12, 0x87, 0x79, 0x90, 0x92, 0x3B, 0xE0, 0x71, 0x08, 0xE0, 0xFF,
-0xA3, 0xE0, 0x90, 0x92, 0x3E, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x92, 0x41,
-0x12, 0x87, 0x70, 0x90, 0x92, 0x40, 0xE0, 0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x12, 0x03, 0x0F,
-0xFD, 0x7C, 0x00, 0x90, 0x92, 0x3B, 0xE0, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x44, 0x12, 0x05, 0x28,
-0x75, 0xF0, 0x02, 0xEF, 0x91, 0x07, 0xFF, 0x90, 0x92, 0x3D, 0xE0, 0xFB, 0xEF, 0xA8, 0x03, 0x08,
-0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x71, 0xF7, 0xEE, 0x8F, 0xF0, 0x12, 0x07,
-0x0A, 0x90, 0x92, 0x40, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x05, 0xB2, 0x90, 0x92, 0x41, 0x12, 0x87,
-0x70, 0x90, 0x00, 0x05, 0x12, 0x03, 0x0F, 0xFD, 0x7C, 0x00, 0x90, 0x92, 0x3D, 0xE0, 0xFF, 0x90,
-0x92, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13,
-0xD8, 0xF9, 0x71, 0xF7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x9E, 0x40, 0x08, 0xED,
-0x9F, 0xFF, 0xEC, 0x9E, 0xFE, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x00, 0x90, 0x92, 0x3E, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x3E, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x3B, 0xE0, 0x71,
-0x08, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xFF, 0x12, 0x03, 0x70, 0x90, 0x92, 0x3E, 0x22, 0x75,
-0xF0, 0x12, 0xE5, 0x62, 0x90, 0x89, 0x40, 0x12, 0x05, 0x28, 0xE0, 0xFE, 0xA3, 0xE0, 0x22, 0xF0,
-0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x92,
-0xEA, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0x91, 0x0F, 0x90, 0x92, 0xF2, 0xF0, 0xA3,
-0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x16, 0xF0, 0x74, 0xAC, 0xA3, 0xF0, 0x90, 0x01, 0x1F,
-0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xF1, 0x57, 0xEC, 0x3E, 0x90, 0x92, 0xE1, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x02, 0x87, 0xE0, 0x90, 0x92, 0xE9, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0x20, 0xE0, 0x02, 0xC1,
-0xFD, 0xE4, 0x90, 0x92, 0xE8, 0xF0, 0x90, 0x92, 0xE9, 0xE0, 0xFF, 0x90, 0x92, 0xE8, 0xE0, 0xC3,
-0x9F, 0x40, 0x02, 0xC1, 0xFD, 0x90, 0x92, 0xE1, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90,
-0xFD, 0x11, 0xF0, 0x90, 0x92, 0xF2, 0xEF, 0xF0, 0xF1, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xF1, 0x44,
-0xF1, 0xCC, 0x54, 0x3F, 0xFE, 0x90, 0x92, 0xE3, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0xEE, 0xEE,
-0xF0, 0xA3, 0xF1, 0xA7, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0xF1, 0x9B, 0x54, 0x03,
-0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x92, 0xF3, 0xF0, 0x90, 0x92, 0xE2, 0xE0, 0x2F, 0xFF,
-0x90, 0x92, 0xE1, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x92, 0xE5, 0xF1, 0x29, 0xC0, 0x07, 0xF1, 0x0E,
-0x7D, 0x01, 0x12, 0x55, 0x36, 0xC0, 0x07, 0xF1, 0x0E, 0x7D, 0x04, 0x12, 0x55, 0x36, 0xAB, 0x07,
-0xD0, 0x05, 0xD0, 0x07, 0x12, 0x5D, 0x98, 0x90, 0x92, 0xEA, 0xEF, 0xF1, 0x0D, 0xE4, 0xFD, 0x12,
-0x55, 0x36, 0xEF, 0x54, 0xFC, 0x90, 0x92, 0xE7, 0xF0, 0x90, 0x92, 0xF3, 0xE0, 0xFF, 0x90, 0x92,
-0xE3, 0xE4, 0x8F, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x92, 0xE3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12,
-0x7A, 0xD0, 0x90, 0x92, 0xE3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xF1, 0x3B, 0x7D, 0x0F, 0x12, 0x55,
-0x36, 0x90, 0x92, 0xE3, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x92, 0xE1, 0xEC, 0x8D, 0xF0, 0x12,
-0x07, 0x0A, 0x90, 0x85, 0xB7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x92, 0xE2, 0xE0, 0x9D,
-0x90, 0x92, 0xE1, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x85, 0xB8, 0xE0, 0x24, 0x01, 0xFD, 0x90, 0x85,
-0xB7, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x92, 0xE2, 0xE0, 0x9D, 0xF0, 0x90, 0x92, 0xE1, 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, 0x92, 0xE7, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x2C, 0x90, 0x86, 0x75, 0xE0,
-0xFF, 0x12, 0x8D, 0x59, 0x20, 0xE0, 0x02, 0xC1, 0x81, 0x90, 0x86, 0x87, 0xE0, 0x04, 0xF1, 0x0D,
-0x12, 0x59, 0x20, 0xEF, 0x70, 0x02, 0xC1, 0x81, 0x90, 0x92, 0xE7, 0xE0, 0xFF, 0x12, 0x7B, 0x77,
-0x90, 0x86, 0x88, 0xE0, 0x04, 0xF0, 0xC1, 0x81, 0x12, 0x9F, 0xD3, 0x30, 0xE0, 0x5A, 0x90, 0x92,
-0xEA, 0xE0, 0xFF, 0x90, 0x92, 0xE6, 0xE0, 0x2F, 0xFF, 0x90, 0x92, 0xE5, 0xE0, 0x34, 0x00, 0xCF,
-0x24, 0x08, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x92, 0xF0, 0xF1, 0x29, 0xEF, 0x64, 0x45, 0x70, 0x38,
-0xF1, 0x18, 0x12, 0xC7, 0x5A, 0xEF, 0x64, 0x01, 0x70, 0x2E, 0xF1, 0x18, 0x12, 0xC7, 0x1D, 0xEF,
-0x64, 0x01, 0x70, 0x24, 0x90, 0x92, 0xF4, 0x04, 0xF1, 0x17, 0xA3, 0xE0, 0xFD, 0x12, 0xC6, 0x76,
-0xEF, 0x70, 0x0D, 0x90, 0x92, 0xF2, 0xE0, 0xFD, 0x90, 0xFD, 0x11, 0xF1, 0x17, 0x12, 0xC6, 0xCE,
-0x90, 0x92, 0xF2, 0xE0, 0x90, 0xFD, 0x11, 0xF0, 0xF1, 0x0E, 0x12, 0x59, 0x20, 0xEF, 0x60, 0x18,
-0xF1, 0x0E, 0x90, 0x92, 0xEA, 0xE0, 0xFD, 0x90, 0x92, 0xED, 0xE0, 0xFB, 0x12, 0x54, 0x02, 0xEF,
-0x60, 0x06, 0x90, 0x92, 0xF4, 0x74, 0x01, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0xC3, 0x13, 0x30, 0xE0,
-0x13, 0xF1, 0x0E, 0x90, 0x92, 0xEA, 0xE0, 0xFD, 0x12, 0x38, 0x10, 0xEF, 0x60, 0x06, 0x90, 0x92,
-0xF4, 0x74, 0x01, 0xF0, 0x12, 0x8F, 0xDF, 0x54, 0x3F, 0x30, 0xE0, 0x0A, 0xF1, 0x0E, 0x90, 0x92,
-0xEA, 0xE0, 0xFD, 0x12, 0x21, 0xB6, 0x90, 0x86, 0x72, 0xE0, 0xFF, 0x12, 0x8D, 0x59, 0x30, 0xE0,
-0x10, 0x90, 0x92, 0xF4, 0xE0, 0x70, 0x0A, 0xF1, 0x0E, 0x90, 0x92, 0xEA, 0xE0, 0xFD, 0x12, 0x4A,
-0x3F, 0x12, 0x79, 0x00, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x10,
-0xF1, 0x32, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x5F, 0xE9,
-0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x02, 0xF1, 0x21, 0x12, 0x7A, 0xE7, 0xEF, 0x64, 0x01, 0x70,
-0x36, 0x90, 0x86, 0x89, 0xE0, 0x04, 0xF0, 0x12, 0x6F, 0xE5, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60,
-0x1F, 0xF1, 0x21, 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, 0x5F, 0xE9, 0x80, 0x1D,
-0xF1, 0x3B, 0x12, 0x7C, 0x0B, 0x80, 0x0E, 0xF1, 0x32, 0x20, 0xE0, 0x11, 0x90, 0x86, 0x72, 0xE0,
-0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x92, 0xE8, 0xE0, 0x04, 0xF0, 0x81, 0x66, 0x74, 0x16, 0x04,
-0x90, 0x01, 0xC4, 0xF0, 0x74, 0xAC, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x92,
-0xE5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xF0, 0x90, 0x92, 0xF0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
-0x22, 0x90, 0x86, 0x7A, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x02,
-0x55, 0x36, 0x90, 0x86, 0x74, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x90, 0x92, 0xE1, 0xE0, 0xFE,
-0xA3, 0xE0, 0xFF, 0x22, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0x90,
-0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0x22, 0xE4, 0xFC,
-0xED, 0x2C, 0x24, 0x00, 0xF1, 0x47, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, 0xF1, 0x44, 0xEF,
-0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0xF1, 0x92, 0xF5, 0x83, 0xF1, 0xA7, 0x54, 0xF0, 0xF0, 0xF1, 0x9B,
-0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10,
-0xF0, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0x22, 0x74, 0x03, 0x2D, 0xF5, 0x82,
-0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
-0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0xF0, 0xA3, 0xE4, 0xF0,
-0xA3, 0xE5, 0x6F, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x22, 0xE0, 0x7A, 0x00, 0x24,
-0x00, 0xFF, 0xEA, 0x3E, 0x22, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x3C, 0x12, 0x05, 0x28, 0xE0, 0x22,
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x1E, 0xE0, 0xFF, 0x90, 0x85, 0x1D, 0xE0, 0xB5, 0x07,
-0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x48, 0x90, 0x85, 0x1D, 0xE0, 0xFE, 0x75,
-0xF0, 0x08, 0x90, 0x84, 0xCD, 0x12, 0x05, 0x28, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24,
-0xCE, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x88, 0xD7, 0x90, 0x85,
-0x1D, 0x12, 0xAF, 0xB5, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85, 0x1D,
-0xF0, 0x7D, 0x68, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x12, 0x40, 0xB9, 0x90, 0x84, 0xC1, 0xE0, 0x44,
-0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x85, 0xB5, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0,
-0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x85, 0xB6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01,
-0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xC0,
-0x01, 0x90, 0x85, 0xB6, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x1F, 0xF9, 0x74, 0x85, 0x35, 0xF0,
-0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x02, 0xD0, 0x7D, 0xCC,
-0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xB6, 0x12, 0xAF, 0xB5, 0xB4, 0x0A, 0x02, 0x7F, 0x01,
-0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85, 0xB6, 0xF0, 0x22, 0x90, 0x92, 0x21, 0xEF, 0xF0, 0xA3, 0x12,
-0x87, 0x79, 0x90, 0x93, 0x18, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x03, 0x4E,
-0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01,
-0x90, 0x92, 0x22, 0x12, 0x87, 0x70, 0x8B, 0x1B, 0x8A, 0x1C, 0x89, 0x1D, 0x75, 0x1E, 0x02, 0xD0,
-0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x6A, 0x21, 0x90, 0x92, 0x21, 0xE0, 0x24, 0x02, 0xF9, 0xE4,
-0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x87, 0x70, 0xE9,
-0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x1B, 0xF5, 0x1C, 0x89, 0x1D, 0x90, 0x92, 0x22, 0x31, 0x2B,
-0xF5, 0x1E, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x6A, 0x21, 0x12, 0x87, 0x70, 0x90, 0x00,
-0x0E, 0x02, 0x03, 0x0F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x25, 0x12, 0x87,
-0x79, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x66, 0x80, 0xEF, 0x60, 0x48, 0x12, 0xAF, 0x4F, 0xEC, 0x3E,
-0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x92, 0x28, 0xEF, 0xF0, 0xEE, 0xFF, 0x90,
-0xFD, 0x11, 0xF0, 0x90, 0x92, 0x28, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
-0x92, 0x25, 0x31, 0x2B, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x5A, 0xA5, 0x90, 0x92, 0x28,
-0xE0, 0x24, 0x18, 0xFF, 0x90, 0x92, 0x25, 0x12, 0x87, 0x70, 0x12, 0x56, 0xF4, 0x90, 0x02, 0x96,
-0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x02, 0x8B, 0x13, 0xE4, 0x90, 0x92, 0x2B, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x92, 0x2B, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x9B, 0x90, 0x01, 0xC4,
-0xF0, 0x74, 0xB1, 0xA3, 0xF0, 0x12, 0x7C, 0x66, 0xBF, 0x01, 0x03, 0x12, 0x5B, 0x25, 0x90, 0x85,
-0xC5, 0xE0, 0x60, 0x0F, 0x90, 0x85, 0xC8, 0xE0, 0xFF, 0x90, 0x85, 0xC7, 0xE0, 0x6F, 0x60, 0x03,
-0x12, 0xA5, 0x90, 0xC2, 0xAF, 0xF1, 0x2F, 0xBF, 0x01, 0x02, 0x51, 0x04, 0xD2, 0xAF, 0x71, 0x5C,
-0x90, 0x92, 0x2C, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x54, 0x7F, 0x45, 0xF0, 0x70, 0x0D,
-0x7F, 0xFF, 0x12, 0x7B, 0x51, 0xEF, 0x04, 0xFD, 0x7F, 0xFF, 0x12, 0x7B, 0x3E, 0x31, 0x98, 0x12,
-0x84, 0x4D, 0x80, 0xA0, 0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x85, 0xBC, 0xE0, 0xFF,
-0x30, 0xE0, 0x0E, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xD1, 0x74, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80,
-0x00, 0x51, 0x24, 0x22, 0x90, 0x85, 0xC8, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0D, 0x71, 0x0D,
-0xBF, 0x01, 0x08, 0x51, 0x3C, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x51, 0xBB, 0x51, 0x4C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x10, 0x7F, 0x08,
-0x12, 0x7B, 0x51, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x7B, 0x3E, 0xE4, 0xFF, 0x51, 0x6F,
-0x7D, 0x35, 0x7F, 0x27, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90,
-0x93, 0x11, 0xEF, 0x12, 0xAC, 0x0F, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F,
-0x01, 0x90, 0x93, 0x11, 0xE0, 0x6F, 0x60, 0x32, 0xC3, 0x90, 0x93, 0x13, 0xE0, 0x94, 0x88, 0x90,
-0x93, 0x12, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90,
-0x93, 0x12, 0xD1, 0x81, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x12, 0xE0, 0x94,
-0x00, 0x40, 0xC3, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xBC, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x44,
-0x10, 0xF0, 0x90, 0x85, 0xD0, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xC6, 0xE0,
-0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01,
-0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12,
-0x7B, 0x3E, 0x7F, 0x01, 0x51, 0x6F, 0x7D, 0x34, 0x7F, 0x27, 0x12, 0x7B, 0x3E, 0x7F, 0x90, 0x71,
-0xC8, 0x7F, 0x90, 0x12, 0x7B, 0x3E, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0x90, 0x92, 0x79,
-0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x2A, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x02, 0x80, 0x08, 0x90, 0x01,
-0x00, 0xE0, 0x64, 0x3F, 0x60, 0x05, 0x75, 0x61, 0x01, 0x80, 0x22, 0x90, 0x02, 0x86, 0xE0, 0x20,
-0xE1, 0x02, 0x80, 0x07, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE3, 0x05, 0x75, 0x61, 0x04, 0x80, 0x0D,
-0x90, 0x04, 0x1D, 0xE0, 0x60, 0x05, 0x75, 0x61, 0x40, 0x80, 0x02, 0x80, 0x73, 0x90, 0x01, 0xB9,
-0x74, 0x08, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x61, 0xF0, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x85, 0xE0, 0x60, 0x25, 0x7F, 0x54, 0x7E, 0x09, 0x12, 0x70, 0x61,
-0x71, 0xB4, 0xEF, 0x44, 0xFE, 0xFF, 0xEE, 0x44, 0x03, 0xFE, 0xED, 0x44, 0x04, 0xFD, 0xEC, 0x71,
-0xB4, 0x90, 0x91, 0x66, 0x12, 0x04, 0xEB, 0x7F, 0x54, 0x7E, 0x09, 0x12, 0x71, 0x18, 0x90, 0x92,
-0x80, 0xE0, 0x70, 0x04, 0x90, 0x07, 0xCC, 0xF0, 0x90, 0x92, 0x88, 0xE0, 0x70, 0x0A, 0x90, 0x92,
-0x85, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x07, 0x90, 0x00, 0x1F, 0xE0, 0x54, 0xF0, 0xF0, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x92, 0x2E, 0x12, 0x04, 0xEB, 0x90, 0x92, 0x2E, 0x02, 0x87, 0x58,
-0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x01, 0xFD, 0x22,
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x02, 0x71, 0xC8, 0x7F, 0x02, 0xD1, 0x6C, 0x44,
-0x02, 0xF0, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06,
-0xB4, 0x74, 0x86, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x90, 0xD8, 0x90, 0x85, 0xBF, 0x74,
-0x01, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0xBF, 0xE0, 0x90, 0x93,
-0x1E, 0xF0, 0x6F, 0x70, 0x02, 0xA1, 0x0A, 0xEF, 0x14, 0x60, 0x42, 0x14, 0x60, 0x6C, 0x14, 0x70,
-0x02, 0x81, 0xB6, 0x14, 0x70, 0x02, 0x81, 0xE1, 0x24, 0x04, 0x60, 0x02, 0xA1, 0x0A, 0x90, 0x93,
-0x1E, 0xE0, 0xB4, 0x04, 0x04, 0xB1, 0x1E, 0xA1, 0x0A, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x02, 0x04,
-0xB1, 0x0F, 0xA1, 0x0A, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0x35, 0xA1, 0x0A, 0x90,
-0x93, 0x1E, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x0A, 0xB1, 0x11, 0xA1, 0x0A, 0x90, 0x93, 0x1E,
-0xE0, 0xB4, 0x04, 0x04, 0xB1, 0x22, 0xA1, 0x0A, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x02, 0x04, 0x71,
-0xF9, 0xA1, 0x0A, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0x39, 0xA1, 0x0A, 0x90, 0x93,
-0x1E, 0xE0, 0x60, 0x02, 0xA1, 0x0A, 0xB1, 0x66, 0xA1, 0x0A, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x04,
-0x04, 0xB1, 0x8B, 0x80, 0x75, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x01, 0x05, 0x12, 0x97, 0xED, 0x80,
-0x69, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0x83, 0x80, 0x5E, 0x90, 0x93, 0x1E, 0xE0,
-0x70, 0x58, 0xB1, 0x86, 0x80, 0x54, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x04, 0x04, 0xB1, 0x41, 0x80,
-0x49, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x01, 0x04, 0xB1, 0x7A, 0x80, 0x3E, 0x90, 0x93, 0x1E, 0xE0,
-0xB4, 0x02, 0x04, 0xB1, 0x2C, 0x80, 0x33, 0x90, 0x93, 0x1E, 0xE0, 0x70, 0x2D, 0xB1, 0x78, 0x80,
-0x29, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0x92, 0x80, 0x1E, 0x90, 0x93, 0x1E, 0xE0,
-0xB4, 0x01, 0x04, 0xB1, 0x6A, 0x80, 0x13, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x02, 0x04, 0xB1, 0x4C,
-0x80, 0x08, 0x90, 0x93, 0x1E, 0xE0, 0x70, 0x02, 0xB1, 0x68, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x71,
-0xF9, 0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x85, 0xBF, 0xF0, 0x22, 0xB1, 0x22,
-0x80, 0xEF, 0xE4, 0xFD, 0xFF, 0xB1, 0x5E, 0x44, 0x40, 0xF0, 0x61, 0xFC, 0x71, 0xD0, 0x90, 0x85,
-0xBF, 0x74, 0x03, 0xF0, 0x22, 0xB1, 0x39, 0x80, 0xD8, 0xE4, 0xFD, 0xFF, 0x12, 0x90, 0xDE, 0x61,
-0xFC, 0x7D, 0x22, 0x7F, 0xFF, 0xB1, 0x5E, 0x44, 0x40, 0xF0, 0x80, 0xE2, 0x71, 0xD0, 0x7D, 0x24,
-0xB1, 0x5C, 0x54, 0xBF, 0xF0, 0x90, 0x85, 0xBF, 0x74, 0x04, 0xF0, 0x22, 0x7F, 0x6F, 0x12, 0x90,
-0xDE, 0x90, 0x05, 0x27, 0xE0, 0x22, 0x61, 0xFC, 0xB1, 0x66, 0x7D, 0x1F, 0xB1, 0x5C, 0x54, 0xBF,
-0xF0, 0x90, 0x85, 0xBF, 0x74, 0x04, 0xF0, 0x22, 0xB1, 0x66, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x90,
-0xDE, 0x80, 0xAB, 0x02, 0x97, 0xF3, 0xB1, 0x66, 0x02, 0x97, 0xED, 0xD1, 0x64, 0x7D, 0x23, 0x02,
-0x97, 0xEF, 0x7D, 0x25, 0xB1, 0x5C, 0x54, 0xBF, 0xF0, 0x90, 0x85, 0xBF, 0x74, 0x04, 0xF0, 0x22,
-0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x02, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0xFE, 0xFD,
-0x7F, 0x02, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x08,
-0xF0, 0x90, 0x01, 0x01, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0xEF, 0x60, 0x49, 0x90, 0x88, 0xCE, 0xE0, 0xFF, 0x60, 0x03, 0x12, 0x7B,
-0x8A, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x12, 0xAF, 0x4F, 0xEC, 0x3E, 0x90, 0x85, 0xB7, 0xF0, 0xA3,
-0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x7F, 0xFF, 0x12, 0x90, 0xDE,
-0xB1, 0xA0, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x72, 0x79, 0xD1, 0x3D, 0x12, 0x90,
-0xD8, 0x12, 0x76, 0xE6, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x02, 0x7C, 0xA9,
-0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x7C, 0x41, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x02,
-0x86, 0xE0, 0x54, 0xFB, 0xF0, 0xD1, 0x3E, 0x12, 0x9F, 0xEB, 0x02, 0x9B, 0x26, 0x22, 0xD1, 0xFD,
-0x12, 0x77, 0x89, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0xB4, 0x01,
-0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0,
-0x54, 0xFB, 0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x12, 0x7B, 0x3E, 0x90,
-0x01, 0x01, 0xE0, 0x22, 0x90, 0x85, 0xBF, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00,
-0x22, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0xE4,
-0x90, 0x92, 0x29, 0xF0, 0xA3, 0xF0, 0xD1, 0xDD, 0xEF, 0x64, 0x01, 0x60, 0x39, 0xC3, 0x90, 0x92,
-0x2A, 0xE0, 0x94, 0x88, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0,
-0x44, 0x10, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x1B, 0x90, 0x92, 0x29, 0xD1, 0x81,
-0xD3, 0x90, 0x92, 0x2A, 0xE0, 0x94, 0x32, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x00, 0x40, 0xC7, 0x90,
-0x01, 0xC6, 0xE0, 0x30, 0xE3, 0xC0, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x90, 0x01, 0x9A,
-0xE0, 0x54, 0xC0, 0x44, 0x0B, 0xD1, 0xF5, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4,
-0x40, 0x02, 0x7F, 0x01, 0x22, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x7B, 0x3E, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0x90, 0x01, 0xC4, 0x74, 0x10, 0xF0, 0x74, 0xB7, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x7B, 0x51, 0xEF,
-0x20, 0xE0, 0xF7, 0x74, 0x10, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xB7, 0xA3, 0xF0, 0x22, 0x7D,
-0x02, 0x90, 0x01, 0xC4, 0x74, 0x2F, 0xF0, 0x74, 0xB7, 0xA3, 0xF0, 0x90, 0x92, 0x7D, 0xE0, 0xFF,
-0xED, 0xC3, 0x9F, 0x50, 0x18, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90,
-0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xDE, 0x7F, 0x01, 0x22,
+0x93, 0x5A, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0xAF, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5,
+0x83, 0xE0, 0x22, 0xE0, 0x54, 0x03, 0x90, 0x91, 0x0B, 0x22, 0xF0, 0xE5, 0x65, 0x90, 0x83, 0x1D,
+0x93, 0xFF, 0x22, 0x7A, 0x00, 0x7D, 0x01, 0x7F, 0x01, 0xC1, 0x19, 0x74, 0xBC, 0x25, 0x79, 0xF5,
+0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x00, 0x04, 0x02, 0x04, 0x18, 0x90, 0x00,
+0x06, 0x02, 0x04, 0x18, 0x90, 0x00, 0x08, 0x02, 0x04, 0x18, 0x90, 0x93, 0x5A, 0xE4, 0xF0, 0xA3,
+0x22, 0xE5, 0x67, 0xF0, 0xA3, 0xE5, 0x68, 0x22, 0x7D, 0x05, 0x7F, 0x01, 0xC1, 0x19, 0xFF, 0x90,
+0x93, 0x5C, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x75, 0xF0, 0x12, 0xE5, 0x63, 0x90, 0x89, 0x42,
+0x12, 0x05, 0x28, 0xE0, 0x22, 0x75, 0xF0, 0x12, 0xE5, 0x63, 0x90, 0x89, 0x40, 0x12, 0x05, 0x28,
+0xE0, 0x22, 0xE5, 0x65, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4,
+0x93, 0xFF, 0x74, 0x01, 0x93, 0x90, 0x93, 0x58, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x56,
+0x22, 0x7D, 0x07, 0xAF, 0x63, 0xED, 0x30, 0xE0, 0x26, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x44,
+0x12, 0xD9, 0x53, 0x90, 0x89, 0x46, 0x12, 0xD9, 0x53, 0x90, 0x89, 0x48, 0x12, 0xD9, 0x53, 0x90,
+0x89, 0x4A, 0x12, 0xD9, 0x53, 0x90, 0x89, 0x4C, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3, 0xF0, 0xED,
+0x30, 0xE1, 0x0E, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x40, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3,
+0xF0, 0xED, 0x30, 0xE2, 0x0C, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x42, 0x12, 0x05, 0x28, 0xE4,
+0xF0, 0x12, 0xD9, 0xCA, 0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0x12, 0xD9, 0xCA, 0xEE, 0xF0, 0x22,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x1E, 0xE0, 0xFF, 0x90, 0x85, 0x1D, 0xE0,
+0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x47, 0x90, 0x85, 0x1D, 0xE0,
+0xFE, 0x75, 0xF0, 0x08, 0x90, 0x84, 0xCD, 0x12, 0x05, 0x28, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08,
+0xA4, 0x24, 0xCE, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x89, 0xB4,
+0x90, 0x85, 0x1D, 0x11, 0x48, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85,
+0x1D, 0xF0, 0x7D, 0x68, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x12, 0x40, 0xB9, 0x90, 0x84, 0xC1, 0xE0,
+0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0x90,
+0x85, 0xB5, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90,
+0x85, 0xB6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90,
+0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xC0, 0x01, 0x90, 0x85, 0xB6, 0xE0, 0x75, 0xF0, 0x0F,
+0xA4, 0x24, 0x1F, 0xF9, 0x74, 0x85, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E,
+0x00, 0x7F, 0x0F, 0x12, 0x02, 0xD0, 0x7D, 0xCC, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xB6,
+0x11, 0x48, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85, 0xB6, 0xF0, 0x22,
+0xE4, 0xFC, 0xED, 0x2C, 0x24, 0x00, 0x11, 0xE5, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, 0x74,
+0x00, 0x2D, 0x11, 0xE5, 0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0x11, 0xED, 0x91, 0x35, 0x54, 0xF0,
+0xF0, 0x91, 0x29, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83,
+0xE0, 0x44, 0x10, 0xF0, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0x74, 0x01, 0x2D,
+0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4,
+0x90, 0x93, 0xBD, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0xB1, 0xDE, 0x90, 0x93, 0xC5,
+0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0xF8, 0xF0, 0x74, 0xB8, 0xA3, 0xF0, 0x90,
+0x01, 0x1F, 0xE0, 0xFE, 0x90, 0x01, 0x1E, 0x91, 0x4B, 0x90, 0x93, 0xB4, 0xF0, 0xA3, 0xEF, 0xF0,
+0x90, 0x02, 0x87, 0xE0, 0x90, 0x93, 0xBC, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0x20, 0xE0, 0x02, 0x61,
+0xEC, 0xE4, 0x90, 0x93, 0xBB, 0xF0, 0x90, 0x93, 0xBC, 0xE0, 0xFF, 0x90, 0x93, 0xBB, 0xE0, 0xC3,
+0x9F, 0x40, 0x02, 0x61, 0xEC, 0x90, 0x93, 0xB4, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90,
+0xFD, 0x11, 0xF0, 0x90, 0x93, 0xC5, 0xEF, 0xF0, 0x11, 0xED, 0xE0, 0xFE, 0x74, 0x00, 0x2D, 0xF5,
+0x82, 0xE4, 0x34, 0xFB, 0x12, 0xD8, 0xAE, 0x54, 0x3F, 0xFE, 0x90, 0x93, 0xB6, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0x93, 0xC1, 0xEE, 0xF0, 0xA3, 0x91, 0x35, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8,
+0xFF, 0x91, 0x29, 0x54, 0x03, 0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x93, 0xC6, 0xF0, 0x90,
+0x93, 0xB5, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0xB4, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xB8, 0x91,
+0x20, 0xC0, 0x07, 0x71, 0xFD, 0x7D, 0x01, 0x12, 0x55, 0x36, 0xC0, 0x07, 0x71, 0xFD, 0x7D, 0x04,
+0x12, 0x55, 0x36, 0xAB, 0x07, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x5D, 0x98, 0x90, 0x93, 0xBD, 0xEF,
+0x71, 0xFC, 0xE4, 0xFD, 0x12, 0x55, 0x36, 0xEF, 0x54, 0xFC, 0x90, 0x93, 0xBA, 0xF0, 0x90, 0x93,
+0xC6, 0xE0, 0xFF, 0x90, 0x93, 0xB6, 0xE4, 0x8F, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x93, 0xB6, 0xE0,
+0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x7A, 0xD0, 0x90, 0x93, 0xB6, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x91,
+0x18, 0xFF, 0x7D, 0x0F, 0x12, 0x55, 0x36, 0x90, 0x93, 0xB6, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90,
+0x93, 0xB4, 0xEC, 0x8D, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x85, 0xB7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD,
+0xD3, 0x90, 0x93, 0xB5, 0xE0, 0x9D, 0x90, 0x93, 0xB4, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x85, 0xB8,
+0xE0, 0x24, 0x01, 0xFD, 0x90, 0x85, 0xB7, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x93, 0xB5, 0xE0,
+0x9D, 0xF0, 0x90, 0x93, 0xB4, 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, 0x93, 0xBA, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20,
+0x70, 0x2C, 0x90, 0x86, 0x75, 0xE0, 0xFF, 0x12, 0x8F, 0x66, 0x20, 0xE0, 0x02, 0x61, 0x63, 0x90,
+0x86, 0x87, 0xE0, 0x04, 0x71, 0xFC, 0x12, 0x59, 0x20, 0xEF, 0x70, 0x02, 0x61, 0x63, 0x90, 0x93,
+0xBA, 0xE0, 0xFF, 0x12, 0x7B, 0x77, 0x90, 0x86, 0x88, 0xE0, 0x04, 0xF0, 0x61, 0x63, 0x12, 0x9F,
+0x1C, 0x30, 0xE0, 0x56, 0x90, 0x93, 0xBD, 0xE0, 0xFF, 0x90, 0x93, 0xB9, 0xE0, 0x2F, 0xFF, 0x90,
+0x93, 0xB8, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x08, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x93, 0xC3, 0x91,
+0x20, 0xEF, 0x64, 0x45, 0x70, 0x34, 0x91, 0x07, 0x91, 0x8F, 0xEF, 0x64, 0x01, 0x70, 0x2B, 0x91,
+0x07, 0x91, 0x54, 0xEF, 0x64, 0x01, 0x70, 0x22, 0x90, 0x93, 0xC7, 0x04, 0x91, 0x06, 0xA3, 0xE0,
+0xFD, 0xB1, 0x11, 0xEF, 0x70, 0x0C, 0x90, 0x93, 0xC5, 0xE0, 0xFD, 0x90, 0xFD, 0x11, 0x91, 0x06,
+0x91, 0xD3, 0x90, 0x93, 0xC5, 0xE0, 0x90, 0xFD, 0x11, 0xF0, 0x71, 0xFD, 0x12, 0x59, 0x20, 0xEF,
+0x60, 0x18, 0x71, 0xFD, 0x90, 0x93, 0xBD, 0xE0, 0xFD, 0x90, 0x93, 0xC0, 0xE0, 0xFB, 0x12, 0x54,
+0x02, 0xEF, 0x60, 0x06, 0x90, 0x93, 0xC7, 0x74, 0x01, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0xC3, 0x13,
+0x30, 0xE0, 0x13, 0x71, 0xFD, 0x90, 0x93, 0xBD, 0xE0, 0xFD, 0x12, 0x38, 0x10, 0xEF, 0x60, 0x06,
+0x90, 0x93, 0xC7, 0x74, 0x01, 0xF0, 0x12, 0xA7, 0x41, 0x54, 0x3F, 0x30, 0xE0, 0x0A, 0x71, 0xFD,
+0x90, 0x93, 0xBD, 0xE0, 0xFD, 0x12, 0x21, 0xB6, 0x90, 0x86, 0x72, 0xE0, 0xFF, 0x12, 0x8F, 0x66,
+0x30, 0xE0, 0x10, 0x90, 0x93, 0xC7, 0xE0, 0x70, 0x0A, 0x71, 0xFD, 0x90, 0x93, 0xBD, 0xE0, 0xFD,
+0x12, 0x4A, 0x3F, 0x12, 0x79, 0x00, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30,
+0xE2, 0x16, 0x90, 0x86, 0x74, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3F,
+0x74, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x5F, 0xE9, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x02, 0x91,
+0x10, 0x12, 0x7A, 0xE7, 0xEF, 0x64, 0x01, 0x70, 0x37, 0x90, 0x86, 0x89, 0xE0, 0x04, 0xF0, 0x12,
+0x6F, 0xE5, 0xAD, 0x07, 0xEF, 0x64, 0x01, 0x60, 0x1F, 0x91, 0x10, 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, 0x5F, 0xE9, 0x80, 0x24, 0x91, 0x18, 0xFF, 0x12, 0x7C, 0x0B, 0x80, 0x14,
+0x90, 0x86, 0x74, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x11, 0x90, 0x86, 0x72, 0xE0, 0x54,
+0xFE, 0xF0, 0x80, 0x08, 0x90, 0x93, 0xBB, 0xE0, 0x04, 0xF0, 0x21, 0x46, 0x74, 0xF8, 0x04, 0x90,
+0x01, 0xC4, 0xF0, 0x74, 0xB8, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x93, 0xB8,
+0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xF0, 0x90, 0x93, 0xC3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22,
+0x90, 0x86, 0x7A, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x93, 0xB4, 0xE0, 0xFE, 0xA3, 0xE0, 0x22,
+0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x02, 0x55, 0x36, 0x74, 0x03, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
+0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5,
+0x83, 0xE0, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00,
+0xFF, 0xEC, 0x3E, 0x22, 0x90, 0x93, 0x4A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x24, 0x16, 0xFF, 0xE4,
+0x3E, 0xFE, 0xE4, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x88, 0x86, 0xA3, 0xE0, 0xB5, 0x07, 0x1A, 0x90,
+0x93, 0x4B, 0xE0, 0x24, 0x16, 0x91, 0xCB, 0xFE, 0x7D, 0x01, 0x12, 0x55, 0x36, 0xEF, 0xFD, 0x90,
+0x88, 0x86, 0xE0, 0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01, 0x22, 0x90,
+0x93, 0x4A, 0xF1, 0x44, 0xA3, 0xF0, 0x90, 0x93, 0x4C, 0xE0, 0xFD, 0xC3, 0x94, 0x04, 0x50, 0x28,
+0x90, 0x93, 0x4B, 0xE0, 0x24, 0x10, 0x91, 0xCB, 0xFE, 0x12, 0x55, 0x36, 0x90, 0x93, 0x4C, 0xE0,
+0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22,
+0x90, 0x93, 0x4C, 0xE0, 0x04, 0xF0, 0x80, 0xCE, 0x7F, 0x01, 0x22, 0xFF, 0x90, 0x93, 0x4A, 0xE0,
+0x34, 0x00, 0x22, 0xB1, 0x5A, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xFD, 0xC3, 0x94, 0x02,
+0x50, 0x17, 0xB1, 0x66, 0x24, 0xAA, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xB5, 0x07,
+0x1D, 0x90, 0x93, 0x4D, 0xE0, 0x04, 0xF0, 0x80, 0xDF, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0,
+0x90, 0x01, 0xC7, 0x74, 0x30, 0xF0, 0x7F, 0x01, 0x12, 0x5F, 0xE9, 0x7F, 0x01, 0x22, 0x7F, 0x00,
+0x22, 0xB1, 0x5A, 0x90, 0x88, 0x7C, 0xE0, 0x70, 0x02, 0xA3, 0xE0, 0x60, 0x29, 0xE4, 0x90, 0x93,
+0x4D, 0xF0, 0x90, 0x93, 0x4D, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x50, 0x1D, 0xB1, 0x66, 0x24, 0x8A,
+0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x93,
+0x4D, 0xE0, 0x04, 0xF0, 0x80, 0xDC, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x40, 0xF0,
+0xE4, 0x90, 0x88, 0x88, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x93, 0x4A, 0xEE, 0xF0, 0xA3,
+0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0x90, 0x93, 0x4A, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x24,
+0x1C, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x93, 0x4D, 0xE0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01,
+0x12, 0x86, 0x4E, 0x90, 0x93, 0x49, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x70,
+0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE0, 0x0F, 0x90, 0x84, 0xC1, 0xE0, 0x54,
+0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x2D, 0xBD, 0x12, 0xB1, 0x3E, 0xB1, 0xD4, 0x30, 0xE1, 0x06, 0x54,
+0xFD, 0xF0, 0x12, 0x60, 0x5D, 0xB1, 0xD4, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x6A, 0x6D,
+0xB1, 0xD4, 0x30, 0xE4, 0x0B, 0x54, 0xEF, 0xF0, 0x12, 0x6F, 0x22, 0xBF, 0x01, 0x02, 0x11, 0xF8,
+0xD2, 0xAF, 0x80, 0xB6, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x22, 0xF0, 0xE4,
+0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x94, 0x06, 0xEF, 0xB1, 0xDE, 0x90, 0x01, 0x09, 0xE0, 0x7F,
+0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x90, 0x94, 0x06, 0xE0, 0x6F, 0x60, 0x36, 0xC3, 0x90, 0x94,
+0x08, 0xE0, 0x94, 0x88, 0x90, 0x94, 0x07, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0,
+0x44, 0x10, 0xF0, 0x22, 0x90, 0x94, 0x07, 0x12, 0xAD, 0x64, 0x12, 0xDA, 0x62, 0xD3, 0x90, 0x94,
+0x08, 0xE0, 0x94, 0x32, 0x90, 0x94, 0x07, 0xE0, 0x94, 0x00, 0x40, 0xBF, 0x90, 0x01, 0xC6, 0xE0,
+0x30, 0xE0, 0xB8, 0x22, 0x12, 0xD3, 0xF0, 0x7F, 0x08, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0xEF, 0xFD,
+0x7F, 0x08, 0x12, 0x7B, 0x3E, 0xE4, 0xFF, 0xB1, 0xE5, 0x7D, 0x35, 0x7F, 0x27, 0x12, 0x7B, 0x3E,
+0x90, 0x85, 0xC2, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xD1,
+0xF1, 0xD1, 0x34, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x85, 0xC8, 0xE0, 0xFF, 0x60, 0x03, 0xB4,
+0x08, 0x0D, 0xD1, 0xA1, 0xBF, 0x01, 0x08, 0xD1, 0x58, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22,
+0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x19, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x30, 0xE0, 0x0F, 0xC3,
+0x13, 0x30, 0xE0, 0x08, 0x12, 0xD4, 0x0F, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80, 0x00, 0xD1, 0x68,
+0x22, 0x90, 0x92, 0x04, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x2A, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x02,
+0x80, 0x08, 0x90, 0x01, 0x00, 0xE0, 0x64, 0x3F, 0x60, 0x05, 0x75, 0x62, 0x01, 0x80, 0x23, 0x90,
+0x02, 0x86, 0xE0, 0x20, 0xE1, 0x02, 0x80, 0x07, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE3, 0x05, 0x75,
+0x62, 0x04, 0x80, 0x0E, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x05, 0x75, 0x62, 0x40, 0x80, 0x03, 0x02,
+0xD5, 0x58, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x62, 0xF0, 0x7F, 0x00,
+0x22, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x85, 0xD0, 0xE0, 0xFD, 0x7F, 0x93, 0x12,
+0x7B, 0x3E, 0x90, 0x85, 0xC6, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74,
+0x10, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x7B, 0x51, 0xEF,
+0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12, 0x7B, 0x3E, 0x7F, 0x01, 0xB1, 0xE5, 0x7D, 0x34, 0x7F, 0x27,
+0x12, 0x7B, 0x3E, 0x7F, 0x90, 0x12, 0xA7, 0xBC, 0x7F, 0x90, 0x12, 0x7B, 0x3E, 0x7F, 0x14, 0x7E,
+0x00, 0x02, 0x7C, 0x9F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x22, 0x90, 0x93, 0x99, 0xF1, 0x44,
+0x90, 0x93, 0x9D, 0xF0, 0x7D, 0x09, 0x12, 0x55, 0x36, 0xEF, 0x64, 0x06, 0x70, 0x2D, 0x12, 0xD9,
+0x78, 0x7D, 0x14, 0x12, 0x55, 0x36, 0xEF, 0x70, 0x22, 0x12, 0xD9, 0x78, 0x7D, 0x15, 0x12, 0x55,
+0x36, 0xEF, 0x64, 0x50, 0x70, 0x15, 0x12, 0xD9, 0x78, 0x7D, 0x21, 0x12, 0x55, 0x36, 0xEF, 0x20,
+0xE0, 0x03, 0x30, 0xE2, 0x06, 0x90, 0x93, 0x9D, 0x74, 0x01, 0xF0, 0x90, 0x86, 0x73, 0xE0, 0x13,
+0x13, 0x54, 0x3F, 0x30, 0xE0, 0x40, 0x12, 0xD9, 0x78, 0x7D, 0x09, 0x12, 0x55, 0x36, 0xEF, 0x64,
+0x11, 0x70, 0x33, 0x90, 0x93, 0x9A, 0xE0, 0x24, 0x14, 0xFF, 0x90, 0x93, 0x99, 0xE0, 0x34, 0x00,
+0xFE, 0x90, 0x93, 0x9B, 0xF0, 0xA3, 0xEF, 0xF0, 0x7D, 0x02, 0x12, 0x55, 0x36, 0xEF, 0x70, 0x16,
+0x90, 0x93, 0x9B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x03, 0x12, 0x55, 0x36, 0xBF, 0x89, 0x06,
+0x90, 0x93, 0x9D, 0x74, 0x01, 0xF0, 0x90, 0x93, 0x9D, 0xE0, 0xFF, 0x12, 0xD4, 0xD1, 0xEF, 0xF0,
+0x22, 0x90, 0x93, 0x20, 0xEF, 0xF0, 0xA3, 0x12, 0x87, 0x79, 0x90, 0x94, 0x0D, 0xE0, 0xFE, 0x04,
+0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x03, 0x4E, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA,
+0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x93, 0x21, 0x12, 0x87, 0x70, 0x8B, 0x1B,
+0x8A, 0x1C, 0x89, 0x1D, 0x75, 0x1E, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x6A, 0x21,
+0x90, 0x93, 0x20, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0,
+0x02, 0xC0, 0x01, 0xA3, 0x12, 0x87, 0x70, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x1B, 0xF5,
+0x1C, 0x89, 0x1D, 0x90, 0x93, 0x21, 0x11, 0x53, 0xF5, 0x1E, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03,
+0x02, 0x6A, 0x21, 0x12, 0x87, 0x70, 0x90, 0x00, 0x0E, 0x02, 0x03, 0x0F, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x24, 0x12, 0x87, 0x79, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x66, 0x80,
+0xEF, 0x60, 0x46, 0x12, 0xBC, 0x43, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x93,
+0x27, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x93, 0x27, 0xE0, 0xFD, 0x90, 0x02,
+0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x24, 0x11, 0x53, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE,
+0x12, 0x5A, 0xA5, 0x90, 0x93, 0x27, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x93, 0x24, 0x12, 0x87, 0x70,
+0x12, 0x56, 0xF4, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93,
+0x6D, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x93, 0x7D, 0xF0, 0xE0, 0xFE,
+0x6F, 0x60, 0x65, 0x90, 0x93, 0x6E, 0x74, 0x03, 0xF0, 0x90, 0x93, 0x7C, 0x74, 0x08, 0xF0, 0xEE,
+0x04, 0x54, 0x0F, 0xFF, 0xE4, 0xFE, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4,
+0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2E, 0x31, 0x3D, 0xE0, 0xFD, 0x74, 0x70, 0x2E, 0xF5, 0x82,
+0xE4, 0x34, 0x93, 0xF5, 0x83, 0xED, 0xF0, 0x0E, 0xEE, 0xB4, 0x08, 0xDA, 0x7B, 0x01, 0x7A, 0x93,
+0x79, 0x6E, 0x12, 0x5E, 0x10, 0x90, 0x93, 0x7D, 0xE0, 0x04, 0x54, 0x0F, 0xFF, 0xF0, 0xBF, 0x0F,
+0x02, 0xE4, 0xF0, 0x90, 0x93, 0x7D, 0xE0, 0x90, 0x04, 0x7F, 0xF0, 0x90, 0x93, 0x6D, 0xE0, 0x7F,
+0x04, 0x70, 0x02, 0x80, 0x6D, 0x12, 0x87, 0xBB, 0x22, 0xE4, 0xFF, 0x80, 0x81, 0xF5, 0x82, 0xE4,
+0x35, 0x83, 0xF5, 0x83, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x94, 0x0E, 0xEF,
+0xF0, 0x31, 0x94, 0x30, 0xE6, 0x39, 0x7F, 0x8D, 0x12, 0x7B, 0x51, 0xEF, 0x64, 0x01, 0x70, 0x2F,
+0x90, 0x94, 0x0F, 0xF0, 0x90, 0x94, 0x0F, 0xE0, 0xFD, 0x90, 0x94, 0x0E, 0xE0, 0x12, 0xB5, 0x85,
+0xE5, 0x82, 0x2D, 0x31, 0x3D, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x8E, 0x5A, 0x90, 0x94, 0x0F, 0xE0,
+0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xDC, 0x31, 0x94, 0x30, 0xE0, 0x02, 0x31, 0x9B, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x8F, 0x12, 0x7B, 0x51, 0xEF, 0x22, 0xE4, 0xFD, 0x7F, 0x8D, 0x02,
+0x7B, 0x3E, 0x8F, 0x0D, 0x7F, 0x02, 0x12, 0x86, 0x27, 0x90, 0x84, 0xC1, 0xE0, 0x45, 0x0D, 0xF0,
+0x22, 0x12, 0x40, 0xB9, 0x7F, 0x02, 0x80, 0xEA, 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, 0xB8, 0xF0, 0x74, 0xC1, 0xA3, 0xF0, 0x12,
+0x71, 0x90, 0xE5, 0x4C, 0x30, 0xE1, 0x02, 0x31, 0x39, 0xE5, 0x4C, 0x30, 0xE3, 0x02, 0x51, 0xE7,
+0xE5, 0x4C, 0x30, 0xE4, 0x02, 0x31, 0xB1, 0xE5, 0x4C, 0x30, 0xE5, 0x03, 0x12, 0xD3, 0x4D, 0xE5,
+0x4C, 0x30, 0xE6, 0x02, 0xF1, 0x6A, 0xE5, 0x4E, 0x30, 0xE0, 0x03, 0x12, 0xA3, 0x49, 0xE5, 0x4E,
+0x30, 0xE1, 0x03, 0x12, 0x99, 0xCC, 0xE5, 0x4E, 0x30, 0xE2, 0x03, 0x12, 0xC9, 0xBB, 0xE5, 0x4E,
+0x30, 0xE3, 0x02, 0x91, 0x09, 0xE5, 0x4E, 0x30, 0xE4, 0x02, 0x91, 0x37, 0xE5, 0x4E, 0x30, 0xE5,
+0x02, 0xF1, 0xAE, 0xE5, 0x4E, 0x30, 0xE6, 0x02, 0x51, 0xF3, 0xE5, 0x4F, 0x30, 0xE1, 0x03, 0x12,
+0x9F, 0x5E, 0xE5, 0x4F, 0x30, 0xE4, 0x02, 0x91, 0xB4, 0xE5, 0x4F, 0x30, 0xE5, 0x02, 0x51, 0x76,
+0x74, 0xB8, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xC1, 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, 0x78, 0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE5, 0x78,
+0xC3, 0x9F, 0x50, 0x62, 0xAF, 0x78, 0x12, 0x77, 0x39, 0xEF, 0x60, 0x56, 0xE5, 0x78, 0x13, 0x13,
+0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x78, 0x54, 0x07, 0xFE, 0x74, 0x75, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
+0x8F, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x12, 0xB1, 0x36, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33,
+0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x60, 0x2A, 0xE5, 0x78, 0xF1, 0x77, 0x20, 0xE7, 0x02, 0x80,
+0x13, 0xE5, 0x78, 0xC4, 0x54, 0xF0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0,
+0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x05, 0xAD, 0x78, 0x12,
+0xB5, 0x92, 0x05, 0x78, 0x80, 0x93, 0x22, 0x90, 0x86, 0x72, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10,
+0x31, 0xA2, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF, 0x01, 0x0F, 0x90, 0x85, 0xC5, 0xE0, 0x60,
+0x09, 0x71, 0x0B, 0x54, 0x07, 0x70, 0x03, 0x12, 0x9F, 0xC6, 0x22, 0x90, 0x85, 0xC9, 0xE0, 0x54,
+0xFE, 0xF0, 0x22, 0xE4, 0xF5, 0x78, 0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x78, 0x54, 0xC0, 0x70, 0x08,
+0x71, 0x0B, 0x54, 0xFD, 0xF0, 0x02, 0x9F, 0xC6, 0xE5, 0x78, 0x30, 0xE6, 0x19, 0x90, 0x85, 0xC5,
+0xE0, 0x64, 0x01, 0x70, 0x13, 0x12, 0x9F, 0xB8, 0x64, 0x02, 0x60, 0x05, 0x12, 0x77, 0x61, 0x80,
+0x07, 0x12, 0x79, 0x41, 0x80, 0x02, 0x71, 0x0B, 0xE5, 0x78, 0x90, 0x85, 0xC9, 0x30, 0xE7, 0x09,
+0x91, 0x21, 0x90, 0x91, 0x6F, 0x71, 0xFE, 0x81, 0x2F, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x06,
+0xA9, 0xE0, 0x90, 0x93, 0x6D, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x04, 0x71, 0x0B, 0x80, 0x5B,
+0xED, 0x30, 0xE6, 0x41, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x02, 0x70, 0x28, 0x90, 0x85, 0xC1, 0xE0,
+0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x1C, 0x12,
+0x9F, 0xBF, 0x64, 0x01, 0x70, 0x21, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12,
+0x62, 0x8E, 0x80, 0x13, 0x12, 0x9F, 0xB8, 0x64, 0x02, 0x60, 0x05, 0x12, 0x77, 0x61, 0x80, 0x07,
+0x12, 0x79, 0x41, 0x80, 0x02, 0x71, 0x0B, 0x90, 0x93, 0x6D, 0xE0, 0x90, 0x85, 0xC9, 0x30, 0xE7,
+0x09, 0x91, 0x21, 0x90, 0x91, 0x6F, 0x71, 0xFE, 0x80, 0x65, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90,
+0x92, 0x0A, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x17, 0xF5, 0x82,
+0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xEF, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x16, 0xF5, 0x82,
+0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x90, 0x91, 0x6F, 0xF0, 0x90, 0x91, 0x6E, 0xEE, 0xF0, 0xE4,
+0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02, 0x61, 0x41, 0x12, 0x9F, 0xD8, 0x64, 0x01, 0x70, 0x10,
+0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0A, 0x12, 0xA7, 0xD6, 0x91, 0x24, 0x90, 0x91, 0x6F, 0x71, 0xFE,
+0x22, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x86, 0x6E, 0xE0, 0x22, 0x90,
+0x85, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x12, 0x9F, 0xD8, 0x64, 0x01, 0x70, 0x17, 0x90, 0x85,
+0xC5, 0xE0, 0x60, 0x11, 0x12, 0xA7, 0xD6, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0x91, 0xCA, 0x54, 0x07,
+0x70, 0x03, 0x12, 0x9F, 0xC6, 0x22, 0xE4, 0x90, 0x93, 0x7E, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60,
+0x52, 0x12, 0x9F, 0xD8, 0x64, 0x01, 0x70, 0x4B, 0x12, 0xA7, 0xB4, 0xF0, 0x12, 0xD9, 0x0B, 0x91,
+0xC1, 0xE4, 0x90, 0x85, 0xCC, 0xF0, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x85, 0xC0,
+0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0x93, 0x7E, 0xF0, 0x12, 0x9E, 0x32, 0xEF, 0x70, 0x04, 0x90,
+0x93, 0x7E, 0xF0, 0x90, 0x93, 0x7E, 0xE0, 0x60, 0x1A, 0x90, 0x85, 0xC8, 0xE0, 0x20, 0xE2, 0x03,
+0x12, 0x9A, 0xF8, 0x91, 0xB9, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCD, 0xE0, 0x90, 0x91,
+0x6F, 0x71, 0xFE, 0x22, 0xE4, 0xFF, 0x02, 0x2D, 0xBD, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x10, 0xF0,
+0x22, 0xF0, 0x90, 0x93, 0x7E, 0x74, 0x01, 0xF0, 0x22, 0xEF, 0x54, 0xFB, 0xF0, 0x90, 0x85, 0xC9,
+0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x19, 0x12, 0xA7, 0xD9, 0xF0, 0xB1,
+0x59, 0x30, 0xE0, 0x02, 0x80, 0xE3, 0xB1, 0x63, 0x40, 0x0A, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF,
+0x01, 0x02, 0x91, 0xF5, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0x9A, 0xF0,
+0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0C, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x03, 0x12,
+0xA7, 0x8D, 0xB1, 0x59, 0x30, 0xE0, 0x08, 0x91, 0xC9, 0x54, 0x07, 0x70, 0x3B, 0x80, 0x36, 0xB1,
+0x63, 0x40, 0x32, 0x12, 0x9F, 0xD8, 0x64, 0x01, 0x70, 0x2E, 0x12, 0x9F, 0xBF, 0x70, 0x05, 0x12,
+0x70, 0xDB, 0x80, 0xC1, 0x12, 0x70, 0xDB, 0x90, 0x85, 0xCF, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94,
+0x02, 0x40, 0x09, 0x91, 0xF5, 0xE4, 0x90, 0x85, 0xCF, 0xF0, 0x80, 0x03, 0x12, 0x79, 0x41, 0xE4,
+0x90, 0x85, 0xCE, 0xF0, 0x22, 0x12, 0x9F, 0xC6, 0x22, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x13, 0x13,
+0x54, 0x3F, 0x22, 0x90, 0x85, 0xCE, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEF, 0xF0,
+0x90, 0x86, 0x6D, 0xE0, 0xFF, 0x90, 0x85, 0xCE, 0xE0, 0xD3, 0x9F, 0x22, 0x90, 0x85, 0xBC, 0xE0,
+0xFF, 0x30, 0xE0, 0x41, 0x90, 0x85, 0xC0, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90,
+0x85, 0xBF, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x27, 0xEF, 0xC3,
+0x13, 0x30, 0xE0, 0x05, 0x12, 0xA3, 0x67, 0x80, 0x1C, 0x91, 0xD5, 0x90, 0x85, 0xC0, 0xE0, 0xB4,
+0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x04, 0x06, 0xE4,
+0xFD, 0xFF, 0x12, 0x9A, 0xFC, 0x90, 0x92, 0xA9, 0x12, 0x9F, 0x1F, 0x30, 0xE0, 0x73, 0x90, 0x92,
+0x0A, 0xE0, 0x30, 0xE0, 0x6C, 0x90, 0x92, 0xAD, 0x12, 0xAD, 0x64, 0x90, 0x92, 0xA9, 0xE0, 0x54,
+0xBF, 0xF0, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x92, 0x4C, 0xE0, 0x24, 0xFB, 0x90, 0x91, 0x6F,
+0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x60, 0x7E, 0x01, 0x12, 0x61, 0x41, 0x12, 0x92, 0x32, 0xF1, 0x85,
+0x54, 0x07, 0x90, 0x93, 0x7E, 0xF0, 0x90, 0x92, 0x72, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x30, 0xE0,
+0x1D, 0xEF, 0x54, 0xEF, 0xF0, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x20, 0xE0, 0x24, 0x12, 0x92, 0x32,
+0xD1, 0x42, 0xEF, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02, 0x61, 0x41, 0x90, 0x93,
+0x7E, 0xE0, 0xFF, 0x64, 0x03, 0x60, 0x04, 0xEF, 0xB4, 0x01, 0x06, 0x12, 0x97, 0xF6, 0x12, 0x90,
+0xE9, 0x22, 0x75, 0xF0, 0x13, 0xA4, 0x24, 0x39, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0,
+0x24, 0xFC, 0xFF, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0xA3, 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, 0x5A, 0xF0, 0x74, 0xC6, 0xA3,
+0xF0, 0x12, 0x75, 0x28, 0xE5, 0x56, 0x30, 0xE1, 0x02, 0xF1, 0x21, 0xE5, 0x56, 0x30, 0xE2, 0x02,
+0xF1, 0x2F, 0xE5, 0x56, 0x30, 0xE4, 0x02, 0xF1, 0x17, 0xE5, 0x56, 0x30, 0xE5, 0x02, 0xF1, 0x05,
+0xE5, 0x57, 0x30, 0xE0, 0x03, 0x12, 0xC9, 0xEA, 0xE5, 0x58, 0x30, 0xE1, 0x02, 0xB1, 0x7C, 0xE5,
+0x58, 0x30, 0xE0, 0x03, 0x12, 0xCC, 0x5F, 0xE5, 0x58, 0x30, 0xE4, 0x02, 0xF1, 0x94, 0xE5, 0x59,
+0x30, 0xE1, 0x04, 0x7F, 0x04, 0x31, 0xA2, 0xE5, 0x59, 0x30, 0xE4, 0x03, 0x12, 0xA2, 0xCD, 0xE5,
+0x59, 0x30, 0xE5, 0x03, 0x12, 0xCC, 0xE6, 0xE5, 0x59, 0x30, 0xE6, 0x03, 0x12, 0xCD, 0x1E, 0x74,
+0x5A, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xC6, 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, 0x92, 0x09, 0xE0, 0x30, 0xE0, 0x0A, 0x12, 0x8F, 0xFB, 0xE4,
+0x90, 0x92, 0x0C, 0xF0, 0x71, 0xCF, 0x22, 0x90, 0x92, 0x0A, 0xE0, 0x30, 0xE0, 0x02, 0xF1, 0x5A,
+0x22, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x02, 0x91, 0xFD, 0x12, 0x93, 0x65, 0x02, 0x90, 0xE9, 0x90,
+0x85, 0xC5, 0xE0, 0x60, 0x11, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x05, 0x12, 0x6B, 0x98, 0x80,
+0x05, 0xF1, 0x62, 0x12, 0x9F, 0xC6, 0x90, 0x92, 0x0C, 0xE0, 0xB4, 0x01, 0x03, 0x12, 0x90, 0xE9,
+0x90, 0x92, 0x0A, 0xE0, 0x30, 0xE0, 0x02, 0xF1, 0x5A, 0x22, 0x90, 0x92, 0xA9, 0xE0, 0x44, 0x40,
+0xF0, 0x22, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xF7, 0xF0, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0,
+0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xC4, 0x54, 0xF0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34,
+0x81, 0xF5, 0x83, 0xE0, 0x22, 0x75, 0xF0, 0x13, 0xA4, 0x24, 0x3A, 0xF5, 0x82, 0xE4, 0x34, 0x92,
+0xF5, 0x83, 0xE0, 0x22, 0x90, 0x92, 0x0A, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x92, 0xA8, 0xE0, 0x12,
+0x8F, 0x66, 0x30, 0xE0, 0x08, 0xA3, 0xE0, 0x44, 0x20, 0xF0, 0x44, 0x40, 0xF0, 0x22, 0xE4, 0xFF,
+0x12, 0x77, 0x39, 0xBF, 0x01, 0x13, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0D, 0x12, 0x9F, 0xBF, 0x64,
+0x02, 0x60, 0x03, 0x02, 0x77, 0x61, 0x12, 0x79, 0x41, 0x22, 0xE4, 0x90, 0x84, 0xC1, 0x12, 0xA6,
+0x95, 0x90, 0x92, 0x01, 0xF0, 0x22, 0x75, 0x48, 0x12, 0xE4, 0xF5, 0x49, 0x75, 0x4A, 0x07, 0x75,
+0x4B, 0x32, 0xF5, 0x50, 0x90, 0x01, 0x30, 0xE5, 0x48, 0xF0, 0xA3, 0xE5, 0x49, 0xF0, 0xA3, 0xE5,
+0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0x90, 0x01, 0x20, 0xE5, 0x50, 0xF0, 0x22, 0x75, 0x52, 0x06,
+0x75, 0x53, 0x01, 0x75, 0x54, 0x03, 0x75, 0x55, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x52, 0xF0, 0xA3,
+0xE5, 0x53, 0xF0, 0xA3, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0x22, 0x90, 0x01, 0xE4, 0x74,
+0x01, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4, 0x74, 0x27, 0xF0, 0x74,
+0xC8, 0xA3, 0xF0, 0x90, 0x92, 0x08, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50, 0x18, 0xED, 0x25, 0xE0,
+0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F,
+0x00, 0x22, 0x0D, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x93, 0x42, 0xF0, 0xA3, 0xF0, 0xA3,
+0xF0, 0x90, 0x93, 0x42, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x58, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xC8,
+0xA3, 0xF0, 0x12, 0x7C, 0x66, 0xBF, 0x01, 0x03, 0x12, 0x5B, 0x25, 0x90, 0x85, 0xC5, 0xE0, 0x60,
+0x0F, 0x90, 0x85, 0xC8, 0xE0, 0xFF, 0x90, 0x85, 0xC7, 0xE0, 0x6F, 0x60, 0x03, 0x12, 0x9F, 0xC6,
+0xC2, 0xAF, 0x11, 0x27, 0xBF, 0x01, 0x03, 0x12, 0xBE, 0x80, 0xD2, 0xAF, 0x11, 0xBF, 0x90, 0x93,
+0x43, 0x12, 0xAD, 0x64, 0x54, 0x7F, 0x45, 0xF0, 0x70, 0x0D, 0x7F, 0xFF, 0x12, 0x7B, 0x51, 0xEF,
+0x04, 0xFD, 0x7F, 0xFF, 0x12, 0x7B, 0x3E, 0x12, 0x8F, 0xF9, 0x12, 0x84, 0x4D, 0x80, 0xA2, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0xBA, 0xE0, 0x60, 0x25, 0x7F, 0x54, 0x7E, 0x09,
+0x12, 0x70, 0x61, 0x31, 0x17, 0xEF, 0x44, 0xFE, 0xFF, 0xEE, 0x44, 0x03, 0xFE, 0xED, 0x44, 0x04,
+0xFD, 0xEC, 0x31, 0x17, 0x90, 0x91, 0x66, 0x12, 0x04, 0xEB, 0x7F, 0x54, 0x7E, 0x09, 0x12, 0x71,
+0x18, 0x90, 0x92, 0xB5, 0xE0, 0x70, 0x04, 0x90, 0x07, 0xCC, 0xF0, 0x90, 0x92, 0xBD, 0xE0, 0x70,
+0x0A, 0x90, 0x92, 0xBA, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x07, 0x90, 0x00, 0x1F, 0xE0, 0x54,
+0xF0, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x45, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x45,
+0x02, 0x87, 0x58, 0x90, 0x84, 0xA1, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0x90, 0x84, 0xA7,
+0x74, 0x80, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 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, 0x39, 0xF0, 0x74, 0xC9, 0xA3, 0xF0,
+0x12, 0x6C, 0xBC, 0x74, 0x39, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xC9, 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, 0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82,
+0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x8A, 0x90, 0x01, 0xC4, 0xED, 0xF0,
+0x74, 0xC9, 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, 0x88, 0xE7, 0xE0, 0x04,
+0xF0, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x30, 0xE0, 0x05, 0x12, 0x9F, 0x3F, 0x60, 0x1B, 0x90, 0x85,
+0xC5, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x02, 0x60, 0x09,
+0x12, 0xA1, 0xAD, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0x91, 0x1A, 0x90, 0x93, 0x7E, 0xEF,
+0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x57, 0x82, 0x90,
+0x93, 0x7E, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80,
+0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x51, 0x1D, 0xFB, 0x02, 0x51, 0x7D, 0x90, 0x85, 0xD7,
+0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x85, 0xDE, 0xE0, 0x22, 0xE4, 0x90, 0x93, 0x6D, 0xF0, 0xA3,
+0xF0, 0xA3, 0xF0, 0x90, 0x92, 0xC9, 0x12, 0x87, 0x58, 0x90, 0x92, 0xC5, 0x12, 0x87, 0x64, 0xC3,
+0x12, 0x04, 0xB4, 0x40, 0x48, 0x90, 0x85, 0xC1, 0xE0, 0x90, 0x92, 0xC9, 0x30, 0xE0, 0x10, 0x71,
+0x9E, 0xFF, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x2F, 0xFF, 0x90, 0x92, 0xFA, 0x80, 0x06, 0x71,
+0x9E, 0xFF, 0x90, 0x92, 0xFB, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0x90, 0x93, 0x6E, 0xF0, 0x90, 0x93,
+0x6E, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x15, 0x74, 0xCD, 0x2F, 0x71, 0xBA, 0xE0, 0x04, 0xF0,
+0x90, 0x85, 0xDB, 0xE0, 0x04, 0xF0, 0xE0, 0xFD, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xDB,
+0xE0, 0xFF, 0xD3, 0x90, 0x92, 0xFD, 0xE0, 0x9F, 0x90, 0x92, 0xFC, 0xE0, 0x94, 0x00, 0x40, 0x02,
+0x61, 0x75, 0x71, 0x7E, 0x90, 0x93, 0x6D, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x1E, 0x71, 0x88,
+0xE0, 0xFF, 0x90, 0x93, 0x6F, 0xE0, 0xD3, 0x9F, 0x40, 0x0A, 0x90, 0x93, 0x6D, 0xE0, 0x90, 0x93,
+0x70, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x6D, 0xE0, 0x04, 0xF0, 0x80, 0xD8, 0x71, 0x7E, 0x90, 0x93,
+0x6D, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x2E, 0x71, 0x88, 0xE0, 0xFF, 0xC3, 0x90, 0x92, 0xFD,
+0xE0, 0x9F, 0xFF, 0x90, 0x92, 0xFC, 0xE0, 0x94, 0x00, 0xFE, 0x90, 0x93, 0x6F, 0xE0, 0xD3, 0x9F,
+0xE4, 0x9E, 0x40, 0x0A, 0x90, 0x93, 0x6D, 0xE0, 0x90, 0x93, 0x71, 0xF0, 0x80, 0x08, 0x90, 0x93,
+0x6D, 0xE0, 0x04, 0xF0, 0x80, 0xC8, 0x90, 0x93, 0x70, 0xE0, 0x90, 0x85, 0xE0, 0xF0, 0x90, 0x93,
+0x71, 0xE0, 0x90, 0x85, 0xE1, 0x71, 0x76, 0x94, 0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x85,
+0xD8, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x85, 0xD8, 0x71, 0x76, 0x74, 0x0A, 0x9F, 0x90, 0x85,
+0xD7, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x85, 0xDE, 0xF0, 0x90,
+0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x92, 0xFA, 0x80, 0x03, 0x90, 0x92, 0xFB, 0xE0, 0xFF,
+0x90, 0x85, 0xDE, 0xE0, 0x2F, 0x04, 0xF0, 0x90, 0x85, 0xDE, 0xE0, 0xC3, 0x94, 0x0A, 0x50, 0x03,
+0x74, 0x0A, 0xF0, 0x90, 0x85, 0xDE, 0xE0, 0x24, 0x02, 0xF0, 0x51, 0x1D, 0xFB, 0x12, 0x51, 0x7D,
+0xE4, 0xFF, 0x12, 0x69, 0x33, 0x22, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xC3, 0x22, 0xE4, 0x90,
+0x93, 0x6F, 0xF0, 0x90, 0x93, 0x6D, 0xF0, 0x22, 0x74, 0xCD, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92,
+0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x93, 0x6F, 0xE0, 0x2F, 0xF0, 0x90, 0x92, 0xFE, 0x22, 0x12, 0x87,
+0x64, 0x90, 0x92, 0xC5, 0x12, 0x87, 0x58, 0x12, 0x87, 0x30, 0x78, 0x0A, 0x12, 0x04, 0xC5, 0x90,
+0x85, 0xDD, 0xE0, 0xFE, 0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5,
+0x83, 0x22, 0xE4, 0xFE, 0x74, 0xCD, 0x2E, 0x71, 0xBA, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x2D, 0xF4,
+0xE4, 0x90, 0x85, 0xDC, 0xF0, 0x90, 0x85, 0xDB, 0xF0, 0x90, 0x85, 0xDF, 0xF0, 0xEF, 0xB4, 0x01,
+0x07, 0xA3, 0x74, 0x2D, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x90, 0x94, 0x09, 0x12, 0x87, 0x79, 0x12,
+0x71, 0x54, 0x90, 0x85, 0xC5, 0xE0, 0xFF, 0x12, 0x60, 0xD0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x19,
+0x90, 0x94, 0x09, 0x12, 0x87, 0x70, 0x12, 0x8F, 0xBA, 0x54, 0x0F, 0xFF, 0x12, 0x8E, 0x90, 0xFD,
+0x12, 0x6A, 0xB8, 0x51, 0x1D, 0xFB, 0x12, 0x51, 0x7D, 0x22, 0xE4, 0x90, 0x93, 0x80, 0xF0, 0xA3,
+0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51, 0x90, 0x93, 0x7F, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51,
+0xAE, 0x07, 0x90, 0x93, 0x7F, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x93, 0x81, 0xE0,
+0x94, 0x64, 0x90, 0x93, 0x80, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40,
+0xF0, 0x90, 0x93, 0x7F, 0xE0, 0xFF, 0x22, 0x90, 0x93, 0x80, 0x12, 0xAD, 0x64, 0x80, 0xC2, 0x90,
+0x85, 0xBC, 0xE0, 0xFF, 0x30, 0xE0, 0x41, 0x90, 0x85, 0xC0, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02,
+0x7E, 0x01, 0x90, 0x85, 0xBF, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70,
+0x27, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x05, 0x12, 0xA3, 0x67, 0x80, 0x1C, 0x12, 0x9F, 0x26, 0x90,
+0x85, 0xC0, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0x85, 0xC0, 0xE0,
+0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x9A, 0xFC, 0x90, 0x92, 0xA9, 0x12, 0x9F, 0x1F, 0x30, 0xE0,
+0x1D, 0x90, 0x92, 0x0A, 0xE0, 0xFF, 0x30, 0xE0, 0x15, 0xC3, 0x13, 0x54, 0x07, 0x12, 0xC7, 0x85,
+0x54, 0x07, 0xFE, 0x91, 0xCF, 0xEE, 0x60, 0x03, 0xB4, 0x02, 0x03, 0x12, 0x90, 0xE9, 0x22, 0x12,
+0x97, 0x26, 0xE0, 0x20, 0xE0, 0x08, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x02, 0x97, 0xF6, 0x12, 0x97,
+0x26, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x85, 0xC1, 0x12, 0x9E, 0x22, 0x30, 0xE0, 0x1F, 0xEF,
+0x54, 0xBF, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x85, 0xC2, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01,
+0xF0, 0x80, 0x08, 0xE0, 0x54, 0xFE, 0xB1, 0x13, 0x74, 0x04, 0xF0, 0x12, 0x9F, 0xC6, 0xE4, 0xFF,
+0x02, 0x68, 0x8F, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x22, 0x90, 0x85,
+0xC1, 0xE0, 0xFF, 0x12, 0x8F, 0x66, 0x30, 0xE0, 0x24, 0xEF, 0x54, 0x7F, 0xF0, 0x90, 0x04, 0xE0,
+0xE0, 0x90, 0x85, 0xC2, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x07, 0xE0, 0x54, 0xFD,
+0xB1, 0x13, 0x04, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x03, 0x12, 0x9F, 0xC6, 0x7F, 0x01, 0x12,
+0x68, 0x8F, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x05, 0xB1, 0x5F, 0x12, 0x97, 0x3C, 0x22, 0x90,
+0x92, 0x09, 0xE0, 0x30, 0xE0, 0x24, 0xA3, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xB1, 0x8B, 0xF5,
+0x83, 0xE0, 0xFE, 0x30, 0xE0, 0x14, 0xEF, 0xB1, 0x8B, 0xF5, 0x83, 0xEE, 0x54, 0xFE, 0x12, 0x97,
+0xF5, 0x12, 0x92, 0x32, 0xFD, 0x7F, 0x02, 0x12, 0x94, 0x82, 0x22, 0x75, 0xF0, 0x0E, 0xA4, 0x24,
+0x15, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0x22, 0x90, 0x93, 0x50, 0x12, 0xBD, 0x5D, 0xEB, 0x75, 0xF0,
+0x06, 0xA4, 0xFF, 0x90, 0x89, 0x21, 0x12, 0x87, 0x70, 0xE9, 0x2F, 0xF9, 0xEA, 0x35, 0xF0, 0xFA,
+0x90, 0x93, 0x58, 0x12, 0x87, 0x79, 0x90, 0x93, 0x52, 0xE0, 0xD1, 0x95, 0xE0, 0xFF, 0xA3, 0xE0,
+0x90, 0x93, 0x55, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x93, 0x58, 0x12, 0x87,
+0x70, 0x90, 0x93, 0x57, 0xE0, 0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x12, 0x03, 0x0F, 0xFD, 0x7C,
+0x00, 0x90, 0x93, 0x52, 0xE0, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x44, 0x12, 0x05, 0x28, 0x75, 0xF0,
+0x02, 0xEF, 0x12, 0x05, 0x28, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x54, 0xE0, 0xFB, 0xEF,
+0xA8, 0x03, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0xD1, 0x77, 0xEE, 0x8F,
+0xF0, 0x12, 0x07, 0x0A, 0x90, 0x93, 0x57, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x05, 0xAD, 0x90, 0x93,
+0x58, 0x12, 0x87, 0x70, 0x12, 0x8F, 0xF3, 0xFD, 0x7C, 0x00, 0x90, 0x93, 0x54, 0xE0, 0xFF, 0x90,
+0x93, 0x50, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13,
+0xD8, 0xF9, 0xD1, 0x77, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x9E, 0x40, 0x08, 0xED,
+0x9F, 0xFF, 0xEC, 0x9E, 0xFE, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x00, 0x90, 0x93, 0x55, 0xEE, 0xF0,
+0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x55, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x52, 0xE0, 0xD1,
+0x95, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xFF, 0x12, 0x03, 0x70, 0x90, 0x93, 0x55, 0x22, 0xE5,
+0x72, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4, 0x93, 0xFE, 0x74,
+0x01, 0x93, 0xFF, 0xE5, 0x6F, 0x25, 0xE0, 0x24, 0x7B, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83,
+0x22, 0x7D, 0x01, 0xAF, 0x63, 0xAC, 0x05, 0x90, 0x93, 0x50, 0xEF, 0xF0, 0xFD, 0xE0, 0xFF, 0x12,
+0xB5, 0x85, 0xE0, 0xF5, 0x6F, 0x54, 0x7F, 0xF5, 0x71, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x3D,
+0x12, 0x05, 0x28, 0xE0, 0xF9, 0x90, 0x93, 0x50, 0xE0, 0xF1, 0x87, 0xFE, 0xEF, 0x12, 0xB6, 0x9A,
+0xE0, 0x54, 0x03, 0xF5, 0x70, 0xE5, 0x71, 0x90, 0x83, 0x1D, 0x93, 0xFB, 0xED, 0xD1, 0x95, 0xE4,
+0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x8D, 0x2E, 0xC4, 0x54, 0x03, 0x90, 0x93, 0x51, 0xF0, 0x74, 0xCC,
+0x2D, 0xF1, 0x96, 0xE5, 0x71, 0xF0, 0x74, 0x4C, 0x2D, 0xF1, 0x7F, 0xE5, 0x70, 0xF0, 0xE5, 0x71,
+0xD3, 0x9E, 0x40, 0x06, 0x8E, 0x71, 0xAF, 0x06, 0x8F, 0x6F, 0x8C, 0x72, 0xE4, 0xFF, 0xEF, 0xC3,
+0x95, 0x72, 0x50, 0x2F, 0xE5, 0x6F, 0x30, 0xE7, 0x09, 0x85, 0x71, 0x6F, 0x1C, 0xEC, 0x70, 0x20,
+0x80, 0x21, 0xE5, 0x71, 0xD3, 0x99, 0x40, 0x14, 0xAD, 0x01, 0x90, 0x93, 0x50, 0xE0, 0xFB, 0x90,
+0x93, 0x55, 0xEC, 0xF0, 0xAF, 0x71, 0xF1, 0x9E, 0x8F, 0x6F, 0x80, 0x07, 0x89, 0x6F, 0x80, 0x03,
+0x0F, 0x80, 0xCB, 0x90, 0x93, 0x50, 0xE0, 0xFF, 0x90, 0x93, 0x56, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0,
+0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x6F, 0xF1, 0x77, 0x12, 0xBD, 0xDE, 0x7B, 0x01, 0xFA, 0x7D, 0x05,
+0x7F, 0x08, 0x12, 0xB6, 0x19, 0x90, 0x93, 0x50, 0xE0, 0xFF, 0x90, 0x91, 0x0B, 0xE5, 0x70, 0xF0,
+0xE4, 0xFB, 0xAD, 0x6F, 0x02, 0x27, 0x3D, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x70, 0x22, 0xF5,
+0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x22, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x3C, 0x12, 0x05, 0x28,
+0xE0, 0x22, 0x74, 0xCC, 0x25, 0x6F, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x22, 0xE4, 0xF5,
+0x74, 0xEF, 0x14, 0xF5, 0x73, 0xED, 0xFF, 0xE5, 0x73, 0xF5, 0x82, 0x33, 0x95, 0xE0, 0xF5, 0x83,
+0xC3, 0xE5, 0x82, 0x9F, 0x74, 0x80, 0xF8, 0x65, 0x83, 0x98, 0x40, 0x54, 0xE5, 0x73, 0x78, 0x03,
+0xA2, 0xE7, 0x13, 0xD8, 0xFB, 0xFF, 0x33, 0x95, 0xE0, 0xFE, 0xEB, 0x12, 0xD9, 0x6C, 0xF5, 0x83,
+0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE5, 0x83, 0x3E, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00,
+0xE5, 0x73, 0x12, 0xB1, 0x33, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE,
+0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x13, 0x85, 0x73, 0x75, 0x05, 0x74, 0x90, 0x93,
+0x55, 0xE0, 0x65, 0x74, 0x60, 0x0A, 0xE5, 0x75, 0xD3, 0x9D, 0x40, 0x04, 0x15, 0x73, 0x80, 0x95,
+0xAF, 0x75, 0x22, 0x8F, 0x6F, 0x8D, 0x70, 0xEF, 0x12, 0xB5, 0x85, 0xE0, 0xF5, 0x71, 0x54, 0x7F,
+0xF5, 0x72, 0xE5, 0x71, 0x54, 0x80, 0xF5, 0x74, 0x75, 0xF0, 0x12, 0xEF, 0x12, 0xCF, 0x8A, 0xF5,
+0x76, 0x75, 0xF0, 0x12, 0xEF, 0x12, 0x8D, 0x32, 0xC4, 0x54, 0x03, 0xF5, 0x77, 0x31, 0x56, 0xF5,
+0x83, 0x74, 0xFF, 0xF0, 0x12, 0xCE, 0x7F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x71, 0x45, 0x74,
+0xFF, 0x12, 0xCF, 0x92, 0xEF, 0xF0, 0xE5, 0x6F, 0x12, 0xB6, 0x9A, 0xE0, 0x54, 0x03, 0xF5, 0x75,
+0x74, 0x4C, 0x25, 0x6F, 0x12, 0xCF, 0x7F, 0xE5, 0x75, 0xF0, 0xE5, 0x72, 0x65, 0x76, 0x70, 0x46,
+0x12, 0x8F, 0xC0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x74, 0x70, 0x08, 0xE5, 0x72,
+0x44, 0x80, 0xF5, 0x71, 0x21, 0x24, 0x12, 0xCE, 0x7F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0xCE,
+0x93, 0xE0, 0xFF, 0xA3, 0xE0, 0x12, 0xB7, 0x75, 0xE4, 0xF0, 0xA3, 0xE5, 0x6F, 0xF0, 0xE4, 0x90,
+0x93, 0x5A, 0x12, 0xA6, 0x95, 0x7B, 0x01, 0xFA, 0x7D, 0x02, 0x7F, 0x04, 0x12, 0xB6, 0x19, 0x7D,
+0x07, 0xAF, 0x6F, 0x02, 0xB7, 0x85, 0xE5, 0x72, 0xC3, 0x95, 0x76, 0x50, 0x5F, 0xAB, 0x6F, 0xAD,
+0x76, 0xAF, 0x72, 0x12, 0x72, 0xEA, 0x8F, 0x73, 0x85, 0x73, 0x71, 0x12, 0x8F, 0xC0, 0xC4, 0x13,
+0x54, 0x01, 0xFF, 0x90, 0x93, 0x5A, 0xE4, 0x12, 0xB7, 0x79, 0xE4, 0xF0, 0xA3, 0xE5, 0x73, 0xF0,
+0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x72, 0xF0, 0xE5, 0x74, 0x12, 0x8F, 0x66, 0x12, 0xB7, 0x3E, 0xE4,
+0xFB, 0xFA, 0x31, 0x60, 0xE5, 0x72, 0xC3, 0x94, 0x0C, 0x40, 0x29, 0x12, 0x8F, 0xC0, 0xC4, 0x13,
+0x54, 0x07, 0x30, 0xE0, 0x1F, 0xE5, 0x70, 0x60, 0x1B, 0xE5, 0x74, 0x70, 0x17, 0xE5, 0x72, 0x44,
+0x80, 0xF5, 0x71, 0x31, 0x56, 0xF5, 0x83, 0xE5, 0x73, 0xF0, 0x80, 0x08, 0x12, 0xCF, 0x92, 0xE5,
+0x76, 0xF0, 0xF5, 0x71, 0x90, 0x93, 0x56, 0xE4, 0xF0, 0xA3, 0xE5, 0x71, 0xF0, 0x31, 0x56, 0xF5,
+0x83, 0xE0, 0xFF, 0x31, 0x67, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x75, 0x12, 0xCF, 0x77,
+0xF0, 0x7B, 0x01, 0x7A, 0x00, 0x31, 0x60, 0x90, 0x91, 0x0B, 0xE5, 0x75, 0xF0, 0xAB, 0x70, 0xAD,
+0x71, 0xAF, 0x6F, 0x02, 0x27, 0x3D, 0x74, 0x9F, 0x25, 0x6F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0x22,
+0x7D, 0x05, 0x7F, 0x04, 0x02, 0xB6, 0x19, 0x90, 0x93, 0x58, 0xE4, 0xF0, 0xA3, 0x22, 0x7E, 0x00,
+0x7F, 0xAA, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x09, 0x02, 0x06, 0xDE, 0xC3, 0xEF, 0x9D,
+0xF5, 0x60, 0xC3, 0x94, 0x08, 0x50, 0x1F, 0xE4, 0xF5, 0x61, 0xEB, 0x51, 0x5F, 0xF5, 0x83, 0xC0,
+0x83, 0xC0, 0x82, 0x90, 0x93, 0x0A, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x05,
+0x28, 0xE5, 0x60, 0xF0, 0x80, 0x41, 0xE5, 0x60, 0xC3, 0x94, 0x10, 0x50, 0x09, 0x75, 0x61, 0x01,
+0xE5, 0x60, 0x24, 0xF8, 0x80, 0x17, 0xE5, 0x60, 0xC3, 0x94, 0x18, 0x50, 0x09, 0x75, 0x61, 0x02,
+0xE5, 0x60, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x61, 0x03, 0xE5, 0x60, 0x24, 0xE8, 0xFF, 0xEB, 0x51,
+0x5F, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0x93, 0x0A, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x75,
+0xF0, 0x03, 0x12, 0x05, 0x28, 0xEF, 0xF0, 0xAF, 0x61, 0x22, 0x8F, 0x5E, 0x8D, 0x5F, 0xAE, 0x03,
+0x74, 0x1F, 0xC3, 0x95, 0x5E, 0x40, 0x0B, 0x51, 0x57, 0xE4, 0xFD, 0x51, 0x50, 0xF0, 0x24, 0xD4,
+0x80, 0x34, 0x74, 0x3F, 0xC3, 0x95, 0x5E, 0x40, 0x0B, 0x51, 0x57, 0x7D, 0x20, 0x51, 0x4E, 0xF0,
+0x24, 0x88, 0x80, 0x22, 0x74, 0x5F, 0xC3, 0x95, 0x5E, 0x40, 0x0B, 0x51, 0x57, 0x7D, 0x40, 0x51,
+0x4E, 0xF0, 0x24, 0xD0, 0x80, 0x10, 0x74, 0x7F, 0xC3, 0x95, 0x5E, 0x40, 0x20, 0x51, 0x57, 0x7D,
+0x60, 0x51, 0x4E, 0xF0, 0x24, 0x84, 0xFD, 0xE4, 0x34, 0x04, 0xFC, 0xE5, 0x5F, 0x51, 0x6B, 0xF5,
+0x83, 0x75, 0xF0, 0x03, 0xEE, 0x12, 0x05, 0x28, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0xAF, 0x5E,
+0x31, 0x7D, 0x90, 0x93, 0x06, 0xEF, 0x22, 0x90, 0x93, 0x0A, 0xEE, 0xF0, 0xAB, 0x5F, 0x22, 0x75,
+0xF0, 0x0E, 0xA4, 0x24, 0x11, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0x22, 0x75, 0xF0, 0x0E, 0xA4, 0x24,
+0x0F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93,
+0x85, 0xED, 0xF0, 0x90, 0x93, 0x84, 0xEF, 0xF0, 0x64, 0x02, 0x70, 0x2A, 0x90, 0x05, 0x22, 0xE0,
+0x90, 0x93, 0x86, 0xF0, 0x7D, 0x4A, 0x7F, 0x6F, 0x12, 0x90, 0xDE, 0x12, 0x93, 0xCB, 0xBF, 0x01,
+0x07, 0x90, 0x04, 0xD4, 0x74, 0xFF, 0x80, 0x4D, 0x90, 0x93, 0x86, 0xE0, 0xFF, 0x7D, 0x46, 0x12,
+0x90, 0xDE, 0x7F, 0x00, 0x80, 0x44, 0x90, 0x93, 0x84, 0xE0, 0x64, 0x01, 0x70, 0x33, 0xFD, 0xFF,
+0x12, 0x90, 0xDE, 0x90, 0x93, 0x85, 0xE0, 0xFF, 0x75, 0xF0, 0x13, 0xA4, 0x24, 0x3C, 0xF5, 0x82,
+0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xF4, 0x90, 0x04, 0xD4, 0xF0, 0xEF, 0x75, 0xF0, 0x13, 0xA4,
+0x24, 0x3D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xF4, 0x90, 0x04, 0xD5, 0xF0, 0x80,
+0x07, 0x90, 0x04, 0xD4, 0xE4, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 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, 0x7C,
+0x9F, 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, 0x7C, 0x9F, 0x90,
+0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02, 0x7F, 0x01, 0x22, 0x90, 0x01, 0xCF,
+0xE0, 0x90, 0x93, 0x6D, 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, 0x75, 0xB6, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB,
+0xFD, 0x7F, 0x03, 0x12, 0x7B, 0x3E, 0x80, 0xFE, 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, 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,
+0xFE, 0xFD, 0xEF, 0xB4, 0x01, 0x0D, 0xEB, 0xB4, 0x02, 0x03, 0x0D, 0x80, 0x06, 0xEB, 0xB4, 0x01,
+0x02, 0x7D, 0x02, 0xAF, 0x06, 0xEF, 0xC4, 0x54, 0xF0, 0x4D, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0x90, 0x01, 0xC4, 0x74, 0xF0, 0xF0, 0x74, 0xD3, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x7B, 0x51, 0xEF,
+0x20, 0xE0, 0xF7, 0x74, 0xF0, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xD3, 0xA3, 0xF0, 0x22, 0x90,
+0x85, 0xBF, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x93, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x84, 0xC3, 0xE0, 0x04,
+0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x3C, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0x97, 0xF0, 0x7D,
+0x26, 0x12, 0x93, 0xC7, 0xEF, 0x64, 0x01, 0x70, 0x16, 0x91, 0xB0, 0x7D, 0x01, 0x12, 0x3A, 0xC2,
+0x91, 0xBB, 0xE0, 0x20, 0xE0, 0x09, 0x90, 0x92, 0x09, 0xE0, 0x20, 0xE0, 0x02, 0x91, 0xA5, 0x90,
+0x93, 0x97, 0xE0, 0xFF, 0x7D, 0x27, 0x12, 0x90, 0xDE, 0x90, 0x93, 0x93, 0xE0, 0xFF, 0x12, 0x5C,
+0xA3, 0x80, 0x24, 0x90, 0x93, 0x93, 0xE0, 0xFF, 0x12, 0x5C, 0xA3, 0x91, 0xB0, 0x90, 0x93, 0xFB,
+0x74, 0x0A, 0xF0, 0x7D, 0x01, 0x12, 0xAE, 0x2E, 0x91, 0xBB, 0xE0, 0x20, 0xE0, 0x09, 0x90, 0x92,
+0x09, 0xE0, 0x20, 0xE0, 0x02, 0x91, 0xA5, 0x12, 0xAF, 0xD6, 0x91, 0xD1, 0x74, 0x01, 0xF0, 0xFF,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x93, 0x95, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x50, 0xD7,
+0x90, 0x84, 0xC8, 0xE0, 0xFF, 0x90, 0x93, 0x94, 0xE0, 0xFB, 0x22, 0x90, 0x93, 0x95, 0xEE, 0xF0,
+0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x93, 0x93, 0xE0, 0xFF, 0x12, 0x65, 0x61, 0x90, 0x92, 0x0A,
+0x22, 0x90, 0x84, 0xBF, 0xA3, 0xE0, 0x24, 0x7F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22,
0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7A, 0x29, 0xEF, 0x64, 0x01, 0x60, 0x05, 0x75,
-0x0F, 0x01, 0x80, 0x51, 0x90, 0x85, 0xC9, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x05, 0x75, 0x0F, 0x02,
-0x80, 0x43, 0x90, 0x85, 0xC7, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x05, 0x75, 0x0F, 0x04, 0x80,
-0x34, 0xEF, 0x30, 0xE2, 0x05, 0x75, 0x0F, 0x08, 0x80, 0x2B, 0x90, 0x85, 0xC9, 0xE0, 0x30, 0xE4,
-0x05, 0x75, 0x0F, 0x10, 0x80, 0x1F, 0x90, 0x85, 0xC2, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0,
-0x05, 0x75, 0x0F, 0x20, 0x80, 0x0F, 0x90, 0x86, 0x71, 0xE0, 0x60, 0x05, 0x75, 0x0F, 0x80, 0x80,
-0x04, 0x71, 0xC0, 0x80, 0x0E, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x0F,
-0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x84, 0xC1, 0x12, 0x96, 0x40, 0x90,
-0x92, 0x76, 0xF0, 0x22, 0xE4, 0xF5, 0x40, 0xF5, 0x41, 0xF5, 0x42, 0x75, 0x43, 0x80, 0xAD, 0x40,
-0x7F, 0x50, 0x12, 0x7B, 0x3E, 0xAD, 0x41, 0x7F, 0x51, 0x12, 0x7B, 0x3E, 0xAD, 0x42, 0x7F, 0x52,
-0x12, 0x7B, 0x3E, 0xAD, 0x43, 0x7F, 0x53, 0x02, 0x7B, 0x3E, 0x12, 0x75, 0xB6, 0x12, 0x75, 0x58,
-0x11, 0x35, 0x11, 0x16, 0x80, 0xCE, 0x75, 0x52, 0x06, 0x75, 0x53, 0x01, 0x75, 0x54, 0x03, 0x75,
-0x55, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x52, 0xF0, 0xA3, 0xE5, 0x53, 0xF0, 0xA3, 0xE5, 0x54, 0xF0,
-0xA3, 0xE5, 0x55, 0xF0, 0x22, 0x75, 0x48, 0x12, 0xE4, 0xF5, 0x49, 0x75, 0x4A, 0x07, 0x75, 0x4B,
-0x32, 0xF5, 0x50, 0x90, 0x01, 0x30, 0xE5, 0x48, 0xF0, 0xA3, 0xE5, 0x49, 0xF0, 0xA3, 0xE5, 0x4A,
-0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0x90, 0x01, 0x20, 0xE5, 0x50, 0xF0, 0x22, 0x12, 0x7C, 0x4E, 0x90,
-0x84, 0xC5, 0xEF, 0xF0, 0x11, 0x0A, 0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0,
-0x44, 0x80, 0xF0, 0x90, 0x00, 0x17, 0xE0, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x7B,
-0x3E, 0x90, 0x00, 0x38, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x38, 0x12, 0x7B, 0x3E, 0x02, 0x68, 0xE2,
-0x90, 0x01, 0xE4, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x84, 0xA1, 0x74, 0x02, 0xF0, 0xA3,
-0x74, 0x10, 0xF0, 0x90, 0x84, 0xA7, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x03, 0xF0, 0x22, 0xE4, 0xFB,
-0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x86, 0x4E, 0x90, 0x92, 0x32, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x84,
-0xC1, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30, 0xE0, 0x0F, 0x90,
-0x84, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x2D, 0xBD, 0x12, 0x91, 0xE8, 0x31, 0x09,
-0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0x60, 0x5D, 0x31, 0x09, 0x30, 0xE2, 0x06, 0x54, 0xFB,
-0xF0, 0x12, 0x6A, 0x6D, 0x31, 0x09, 0x30, 0xE4, 0x0C, 0x54, 0xEF, 0xF0, 0x12, 0x6F, 0x22, 0xBF,
-0x01, 0x03, 0x12, 0xAC, 0x16, 0xD2, 0xAF, 0x80, 0xB5, 0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x84, 0xC1,
-0xE0, 0xFF, 0x22, 0x8F, 0x0D, 0x7F, 0x02, 0x12, 0x86, 0x27, 0x90, 0x84, 0xC1, 0xE0, 0x45, 0x0D,
-0xF0, 0x22, 0x12, 0x40, 0xB9, 0x7F, 0x02, 0x80, 0xEA, 0x90, 0x86, 0x72, 0xE0, 0x30, 0xE0, 0x04,
-0x7F, 0x10, 0x31, 0x13, 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, 0x35, 0xF0, 0x74, 0xB9, 0xA3, 0xF0, 0x12, 0x75, 0x28, 0xE5,
-0x56, 0x30, 0xE1, 0x02, 0x51, 0x6C, 0xE5, 0x56, 0x30, 0xE2, 0x03, 0x12, 0xA6, 0x0E, 0xE5, 0x57,
-0x30, 0xE0, 0x02, 0x51, 0x38, 0xE5, 0x58, 0x30, 0xE1, 0x02, 0x91, 0xBA, 0xE5, 0x58, 0x30, 0xE0,
-0x02, 0x91, 0x72, 0xE5, 0x58, 0x30, 0xE4, 0x02, 0x51, 0x6B, 0xE5, 0x59, 0x30, 0xE1, 0x04, 0x7F,
-0x04, 0x31, 0x13, 0xE5, 0x59, 0x30, 0xE4, 0x03, 0x12, 0xA5, 0x37, 0xE5, 0x59, 0x30, 0xE5, 0x02,
-0x31, 0xCF, 0xE5, 0x59, 0x30, 0xE6, 0x02, 0x31, 0xF6, 0x74, 0x35, 0x04, 0x90, 0x01, 0xC4, 0xF0,
-0x74, 0xB9, 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,
-0x85, 0xC1, 0x12, 0x9C, 0x0B, 0x30, 0xE0, 0x19, 0xEF, 0x54, 0xBF, 0x51, 0x24, 0x30, 0xE0, 0x06,
-0xE0, 0x44, 0x01, 0xF0, 0x80, 0x08, 0xE0, 0x54, 0xFE, 0x51, 0x2D, 0x74, 0x04, 0xF0, 0x12, 0xA5,
-0x90, 0xE4, 0xFF, 0x02, 0x68, 0x8F, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x12, 0x8D, 0x59, 0x30, 0xE0,
-0x1E, 0xEF, 0x54, 0x7F, 0x51, 0x24, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02, 0xF0, 0x80, 0x07, 0xE0,
-0x54, 0xFD, 0x51, 0x2D, 0x04, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x03, 0x12, 0xA5, 0x90, 0x7F,
-0x01, 0x02, 0x68, 0x8F, 0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x85, 0xC2, 0x22, 0xF0, 0x90, 0x01,
-0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x22, 0xB1, 0x03, 0x90, 0x92, 0x67, 0xEF, 0xF0, 0x30,
-0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x57, 0x82, 0x90, 0x92, 0x67,
-0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90,
-0x01, 0x2F, 0x74, 0x80, 0xF0, 0x51, 0x76, 0xFB, 0x02, 0x51, 0x7D, 0x22, 0x90, 0x85, 0xC5, 0xE0,
-0x60, 0x03, 0x12, 0xA4, 0xD0, 0x22, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x85,
-0xDE, 0xE0, 0x22, 0xE4, 0x90, 0x92, 0x56, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x92, 0x94, 0x12,
-0x87, 0x58, 0x90, 0x92, 0x90, 0x12, 0x87, 0x64, 0xC3, 0x12, 0x04, 0xB4, 0x40, 0x50, 0x90, 0x85,
-0xC1, 0xE0, 0x90, 0x92, 0x94, 0x30, 0xE0, 0x14, 0x71, 0xFA, 0x74, 0x0A, 0x9E, 0x2F, 0xFF, 0x90,
-0x85, 0xFB, 0xE0, 0x24, 0x04, 0x2F, 0xFF, 0x90, 0x92, 0xC5, 0x80, 0x0A, 0x71, 0xFA, 0x74, 0x0A,
-0x9E, 0x2F, 0xFF, 0x90, 0x92, 0xC6, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0x90, 0x92, 0x57, 0xF0, 0x90,
-0x92, 0x57, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x15, 0x74, 0x98, 0x2F, 0x91, 0x12, 0xE0, 0x04,
-0xF0, 0x90, 0x85, 0xDB, 0xE0, 0x04, 0xF0, 0xE0, 0xFD, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85,
-0xDB, 0xE0, 0xFF, 0xD3, 0x90, 0x92, 0xC8, 0xE0, 0x9F, 0x90, 0x92, 0xC7, 0xE0, 0x94, 0x00, 0x40,
-0x02, 0x61, 0xC6, 0x71, 0xD8, 0x71, 0xCF, 0x50, 0x1C, 0x71, 0xE2, 0x90, 0x92, 0x58, 0xE0, 0xD3,
-0x9F, 0x40, 0x0A, 0x90, 0x92, 0x56, 0xE0, 0x90, 0x92, 0x59, 0xF0, 0x80, 0x08, 0x90, 0x92, 0x56,
-0xE0, 0x04, 0xF0, 0x80, 0xE0, 0x71, 0xD8, 0x71, 0xCF, 0x50, 0x2C, 0x71, 0xE2, 0xC3, 0x90, 0x92,
-0xC8, 0xE0, 0x9F, 0xFF, 0x90, 0x92, 0xC7, 0xE0, 0x94, 0x00, 0xFE, 0x90, 0x92, 0x58, 0xE0, 0xD3,
-0x9F, 0xE4, 0x9E, 0x40, 0x0A, 0x90, 0x92, 0x56, 0xE0, 0x90, 0x92, 0x5A, 0xF0, 0x80, 0x08, 0x90,
-0x92, 0x56, 0xE0, 0x04, 0xF0, 0x80, 0xD0, 0x90, 0x92, 0x59, 0xE0, 0x90, 0x85, 0xE0, 0xF0, 0x90,
-0x92, 0x5A, 0xE0, 0x90, 0x85, 0xE1, 0x71, 0xC7, 0x94, 0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90,
-0x85, 0xD8, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x85, 0xD8, 0x71, 0xC7, 0x74, 0x0A, 0x9F, 0x90,
-0x85, 0xD7, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x85, 0xDE, 0xF0,
-0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x92, 0xC5, 0x80, 0x03, 0x90, 0x92, 0xC6, 0xE0,
-0xFF, 0x90, 0x85, 0xDE, 0xE0, 0x2F, 0x04, 0xF0, 0x90, 0x85, 0xDE, 0xE0, 0xC3, 0x94, 0x0A, 0x50,
-0x03, 0x74, 0x0A, 0xF0, 0x90, 0x85, 0xDE, 0xE0, 0x24, 0x02, 0xF0, 0x51, 0x76, 0xFB, 0x12, 0x51,
-0x7D, 0xE4, 0xFF, 0x12, 0x69, 0x33, 0x22, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xC3, 0x22, 0x90,
-0x92, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x22, 0xE4, 0x90, 0x92, 0x58, 0xF0, 0x90, 0x92, 0x56,
-0xF0, 0x22, 0x74, 0x98, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x92,
-0x58, 0xE0, 0x2F, 0xF0, 0x90, 0x92, 0xC9, 0xE0, 0xFF, 0x22, 0x12, 0x87, 0x64, 0x90, 0x92, 0x90,
-0x12, 0x87, 0x58, 0x12, 0x87, 0x30, 0x78, 0x0A, 0x12, 0x04, 0xC5, 0x90, 0x85, 0xDD, 0xE0, 0xFE,
-0xC3, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xE4, 0xFE, 0x74, 0x98, 0x2E, 0x91,
-0x12, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x2D, 0xF4, 0xE4, 0x90, 0x85, 0xDC, 0xF0, 0x90, 0x85, 0xDB,
-0xF0, 0x90, 0x85, 0xDF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0xA3, 0x74, 0x2D, 0xF0, 0xE4, 0xA3, 0xF0,
-0x22, 0x90, 0x93, 0x14, 0x12, 0x87, 0x79, 0x12, 0x71, 0x54, 0x90, 0x85, 0xC5, 0xE0, 0xFF, 0x12,
-0x60, 0xD0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x19, 0x90, 0x93, 0x14, 0x12, 0x87, 0x70, 0x12, 0x8D,
-0x62, 0x54, 0x0F, 0xFF, 0x12, 0x8C, 0x6F, 0xFD, 0x12, 0x6A, 0xB8, 0x51, 0x76, 0xFB, 0x12, 0x51,
-0x7D, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x30, 0xE0, 0x3F, 0x90, 0x85, 0xC0, 0xE0, 0x7E, 0x00,
-0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x85, 0xBF, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01,
-0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0xA7, 0xBA, 0x12, 0x9F, 0x2F,
-0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0x85, 0xC0,
-0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x9D, 0x7D, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x30,
-0xE0, 0x40, 0x90, 0x85, 0xC0, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x85, 0xBF,
-0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x26, 0xEF, 0xC3, 0x13, 0x30,
-0xE0, 0x03, 0x02, 0xA7, 0xBA, 0x12, 0xA5, 0xC9, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x0C, 0x06, 0xE4,
-0xFD, 0x7F, 0x08, 0x80, 0x0A, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12,
-0x9D, 0x7D, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, 0xA3, 0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51, 0x90,
-0x92, 0x68, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51, 0xAE, 0x07, 0x90, 0x92, 0x68, 0xE0, 0xFF,
-0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x92, 0x6A, 0xE0, 0x94, 0x64, 0x90, 0x92, 0x69, 0xE0, 0x94,
-0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40, 0xF0, 0x90, 0x92, 0x68, 0xE0, 0xFF, 0x22,
-0x90, 0x92, 0x69, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x80, 0xBE, 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, 0x4D, 0xF0,
-0x74, 0xBD, 0xA3, 0xF0, 0x12, 0x6C, 0xBC, 0x74, 0x4D, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xBD,
-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, 0x32, 0xC0, 0xE0,
-0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x9E, 0x90,
-0x01, 0xC4, 0xED, 0xF0, 0x74, 0xBD, 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,
-0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x88, 0xE7, 0xE0,
-0x04, 0xF0, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x30, 0xE0, 0x05, 0x12, 0x9F, 0x48, 0x60, 0x1B, 0x90,
-0x85, 0xC5, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x02, 0x60,
-0x09, 0x12, 0xA0, 0x9E, 0x90, 0x01, 0xE6, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39,
-0xBF, 0x01, 0x13, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0D, 0x12, 0x9F, 0xE4, 0x64, 0x02, 0x60, 0x03,
-0x02, 0x77, 0x61, 0x12, 0x79, 0x41, 0x22, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x07, 0x90, 0x85, 0xBC,
-0xE0, 0x30, 0xE0, 0x13, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x09, 0x12, 0x9F, 0xAC, 0xBF, 0x01,
-0x06, 0x02, 0x9F, 0x4F, 0x12, 0x9F, 0x67, 0x22, 0x7D, 0x07, 0xAF, 0x62, 0xED, 0x30, 0xE0, 0x21,
-0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x44, 0xD1, 0x9B, 0xEF, 0x90, 0x89, 0x46, 0xD1, 0x9B, 0xEF,
-0x90, 0x89, 0x48, 0xD1, 0x9B, 0xEF, 0x90, 0x89, 0x4A, 0xD1, 0x9B, 0xEF, 0x90, 0x89, 0x4C, 0xD1,
-0xA6, 0xED, 0x30, 0xE1, 0x09, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x40, 0xD1, 0xA6, 0xED, 0x30,
-0xE2, 0x0C, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x42, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xD1, 0xAE,
-0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0xD1, 0xAE, 0xEE, 0xF0, 0x22, 0x12, 0x05, 0x28, 0xE4, 0xF0,
-0xA3, 0xF0, 0x75, 0xF0, 0x12, 0x22, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3, 0xF0, 0x22, 0xEF, 0xC4,
-0x54, 0xF0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x7B, 0x00, 0x7A, 0x00,
-0x79, 0x00, 0x90, 0x89, 0x1B, 0x12, 0x87, 0x79, 0x7B, 0xFF, 0x7A, 0x82, 0x79, 0x00, 0x90, 0x89,
-0x1E, 0x12, 0x87, 0x79, 0x7A, 0x82, 0x79, 0x3F, 0x90, 0x89, 0x21, 0x12, 0x87, 0x79, 0x7A, 0x82,
-0x79, 0xE1, 0x90, 0x89, 0x27, 0x12, 0x87, 0x79, 0x7A, 0x82, 0x79, 0xF5, 0x90, 0x89, 0x2A, 0x12,
-0x87, 0x79, 0x7A, 0x83, 0x79, 0x1D, 0x90, 0x89, 0x2D, 0x12, 0x87, 0x79, 0x7A, 0x83, 0x79, 0x31,
-0x90, 0x89, 0x33, 0x12, 0x87, 0x79, 0x7A, 0x83, 0x79, 0x59, 0x90, 0x89, 0x36, 0x12, 0x87, 0x79,
-0x7A, 0x83, 0x79, 0x81, 0x90, 0x89, 0x39, 0x12, 0x87, 0x79, 0xE4, 0x90, 0x92, 0xCB, 0xF0, 0x90,
-0x92, 0x29, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0xFF, 0xC3, 0x94, 0x05, 0x50, 0x10, 0x74, 0xDC, 0x2F,
-0x12, 0x96, 0x7A, 0xE4, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0x04, 0xF0, 0x80, 0xE6, 0x22, 0x90, 0x01,
-0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90,
-0x92, 0x56, 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, 0x75, 0xB6, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F,
-0x03, 0x12, 0x7B, 0x3E, 0x80, 0xFE, 0x22, 0xE4, 0xFF, 0x02, 0x2D, 0xBD, 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, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A,
-0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
-0xC0, 0xD0, 0x90, 0x93, 0x08, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x07, 0xEF, 0xF0, 0xE4,
-0xFD, 0xFC, 0x12, 0xC3, 0x07, 0x90, 0x93, 0x07, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x93, 0x08,
-0xE0, 0x60, 0x06, 0x12, 0xC0, 0x85, 0x44, 0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0, 0x11, 0x85, 0x54, 0xC0, 0xF0, 0x90, 0x93,
-0x0A, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x18, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF,
-0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03, 0x74, 0x10, 0x40, 0x07, 0x11, 0x7C, 0x74, 0x04,
-0xF0, 0x80, 0x04, 0x11, 0x7C, 0xE4, 0xF0, 0xAF, 0x05, 0x11, 0x73, 0xF5, 0x83, 0xE0, 0x54, 0x01,
-0xFE, 0x90, 0x93, 0x09, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x11,
-0x73, 0xF5, 0x83, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74,
-0xFF, 0xF0, 0x74, 0x29, 0x2F, 0x11, 0xA1, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0,
-0x92, 0xAF, 0x22, 0x74, 0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x22, 0x2E, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0x22, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29,
-0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0x90, 0x88, 0xD9, 0x31, 0x48, 0x11,
-0x91, 0xFD, 0x90, 0x92, 0x07, 0xE0, 0x24, 0x2C, 0x51, 0xFB, 0x90, 0x92, 0x07, 0xE0, 0x2F, 0x24,
-0x30, 0xA3, 0xF0, 0xE0, 0xFD, 0x24, 0x04, 0x51, 0xF3, 0xE0, 0xFE, 0x74, 0x05, 0x2D, 0x51, 0x06,
-0x12, 0xAF, 0x57, 0xEC, 0x3E, 0x90, 0x88, 0x80, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x08, 0xE0,
-0x24, 0x0C, 0xF9, 0xE4, 0x34, 0xFC, 0x31, 0x59, 0x75, 0x1E, 0x04, 0x7B, 0x01, 0x7A, 0x88, 0x79,
-0x82, 0x12, 0x6A, 0x21, 0x90, 0x92, 0x08, 0xE0, 0x24, 0x14, 0xF0, 0xE0, 0xFD, 0x24, 0x01, 0x51,
-0x16, 0x2D, 0x51, 0x0E, 0x12, 0xAF, 0x57, 0xEC, 0x3E, 0x90, 0x88, 0x86, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x88, 0xDA, 0x31, 0x48, 0x90, 0x88, 0x7C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x4E, 0x60, 0x11,
-0x90, 0x92, 0x07, 0xE0, 0x31, 0x53, 0x8F, 0x1E, 0x7B, 0x01, 0x7A, 0x88, 0x79, 0x8A, 0x12, 0x6A,
-0x21, 0x90, 0x88, 0xDB, 0x31, 0x48, 0x31, 0x53, 0x90, 0x88, 0x7E, 0xA3, 0xE0, 0xF5, 0x1E, 0x7B,
-0x01, 0x7A, 0x88, 0x79, 0xAA, 0x02, 0x6A, 0x21, 0xE0, 0xFF, 0x12, 0x7B, 0x2A, 0x90, 0x92, 0x07,
-0xEF, 0xF0, 0x22, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC, 0x75, 0x1B, 0x01, 0xF5, 0x1C, 0x89, 0x1D,
-0x22, 0xEF, 0x60, 0x04, 0x31, 0x69, 0x11, 0xAA, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x88, 0xD8, 0xE0,
-0xFF, 0x71, 0x07, 0xAB, 0x05, 0x74, 0x01, 0x2B, 0x51, 0x16, 0x2B, 0x51, 0x0E, 0x12, 0xAF, 0xCC,
-0x90, 0x88, 0x76, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0xE0, 0xFE, 0x74, 0x02, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x31, 0xFD, 0x90, 0x88, 0x78,
-0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x05, 0x2B, 0x51, 0x06, 0xE0, 0xFE, 0x74, 0x04, 0x2B, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0x31, 0xFD, 0x90, 0x88, 0x7A, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x07, 0x2B, 0xF5,
+0x10, 0x01, 0x80, 0x51, 0x90, 0x85, 0xC9, 0xE0, 0xFF, 0x54, 0x03, 0x60, 0x05, 0x75, 0x10, 0x02,
+0x80, 0x43, 0x90, 0x85, 0xC7, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x05, 0x75, 0x10, 0x04, 0x80,
+0x34, 0xEF, 0x30, 0xE2, 0x05, 0x75, 0x10, 0x08, 0x80, 0x2B, 0x90, 0x85, 0xC9, 0xE0, 0x30, 0xE4,
+0x05, 0x75, 0x10, 0x10, 0x80, 0x1F, 0x90, 0x85, 0xC2, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0,
+0x05, 0x75, 0x10, 0x20, 0x80, 0x0F, 0x90, 0x86, 0x71, 0xE0, 0x60, 0x05, 0x75, 0x10, 0x80, 0x80,
+0x04, 0xB1, 0x58, 0x80, 0x0E, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x10,
+0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22,
+0xAC, 0x07, 0x90, 0x92, 0xC0, 0xE0, 0xF9, 0x30, 0xE0, 0x02, 0xC1, 0x13, 0x90, 0x85, 0xC1, 0xE0,
+0x30, 0xE0, 0x16, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90, 0x85, 0xDA, 0xF0, 0x90, 0x85, 0xFB,
+0xE0, 0x24, 0x03, 0x90, 0x85, 0xD9, 0xF0, 0x80, 0x0D, 0x90, 0x85, 0xDA, 0x74, 0x02, 0xF0, 0x90,
+0x85, 0xD9, 0x14, 0xF0, 0x0B, 0x0B, 0x90, 0x85, 0xD9, 0xE0, 0xFA, 0x90, 0x85, 0xD8, 0xE0, 0xD3,
+0x9A, 0x50, 0x0E, 0x90, 0x85, 0xCD, 0xEB, 0xF0, 0x90, 0x85, 0xDA, 0xE0, 0xC3, 0x9D, 0x2C, 0x80,
+0x11, 0xC3, 0xED, 0x9A, 0x2B, 0x90, 0x85, 0xCD, 0xF0, 0x90, 0x85, 0xD9, 0xE0, 0xFF, 0xA3, 0xE0,
+0xC3, 0x9F, 0x90, 0x85, 0xDD, 0xF0, 0x90, 0x85, 0xDA, 0xE0, 0xFF, 0x24, 0x0A, 0xFD, 0xE4, 0x33,
+0xFC, 0x90, 0x85, 0xDD, 0xD1, 0x1B, 0x40, 0x04, 0xEF, 0x24, 0x0A, 0xF0, 0x90, 0x85, 0xDD, 0xE0,
+0xFF, 0x24, 0x23, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85, 0xCD, 0xD1, 0x1B, 0x40, 0x04, 0xEF, 0x24,
+0x23, 0xF0, 0x90, 0x85, 0xDD, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x85, 0xD1, 0xEE, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0x05, 0x58, 0xE0, 0x6F, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x12, 0xA7, 0xCC, 0xE9, 0x54,
+0xFD, 0x80, 0x03, 0xE9, 0x44, 0x02, 0x90, 0x92, 0xC0, 0xF0, 0x22, 0xE0, 0xD3, 0x9D, 0xEC, 0x64,
+0x80, 0xF8, 0x74, 0x80, 0x98, 0x22, 0x90, 0x92, 0xFA, 0x74, 0x04, 0xF0, 0x14, 0xF0, 0xA3, 0xF0,
+0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x64, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0xC5,
+0x70, 0x40, 0x2E, 0x90, 0x85, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x92, 0xFF, 0xE0, 0xFF, 0x90, 0x85,
+0xDF, 0xE0, 0xD3, 0x9F, 0x50, 0x1B, 0x90, 0x85, 0xD7, 0xE0, 0x04, 0x12, 0x9E, 0xE5, 0x12, 0x9E,
+0xDE, 0x90, 0x85, 0xDE, 0xF0, 0xFB, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x51,
+0x7D, 0x22, 0x90, 0x92, 0x04, 0xE0, 0x30, 0xE0, 0x0A, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x03,
+0x12, 0xA3, 0x04, 0x22, 0x90, 0x93, 0x98, 0xEF, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x02, 0x70,
+0x23, 0x90, 0x93, 0x98, 0xE0, 0xFD, 0x64, 0x01, 0x70, 0x36, 0x12, 0xBC, 0x10, 0x90, 0x86, 0x76,
+0xE0, 0x12, 0x8F, 0x66, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, 0x20,
+0xAF, 0x05, 0x80, 0x19, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x7C,
+0x9F, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x93, 0x98, 0xE0, 0xFF, 0x12, 0x2A, 0x87,
+0x90, 0x88, 0xE1, 0xE0, 0x54, 0xFE, 0xF0, 0x02, 0xA7, 0xAC, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x7B, 0x3E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD1, 0xDA, 0x12,
+0x77, 0x89, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0xB4, 0x01, 0x07,
+0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x54,
+0xFB, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0xD9, 0x94, 0x20, 0xE0, 0x05,
+0xD1, 0xED, 0x02, 0xD8, 0x01, 0x12, 0x8B, 0xD1, 0x12, 0xA7, 0x57, 0x90, 0x86, 0x75, 0x12, 0xA7,
+0x2C, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0x12, 0xD9, 0xF2, 0x12, 0xA7, 0x94, 0x12, 0xA7, 0x3A,
+0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0x12, 0xD9, 0xF2, 0x12, 0xA7, 0x9C, 0x12, 0xA7, 0x3A, 0x54,
+0x40, 0xFD, 0xEF, 0x54, 0xBF, 0x12, 0xD9, 0xF2, 0x12, 0xA7, 0xA4, 0x12, 0x8F, 0xB9, 0x54, 0x80,
+0xFF, 0x90, 0x86, 0x76, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x12, 0xDA, 0x69, 0x30, 0xE0, 0x07, 0x90,
+0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x8B, 0xD1, 0x12, 0x02, 0xF6, 0x13, 0x13, 0x13, 0x54,
+0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0xB4,
+0x02, 0x0A, 0x90, 0x86, 0x76, 0xE0, 0x12, 0x8F, 0x66, 0x20, 0xE0, 0x42, 0x12, 0x8F, 0xBA, 0x54,
+0x7F, 0xFF, 0x90, 0x86, 0x76, 0xE0, 0x54, 0x80, 0x12, 0x8E, 0x8E, 0x90, 0x86, 0x77, 0xF0, 0x12,
+0x8F, 0xCD, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x86, 0x78, 0x12, 0xA7, 0x4F, 0x54, 0xFE, 0xFF, 0xEE,
+0x54, 0x01, 0x4F, 0xF0, 0x90, 0x86, 0x76, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x86, 0x75, 0xE0, 0xFE,
+0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x54, 0x9F, 0x90, 0x84,
+0xC5, 0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x87, 0x4A, 0x74,
+0x05, 0xF0, 0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x87, 0x79, 0x95, 0x12, 0x06,
+0xDE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x88, 0xD8, 0xE0, 0xFF, 0x11, 0xA6,
+0xAB, 0x05, 0x74, 0x01, 0x2B, 0x11, 0xB9, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x11, 0xAE, 0x90,
+0x88, 0x76, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xE0, 0xFE, 0x74, 0x02, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x11, 0x9D, 0x90, 0x88, 0x78, 0xF0,
+0xA3, 0xEF, 0xF0, 0x74, 0x05, 0x2B, 0x12, 0xAF, 0xC6, 0xE0, 0xFE, 0x74, 0x04, 0x2B, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0x11, 0x9D, 0x90, 0x88, 0x7A, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x07, 0x2B, 0xF5,
0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x06, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
-0x31, 0xFD, 0x90, 0x88, 0x7C, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x09, 0x2B, 0xF5, 0x82, 0xE4, 0x34,
+0x11, 0x9D, 0x90, 0x88, 0x7C, 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, 0x88, 0x7E, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xF5, 0x83, 0xE0,
-0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82,
-0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74,
-0x00, 0x22, 0xAD, 0x07, 0x90, 0x88, 0x80, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x90, 0x88,
-0x80, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x04, 0x2E, 0x51, 0xF3, 0xEF, 0xF0, 0x90, 0x88, 0x80, 0xA3,
-0xE0, 0xFF, 0x74, 0x05, 0x2E, 0x51, 0x06, 0xEF, 0xF0, 0x22, 0xE4, 0x90, 0x92, 0x59, 0xF0, 0xA3,
-0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x20, 0xF0, 0x12, 0x75, 0xE4, 0xEF, 0x64, 0x01, 0x60, 0x02,
-0x41, 0xE9, 0x90, 0x88, 0xD9, 0xE0, 0xFF, 0x90, 0x93, 0x0A, 0x74, 0x0A, 0xF0, 0x7B, 0x08, 0x7D,
-0x01, 0x12, 0xBF, 0xCB, 0x90, 0x92, 0x56, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x56, 0xA3,
-0x11, 0x91, 0xFD, 0x74, 0x2C, 0x2E, 0x51, 0xFB, 0x90, 0x92, 0x58, 0xEF, 0xF0, 0x90, 0x92, 0x56,
-0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B, 0x01, 0xE4, 0xFD, 0x12, 0x52, 0x21,
-0x90, 0x92, 0x58, 0xE0, 0xFF, 0x90, 0x92, 0x57, 0xE0, 0x2F, 0xFF, 0x90, 0x92, 0x56, 0xE0, 0x34,
-0x00, 0xCF, 0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x92, 0x59, 0xF0, 0xA3, 0xEF, 0xF0, 0x51,
-0x22, 0x51, 0xEA, 0x90, 0x88, 0xD9, 0xE0, 0xFB, 0xE4, 0xFF, 0x12, 0x15, 0x44, 0x51, 0xEA, 0x90,
-0x88, 0xD5, 0xE0, 0xFB, 0x7F, 0x11, 0x12, 0x15, 0x44, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x90,
-0x88, 0x88, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x22, 0x90, 0x92, 0x59, 0xE0, 0xFC, 0xA3,
-0xE0, 0xFD, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC,
-0xF5, 0x83, 0xE0, 0xFB, 0x02, 0x5D, 0x98, 0x12, 0x7B, 0x2A, 0x7C, 0x00, 0xAD, 0x07, 0x22, 0xD3,
-0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0xF5, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x70,
-0x61, 0x90, 0x92, 0xFF, 0x12, 0x04, 0xEB, 0x90, 0x92, 0xF7, 0x12, 0x87, 0x58, 0x12, 0x04, 0xA7,
-0x90, 0x92, 0xFF, 0x12, 0x87, 0x64, 0x12, 0x87, 0x3E, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0,
-0x07, 0x90, 0x92, 0xF7, 0x12, 0x87, 0x58, 0x90, 0x92, 0xFB, 0x12, 0x87, 0x64, 0x12, 0x87, 0x3E,
-0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x87, 0x4B, 0x90, 0x93, 0x03, 0x12, 0x04,
-0xEB, 0x90, 0x93, 0x03, 0x12, 0x87, 0x58, 0x90, 0x91, 0x66, 0x12, 0x04, 0xEB, 0x90, 0x92, 0xF5,
-0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x71, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, 0x7F,
-0xAC, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xC1, 0x12, 0x06, 0xDE, 0x91, 0x4C, 0x12, 0x06,
-0xDE, 0x90, 0x85, 0xC4, 0x74, 0x02, 0xF0, 0x90, 0x85, 0xCB, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74,
-0x0A, 0xF0, 0x90, 0x85, 0xD1, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0x91, 0x3C, 0x91, 0x59, 0xE4, 0xFD,
-0xFF, 0x12, 0x57, 0x82, 0x7D, 0x0C, 0x7F, 0x02, 0x12, 0x57, 0x82, 0x7D, 0x0C, 0x7F, 0x01, 0x12,
-0x57, 0x82, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90, 0x85, 0xD0, 0x74, 0xDD, 0xF0,
-0x80, 0x0F, 0xEF, 0x90, 0x85, 0xD0, 0xB4, 0x03, 0x05, 0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40,
-0xF0, 0x7F, 0x2C, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0x0F, 0xFF, 0xBF, 0x05, 0x08, 0x90, 0x85, 0xFB,
-0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x85, 0xFB, 0xF0, 0x90, 0x86, 0x6D, 0x74, 0x03, 0xF0,
-0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0, 0xA3, 0x74, 0x07, 0x91, 0x3C,
-0xE4, 0x90, 0x85, 0xD7, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x12, 0x69, 0x33, 0x90, 0x05, 0x58, 0x74,
-0x02, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0,
-0xE4, 0xFD, 0xFF, 0x12, 0x90, 0xDE, 0xE4, 0x90, 0x86, 0x71, 0xF0, 0x22, 0xF0, 0x90, 0x85, 0xFB,
-0xE0, 0x24, 0x04, 0x90, 0x85, 0xDD, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x04,
-0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x79, 0x22, 0x90, 0x92, 0xC5, 0x74, 0x04, 0xF0, 0x14,
-0xF0, 0xA3, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x64, 0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xF0,
-0x22, 0xAC, 0x07, 0x90, 0x92, 0x8B, 0xE0, 0xF9, 0x30, 0xE0, 0x02, 0xA1, 0x25, 0x90, 0x85, 0xC1,
-0xE0, 0x30, 0xE0, 0x16, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90, 0x85, 0xDA, 0xF0, 0x90, 0x85,
-0xFB, 0xE0, 0x24, 0x03, 0x90, 0x85, 0xD9, 0xF0, 0x80, 0x0D, 0x90, 0x85, 0xDA, 0x74, 0x02, 0xF0,
-0x90, 0x85, 0xD9, 0x14, 0xF0, 0x0B, 0x0B, 0x90, 0x85, 0xD9, 0xE0, 0xFA, 0x90, 0x85, 0xD8, 0xE0,
-0xD3, 0x9A, 0x50, 0x0E, 0x90, 0x85, 0xCD, 0xEB, 0xF0, 0x90, 0x85, 0xDA, 0xE0, 0xC3, 0x9D, 0x2C,
-0x80, 0x11, 0xC3, 0xED, 0x9A, 0x2B, 0x90, 0x85, 0xCD, 0xF0, 0x90, 0x85, 0xD9, 0xE0, 0xFF, 0xA3,
-0xE0, 0xC3, 0x9F, 0x90, 0x85, 0xDD, 0xF0, 0x90, 0x85, 0xDA, 0xE0, 0xFF, 0x24, 0x0A, 0xFD, 0xE4,
-0x33, 0xFC, 0x90, 0x85, 0xDD, 0xB1, 0x2D, 0x98, 0x40, 0x04, 0xEF, 0x24, 0x0A, 0xF0, 0x90, 0x85,
-0xDD, 0xE0, 0xFF, 0x24, 0x23, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85, 0xCD, 0xB1, 0x2D, 0x98, 0x40,
-0x04, 0xEF, 0x24, 0x23, 0xF0, 0x90, 0x85, 0xDD, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x85, 0xD1, 0xEE,
-0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xE0, 0x6F, 0x70, 0x01, 0xE4, 0x60, 0x02, 0xB1, 0x37,
-0xE9, 0x54, 0xFD, 0x80, 0x03, 0xE9, 0x44, 0x02, 0x90, 0x92, 0x8B, 0xF0, 0x22, 0xE0, 0xD3, 0x9D,
-0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x22, 0x90, 0x85, 0xD1, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0,
-0x22, 0x12, 0xA7, 0xAE, 0x40, 0x2B, 0x90, 0x85, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x92, 0xCA, 0xE0,
-0xFF, 0x90, 0x85, 0xDF, 0xE0, 0xD3, 0x9F, 0x50, 0x18, 0x90, 0x85, 0xD7, 0xE0, 0x04, 0x12, 0xA2,
-0x50, 0x90, 0x85, 0xDE, 0xF0, 0xFB, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x51,
-0x7D, 0x22, 0x90, 0x92, 0x70, 0xEF, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x02, 0x70, 0x1F, 0x90,
-0x92, 0x70, 0xE0, 0xFD, 0x64, 0x01, 0x70, 0x32, 0x12, 0xAF, 0x21, 0x12, 0x8D, 0x55, 0x30, 0xE0,
-0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, 0x20, 0xAF, 0x05, 0x80, 0x19, 0x90, 0x01,
-0x00, 0x74, 0xFF, 0xF0, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90, 0x06, 0x90, 0xE0, 0x44,
-0x01, 0xF0, 0x90, 0x92, 0x70, 0xE0, 0xFF, 0x12, 0x2A, 0x87, 0x90, 0x88, 0xE1, 0xE0, 0x54, 0xFE,
-0xF0, 0x90, 0x86, 0x72, 0xE0, 0x54, 0xBF, 0xF0, 0x22, 0x90, 0x92, 0x71, 0xEE, 0xF0, 0xA3, 0xEF,
-0xF0, 0xE4, 0x90, 0x92, 0x75, 0xF0, 0x7D, 0x09, 0x12, 0x55, 0x36, 0xEF, 0x64, 0x06, 0x70, 0x2A,
-0xD1, 0x5E, 0x7D, 0x14, 0x12, 0x55, 0x36, 0xEF, 0x70, 0x20, 0xD1, 0x5E, 0x7D, 0x15, 0x12, 0x55,
-0x36, 0xEF, 0x64, 0x50, 0x70, 0x14, 0xD1, 0x5E, 0x7D, 0x21, 0x12, 0x55, 0x36, 0xEF, 0x20, 0xE0,
-0x03, 0x30, 0xE2, 0x06, 0x90, 0x92, 0x75, 0x74, 0x01, 0xF0, 0x90, 0x86, 0x73, 0xE0, 0x13, 0x13,
-0x54, 0x3F, 0x30, 0xE0, 0x3F, 0xD1, 0x5E, 0x7D, 0x09, 0x12, 0x55, 0x36, 0xEF, 0x64, 0x11, 0x70,
-0x33, 0x90, 0x92, 0x72, 0xE0, 0x24, 0x14, 0xFF, 0x90, 0x92, 0x71, 0xE0, 0x34, 0x00, 0xFE, 0x90,
-0x92, 0x73, 0xF0, 0xA3, 0xEF, 0xF0, 0x7D, 0x02, 0x12, 0x55, 0x36, 0xEF, 0x70, 0x16, 0x90, 0x92,
-0x73, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x03, 0x12, 0x55, 0x36, 0xBF, 0x89, 0x06, 0x90, 0x92,
-0x75, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x75, 0xE0, 0xFF, 0xD1, 0x67, 0xEF, 0xF0, 0x22, 0x90, 0x92,
-0x71, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x84, 0xBF, 0xA3, 0xE0, 0x24, 0x7F, 0xF5, 0x82,
-0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0xD1, 0xBC, 0xA3, 0xED, 0xF0, 0x90, 0x88, 0x7C, 0xE0, 0x70,
-0x02, 0xA3, 0xE0, 0x60, 0x23, 0xE4, 0x90, 0x92, 0x36, 0xF0, 0xD1, 0xC5, 0x50, 0x1D, 0xF1, 0x09,
-0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22,
-0x90, 0x92, 0x36, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x32, 0xE0, 0x44,
-0x40, 0xF0, 0xE4, 0x90, 0x88, 0x88, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x92, 0x33, 0xEE,
-0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x92, 0x36, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x22, 0xD1, 0xBC,
-0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0xD1, 0xC5, 0x50, 0x17, 0xF1, 0x09, 0x24, 0xAA, 0xF5, 0x82,
-0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xB5, 0x07, 0x1D, 0x90, 0x92, 0x36, 0xE0, 0x04, 0xF0, 0x80,
-0xE5, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x30, 0xF0, 0x7F, 0x01,
-0x12, 0x5F, 0xE9, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x92, 0x33, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x92, 0x36, 0xE0, 0x22, 0xD1, 0xBC, 0x24,
-0x16, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x88, 0x86, 0xA3, 0xE0, 0xB5,
-0x07, 0x19, 0x90, 0x92, 0x34, 0xE0, 0x24, 0x16, 0xF1, 0x51, 0x7D, 0x01, 0x12, 0x55, 0x36, 0xEF,
-0xFD, 0x90, 0x88, 0x86, 0xE0, 0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01,
-0x22, 0xFF, 0x90, 0x92, 0x33, 0xE0, 0x34, 0x00, 0xFE, 0x22, 0xD1, 0xBC, 0xE4, 0xA3, 0xF0, 0x90,
-0x92, 0x35, 0xE0, 0xFD, 0xC3, 0x94, 0x04, 0x50, 0x27, 0x90, 0x92, 0x34, 0xE0, 0x24, 0x10, 0xF1,
-0x51, 0x12, 0x55, 0x36, 0x90, 0x92, 0x35, 0xE0, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x92, 0x35, 0xE0, 0x04, 0xF0, 0x80, 0xCF,
-0x7F, 0x01, 0x22, 0xE5, 0x64, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83,
-0xE4, 0x93, 0xFF, 0x74, 0x01, 0x93, 0x90, 0x92, 0x41, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92,
-0x3F, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, 0x67, 0xF0, 0x22, 0x90, 0x05, 0x63, 0xE0, 0x90, 0x92, 0x94,
-0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x92, 0x95, 0xF0, 0x90, 0x05, 0x61, 0xE0, 0x90, 0x92, 0x96,
-0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x92, 0x97, 0xF0, 0x90, 0x92, 0x8B, 0xE0, 0x44, 0x01, 0xF0,
-0x22, 0x90, 0x92, 0x6D, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x92, 0x6B, 0xE0, 0xFF,
-0x12, 0x65, 0x61, 0x90, 0x92, 0x6D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x50, 0xD7, 0x90, 0x01,
-0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x7C, 0xA9, 0x43, 0x5E, 0x08, 0x22, 0xE5, 0x64,
-0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0xC4, 0x54, 0xF0, 0x24,
-0x01, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90,
-0x85, 0xC7, 0xE0, 0x90, 0x01, 0xBB, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x22, 0xF0,
-0x74, 0xCC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0x74, 0xBC, 0x25, 0x62, 0xF5,
-0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0x90, 0x92, 0x41, 0xE4, 0xF0, 0xA3, 0x22, 0x90, 0x92,
-0x07, 0x12, 0x87, 0x79, 0x02, 0x02, 0xF6, 0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0x02, 0x03, 0xED,
-0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92, 0x41, 0xCF, 0x22, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E,
-0x22, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x22, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E,
-0x22, 0x12, 0x02, 0xF6, 0x13, 0x13, 0x54, 0x3F, 0x22, 0xE5, 0x68, 0xF0, 0xA3, 0xE5, 0x69, 0xF0,
-0x22, 0x90, 0x00, 0x02, 0x12, 0x04, 0x18, 0xFF, 0x22, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xF7, 0xF0,
-0x22, 0x00, 0xE1, 0x40,
+0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x22, 0x12, 0x7B, 0x2A, 0x7C, 0x00, 0xAD, 0x07, 0x22, 0xF5, 0x83,
+0xE0, 0x7A, 0x00, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xE0, 0xFE, 0x74, 0x00, 0x22, 0x90, 0x93, 0xED, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0xFB, 0x74, 0x03,
+0xF0, 0x7B, 0x06, 0x7D, 0x01, 0x12, 0xAE, 0x2E, 0x90, 0x93, 0xF1, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF,
+0xF0, 0xFD, 0x90, 0x93, 0xF0, 0xE0, 0xFF, 0x74, 0x10, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xEF, 0xF0, 0x90, 0x93, 0xEF, 0xE0, 0xFF, 0x02, 0x65, 0x61, 0xE5, 0x7A, 0x75, 0xF0, 0x13,
+0xA4, 0x24, 0x37, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0x90, 0x05, 0x63, 0xE0, 0x90,
+0x92, 0xC9, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x92, 0xCA, 0xF0, 0x90, 0x05, 0x61, 0xE0, 0x90,
+0x92, 0xCB, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x92, 0xCC, 0xF0, 0x90, 0x92, 0xC0, 0xE0, 0x44,
+0x01, 0x22, 0x90, 0x92, 0x0A, 0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF, 0xEE, 0x04,
+0x54, 0x07, 0x25, 0xE0, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x0A, 0xE0, 0xFE, 0xC3, 0x13,
+0x54, 0x07, 0x22, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x12, 0xEF, 0x22, 0xFD,
+0x75, 0xF0, 0x0E, 0xA4, 0x24, 0x0D, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0x22, 0x75, 0xF0, 0x08, 0xA4,
+0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x22, 0x90, 0x93, 0x99, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
+0x22, 0x9D, 0xFD, 0xE4, 0x94, 0x00, 0xFC, 0x74, 0x06, 0x2D, 0xF5, 0x82, 0x74, 0x93, 0x3C, 0xF5,
+0x83, 0xEE, 0xF0, 0x22, 0x90, 0x93, 0x06, 0x12, 0x87, 0x79, 0x02, 0x02, 0xF6, 0x9D, 0xFD, 0x74,
+0x05, 0x94, 0x00, 0x8D, 0x82, 0xF5, 0x83, 0xE0, 0xFE, 0xEF, 0xFD, 0xC3, 0x22, 0x75, 0xF0, 0x13,
+0xA4, 0x24, 0x3B, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0x22, 0xE5, 0x65, 0x25, 0xE0,
+0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0xEF, 0xC4, 0x54, 0xF0, 0x24, 0x03,
+0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90, 0x85, 0xC7,
+0xE0, 0x90, 0x01, 0xBB, 0x22, 0x90, 0x92, 0x72, 0xE0, 0x44, 0x10, 0xF0, 0x90, 0x93, 0x80, 0xE0,
+0xFF, 0x22, 0x4D, 0xFF, 0x90, 0x86, 0x75, 0xF0, 0xEE, 0x22, 0x12, 0x05, 0x28, 0xE0, 0xFC, 0xA3,
+0xE0, 0xF5, 0x82, 0x8C, 0x83, 0x22, 0xF0, 0x74, 0xCC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5,
+0x83, 0x22, 0x74, 0xBC, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0xF0, 0x90,
+0x92, 0xA8, 0xE0, 0x54, 0x7F, 0xF0, 0xA3, 0xE0, 0x22, 0x7F, 0x84, 0x7E, 0x08, 0x12, 0x96, 0xA1,
+0x90, 0x93, 0xCB, 0x22, 0x90, 0x94, 0x02, 0xE0, 0xFF, 0x7D, 0x48, 0x02, 0x90, 0xDE, 0xF0, 0x90,
+0x92, 0x3A, 0xE0, 0x54, 0x07, 0xFF, 0x64, 0x03, 0x22, 0x12, 0x02, 0xF6, 0xC4, 0x54, 0x0F, 0x22,
+0x90, 0x93, 0xF7, 0xE0, 0xFF, 0x90, 0x93, 0xF5, 0xE0, 0x22, 0xFF, 0x12, 0x02, 0xF6, 0x54, 0x0F,
+0xFD, 0x22, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0x12, 0x02, 0xF6, 0x13, 0x13, 0x54, 0x3F,
+0x22, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0x80, 0x22, 0xF9, 0xE4, 0x3A, 0xFA, 0x02, 0x02, 0xF6,
+0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0x22, 0xE5, 0x69, 0xF0, 0xA3, 0xE5, 0x6A, 0xF0, 0x22,
+0x90, 0x00, 0x02, 0x12, 0x04, 0x18, 0xFF, 0x22, 0x7D, 0x20, 0xE4, 0xFF, 0x02, 0x7B, 0xFD, 0xFF,
+0x12, 0x02, 0xF6, 0xFE, 0x54, 0x0F, 0x22, 0x00, 0x9F, 0xE4,
};
-u4Byte ArrayLength_MP_8188F_FW_NIC = 18644;
+u4Byte ArrayLength_MP_8188F_FW_NIC = 23242;
void
@@ -2329,31 +2628,31 @@ ODM_ReadFirmware_MP_8188F_FW_NIC( u1Byte Array_MP_8188F_FW_WoWLAN[] = {
-0xF1, 0x88, 0x30, 0x00, 0x01, 0x00, 0x01, 0x00, 0x09, 0x22, 0x15, 0x56, 0xD8, 0x48, 0x02, 0x00,
-0xAF, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x02, 0x86, 0xAD, 0x02, 0xBC, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xA6, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xBD, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0xF1, 0x88, 0x30, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x11, 0x25, 0x17, 0x06, 0x7C, 0x52, 0x02, 0x00,
+0x2F, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x02, 0x86, 0xAD, 0x02, 0xC4, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xBA, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xC4, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xBC, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xB8, 0xDC, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x02, 0xBD, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xC4, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xBD, 0x05, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x02, 0xC4, 0xD7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x87, 0xBB, 0x02, 0x88, 0xD7, 0x02, 0x80, 0x86, 0x02, 0x80, 0x89, 0x02, 0x80, 0x8C, 0x02,
-0x9D, 0x7D, 0x02, 0xB8, 0xBA, 0x02, 0x80, 0x95, 0x02, 0x80, 0x98, 0x02, 0x80, 0x9B, 0x02, 0x80,
+0x02, 0x87, 0xBB, 0x02, 0x88, 0xDA, 0x02, 0x80, 0x86, 0x02, 0x80, 0x89, 0x02, 0xA5, 0x16, 0x02,
+0x9A, 0x74, 0x02, 0xBA, 0x18, 0x02, 0x80, 0x95, 0x02, 0x80, 0x98, 0x02, 0x80, 0x9B, 0x02, 0x80,
0x9E, 0x02, 0x80, 0xA1, 0x02, 0x80, 0xA4, 0x02, 0x80, 0xA7, 0x02, 0x80, 0xAA, 0x02, 0x80, 0xAD,
-0x02, 0x80, 0xB0, 0x02, 0x89, 0xA5, 0x02, 0x80, 0xB6, 0x02, 0x80, 0xB9, 0x02, 0xB0, 0x57, 0x02,
-0xB1, 0x34, 0x02, 0xB0, 0xB9, 0x02, 0xAF, 0x5E, 0x02, 0xA8, 0x5B, 0x02, 0xAF, 0xEE, 0x02, 0x80,
-0xCE, 0x02, 0x80, 0xD1, 0x02, 0xC5, 0xD9, 0x02, 0x80, 0xD7, 0x00, 0x00, 0x00, 0x02, 0x80, 0xDD,
-0x02, 0x80, 0xE0, 0x02, 0x80, 0xE3, 0x02, 0x80, 0xE6, 0x02, 0xC5, 0x82, 0x02, 0x80, 0xEC, 0x02,
+0x02, 0x80, 0xB0, 0x02, 0x89, 0xBF, 0x02, 0x80, 0xB6, 0x02, 0x80, 0xB9, 0x02, 0xB8, 0x50, 0x02,
+0xB9, 0x2D, 0x02, 0xB8, 0xB2, 0x02, 0xB7, 0x4F, 0x02, 0xAF, 0xE2, 0x02, 0xB7, 0xE7, 0x02, 0x80,
+0xCE, 0x02, 0x80, 0xD1, 0x02, 0xCA, 0x00, 0x02, 0x80, 0xD7, 0x00, 0x00, 0x00, 0x02, 0x80, 0xDD,
+0x02, 0x80, 0xE0, 0x02, 0x80, 0xE3, 0x02, 0x80, 0xE6, 0x02, 0xCF, 0x5C, 0x02, 0x80, 0xEC, 0x02,
0x80, 0xEF, 0x02, 0x80, 0xF2, 0x02, 0x80, 0xF5, 0x02, 0x80, 0xF8, 0x02, 0x80, 0xFB, 0x02, 0x80,
0xFE, 0x02, 0x81, 0x01, 0x02, 0x81, 0x04, 0x02, 0x81, 0x07, 0x02, 0x81, 0x0A, 0x02, 0x81, 0x0D,
0x02, 0x81, 0x10, 0x02, 0x81, 0x13, 0x02, 0x81, 0x16, 0x02, 0x81, 0x19, 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, 0xB3, 0xEE, 0x02, 0xB5, 0xBE, 0x02, 0x90, 0xE9, 0x02, 0x90, 0xDE,
-0x02, 0x81, 0x40, 0x02, 0x9E, 0xDD, 0x02, 0xC4, 0x08, 0x02, 0x81, 0x49, 0x02, 0x81, 0x4C, 0x02,
-0x81, 0x4F, 0x02, 0x81, 0x52, 0x02, 0x81, 0x55, 0x02, 0x81, 0x58, 0x02, 0x81, 0x5B, 0x02, 0x91,
-0x47, 0x02, 0x81, 0x61, 0x02, 0x81, 0x64, 0x02, 0xC4, 0x81, 0x02, 0xC5, 0x51, 0x02, 0xBB, 0xC1,
+0x00, 0x00, 0x00, 0x00, 0x02, 0xC2, 0xFA, 0x02, 0xC5, 0x61, 0x02, 0xA7, 0x4F, 0x02, 0xA6, 0xF8,
+0x02, 0x81, 0x40, 0x02, 0x9B, 0xD4, 0x02, 0xC3, 0x94, 0x02, 0x81, 0x49, 0x02, 0x81, 0x4C, 0x02,
+0x81, 0x4F, 0x02, 0x81, 0x52, 0x02, 0x81, 0x55, 0x02, 0x81, 0x58, 0x02, 0x81, 0x5B, 0x02, 0xC8,
+0x88, 0x02, 0x81, 0x61, 0x02, 0x81, 0x64, 0x02, 0xCE, 0x46, 0x02, 0xCF, 0x16, 0x02, 0xCE, 0x1F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -2377,10 +2676,10 @@ u1Byte Array_MP_8188F_FW_WoWLAN[] = { 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, 0x08, 0x08, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x0B, 0x0D,
-0x0E, 0x0F, 0x11, 0x12, 0x14, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x23, 0x00,
-0x2D, 0x00, 0x50, 0x00, 0x91, 0x00, 0xC3, 0x01, 0x27, 0x01, 0x31, 0x01, 0x5E, 0x00, 0xC8, 0x00,
-0xF0, 0x00, 0xDC, 0x01, 0x5E, 0x01, 0x68, 0x01, 0x9A, 0x01, 0xCC, 0x01, 0xEA, 0x02, 0x02, 0x04,
+0x30, 0x02, 0x02, 0x03, 0x04, 0x04, 0x08, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x02, 0x09, 0x0B,
+0x0E, 0x0D, 0x0F, 0x10, 0x12, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x23, 0x00,
+0x2D, 0x00, 0x50, 0x00, 0x91, 0x00, 0xC3, 0x01, 0x27, 0x01, 0x31, 0x01, 0x5E, 0x00, 0x8C, 0x00,
+0xC8, 0x00, 0xDC, 0x01, 0x5E, 0x01, 0x68, 0x01, 0x9A, 0x01, 0xCC, 0x01, 0xEA, 0x02, 0x02, 0x04,
0x08, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C, 0x14, 0x28, 0x32, 0x50, 0x78, 0xA0, 0xC8,
0xE6, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x02, 0x04, 0x06,
0x07, 0x07, 0x08, 0x08, 0x08, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
@@ -2453,628 +2752,756 @@ u1Byte Array_MP_8188F_FW_WoWLAN[] = { 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, 0x41, 0x93, 0x17, 0x00, 0x41, 0x93, 0x18, 0x00,
-0x41, 0x93, 0x1D, 0x00, 0x00, 0x9A, 0x47, 0xB1, 0x9B, 0xB8, 0x55, 0x90, 0x93, 0x1B, 0xEF, 0xF0,
-0x7F, 0x02, 0xD1, 0x27, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x90, 0x93, 0x1B, 0xE0, 0xFE, 0xEF, 0x4E,
+0x68, 0x60, 0xEF, 0xA3, 0xA3, 0xA3, 0x80, 0xDF, 0x41, 0x93, 0x8A, 0x00, 0x41, 0x93, 0x8B, 0x00,
+0x41, 0x93, 0x92, 0x00, 0x00, 0xAA, 0x4A, 0xC0, 0x6C, 0xC4, 0x21, 0x90, 0x93, 0x90, 0xEF, 0xF0,
+0x7F, 0x02, 0xD1, 0x27, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x90, 0x93, 0x90, 0xE0, 0xFE, 0xEF, 0x4E,
0x90, 0x84, 0xC1, 0xF0, 0x22, 0x90, 0x02, 0x09, 0xE0, 0xF5, 0x5B, 0x12, 0x02, 0xF6, 0x25, 0x5B,
-0x90, 0x84, 0xC6, 0x12, 0x8D, 0x61, 0x25, 0x5B, 0x90, 0x84, 0xC7, 0x12, 0x8C, 0x6E, 0x25, 0x5B,
-0x90, 0x84, 0xC8, 0x12, 0x8F, 0xD8, 0x25, 0x5B, 0x90, 0x84, 0xC9, 0xF0, 0x90, 0x00, 0x04, 0x12,
-0x03, 0x0F, 0x25, 0x5B, 0x90, 0x84, 0xCA, 0xF0, 0x90, 0x00, 0x05, 0x12, 0x03, 0x0F, 0x25, 0x5B,
-0x90, 0x84, 0xCB, 0xF0, 0x11, 0x1D, 0x25, 0x5B, 0x90, 0x84, 0xCC, 0xF0, 0x22, 0x90, 0x00, 0x06,
-0x02, 0x03, 0x0F, 0x12, 0xC8, 0x7A, 0xFF, 0x54, 0x7F, 0x90, 0x85, 0xC5, 0xF0, 0xEF, 0xB1, 0x59,
-0xA3, 0xB1, 0x61, 0xFF, 0x54, 0xF0, 0xC4, 0x54, 0x0F, 0xFE, 0x90, 0x85, 0xC3, 0xE0, 0x54, 0xF0,
-0x4E, 0xF1, 0xD8, 0x54, 0x01, 0x25, 0xE0, 0xFE, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xFD, 0x4E, 0xF0,
-0xEF, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x12, 0x9F, 0xE4, 0x91, 0x6D, 0x90, 0x85, 0xC4, 0xF0,
-0x11, 0x1D, 0x30, 0xE0, 0x4D, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x85, 0xD8,
-0x50, 0x04, 0xEF, 0xF0, 0x80, 0x25, 0x74, 0x03, 0xF0, 0x31, 0x9F, 0xE9, 0x24, 0x06, 0xF1, 0xED,
-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, 0x03, 0x3C, 0x31, 0x9F, 0x11, 0x1D, 0xC4,
-0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x85, 0xCD, 0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02,
-0xEF, 0xF0, 0x31, 0x9F, 0x90, 0x00, 0x04, 0x12, 0x03, 0x0F, 0xFD, 0x7F, 0x02, 0x12, 0x57, 0x82,
-0x31, 0x9F, 0x12, 0x71, 0xCB, 0x12, 0xB9, 0xD5, 0xF0, 0x90, 0x85, 0xC5, 0x12, 0xC8, 0x3A, 0x12,
-0x9F, 0xE3, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x92, 0x04, 0x12, 0x87, 0x79, 0x90, 0x92, 0x03,
-0xEF, 0xF0, 0x12, 0x87, 0x82, 0x89, 0x28, 0x00, 0x89, 0x2D, 0x01, 0x89, 0x32, 0x03, 0x89, 0x37,
-0x04, 0x89, 0x3C, 0x12, 0x89, 0x41, 0x14, 0x89, 0x46, 0x20, 0x89, 0x4A, 0x24, 0x89, 0x4F, 0x25,
-0x89, 0x54, 0x27, 0x89, 0x59, 0x40, 0x89, 0x5D, 0x42, 0x89, 0x92, 0x47, 0x89, 0x92, 0x49, 0x89,
-0x66, 0x80, 0x89, 0x62, 0x81, 0x89, 0x6A, 0x82, 0x89, 0x6F, 0x83, 0x89, 0x74, 0x84, 0x89, 0x79,
-0x88, 0x89, 0x7E, 0xC3, 0x00, 0x00, 0x89, 0x83, 0x31, 0x93, 0x02, 0x87, 0xD5, 0x31, 0x93, 0x02,
-0x90, 0x03, 0x31, 0x93, 0x02, 0x78, 0x94, 0x31, 0x93, 0x02, 0x6B, 0x03, 0x31, 0x93, 0x02, 0x97,
-0xFD, 0x31, 0x93, 0x02, 0xA0, 0x12, 0x31, 0x93, 0x01, 0x23, 0x31, 0x93, 0x02, 0x9C, 0x13, 0x31,
-0x93, 0x02, 0xA0, 0x21, 0x31, 0x93, 0x02, 0xA0, 0x29, 0x31, 0x93, 0x80, 0x48, 0x31, 0x93, 0x02,
-0x4E, 0x29, 0x31, 0x93, 0xA1, 0x75, 0x31, 0x93, 0x81, 0x75, 0x31, 0x93, 0x02, 0x7A, 0xFE, 0x31,
-0x93, 0x02, 0x6F, 0x63, 0x31, 0x93, 0x02, 0x6F, 0xA4, 0x31, 0x93, 0x02, 0x7B, 0xD0, 0x31, 0x93,
-0x02, 0x9A, 0x34, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0x03, 0xE0, 0x90, 0x01,
-0xC2, 0xF0, 0x22, 0x90, 0x92, 0x04, 0x02, 0x87, 0x70, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90,
-0x92, 0x07, 0x02, 0x87, 0x70, 0x90, 0x92, 0x07, 0x12, 0x87, 0x79, 0x31, 0x9F, 0x12, 0x02, 0xF6,
-0x54, 0x7F, 0xFD, 0xB1, 0x62, 0xFE, 0x54, 0x1F, 0x90, 0x92, 0x0B, 0xF0, 0xEE, 0x54, 0x80, 0xB1,
-0x59, 0x90, 0x92, 0x0A, 0x91, 0x6E, 0xFE, 0x54, 0x03, 0xFC, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F,
-0x90, 0x92, 0x0D, 0x91, 0x6E, 0xFE, 0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x92, 0x0C,
-0xF0, 0xEE, 0x54, 0x80, 0xB1, 0x59, 0xFF, 0x91, 0x6F, 0xFB, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54,
-0x1F, 0x90, 0x92, 0x0F, 0xF0, 0xFA, 0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEF,
-0x54, 0x01, 0xC4, 0x33, 0x33, 0x33, 0x54, 0x80, 0x71, 0x06, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x92,
-0x0C, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x54, 0xC0, 0x71, 0x06, 0x54, 0xBF, 0x4F, 0xF0, 0xEA,
-0x60, 0x02, 0x61, 0x05, 0x90, 0x92, 0x0B, 0xE0, 0x54, 0x1F, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0xB1,
-0x6D, 0x54, 0xE0, 0x4F, 0xF0, 0xEC, 0x54, 0x03, 0x71, 0x06, 0x54, 0xFC, 0x4F, 0xF0, 0xEC, 0x54,
-0x03, 0x25, 0xE0, 0x25, 0xE0, 0x71, 0x06, 0x54, 0xF3, 0x4F, 0xF0, 0x90, 0x92, 0x0A, 0xE0, 0x54,
-0x01, 0xC4, 0x33, 0x54, 0xE0, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0xB1, 0x6D, 0x54, 0xDF, 0x4F, 0xF0,
-0x90, 0x92, 0x0D, 0xE0, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0x71, 0x06, 0x54, 0xCF, 0x4F, 0x12, 0xC8,
-0x5B, 0xE0, 0x54, 0xFB, 0x12, 0xC8, 0x5B, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0x92, 0x10,
-0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0x92, 0x85,
-0xE0, 0x60, 0x2F, 0x31, 0x9F, 0xE9, 0x24, 0x03, 0xF1, 0xED, 0x54, 0x1F, 0x12, 0x03, 0x3C, 0x90,
-0x92, 0x0E, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x13, 0xEF,
-0x31, 0x99, 0x8F, 0x82, 0x8E, 0x83, 0xE4, 0x12, 0x03, 0x4E, 0x90, 0x92, 0x0E, 0xE0, 0x04, 0xF0,
-0x80, 0xE3, 0x90, 0x92, 0x83, 0xE0, 0x54, 0x07, 0xFF, 0xBF, 0x05, 0x0A, 0xEC, 0xB4, 0x01, 0x06,
-0x90, 0x92, 0x88, 0x74, 0x01, 0xF0, 0xE4, 0x90, 0x92, 0x0E, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0xFC,
-0x31, 0x99, 0x8F, 0x82, 0x8E, 0x83, 0x12, 0x03, 0x0F, 0xFF, 0xED, 0x12, 0xAF, 0xE0, 0xE5, 0x82,
-0x2C, 0x12, 0xA8, 0x53, 0xEF, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x04, 0xDB,
-0xAF, 0x05, 0x12, 0x17, 0x8E, 0x22, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0x90, 0x89, 0x3F, 0x12, 0x05,
-0x28, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x6B, 0x20, 0xE6, 0x02, 0x81,
-0x34, 0x90, 0x00, 0x8C, 0xE0, 0x90, 0x93, 0x0E, 0xF0, 0x7F, 0x8D, 0x12, 0x7B, 0x51, 0x90, 0x93,
-0x0F, 0xEF, 0xF0, 0x90, 0x00, 0x8E, 0xE0, 0x90, 0x93, 0x10, 0xF0, 0x90, 0x93, 0x0F, 0xE0, 0x24,
-0xFC, 0x60, 0x0F, 0x24, 0x03, 0x60, 0x02, 0x81, 0x2D, 0x90, 0x93, 0x0E, 0xE0, 0xFF, 0xF1, 0x72,
-0x81, 0x2D, 0x90, 0x93, 0x0E, 0xE0, 0x24, 0xDC, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0,
-0xFB, 0xE4, 0xFD, 0xFF, 0x91, 0x66, 0x75, 0xF0, 0x12, 0x71, 0x0B, 0x13, 0x13, 0x54, 0x03, 0xFB,
-0x0D, 0xE4, 0xFF, 0x91, 0x66, 0x75, 0xF0, 0x12, 0x71, 0x0B, 0xB1, 0x59, 0xFB, 0x0D, 0xE4, 0xFF,
-0x91, 0x66, 0x75, 0xF0, 0x12, 0x71, 0x0B, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x66,
-0x12, 0xAF, 0xD5, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x66, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x3D, 0x12,
-0x05, 0x28, 0x91, 0x63, 0x75, 0xF0, 0x12, 0xB1, 0x6D, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F,
-0x01, 0x91, 0x66, 0x75, 0xF0, 0x12, 0xB1, 0x6D, 0x54, 0x1F, 0x91, 0x64, 0x12, 0xAF, 0xE0, 0xE0,
-0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34,
-0x82, 0x91, 0x61, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x61,
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x61, 0x75, 0xF0, 0x08,
-0xA4, 0x24, 0x04, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91,
-0x66, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x61, 0x75, 0xF0,
-0x08, 0xA4, 0x24, 0x06, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x61, 0x75, 0xF0, 0x08, 0xA4, 0x24,
-0x07, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x39, 0xF1, 0x6B, 0x30,
-0xE0, 0x02, 0xF1, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 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, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x39, 0x90, 0x93, 0x0E, 0xE0, 0x22, 0x4F, 0xF0, 0x90,
-0x00, 0x02, 0x02, 0x03, 0x0F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0xC8, 0x7A, 0x20,
-0xE0, 0x05, 0x12, 0xB6, 0x5C, 0xA1, 0x50, 0x31, 0x9F, 0x12, 0xC8, 0x47, 0x90, 0x86, 0x75, 0xD1,
-0x00, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0xF1, 0x47, 0x12, 0xC8, 0x9E, 0xD1, 0x0E, 0x54, 0x10,
-0xFD, 0xEF, 0x54, 0xEF, 0xF1, 0x47, 0x12, 0xC8, 0xA6, 0xD1, 0x0E, 0x54, 0x40, 0xFD, 0xEF, 0x54,
-0xBF, 0xF1, 0x47, 0x12, 0xC8, 0xAE, 0xB1, 0x61, 0x54, 0x80, 0xFF, 0x90, 0x86, 0x76, 0xE0, 0x54,
-0x7F, 0x4F, 0xF0, 0x12, 0xC8, 0xB6, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0,
-0x31, 0x9F, 0x12, 0x02, 0xF6, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90,
-0xE0, 0x44, 0x08, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0xB4, 0x02, 0x05, 0xB1, 0x55, 0x20, 0xE0, 0x3D,
-0xB1, 0x62, 0x54, 0x7F, 0xFF, 0x90, 0x86, 0x76, 0xE0, 0x54, 0x80, 0x91, 0x6D, 0x90, 0x86, 0x77,
-0xF1, 0xD8, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x86, 0x78, 0xF1, 0xFB, 0x54, 0xFE, 0xFF, 0xEE, 0x54,
-0x01, 0x4F, 0xF0, 0x90, 0x86, 0x76, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x86, 0x75, 0xE0, 0xFE, 0xC4,
-0x13, 0x54, 0x07, 0x7D, 0x00, 0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x54, 0x9F, 0x90, 0x84, 0xC5,
-0xE0, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x87, 0x4A, 0x74, 0x05,
-0xF0, 0x7E, 0x00, 0x7F, 0x08, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x87, 0x79, 0x95, 0x12, 0x06, 0xDE,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x86, 0x76, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x22,
-0x4F, 0xF0, 0x90, 0x00, 0x01, 0x02, 0x03, 0x0F, 0x75, 0xF0, 0x12, 0xE5, 0x6E, 0x90, 0x89, 0x3E,
-0x12, 0x05, 0x28, 0xE0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0xC8, 0x47, 0x90,
-0x86, 0x72, 0xD1, 0x00, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0xF1, 0x3F, 0x12, 0xC8, 0x9E, 0xD1,
-0x0E, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0xF1, 0x3F, 0x12, 0xC8, 0xA6, 0xD1, 0x0E, 0x54, 0x40,
-0xFD, 0xEF, 0x54, 0xBF, 0xF1, 0x3F, 0x12, 0xC8, 0xAE, 0x91, 0x6E, 0x54, 0x01, 0xFF, 0x90, 0x86,
-0x74, 0xE0, 0x54, 0xFE, 0xB1, 0x60, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x86, 0x73, 0xF1, 0xFB, 0x54,
+0x90, 0x84, 0xC6, 0xF0, 0x12, 0x8D, 0x96, 0x25, 0x5B, 0x90, 0x84, 0xC7, 0x12, 0x8C, 0x79, 0x25,
+0x5B, 0x90, 0x84, 0xC8, 0x12, 0x8E, 0x80, 0x25, 0x5B, 0x90, 0x84, 0xC9, 0xF0, 0x12, 0x8F, 0xF3,
+0x25, 0x5B, 0x90, 0x84, 0xCA, 0xF0, 0xF1, 0xED, 0x25, 0x5B, 0x90, 0x84, 0xCB, 0x11, 0x16, 0x25,
+0x5B, 0x90, 0x84, 0xCC, 0xF0, 0x22, 0xF0, 0x90, 0x00, 0x06, 0x02, 0x03, 0x0F, 0xF1, 0xE4, 0xFF,
+0x54, 0x7F, 0x90, 0x85, 0xC5, 0xF0, 0xEF, 0xD1, 0x8B, 0xA3, 0xF0, 0xB1, 0x96, 0xFD, 0x54, 0xF0,
+0xC4, 0x54, 0x0F, 0xFF, 0x90, 0x85, 0xC3, 0xE0, 0x54, 0xF0, 0x4F, 0xD1, 0x80, 0xFC, 0x54, 0x01,
+0x25, 0xE0, 0xFF, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xFD, 0x4F, 0xF0, 0xEC, 0x54, 0x04, 0xFF, 0x90,
+0x92, 0xDC, 0xE0, 0x54, 0xFB, 0x4F, 0xF0, 0xED, 0x54, 0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x12, 0x9E,
+0xC6, 0x91, 0x78, 0x90, 0x85, 0xC4, 0x11, 0x16, 0x30, 0xE0, 0x4E, 0xC3, 0x13, 0x54, 0x07, 0xFF,
+0xC3, 0x94, 0x04, 0x90, 0x85, 0xD8, 0x50, 0x04, 0xEF, 0xF0, 0x80, 0x26, 0x74, 0x03, 0xF0, 0x31,
+0xB9, 0xE9, 0x24, 0x06, 0x12, 0xD2, 0x44, 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,
+0x03, 0x3C, 0x31, 0xB9, 0x11, 0x17, 0xC4, 0x54, 0x0F, 0xFF, 0xC3, 0x94, 0x04, 0x90, 0x85, 0xCD,
+0x50, 0x05, 0x74, 0x04, 0xF0, 0x80, 0x02, 0xEF, 0xF0, 0x31, 0xB9, 0xF1, 0xF3, 0xFD, 0x7F, 0x02,
+0x12, 0x57, 0x82, 0x31, 0xB9, 0x12, 0x71, 0xCB, 0x12, 0xBE, 0x8A, 0xF0, 0x90, 0x85, 0xC5, 0x12,
+0xD1, 0x7E, 0x12, 0x9E, 0xC5, 0x90, 0x01, 0xBE, 0xF0, 0x22, 0x90, 0x92, 0x04, 0x12, 0x87, 0x79,
+0x90, 0x92, 0x03, 0xEF, 0xF0, 0x12, 0x87, 0x82, 0x89, 0x34, 0x00, 0x89, 0x39, 0x01, 0x89, 0x3E,
+0x03, 0x89, 0x43, 0x04, 0x89, 0x48, 0x10, 0x89, 0x4D, 0x11, 0x89, 0x51, 0x12, 0x89, 0x56, 0x14,
+0x89, 0x5B, 0x1C, 0x89, 0x5F, 0x20, 0x89, 0x63, 0x24, 0x89, 0x68, 0x25, 0x89, 0x6D, 0x27, 0x89,
+0x72, 0x40, 0x89, 0x76, 0x42, 0x89, 0xAC, 0x47, 0x89, 0xAC, 0x49, 0x89, 0x80, 0x80, 0x89, 0x7B,
+0x81, 0x89, 0x84, 0x82, 0x89, 0x89, 0x83, 0x89, 0x8E, 0x84, 0x89, 0x93, 0x88, 0x89, 0x98, 0xC3,
+0x00, 0x00, 0x89, 0x9D, 0x31, 0xAD, 0x02, 0x87, 0xD5, 0x31, 0xAD, 0x02, 0x90, 0x02, 0x31, 0xAD,
+0x02, 0x78, 0x94, 0x31, 0xAD, 0x02, 0x6B, 0x03, 0x31, 0xAD, 0x02, 0x98, 0x03, 0x31, 0xAD, 0x81,
+0x80, 0x31, 0xAD, 0x02, 0x98, 0x35, 0x31, 0xAD, 0x02, 0x98, 0xFF, 0x31, 0xAD, 0xA1, 0x4F, 0x31,
+0xAD, 0x01, 0x1D, 0x31, 0xAD, 0x02, 0x99, 0x0E, 0x31, 0xAD, 0x02, 0x9F, 0xFE, 0x31, 0xAD, 0x02,
+0xA0, 0x06, 0x31, 0xAD, 0x80, 0x49, 0x31, 0xAD, 0x02, 0x4E, 0x29, 0x31, 0xAD, 0x02, 0xAD, 0x45,
+0x31, 0xAD, 0xA1, 0x9C, 0x31, 0xAD, 0x02, 0x7A, 0xFE, 0x31, 0xAD, 0x02, 0x6F, 0x63, 0x31, 0xAD,
+0x02, 0x6F, 0xA4, 0x31, 0xAD, 0x02, 0x7B, 0xD0, 0x31, 0xAD, 0x02, 0xA7, 0xFA, 0x90, 0x01, 0xC0,
+0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0x03, 0xE0, 0x90, 0x01, 0xC2, 0xF0, 0x22, 0x90, 0x92, 0x04,
+0x02, 0x87, 0x70, 0x24, 0x03, 0xFF, 0xE4, 0x33, 0xFE, 0x90, 0x92, 0x07, 0x02, 0x87, 0x70, 0x90,
+0x92, 0x07, 0x12, 0x87, 0x79, 0x31, 0xB9, 0x12, 0x02, 0xF6, 0x54, 0x7F, 0xFD, 0xB1, 0x96, 0xFE,
+0x54, 0x1F, 0x90, 0x92, 0x0B, 0xF0, 0xEE, 0x54, 0x80, 0xD1, 0x8B, 0x90, 0x92, 0x0A, 0x91, 0x79,
+0xFE, 0x54, 0x03, 0xFC, 0xEE, 0x54, 0x30, 0xC4, 0x54, 0x0F, 0x90, 0x92, 0x0D, 0x91, 0x79, 0xFE,
+0x54, 0x40, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x90, 0x92, 0x0C, 0xF0, 0xEE, 0x54, 0x80, 0xD1, 0x8B,
+0xFF, 0x91, 0x7A, 0xFB, 0x54, 0x08, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x90, 0x92, 0x0F, 0xF0, 0xFA,
+0xEB, 0x54, 0x04, 0x13, 0x13, 0x54, 0x3F, 0xA3, 0xF0, 0xEF, 0x54, 0x01, 0xC4, 0x33, 0x33, 0x33,
+0x54, 0x80, 0x71, 0x11, 0x54, 0x7F, 0x4F, 0xF0, 0x90, 0x92, 0x0C, 0xE0, 0x54, 0x01, 0xC4, 0x33,
+0x33, 0x54, 0xC0, 0x71, 0x11, 0x54, 0xBF, 0x4F, 0xF0, 0xEA, 0x60, 0x02, 0x61, 0x10, 0x90, 0x92,
+0x0B, 0xE0, 0x54, 0x1F, 0xD1, 0x92, 0x54, 0xE0, 0x4F, 0xF0, 0xEC, 0x54, 0x03, 0x71, 0x11, 0x54,
+0xFC, 0x4F, 0xF0, 0xEC, 0x54, 0x03, 0x25, 0xE0, 0x25, 0xE0, 0x71, 0x11, 0x54, 0xF3, 0x4F, 0xF0,
+0x90, 0x92, 0x0A, 0xE0, 0x54, 0x01, 0xC4, 0x33, 0x54, 0xE0, 0xD1, 0x92, 0x54, 0xDF, 0x4F, 0xF0,
+0x90, 0x92, 0x0D, 0xE0, 0x54, 0x03, 0xC4, 0x54, 0xF0, 0x71, 0x11, 0x54, 0xCF, 0x4F, 0x12, 0xD1,
+0xAF, 0xE0, 0x54, 0xFB, 0x12, 0xD1, 0xAF, 0xC0, 0x83, 0xC0, 0x82, 0xE0, 0xFF, 0x90, 0x92, 0x10,
+0xE0, 0x12, 0xAF, 0xD2, 0xD0, 0x82, 0xD0, 0x83, 0xF0, 0x90, 0x92, 0xD6, 0xE0, 0x60, 0x30, 0x31,
+0xB9, 0xE9, 0x24, 0x03, 0x12, 0xD2, 0x44, 0x54, 0x1F, 0x12, 0x03, 0x3C, 0x90, 0x92, 0x0E, 0x74,
+0x01, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0xFF, 0xC3, 0x94, 0x04, 0x50, 0x13, 0xEF, 0x31, 0xB3, 0x8F,
+0x82, 0x8E, 0x83, 0xE4, 0x12, 0x03, 0x4E, 0x90, 0x92, 0x0E, 0xE0, 0x04, 0xF0, 0x80, 0xE3, 0x90,
+0x92, 0xD4, 0xE0, 0x54, 0x07, 0xFF, 0xBF, 0x05, 0x0A, 0xEC, 0xB4, 0x01, 0x06, 0x90, 0x92, 0xD9,
+0x74, 0x01, 0xF0, 0xE4, 0x90, 0x92, 0x0E, 0xF0, 0x90, 0x92, 0x0E, 0xE0, 0xFC, 0x31, 0xB3, 0x8F,
+0x82, 0x8E, 0x83, 0x12, 0x03, 0x0F, 0xFF, 0xED, 0x12, 0xD1, 0x21, 0xE5, 0x82, 0x2C, 0x12, 0xB0,
+0xEE, 0x90, 0x92, 0x0E, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x04, 0xDD, 0xAF, 0x05, 0x12, 0x17, 0x8E,
+0x22, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0x90, 0x89, 0x3F, 0x12, 0x05, 0x28, 0xE0, 0x22, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x80, 0x20, 0xE6, 0x02, 0x81, 0x3F, 0x90, 0x00, 0x8C, 0xE0,
+0x90, 0x93, 0x81, 0xF0, 0x7F, 0x8D, 0x12, 0x7B, 0x51, 0x90, 0x93, 0x82, 0xEF, 0xF0, 0x90, 0x00,
+0x8E, 0xE0, 0x90, 0x93, 0x83, 0xF0, 0x90, 0x93, 0x82, 0xE0, 0x24, 0xFC, 0x60, 0x0F, 0x24, 0x03,
+0x60, 0x02, 0x81, 0x38, 0x90, 0x93, 0x81, 0xE0, 0xFF, 0xF1, 0x87, 0x81, 0x38, 0x90, 0x93, 0x81,
+0xE0, 0x24, 0xDC, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0xFF, 0x91,
+0x71, 0x75, 0xF0, 0x12, 0x71, 0x16, 0x13, 0x13, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x71,
+0x75, 0xF0, 0x12, 0x71, 0x16, 0xD1, 0x8B, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x71, 0x75, 0xF0, 0x12,
+0x71, 0x16, 0xC4, 0x54, 0x03, 0xFB, 0x0D, 0xE4, 0xFF, 0x91, 0x71, 0x12, 0xB7, 0xD0, 0xFB, 0xE4,
+0xFD, 0x0F, 0x91, 0x71, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x3D, 0x12, 0x05, 0x28, 0x91, 0x6E, 0x75,
+0xF0, 0x12, 0xD1, 0x97, 0xC4, 0x13, 0x54, 0x01, 0xFB, 0x0D, 0x7F, 0x01, 0x91, 0x71, 0x75, 0xF0,
+0x12, 0xD1, 0x97, 0x54, 0x1F, 0x91, 0x6F, 0x12, 0xD1, 0x21, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91,
+0x71, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x6C, 0x75, 0xF0,
+0x08, 0xA4, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x24,
+0x03, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x04, 0xF5, 0x82,
+0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE0, 0xFB, 0xE4, 0xFD, 0x0F, 0x91, 0x71, 0x75, 0xF0, 0x08, 0xA4,
+0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x91, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x06, 0xF5,
+0x82, 0xE4, 0x34, 0x82, 0x91, 0x6C, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x07, 0xF5, 0x82, 0xE4, 0x34,
+0x82, 0xF5, 0x83, 0xE0, 0xFB, 0x0D, 0x91, 0x44, 0xF1, 0x80, 0x30, 0xE0, 0x02, 0xF1, 0xFB, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 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, 0xF5, 0x83, 0xE0, 0xFB,
+0x0D, 0x91, 0x44, 0x90, 0x93, 0x81, 0xE0, 0x22, 0x4F, 0xF0, 0x90, 0x00, 0x02, 0x02, 0x03, 0x0F,
+0x12, 0xD2, 0x09, 0x12, 0x02, 0xF6, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x0F, 0x16, 0x90, 0x92, 0xA1,
+0xE0, 0x54, 0xFE, 0xF0, 0x12, 0xBF, 0xCF, 0x12, 0x90, 0xC9, 0x54, 0x0F, 0xFF, 0x12, 0xA6, 0xB2,
+0x02, 0xC6, 0x9D, 0xB1, 0x90, 0x12, 0xD2, 0x71, 0x12, 0xA7, 0xEB, 0xEF, 0x91, 0x79, 0x54, 0x03,
+0xFF, 0xED, 0x12, 0xA6, 0xE3, 0x54, 0xFC, 0x91, 0x78, 0x54, 0x1C, 0xFF, 0xEE, 0x54, 0x0F, 0xFE,
+0x12, 0xA6, 0xE3, 0x54, 0xE3, 0x91, 0x78, 0x54, 0xE0, 0xFF, 0xEE, 0x12, 0xA6, 0xE3, 0x54, 0x1F,
+0x4F, 0xF0, 0xF1, 0xF3, 0xFF, 0x12, 0x02, 0xF6, 0x54, 0x0F, 0xFD, 0xE4, 0xFB, 0xF1, 0xDD, 0xA9,
+0x5D, 0xF1, 0xED, 0xFF, 0x12, 0x02, 0xF6, 0x54, 0x0F, 0xFD, 0x7B, 0x01, 0xF1, 0xDD, 0xA9, 0x5D,
+0xD1, 0x81, 0x33, 0x33, 0x33, 0x54, 0xF8, 0x12, 0xD2, 0x71, 0xFD, 0x75, 0xF0, 0x0E, 0xA4, 0x24,
+0xAE, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xD1, 0x80, 0xC4, 0x13, 0x54, 0x07, 0xFF,
+0xED, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0xAF, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEF, 0xF0,
+0xEE, 0xC4, 0x54, 0x0F, 0xFF, 0x14, 0x6D, 0x70, 0x25, 0x90, 0x92, 0xA3, 0xEF, 0x11, 0x16, 0x54,
+0x0F, 0xC4, 0x54, 0xF0, 0xFF, 0x90, 0x92, 0xA2, 0xE0, 0x54, 0x0F, 0x4F, 0xF0, 0x54, 0xF1, 0xF0,
+0x90, 0x92, 0xA1, 0xE0, 0x44, 0x01, 0xF0, 0x7D, 0x20, 0xE4, 0xFF, 0x12, 0x7B, 0xFD, 0x22, 0xF1,
+0xE4, 0xFF, 0xB1, 0x96, 0x12, 0xD1, 0xEB, 0xFB, 0xC0, 0x03, 0x31, 0xB9, 0x91, 0x7A, 0x12, 0xA7,
+0xC2, 0xD0, 0x03, 0x12, 0xA5, 0x16, 0x31, 0xB9, 0xB1, 0x96, 0x12, 0xA2, 0xBE, 0x90, 0x92, 0x0A,
+0x74, 0x10, 0xF0, 0x90, 0x92, 0x18, 0x74, 0x07, 0xF0, 0x31, 0xB9, 0x12, 0x02, 0xF6, 0x90, 0x92,
+0x0C, 0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x0A, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB,
+0xAB, 0x5B, 0xAA, 0x5C, 0xA9, 0x5D, 0x90, 0x00, 0x01, 0x02, 0x03, 0x0F, 0xD3, 0x10, 0xAF, 0x01,
+0xC3, 0xC0, 0xD0, 0xF1, 0xE4, 0x20, 0xE0, 0x05, 0x12, 0xCF, 0xC1, 0xC1, 0x7B, 0x31, 0xB9, 0x12,
+0xAF, 0x9A, 0x90, 0x86, 0x75, 0x12, 0xAD, 0xD6, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0xF1, 0xD5,
+0x12, 0xAF, 0xA2, 0x12, 0xAD, 0xE4, 0x54, 0x10, 0xFD, 0xEF, 0x54, 0xEF, 0xF1, 0xD5, 0x12, 0xAF,
+0xAA, 0x12, 0xAD, 0xE4, 0x54, 0x40, 0xFD, 0xEF, 0x54, 0xBF, 0xF1, 0xD5, 0x12, 0xAF, 0xB2, 0xF0,
+0xB1, 0x96, 0x54, 0x80, 0xFF, 0x90, 0x86, 0x76, 0xE0, 0x54, 0x7F, 0x4F, 0xF0, 0x12, 0xD2, 0x34,
+0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x04, 0xF0, 0x31, 0xB9, 0x12, 0x02, 0xF6, 0x13,
+0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x07, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x08, 0xF0, 0x90, 0x84,
+0xC5, 0xE0, 0xB4, 0x02, 0x05, 0xD1, 0x87, 0x20, 0xE0, 0x3E, 0xB1, 0x96, 0x54, 0x7F, 0xFF, 0x90,
+0x86, 0x76, 0xE0, 0x54, 0x80, 0x91, 0x78, 0x90, 0x86, 0x77, 0xD1, 0x80, 0xFF, 0x54, 0x01, 0xFE,
+0x90, 0x86, 0x78, 0x12, 0xAF, 0x92, 0x54, 0xFE, 0xFF, 0xEE, 0x54, 0x01, 0x4F, 0xF0, 0x90, 0x86,
+0x76, 0xE0, 0x54, 0x7F, 0xFF, 0x90, 0x86, 0x75, 0xE0, 0xFE, 0xC4, 0x13, 0x54, 0x07, 0x7D, 0x00,
+0x20, 0xE0, 0x02, 0x7D, 0x01, 0x12, 0x54, 0x9F, 0x90, 0x84, 0xC5, 0xE0, 0xB4, 0x01, 0x07, 0x90,
+0xFE, 0x10, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x87, 0x4A, 0x74, 0x05, 0xF0, 0x7E, 0x00, 0x7F, 0x08,
+0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x87, 0x79, 0x95, 0x12, 0x06, 0xDE, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0xF0, 0x90, 0x00, 0x03, 0x02, 0x03, 0x0F, 0x90, 0x86, 0x76, 0xE0, 0xC4, 0x13, 0x13, 0x13, 0x54,
+0x01, 0x22, 0xFF, 0x75, 0xF0, 0x12, 0xED, 0x90, 0x89, 0x3E, 0x12, 0x05, 0x28, 0xE0, 0x22, 0x8F,
+0x5E, 0x8D, 0x5F, 0xAE, 0x03, 0x74, 0x1F, 0xC3, 0x95, 0x5E, 0x40, 0x0B, 0xF1, 0x78, 0xE4, 0xFD,
+0xF1, 0x71, 0xF0, 0x24, 0xD4, 0x80, 0x34, 0x74, 0x3F, 0xC3, 0x95, 0x5E, 0x40, 0x0B, 0xF1, 0x78,
+0x7D, 0x20, 0xF1, 0x6F, 0xF0, 0x24, 0x88, 0x80, 0x22, 0x74, 0x5F, 0xC3, 0x95, 0x5E, 0x40, 0x0B,
+0xF1, 0x78, 0x7D, 0x40, 0xF1, 0x6F, 0xF0, 0x24, 0xD0, 0x80, 0x10, 0x74, 0x7F, 0xC3, 0x95, 0x5E,
+0x40, 0x1F, 0xF1, 0x78, 0x7D, 0x60, 0xF1, 0x6F, 0xF0, 0x24, 0x84, 0xFD, 0xE4, 0x34, 0x04, 0xFC,
+0xE5, 0x5F, 0x12, 0xD1, 0x13, 0x75, 0xF0, 0x03, 0xEE, 0x12, 0x05, 0x28, 0xEC, 0xF0, 0xA3, 0xED,
+0xF0, 0x22, 0xC3, 0xEF, 0x9D, 0xF5, 0x60, 0xC3, 0x94, 0x08, 0x50, 0x1F, 0xE4, 0xF5, 0x61, 0x12,
+0xD1, 0x06, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0x92, 0x0B, 0xE0, 0xD0, 0x82, 0xD0, 0x83,
+0x75, 0xF0, 0x03, 0x12, 0x05, 0x28, 0xE5, 0x60, 0xF0, 0x80, 0x41, 0xE5, 0x60, 0xC3, 0x94, 0x10,
+0x50, 0x09, 0x75, 0x61, 0x01, 0xE5, 0x60, 0x24, 0xF8, 0x80, 0x17, 0xE5, 0x60, 0xC3, 0x94, 0x18,
+0x50, 0x09, 0x75, 0x61, 0x02, 0xE5, 0x60, 0x24, 0xF0, 0x80, 0x07, 0x75, 0x61, 0x03, 0xE5, 0x60,
+0x24, 0xE8, 0xFF, 0x12, 0xD1, 0x06, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0x92, 0x0B, 0xE0,
+0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0x05, 0x28, 0xEF, 0xF0, 0xAF, 0x61, 0x22, 0xAF,
+0x5E, 0xF1, 0x02, 0x90, 0x92, 0x07, 0xEF, 0x22, 0x90, 0x92, 0x0B, 0xEE, 0xF0, 0xAB, 0x5F, 0x22,
+0x7F, 0x8F, 0x12, 0x7B, 0x51, 0xEF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93,
+0x8C, 0xEF, 0xF0, 0xF1, 0x80, 0x30, 0xE6, 0x38, 0x7F, 0x8D, 0x12, 0x7B, 0x51, 0xEF, 0x64, 0x01,
+0x70, 0x2E, 0x90, 0x93, 0x8D, 0xF0, 0x90, 0x93, 0x8D, 0xE0, 0xFD, 0x90, 0x93, 0x8C, 0xE0, 0x12,
+0x91, 0x68, 0xE5, 0x82, 0x2D, 0x12, 0xBA, 0x0F, 0xFB, 0xE4, 0xFF, 0x91, 0x44, 0x90, 0x93, 0x8D,
+0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x10, 0x40, 0xDD, 0xF1, 0x80, 0x30, 0xE0, 0x02, 0xF1, 0xFB,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x4D, 0xFF, 0x90, 0x86, 0x75, 0xF0, 0xEE, 0x22, 0xD1, 0x9F, 0xAB,
+0x5B, 0xAA, 0x5C, 0x22, 0x90, 0x92, 0x07, 0x12, 0x87, 0x79, 0x02, 0x02, 0xF6, 0x90, 0x00, 0x05,
+0x02, 0x03, 0x0F, 0x90, 0x00, 0x04, 0x02, 0x03, 0x0F, 0x61, 0x1E, 0xE4, 0xFD, 0x7F, 0x8D, 0x02,
+0x7B, 0x3E, 0x12, 0xD2, 0x09, 0x90, 0x92, 0xD0, 0xE0, 0x70, 0x0C, 0x12, 0xD2, 0x34, 0x30, 0xE0,
+0x06, 0x90, 0x92, 0xD6, 0x74, 0x01, 0xF0, 0x90, 0x92, 0xD2, 0xE0, 0x70, 0x0F, 0x11, 0xC9, 0xC4,
+0x54, 0x0F, 0xFF, 0xBF, 0x05, 0x06, 0x90, 0x92, 0xD7, 0x74, 0x01, 0xF0, 0x12, 0x8D, 0x90, 0xFF,
+0xF5, 0x5F, 0x12, 0x02, 0xF6, 0xFE, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x8C, 0x7A, 0xF5, 0x60,
+0x80, 0x02, 0x8F, 0x60, 0x85, 0x5F, 0x5E, 0xE5, 0x5E, 0xD3, 0x95, 0x60, 0x50, 0x28, 0x11, 0xC9,
+0x54, 0x01, 0xFD, 0xAF, 0x5E, 0x12, 0x6E, 0x5F, 0xAF, 0x5E, 0x12, 0x77, 0x39, 0xEF, 0xAF, 0x5E,
+0x70, 0x04, 0x11, 0x91, 0x80, 0x02, 0xF1, 0xF6, 0x90, 0x92, 0xD7, 0xE0, 0x60, 0x04, 0xAF, 0x5E,
+0x11, 0x91, 0x05, 0x5E, 0x80, 0xD1, 0xE5, 0x5F, 0x70, 0x16, 0xFF, 0x12, 0x77, 0x39, 0xEF, 0x70,
+0x0F, 0x12, 0xC2, 0xFA, 0x12, 0x79, 0x61, 0x12, 0xD2, 0x69, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0,
+0x22, 0x7D, 0x01, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x07, 0xEF, 0xF0, 0xA3,
+0xED, 0xF0, 0x7D, 0x44, 0x12, 0xA7, 0xD0, 0x90, 0x92, 0x08, 0xE0, 0x90, 0x92, 0x07, 0xB4, 0x01,
+0x09, 0xE0, 0x11, 0xD6, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x07, 0xE0, 0x11, 0xD6, 0xE0, 0x54, 0xFB,
+0xF0, 0x12, 0xAF, 0x8C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xAB, 0x5B, 0xAA, 0x5C, 0xA9, 0x5D, 0x02,
+0x02, 0xF6, 0xE0, 0xFD, 0xE5, 0x79, 0xC4, 0x54, 0xF0, 0x24, 0x05, 0xF5, 0x82, 0xE4, 0x34, 0x81,
+0xF5, 0x83, 0x22, 0x8D, 0x79, 0xEF, 0x30, 0xE6, 0x1A, 0x31, 0x66, 0x11, 0xD2, 0xE0, 0x54, 0x03,
+0x90, 0x91, 0x0B, 0xF0, 0xE4, 0xFB, 0xAF, 0x79, 0x12, 0x27, 0x3D, 0x31, 0x59, 0xD1, 0x70, 0x74,
+0x01, 0x80, 0x4D, 0x12, 0xD1, 0x55, 0x04, 0xF0, 0x12, 0xD1, 0x55, 0x64, 0x02, 0x70, 0x1F, 0x74,
+0x1D, 0x25, 0x79, 0x12, 0xD1, 0x33, 0xE0, 0xFD, 0xF4, 0x60, 0x02, 0x80, 0x04, 0x31, 0x66, 0xE0,
+0xFD, 0x11, 0xD4, 0x12, 0xD1, 0x62, 0x31, 0x66, 0xD1, 0x70, 0x74, 0x02, 0x80, 0x22, 0x12, 0xD1,
+0x55, 0xD3, 0x94, 0x03, 0x40, 0x0D, 0xAF, 0x79, 0x12, 0x6D, 0x94, 0x31, 0x59, 0xD1, 0x70, 0x74,
+0x03, 0x80, 0x0D, 0x31, 0x66, 0x11, 0xD2, 0x12, 0xD1, 0x62, 0x31, 0x66, 0xD1, 0x70, 0x74, 0x02,
+0xF0, 0xAB, 0x79, 0xE4, 0xFD, 0xFF, 0x02, 0x52, 0xC3, 0x74, 0xBC, 0x25, 0x79, 0xF5, 0x82, 0xE4,
+0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xE5, 0x79, 0xC4, 0x54, 0xF0, 0x24, 0x00, 0xF5, 0x82, 0xE4,
+0x34, 0x81, 0xF5, 0x83, 0x22, 0x90, 0x04, 0x85, 0xE0, 0xF5, 0x6C, 0x90, 0x93, 0x1C, 0xE0, 0x04,
+0xF0, 0xE4, 0xF5, 0x63, 0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE5, 0x63, 0xC3, 0x9F, 0x40, 0x02, 0xA1,
+0xAA, 0xE5, 0x63, 0x31, 0x68, 0xE0, 0xF5, 0x6E, 0x12, 0xD1, 0xBB, 0xE0, 0x65, 0x6E, 0x60, 0x16,
+0x90, 0x8A, 0x71, 0xE5, 0x6E, 0xF0, 0xE4, 0xA3, 0xF0, 0xAB, 0x63, 0xFD, 0xFF, 0x12, 0x52, 0xC3,
+0x12, 0xD1, 0xBB, 0xE5, 0x6E, 0xF0, 0x90, 0x04, 0xA0, 0xE0, 0x64, 0x01, 0x70, 0x4C, 0xA3, 0xE0,
+0x65, 0x63, 0x70, 0x46, 0xA3, 0xE0, 0xF5, 0x64, 0xA3, 0xE0, 0x90, 0x92, 0x50, 0xF0, 0xE5, 0x63,
+0x31, 0x68, 0xE0, 0x65, 0x64, 0x70, 0x02, 0xA1, 0xA6, 0xE5, 0x63, 0x31, 0x68, 0xE5, 0x64, 0xF0,
+0xE5, 0x63, 0x11, 0xD6, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0x92, 0x50, 0xE0, 0x54, 0x03, 0x4F, 0xFF,
+0xE5, 0x63, 0x11, 0xD6, 0xEF, 0xF0, 0x90, 0x8A, 0x71, 0xE5, 0x64, 0xF0, 0xA3, 0x74, 0xFF, 0xF0,
+0xAB, 0x63, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0xC3, 0xA1, 0xA6, 0xAF, 0x63, 0x12, 0x77, 0x39, 0x75,
+0xF0, 0x12, 0xE5, 0x63, 0x12, 0x8B, 0x16, 0x12, 0x8E, 0x8B, 0xFD, 0x12, 0xD1, 0xC7, 0xED, 0xF0,
+0x90, 0x92, 0x59, 0x12, 0xB2, 0xEC, 0xE5, 0x63, 0xF0, 0x12, 0xB1, 0x18, 0x08, 0x80, 0x05, 0xC3,
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0xFF, 0x90, 0x92, 0x5D,
+0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7B, 0x02, 0x7A, 0x00, 0xE4, 0xFD, 0x7F, 0x01, 0xD1, 0x06, 0x12,
+0xD1, 0x48, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0xD1, 0x3B, 0xFD, 0xE5, 0x63, 0x12, 0xD1, 0x70, 0x54,
+0x80, 0xFB, 0x12, 0xD1, 0xC7, 0xEB, 0xF0, 0x12, 0xD1, 0xCE, 0xED, 0xF0, 0x90, 0x92, 0x57, 0x12,
+0xCA, 0x9A, 0x90, 0x92, 0x5D, 0xF0, 0xA3, 0xF0, 0x7B, 0x03, 0xFA, 0xFD, 0x7F, 0x01, 0xD1, 0x06,
+0xAF, 0x63, 0x12, 0x77, 0x39, 0xEF, 0x70, 0x02, 0xA1, 0xA6, 0x75, 0xF0, 0x12, 0xE5, 0x63, 0x12,
+0x8B, 0x16, 0x12, 0x8E, 0x8B, 0x30, 0xE0, 0x02, 0xA1, 0xA6, 0xE5, 0x63, 0x12, 0xB1, 0x18, 0x08,
+0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E,
+0x60, 0x02, 0xA1, 0xA6, 0x12, 0xD1, 0x48, 0xFE, 0xA3, 0xE0, 0x4E, 0x70, 0x07, 0x12, 0xD1, 0x3B,
+0x70, 0x02, 0xA1, 0xA6, 0xE5, 0x63, 0x75, 0xF0, 0x12, 0xA4, 0x24, 0x44, 0xF9, 0x74, 0x89, 0x35,
+0xF0, 0xFA, 0x7B, 0x01, 0x90, 0x92, 0x4B, 0x12, 0x87, 0x79, 0xF1, 0xC4, 0x12, 0xD2, 0x5A, 0x12,
+0x03, 0xED, 0x2F, 0xFF, 0xF1, 0xF0, 0x2F, 0xFF, 0x12, 0xD1, 0xD5, 0x2F, 0xFF, 0x12, 0xD1, 0xDB,
+0x2F, 0xF5, 0x6D, 0x12, 0xD1, 0x48, 0xF5, 0x69, 0xA3, 0xE0, 0xF5, 0x6A, 0x12, 0xD1, 0x3B, 0xFF,
+0x90, 0x92, 0x4E, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x63, 0x31, 0x68, 0xE0, 0xF5, 0x64, 0x54,
+0x80, 0xF5, 0x66, 0xE5, 0x64, 0x54, 0x7F, 0xF5, 0x65, 0xF1, 0xC4, 0x12, 0x03, 0xED, 0xF1, 0xCA,
+0x12, 0xD2, 0x5A, 0x90, 0x92, 0x59, 0xF1, 0xCE, 0xF1, 0xF0, 0xFF, 0x90, 0x92, 0x5B, 0xF1, 0xCE,
+0x12, 0xD1, 0xD5, 0xFF, 0x90, 0x92, 0x5D, 0xF1, 0xCE, 0x7B, 0x01, 0xF1, 0xDD, 0xF1, 0xC4, 0x12,
+0xD1, 0xDB, 0xF1, 0xCA, 0x90, 0x92, 0x4E, 0xF1, 0xFA, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0x12, 0xD2,
+0x52, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x64, 0xF0, 0x7B, 0x02, 0xF1, 0xDD, 0x74, 0x7C, 0x25, 0x63,
+0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xC3, 0x94, 0x05, 0x40, 0x02, 0xA1, 0x8B, 0x75,
+0xF0, 0x12, 0xE5, 0x63, 0x12, 0xB7, 0xD3, 0xFF, 0xE5, 0x65, 0xD3, 0x9F, 0x40, 0x08, 0x8F, 0x65,
+0xE5, 0x65, 0x45, 0x66, 0xF5, 0x64, 0xE5, 0x65, 0x90, 0x82, 0xE1, 0x93, 0xF5, 0x6B, 0xE5, 0x66,
+0x60, 0x04, 0x05, 0x6B, 0x05, 0x6B, 0x90, 0x04, 0x8C, 0xE0, 0x64, 0x01, 0x70, 0x28, 0xE5, 0x65,
+0xC3, 0x94, 0x0C, 0x40, 0x21, 0x74, 0x84, 0x25, 0x65, 0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83,
+0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0xEF, 0x30, 0xE7, 0x06, 0xE5, 0x6B, 0x2E, 0xFF, 0x80, 0x05, 0xC3,
+0xE5, 0x6B, 0x9E, 0xFF, 0x8F, 0x6B, 0xE5, 0x6B, 0xD3, 0x94, 0x1A, 0xAF, 0x6B, 0x40, 0x02, 0x7F,
+0x1A, 0x8F, 0x6B, 0xB1, 0xB0, 0x7B, 0x03, 0xFA, 0xF1, 0xDF, 0xE5, 0x64, 0x90, 0x83, 0x59, 0x93,
+0xFF, 0xD3, 0x90, 0x92, 0x4F, 0xE0, 0x9F, 0x90, 0x92, 0x4E, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x80,
+0x71, 0xC3, 0xE5, 0x6A, 0x94, 0x0A, 0xE5, 0x69, 0x94, 0x00, 0x40, 0x02, 0x81, 0xD3, 0xB1, 0xF4,
+0xE0, 0xC3, 0x94, 0x01, 0x40, 0x05, 0xB1, 0xF4, 0xE0, 0x14, 0xF0, 0xF1, 0xC4, 0x12, 0xD1, 0xDB,
+0xFF, 0x90, 0x92, 0x4F, 0xE0, 0x2F, 0xFF, 0x90, 0x92, 0x4E, 0xE0, 0x35, 0xF0, 0xFE, 0x12, 0xD1,
+0xD5, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE, 0xF1, 0xF0, 0x2F, 0xFD, 0xEE, 0x35, 0xF0, 0xFC, 0xE5,
+0x69, 0xC3, 0x13, 0xFE, 0xE5, 0x6A, 0x13, 0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x28, 0xE5,
+0x63, 0x94, 0x05, 0x50, 0x05, 0xB1, 0xF4, 0x74, 0x03, 0xF0, 0x90, 0x92, 0x57, 0x12, 0xD2, 0x52,
+0xE5, 0x69, 0xC3, 0x13, 0xA3, 0xF0, 0xE5, 0x6A, 0x13, 0xA3, 0xB1, 0xC6, 0xF1, 0xE5, 0x7B, 0x01,
+0xD1, 0x00, 0x12, 0xB2, 0x1B, 0xA1, 0x8B, 0xF1, 0xC4, 0x12, 0x03, 0xED, 0x65, 0x6D, 0x70, 0x02,
+0xE5, 0xF0, 0x70, 0x4F, 0x90, 0x92, 0x57, 0xF0, 0xA3, 0xE5, 0x6D, 0xF0, 0xC3, 0x13, 0xFF, 0xA3,
+0xE4, 0xF0, 0xA3, 0xEF, 0xB1, 0xC6, 0xF1, 0xE5, 0x7B, 0x02, 0xD1, 0x00, 0xE5, 0x63, 0xC3, 0x94,
+0x05, 0x50, 0x0E, 0xB1, 0xF4, 0xE0, 0xD3, 0x94, 0x00, 0x40, 0x06, 0xB1, 0xAB, 0x7B, 0x03, 0x80,
+0x0B, 0xE5, 0x6D, 0xC3, 0x94, 0x03, 0x50, 0x10, 0xB1, 0xAB, 0x7B, 0x04, 0xFA, 0xD1, 0x02, 0x7D,
+0x06, 0xAF, 0x63, 0x12, 0xC5, 0xAB, 0xA1, 0xA6, 0xE4, 0xFD, 0xAF, 0x63, 0xD1, 0x83, 0x12, 0xC5,
+0xA7, 0xA1, 0x8B, 0xB1, 0xAB, 0x7B, 0x08, 0xFA, 0xD1, 0x02, 0x7D, 0x01, 0xAF, 0x63, 0x12, 0x65,
+0xC2, 0xA1, 0x8B, 0xB1, 0xF4, 0xE4, 0xF0, 0x90, 0x92, 0x55, 0x74, 0x02, 0xF0, 0xAB, 0x6B, 0xAD,
+0x63, 0xAF, 0x6A, 0xAE, 0x69, 0x12, 0xB3, 0x26, 0x8E, 0x67, 0x8F, 0x68, 0x12, 0xD1, 0x8B, 0xF5,
+0x83, 0xC3, 0x74, 0x01, 0x93, 0x95, 0x68, 0xE4, 0x93, 0x95, 0x67, 0x50, 0x17, 0xD1, 0x77, 0xE4,
+0xF0, 0x7D, 0x01, 0xAF, 0x63, 0xD1, 0x83, 0x12, 0xD0, 0xB8, 0xE4, 0x90, 0x92, 0x5B, 0xB1, 0xBE,
+0x7B, 0x01, 0x80, 0x22, 0xF1, 0xD5, 0xC3, 0xE5, 0x68, 0x9F, 0xE5, 0x67, 0x94, 0x00, 0x50, 0x1C,
+0xD1, 0x77, 0xE4, 0xF0, 0x12, 0xB2, 0x1B, 0x12, 0xD0, 0xD3, 0xF1, 0xD5, 0x12, 0xD1, 0xCE, 0xEF,
+0xF0, 0xE4, 0xB1, 0xBD, 0x7B, 0x02, 0xFA, 0x12, 0xD2, 0x4B, 0x80, 0x4F, 0x12, 0xC5, 0xA7, 0x12,
+0xD0, 0xB8, 0xF1, 0xD5, 0x12, 0xD1, 0xC7, 0xEF, 0xF0, 0xD1, 0x77, 0xF1, 0xE5, 0x7B, 0x03, 0x7A,
+0x00, 0x12, 0xD2, 0x4B, 0xD1, 0x77, 0xE0, 0x04, 0xF0, 0xE5, 0x65, 0x90, 0x83, 0x6D, 0x93, 0xFF,
+0xD1, 0x77, 0xE0, 0xC3, 0x9F, 0x40, 0x24, 0xD1, 0x77, 0xE4, 0xF0, 0xF1, 0xD5, 0x12, 0xD1, 0x8B,
+0xF5, 0x83, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x34, 0x00, 0xC3, 0x13, 0xFE, 0xEF, 0x13,
+0xFF, 0xE5, 0x63, 0x12, 0xB3, 0x1A, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x6D, 0xFD, 0xAF,
+0x63, 0x12, 0x65, 0xC2, 0xE4, 0x90, 0x92, 0x57, 0xF0, 0xB1, 0xB9, 0xA3, 0xF0, 0x7B, 0x01, 0xFA,
+0x7D, 0xFF, 0x7F, 0x01, 0xD1, 0x06, 0x05, 0x63, 0x21, 0x84, 0x22, 0x90, 0x93, 0x1C, 0xE0, 0xFF,
+0x90, 0x92, 0x57, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
+0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xF0, 0x90, 0x92, 0x4B, 0x12, 0x87, 0x70, 0x90, 0x00, 0x06,
+0x12, 0x04, 0x18, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x04, 0x18, 0x2F, 0xFF, 0xE5, 0xF0,
+0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x04, 0x18, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90, 0x92, 0x5B,
+0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x2D, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22,
+0x7A, 0x00, 0x7D, 0x03, 0x7F, 0x01, 0x90, 0x01, 0xC6, 0xE0, 0xFE, 0x64, 0x80, 0x70, 0x60, 0x90,
+0x92, 0x61, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEB, 0xA3, 0xF0, 0xEA, 0xA3, 0xF0, 0x90, 0x92, 0x57,
+0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92, 0x65, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x59, 0xE0, 0xFC,
+0xA3, 0xE0, 0x90, 0x92, 0x67, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x5B, 0xE0, 0xFC, 0xA3, 0xE0,
+0x90, 0x92, 0x69, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x5D, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92,
+0x6B, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x5F, 0x74, 0xFE, 0xF0, 0x90, 0x92, 0x6D, 0x74, 0x0C,
+0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x5F, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x12, 0x87, 0xBB, 0x22,
+0xE0, 0x90, 0x8A, 0x71, 0xF0, 0xA3, 0x22, 0x74, 0xAC, 0x25, 0x63, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
+0xF5, 0x83, 0x22, 0x8F, 0x6F, 0x8D, 0x70, 0xEF, 0x31, 0x68, 0xE0, 0xF5, 0x71, 0x54, 0x7F, 0xF5,
+0x72, 0xE5, 0x71, 0x54, 0x80, 0xF5, 0x74, 0x75, 0xF0, 0x12, 0xEF, 0x12, 0xB7, 0xD3, 0xF5, 0x76,
+0x75, 0xF0, 0x12, 0xEF, 0x12, 0x8B, 0x16, 0xC4, 0x54, 0x03, 0xF5, 0x77, 0x12, 0xD1, 0x2F, 0x74,
+0xFF, 0xF0, 0x12, 0xB3, 0x04, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x71, 0x45, 0x74, 0xFF, 0x12,
+0xB2, 0xF8, 0xEF, 0xF0, 0xE5, 0x6F, 0x11, 0xD6, 0xE0, 0x54, 0x03, 0xF5, 0x75, 0x74, 0x4C, 0x25,
+0x6F, 0x12, 0xB7, 0xB5, 0xE5, 0x75, 0xF0, 0xE5, 0x72, 0x65, 0x76, 0x70, 0x44, 0x75, 0xF0, 0x12,
+0xE5, 0x6F, 0x12, 0x8E, 0x97, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x74, 0x70, 0x08,
+0xE5, 0x72, 0x44, 0x80, 0xF5, 0x71, 0xE1, 0x94, 0x12, 0xB3, 0x04, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x12, 0xB3, 0x18, 0xF1, 0xFA, 0x12, 0xB2, 0xED, 0xE5, 0x6F, 0xF0, 0xE4, 0x90, 0x92, 0x5B, 0xB1,
+0xBE, 0x7B, 0x01, 0xFA, 0x7D, 0x02, 0x7F, 0x04, 0xD1, 0x06, 0x7D, 0x07, 0xAF, 0x6F, 0x02, 0xC5,
+0xAB, 0xE5, 0x72, 0xC3, 0x95, 0x76, 0x50, 0x64, 0xAB, 0x6F, 0xAD, 0x76, 0xAF, 0x72, 0x12, 0x72,
+0xEA, 0x8F, 0x73, 0x85, 0x73, 0x71, 0x75, 0xF0, 0x12, 0xE5, 0x6F, 0x12, 0x8E, 0x97, 0xC4, 0x13,
+0x54, 0x01, 0xFF, 0x90, 0x92, 0x5B, 0x12, 0xB2, 0xEC, 0xE5, 0x73, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3,
+0xE5, 0x72, 0xF0, 0xE5, 0x74, 0x12, 0x8E, 0x8B, 0xF1, 0xE6, 0xE4, 0xFB, 0xFA, 0x12, 0xD2, 0x62,
+0xE5, 0x72, 0xC3, 0x94, 0x0C, 0x40, 0x2D, 0x75, 0xF0, 0x12, 0xE5, 0x6F, 0x12, 0x8E, 0x97, 0xC4,
+0x13, 0x54, 0x07, 0x30, 0xE0, 0x1E, 0xE5, 0x70, 0x60, 0x1A, 0xE5, 0x74, 0x70, 0x16, 0xE5, 0x72,
+0x44, 0x80, 0xF5, 0x71, 0x12, 0xD1, 0x2F, 0xE5, 0x73, 0xF0, 0x80, 0x08, 0x12, 0xB2, 0xF8, 0xE5,
+0x76, 0xF0, 0xF5, 0x71, 0x12, 0xB2, 0xF1, 0xE5, 0x71, 0xF0, 0x12, 0xD1, 0x2F, 0xE0, 0xFF, 0x12,
+0xD1, 0xCE, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x75, 0x12, 0xB7, 0xAD, 0xF0, 0x7B, 0x01,
+0x7A, 0x00, 0x12, 0xD2, 0x62, 0x90, 0x91, 0x0B, 0xE5, 0x75, 0xF0, 0xAB, 0x70, 0xAD, 0x71, 0xAF,
+0x6F, 0x02, 0x27, 0x3D, 0x90, 0x92, 0x4B, 0x02, 0x87, 0x70, 0xFF, 0x90, 0x92, 0x57, 0xE5, 0xF0,
+0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xE5, 0x65, 0x90, 0x83, 0x1D, 0x93, 0xFF, 0x22, 0x7A, 0x00, 0x7D,
+0x01, 0x7F, 0x01, 0xC1, 0x06, 0xE0, 0xFF, 0x90, 0x92, 0x5D, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22,
+0x90, 0x00, 0x04, 0x02, 0x04, 0x18, 0xE4, 0xFD, 0x01, 0x93, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92,
+0x59, 0xCF, 0x22, 0x90, 0x92, 0x07, 0x12, 0x87, 0x79, 0x90, 0x04, 0x24, 0xE0, 0xF5, 0x5B, 0xE4,
+0xFF, 0x12, 0x89, 0xB9, 0x8F, 0x82, 0x75, 0x83, 0x00, 0x12, 0x03, 0x0F, 0x25, 0x5B, 0xFE, 0xEF,
+0x75, 0xF0, 0x0E, 0xA4, 0x24, 0xB1, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xEE, 0xF0, 0x0F,
+0xEF, 0xB4, 0x03, 0xDD, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x92, 0x9B, 0xF0, 0xBF, 0x01, 0x07,
+0x11, 0x48, 0xE4, 0x90, 0x92, 0x9B, 0xF0, 0x22, 0x11, 0xF8, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x64,
+0x37, 0xBF, 0x01, 0x06, 0x90, 0x92, 0x07, 0xE0, 0xA3, 0xF0, 0x11, 0xF8, 0x7F, 0xF6, 0x7E, 0x01,
+0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x09, 0xF0, 0x11, 0xF8,
+0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92,
+0x0A, 0xF0, 0x11, 0xF8, 0x7F, 0xF3, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92,
+0x07, 0xE0, 0x90, 0x92, 0x0B, 0xF0, 0x11, 0xF8, 0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF,
+0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x0C, 0xF0, 0x90, 0x92, 0x08, 0xE0, 0xFF, 0xA3,
+0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90, 0x92, 0x10, 0xF0, 0x90, 0x92, 0x0C, 0xE0, 0x90,
+0x92, 0x11, 0xF0, 0x90, 0x92, 0x12, 0x74, 0x12, 0xF0, 0x90, 0x92, 0x20, 0x74, 0x05, 0xF0, 0x90,
+0x92, 0x14, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3, 0xEB, 0xF0, 0x90, 0x92, 0x10, 0xE0, 0x90, 0x92,
+0x17, 0xF0, 0x90, 0x92, 0x11, 0xE0, 0x90, 0x92, 0x18, 0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x12,
+0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x07, 0x22, 0x12,
+0x02, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x92, 0xDB, 0xE0, 0x54, 0xFE, 0x4F, 0xF0, 0x22, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0xD2, 0x09, 0x90, 0x05, 0x27, 0xE0, 0xF5, 0x5E, 0x8B, 0x1B,
+0x8A, 0x1C, 0x89, 0x1D, 0x75, 0x1E, 0x01, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xBC, 0x12, 0x6A, 0x21,
+0x12, 0x90, 0xC9, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0x21, 0xC3, 0x90, 0x85, 0xBC, 0xE0, 0x30,
+0xE0, 0x70, 0xB1, 0x3A, 0x75, 0x5E, 0x21, 0xB1, 0x52, 0x30, 0xE0, 0x04, 0xD1, 0x1C, 0x80, 0x0D,
+0xE4, 0x90, 0x85, 0xBD, 0xF0, 0xA3, 0xF0, 0x7D, 0x40, 0xFF, 0x12, 0x7C, 0x41, 0xB1, 0x49, 0x54,
+0x1F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x12, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x5E,
+0x14, 0x90, 0x85, 0xBC, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x80, 0x90,
+0x85, 0xBC, 0x12, 0xB7, 0xC9, 0x20, 0xE0, 0x03, 0x43, 0x5E, 0x40, 0x51, 0x69, 0x90, 0x85, 0xBF,
+0xE0, 0x70, 0x04, 0x7F, 0x01, 0x91, 0x1F, 0x90, 0x85, 0xBC, 0xB1, 0x41, 0x30, 0xE0, 0x04, 0x7F,
+0x04, 0x80, 0x0B, 0xB1, 0x5B, 0xEF, 0x60, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x91, 0x1F,
+0x80, 0x7F, 0x51, 0x66, 0x90, 0x85, 0xBF, 0xE0, 0x64, 0x04, 0x60, 0x02, 0x41, 0x61, 0xFF, 0x91,
+0x1F, 0x41, 0x61, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x6F, 0xB1, 0x3A, 0x43, 0x5E, 0x31, 0xB1,
+0x52, 0x30, 0xE0, 0x04, 0xD1, 0x1C, 0x80, 0x07, 0x7D, 0x40, 0xE4, 0xFF, 0x12, 0x7C, 0x41, 0xB1,
+0x49, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03,
+0x43, 0x5E, 0x04, 0x51, 0x69, 0x90, 0x85, 0xBC, 0xB1, 0x41, 0x30, 0xE0, 0x0A, 0xD1, 0x61, 0x60,
+0x30, 0xE4, 0xFD, 0x7F, 0x02, 0x80, 0x1E, 0x12, 0xC5, 0x9F, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02,
+0x18, 0x12, 0x7A, 0xA2, 0xB1, 0x5B, 0xBF, 0x01, 0x09, 0x90, 0x85, 0xC7, 0xE0, 0xFF, 0x7D, 0x01,
+0x80, 0x03, 0xE4, 0xFD, 0xFF, 0x51, 0x74, 0x80, 0x08, 0x90, 0x85, 0xC8, 0xE0, 0x90, 0x85, 0xC0,
+0xF0, 0x90, 0x05, 0x40, 0x74, 0x22, 0xF0, 0x80, 0x28, 0x51, 0x66, 0x90, 0x85, 0xC0, 0xE0, 0xB4,
+0x02, 0x06, 0x7D, 0x01, 0x7F, 0x04, 0x80, 0x0B, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x08, 0x06, 0x7D,
+0x01, 0x7F, 0x0C, 0x51, 0x74, 0x12, 0xC8, 0x7E, 0x90, 0x85, 0xC7, 0x12, 0xBB, 0x86, 0x12, 0xC8,
+0x53, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75, 0x5E, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x5E, 0xF0, 0x22,
+0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x94, 0xED, 0xF0,
+0x90, 0x85, 0xC1, 0xE0, 0xFE, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0x61, 0xCF, 0xEE,
+0x12, 0x8E, 0x8B, 0x30, 0xE0, 0x02, 0x61, 0xCF, 0x90, 0x85, 0xC8, 0xE0, 0xFE, 0x6F, 0x70, 0x02,
+0x61, 0xCF, 0xEF, 0x70, 0x02, 0x61, 0x3A, 0x24, 0xFE, 0x70, 0x02, 0x61, 0x77, 0x24, 0xFE, 0x60,
+0x4D, 0x24, 0xFC, 0x70, 0x02, 0x61, 0xB6, 0x24, 0xFC, 0x60, 0x02, 0x61, 0xC8, 0xEE, 0xB4, 0x0E,
+0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90,
+0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x0F,
+0x90, 0x93, 0x94, 0xE0, 0xFF, 0x60, 0x05, 0x12, 0x6D, 0x4C, 0x80, 0x03, 0x12, 0x79, 0x61, 0x90,
+0x85, 0xC8, 0xE0, 0x64, 0x08, 0x60, 0x02, 0x61, 0xC8, 0x12, 0x7A, 0xB9, 0x61, 0xC8, 0x90, 0x85,
+0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03,
+0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0x71, 0xD4, 0xBF, 0x01, 0x03, 0x12,
+0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x0C, 0x60, 0x02, 0x61, 0xC8, 0x71, 0xD4, 0xEF, 0x64,
+0x01, 0x60, 0x02, 0x61, 0xC8, 0x12, 0x70, 0x9E, 0x61, 0xC8, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E,
+0x08, 0x71, 0xD4, 0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03,
+0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x08, 0x71, 0xD4, 0xBF, 0x01, 0x03, 0x12,
+0x70, 0x9E, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x04, 0x70, 0x5E, 0x12, 0xC3, 0x94, 0xEF, 0x64, 0x01,
+0x70, 0x56, 0x12, 0x77, 0xFE, 0x80, 0x51, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0x71, 0xD4,
+0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E,
+0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x08, 0x71, 0xD4, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90,
+0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04,
+0x17, 0x12, 0x79, 0xF3, 0x80, 0x12, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x0B, 0x12, 0xA1, 0x76,
+0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x7A, 0x8A, 0x90, 0x85, 0xC8, 0x12, 0xD1, 0x7E, 0xF0, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7A, 0x29, 0xEF, 0x64,
+0x01, 0x60, 0x05, 0x75, 0x0F, 0x01, 0x80, 0x24, 0x90, 0x85, 0xC1, 0xE0, 0x13, 0x13, 0x13, 0x54,
+0x1F, 0x30, 0xE0, 0x05, 0x75, 0x0F, 0x02, 0x80, 0x13, 0x90, 0x85, 0xC7, 0xE0, 0xD3, 0x94, 0x04,
+0x40, 0x05, 0x75, 0x0F, 0x08, 0x80, 0x05, 0x12, 0xC2, 0xB0, 0x80, 0x0E, 0x90, 0x01, 0xB9, 0x74,
+0x02, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x0F, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0xBF, 0xE0, 0x90, 0x93, 0x93, 0xF0, 0x6F, 0x70,
+0x02, 0xA1, 0x35, 0xEF, 0x14, 0x60, 0x46, 0x14, 0x60, 0x71, 0x14, 0x70, 0x02, 0x81, 0xD9, 0x14,
+0x70, 0x02, 0xA1, 0x08, 0x24, 0x04, 0x60, 0x02, 0xA1, 0x35, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x04,
+0x05, 0x12, 0xC3, 0x4E, 0xA1, 0x35, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0xC3, 0x5D,
+0xA1, 0x35, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0xC3, 0x62, 0xA1, 0x35, 0x90, 0x93,
+0x93, 0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x35, 0x12, 0xC3, 0x50, 0xA1, 0x35, 0x90, 0x93, 0x93,
+0xE0, 0xB4, 0x04, 0x05, 0x12, 0xC3, 0x43, 0xA1, 0x35, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x02, 0x04,
+0xF1, 0xE8, 0xA1, 0x35, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x03, 0x04, 0xF1, 0xDB, 0xA1, 0x35, 0x90,
+0x93, 0x93, 0xE0, 0x60, 0x02, 0xA1, 0x35, 0xF1, 0xD9, 0xA1, 0x35, 0x90, 0x93, 0x93, 0xE0, 0xB4,
+0x04, 0x05, 0x12, 0xC5, 0x95, 0x80, 0x7E, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x01, 0x04, 0xF1, 0xED,
+0x80, 0x73, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x03, 0x05, 0x12, 0xC5, 0x9C, 0x80, 0x67, 0x90, 0x93,
+0x93, 0xE0, 0x70, 0x61, 0x12, 0xC8, 0x72, 0x80, 0x5C, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x04, 0x05,
+0x12, 0xC3, 0x67, 0x80, 0x50, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x01, 0x05, 0x12, 0xA7, 0xDE, 0x80,
+0x44, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0xC3, 0x34, 0x80, 0x38, 0x90, 0x93, 0x93,
+0xE0, 0x70, 0x32, 0x12, 0xC8, 0x78, 0x80, 0x2D, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x03, 0x05, 0x12,
+0xC3, 0x86, 0x80, 0x21, 0x90, 0x93, 0x93, 0xE0, 0xB4, 0x01, 0x05, 0x12, 0xC3, 0x73, 0x80, 0x15,
+0x90, 0x93, 0x93, 0xE0, 0xB4, 0x02, 0x05, 0x12, 0xC3, 0x24, 0x80, 0x09, 0x90, 0x93, 0x93, 0xE0,
+0x70, 0x03, 0x12, 0xC3, 0x81, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x03, 0x7F, 0x02, 0x02, 0x7B,
+0xFD, 0xE0, 0xFF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x13, 0x13,
+0x13, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0x05, 0x43, 0xE0, 0x7F,
+0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xE4, 0xF5, 0x78, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02,
+0xC1, 0x09, 0x12, 0xBB, 0xA6, 0x60, 0x02, 0xC1, 0x09, 0x12, 0xD0, 0xDE, 0x12, 0xA1, 0x8E, 0x60,
+0x22, 0x24, 0xFE, 0x60, 0x03, 0x04, 0x70, 0x1E, 0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0, 0xE0, 0xFF,
+0x60, 0x06, 0x90, 0x85, 0xCE, 0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xA3,
+0xF0, 0x80, 0x00, 0x75, 0x78, 0x01, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x11, 0x90, 0x85, 0xC0,
+0xE0, 0xB4, 0x02, 0x03, 0xE4, 0xF5, 0x78, 0xB1, 0x5B, 0xEF, 0x70, 0x02, 0xF5, 0x78, 0xE5, 0x78,
+0x60, 0x47, 0x90, 0x85, 0xC8, 0xE0, 0x20, 0xE2, 0x02, 0x51, 0x70, 0x12, 0xD2, 0x3C, 0x90, 0x85,
+0xCE, 0xE0, 0x60, 0x04, 0x64, 0x01, 0x70, 0x16, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCE,
+0xE0, 0xD1, 0x15, 0x90, 0x91, 0x6F, 0xD1, 0xFC, 0x90, 0x85, 0xCE, 0xE0, 0x80, 0x15, 0xE4, 0x90,
+0x91, 0x6E, 0xD1, 0x0A, 0x90, 0x91, 0x6F, 0xD1, 0xFC, 0x90, 0x85, 0xCE, 0xE0, 0x75, 0xF0, 0x03,
+0xA4, 0x24, 0xFE, 0xD1, 0x15, 0x90, 0x85, 0xDE, 0xF0, 0x22, 0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x75,
+0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x85, 0xCD, 0xE0, 0x2F, 0x22, 0x90, 0x01, 0x34, 0x74,
+0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x7C, 0xA9, 0x43, 0x5E, 0x08, 0x22, 0xAE, 0x07, 0xB1, 0x5B,
+0xBF, 0x01, 0x12, 0x90, 0x85, 0xBC, 0x12, 0xB7, 0xC9, 0x20, 0xE0, 0x09, 0xAF, 0x06, 0x7D, 0x01,
+0x51, 0x74, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x85, 0xBC, 0xB1, 0x41, 0x30, 0xE0, 0x0A,
+0xD1, 0x61, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x02, 0x51, 0x74, 0xD1, 0x61, 0x60, 0x02, 0xD1, 0x68,
+0x22, 0x90, 0x85, 0xC0, 0xE0, 0x64, 0x02, 0x22, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x02, 0x60, 0x0F,
+0xD1, 0xC6, 0x60, 0x0B, 0x12, 0x7A, 0x29, 0xEF, 0x70, 0x05, 0xFD, 0x7F, 0x0C, 0x51, 0x74, 0x22,
+0x90, 0x85, 0xC5, 0xE0, 0x70, 0x07, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x10, 0x90, 0x85, 0xBC,
+0xE0, 0x30, 0xE0, 0x07, 0xB1, 0x5B, 0xBF, 0x01, 0x04, 0x80, 0xCD, 0xD1, 0x9E, 0x22, 0x90, 0x85,
+0xC5, 0xE0, 0x64, 0x01, 0x70, 0x18, 0xD1, 0xC6, 0x60, 0x0C, 0xE4, 0xFD, 0x7F, 0x0C, 0x51, 0x74,
+0x12, 0xAF, 0x8C, 0x02, 0x6B, 0x98, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x02, 0x51, 0x70, 0x22, 0x90,
+0x85, 0xC9, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x85, 0xC3, 0xE0, 0x54, 0x0F, 0x22, 0x90, 0x92, 0xA2,
+0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0xAF, 0xF5, 0x82, 0xE4, 0x34,
+0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xEF, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0xAE, 0xF5, 0x82, 0xE4, 0x34,
+0x92, 0xF5, 0x83, 0xE0, 0x90, 0x91, 0x6F, 0xF0, 0x90, 0x91, 0x6E, 0xEE, 0xF0, 0xE4, 0xFB, 0xFD,
+0x7F, 0x54, 0x7E, 0x01, 0x02, 0x61, 0x41, 0xE4, 0x90, 0x92, 0x7F, 0xF0, 0x90, 0x85, 0xC5, 0xE0,
+0x60, 0x52, 0x12, 0xBB, 0xA6, 0x70, 0x4D, 0x12, 0xD2, 0x22, 0x12, 0xD0, 0xDE, 0x90, 0x92, 0x7F,
+0x74, 0x01, 0xF0, 0xE4, 0x90, 0x85, 0xCC, 0xF0, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x15, 0x90,
+0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0x92, 0x7F, 0xF0, 0xB1, 0x5B, 0xEF, 0x70, 0x04,
+0x90, 0x92, 0x7F, 0xF0, 0x90, 0x92, 0x7F, 0xE0, 0x60, 0x1A, 0x90, 0x85, 0xC8, 0xE0, 0x20, 0xE2,
+0x02, 0x51, 0x70, 0x12, 0xD2, 0x3C, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCD, 0xE0, 0x90,
+0x91, 0x6F, 0xD1, 0xFC, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x92, 0x6E, 0xF0, 0xE0, 0xFD, 0x54,
+0xC0, 0x70, 0x05, 0x12, 0xBB, 0x23, 0x80, 0x5D, 0xED, 0x30, 0xE6, 0x3F, 0x90, 0x85, 0xC5, 0xE0,
+0x64, 0x02, 0x70, 0x27, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0xC3, 0x13, 0x20, 0xE0, 0x09, 0x90, 0x85,
+0xC9, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x1A, 0xD1, 0xC6, 0x64, 0x01, 0x70, 0x21, 0x90, 0x85, 0xC9,
+0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x62, 0x8E, 0x80, 0x13, 0xD1, 0xBF, 0x64, 0x02, 0x60,
+0x05, 0x12, 0x77, 0x61, 0x80, 0x08, 0x12, 0x79, 0x41, 0x80, 0x03, 0x12, 0xBB, 0x23, 0x90, 0x92,
+0x6E, 0xE0, 0x90, 0x85, 0xC9, 0x30, 0xE7, 0x0C, 0xE0, 0x44, 0x02, 0xF0, 0x12, 0xBC, 0xE2, 0xD1,
+0xFC, 0x02, 0xBF, 0xD6, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x80, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0xA6,
+0xF8, 0x90, 0x85, 0xBF, 0x74, 0x01, 0xF0, 0x22, 0x12, 0xC2, 0xFA, 0x80, 0xEE, 0x7D, 0x20, 0x7F,
+0xFF, 0x12, 0xA6, 0xF8, 0x12, 0xC5, 0x61, 0x90, 0x85, 0xBF, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x02,
+0xF6, 0x90, 0x86, 0x71, 0xF0, 0x22, 0x12, 0xAF, 0x9A, 0x90, 0x92, 0x9C, 0x12, 0xAF, 0x92, 0x54,
+0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xF0, 0x12, 0x8D, 0x96, 0x90, 0x92, 0x9D, 0x12, 0x8C, 0x79,
+0x90, 0x92, 0x9E, 0xF0, 0x12, 0xD1, 0xE1, 0x90, 0x92, 0x9C, 0xE0, 0x54, 0x01, 0xFF, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x64, 0x01, 0x70, 0x1A, 0x11, 0x77, 0x60, 0x0A, 0x11, 0x70,
+0x12, 0x7B, 0xFD, 0x12, 0xD2, 0x19, 0x80, 0x07, 0x11, 0x70, 0x12, 0x7B, 0xBF, 0xF1, 0xAD, 0x12,
+0x7A, 0x8A, 0x80, 0x17, 0x11, 0x77, 0x60, 0x07, 0x11, 0x70, 0x12, 0x7B, 0xFD, 0x80, 0x05, 0x11,
+0x70, 0x12, 0x7B, 0xBF, 0xF1, 0xBB, 0xF1, 0xC9, 0x12, 0x7A, 0xB9, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0x74, 0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x22, 0x90, 0x92, 0x9E, 0xE0, 0x90, 0x01, 0x3F, 0x22, 0x12,
+0xBB, 0xA6, 0x60, 0x02, 0x21, 0x6A, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x21, 0x6A, 0x90, 0x05,
+0x63, 0xE0, 0x90, 0x92, 0xE1, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x92, 0xE2, 0xF0, 0x90, 0x05,
+0x61, 0xE0, 0x90, 0x92, 0xE3, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x92, 0xE4, 0xF0, 0x12, 0xBC,
+0xA2, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEC, 0xF0, 0x31, 0x8E, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0F,
+0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x05, 0x12, 0x9F, 0x65, 0x80, 0x03, 0x12, 0xBB, 0x2B, 0x31,
+0x8E, 0x64, 0x01, 0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x85, 0xCC, 0xF0, 0x90, 0x06, 0xAA,
+0xE0, 0x90, 0x85, 0xCB, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xFE, 0xFF,
+0x80, 0x00, 0x90, 0x85, 0xCC, 0xEF, 0xF0, 0x12, 0xCC, 0x91, 0xE4, 0x90, 0x85, 0xCE, 0xF0, 0x12,
+0xCF, 0x0C, 0x31, 0x76, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x5E, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03,
+0x20, 0xE0, 0x24, 0x31, 0x86, 0x6F, 0x70, 0x50, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x40, 0xF0, 0x12,
+0xD2, 0x22, 0x90, 0x01, 0x3F, 0x11, 0x70, 0x12, 0x7B, 0xFD, 0xF1, 0xB4, 0x12, 0xBF, 0xC8, 0x90,
+0x85, 0xCC, 0xE0, 0x14, 0xF0, 0x80, 0x31, 0x90, 0x85, 0xC3, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01,
+0x70, 0x26, 0x31, 0x86, 0xFE, 0x6F, 0x60, 0x20, 0x90, 0x05, 0x73, 0xE0, 0xFF, 0xEE, 0x6F, 0x60,
+0x17, 0x31, 0x76, 0x54, 0x3F, 0x30, 0xE0, 0x10, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x01, 0x3F, 0x11,
+0x70, 0x12, 0x7B, 0xBF, 0xF1, 0xC9, 0xF1, 0xBB, 0x31, 0x7E, 0x90, 0x85, 0xBC, 0xE0, 0xC3, 0x13,
+0x20, 0xE0, 0x02, 0x31, 0x7E, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0xFF, 0x13, 0x13, 0x22, 0x90, 0x85,
+0xC2, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x85, 0xCB, 0xE0, 0xFF, 0xA3, 0xE0, 0x22, 0x90, 0x85,
+0xC3, 0xE0, 0xFF, 0xC4, 0x54, 0x0F, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x85,
+0xBE, 0x74, 0x01, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x41, 0x4B, 0x90, 0x85, 0xDC, 0xE0,
+0x04, 0xF0, 0x90, 0x05, 0x61, 0x51, 0xB7, 0x78, 0x08, 0x12, 0x04, 0xD8, 0xA8, 0x04, 0xA9, 0x05,
+0xAA, 0x06, 0xAB, 0x07, 0x90, 0x05, 0x60, 0x51, 0xB7, 0x12, 0x87, 0x4B, 0xC0, 0x04, 0xC0, 0x05,
+0xC0, 0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x51, 0xB7, 0x78, 0x10, 0x12, 0x04, 0xD8, 0xD0, 0x03,
+0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x87, 0x4B, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0,
+0x07, 0xA3, 0x51, 0xB7, 0x78, 0x18, 0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0,
+0x00, 0x12, 0x87, 0x4B, 0x90, 0x85, 0xFC, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0xDC, 0xE0,
+0x54, 0xFE, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0A, 0x12, 0xCC, 0x81, 0x90, 0x92, 0xDC, 0xE0,
+0x54, 0xFD, 0xF0, 0x31, 0x76, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x3B, 0xE0, 0x30,
+0xE4, 0x02, 0xF1, 0xAD, 0x90, 0x93, 0x91, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94, 0x80, 0x40, 0x0B,
+0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x5D, 0x1F, 0x12, 0x6E,
+0x1D, 0xE4, 0x90, 0x88, 0xE0, 0xF0, 0x7F, 0x01, 0x12, 0xBA, 0x18, 0x12, 0xCF, 0x4A, 0x12, 0xB7,
+0xC6, 0x30, 0xE0, 0x52, 0x90, 0x88, 0x76, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7C, 0x00, 0x7D, 0x64,
+0x12, 0x03, 0x82, 0x90, 0x88, 0xCA, 0xE0, 0x6E, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x60, 0x0A, 0x90,
+0x88, 0xCA, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x07, 0x0A, 0x90, 0x88, 0x7A, 0xE0, 0xFE, 0xA3, 0xE0,
+0xFF, 0x90, 0x88, 0x88, 0xE0, 0xB5, 0x06, 0x14, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0xEF, 0x4E, 0x60,
+0x0B, 0x90, 0x01, 0xC7, 0x74, 0x31, 0xF0, 0x7F, 0x01, 0x02, 0x5F, 0xE9, 0x12, 0xC9, 0x40, 0xE4,
+0x90, 0x88, 0xCA, 0xF0, 0xA3, 0xF0, 0x22, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22, 0xFE, 0x54,
+0x03, 0xFF, 0xEE, 0x13, 0x13, 0x54, 0x07, 0xFD, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
+0x93, 0x8E, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0xEF, 0x14, 0x60, 0x02, 0x61, 0xB5, 0x90, 0x06, 0x03,
+0xE0, 0x54, 0xFB, 0xF0, 0x90, 0x93, 0x8E, 0xE0, 0xFB, 0xC4, 0x33, 0x54, 0xE0, 0xFE, 0x90, 0x04,
+0x42, 0xE0, 0x54, 0x9F, 0x4E, 0xFE, 0xF0, 0xE4, 0xFD, 0x12, 0xC7, 0xE2, 0x90, 0x93, 0x8F, 0xEF,
+0xF0, 0x90, 0x04, 0x83, 0xF0, 0x90, 0x93, 0x5B, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x01, 0x90,
+0x93, 0x5F, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x7E, 0x08, 0x91, 0x87, 0x12,
+0x04, 0xF7, 0x00, 0x00, 0x00, 0x01, 0x90, 0x93, 0x5F, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x01,
+0x7F, 0x00, 0x7E, 0x09, 0x91, 0x87, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x10, 0x90, 0x93, 0x8E,
+0x51, 0xB7, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x01, 0x12, 0x04, 0xC5, 0x78, 0x04, 0x91, 0x8D,
+0x7F, 0x00, 0x7E, 0x0A, 0x91, 0x87, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x93, 0x8E,
+0x51, 0xB7, 0xEF, 0x54, 0x03, 0xFF, 0xE4, 0x78, 0x0A, 0x91, 0x8D, 0x7F, 0x00, 0x7E, 0x0D, 0x91,
+0x87, 0x12, 0x04, 0xF7, 0x0C, 0x00, 0x00, 0x00, 0x90, 0x93, 0x8F, 0x51, 0xB7, 0xEF, 0x54, 0x03,
+0xFF, 0xE4, 0x78, 0x1A, 0x91, 0x8D, 0x7F, 0x18, 0x7E, 0x08, 0x91, 0x87, 0x12, 0x04, 0xF7, 0x00,
+0x00, 0x0C, 0x00, 0x90, 0x93, 0x5F, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x91, 0x1D, 0x90,
+0x93, 0x49, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x93, 0x4D, 0x12, 0x04, 0xF7, 0x00,
+0x00, 0x04, 0x00, 0x80, 0x5F, 0x90, 0x06, 0x03, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x93, 0x5B, 0x12,
+0x04, 0xF7, 0x00, 0x00, 0x00, 0x01, 0x90, 0x93, 0x5F, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x00,
+0x7F, 0x00, 0x7E, 0x08, 0x91, 0x87, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x01, 0x90, 0x93, 0x5F,
+0x12, 0x04, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x09, 0x91, 0x87, 0x12, 0x04, 0xF7,
+0x00, 0x00, 0x0C, 0x00, 0x90, 0x93, 0x5F, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x0C, 0x00, 0x91, 0x1D,
+0x90, 0x93, 0x49, 0x12, 0x04, 0xF7, 0x00, 0x00, 0x0C, 0x00, 0x90, 0x93, 0x4D, 0x12, 0x04, 0xF7,
+0x00, 0x00, 0x0C, 0x00, 0x7D, 0x18, 0x91, 0x9C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0x84, 0x7E,
+0x08, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x59, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x12, 0x70, 0x61, 0x90, 0x93, 0x63, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x5B, 0x12, 0x87, 0x58, 0x12,
+0x04, 0xA7, 0x90, 0x93, 0x63, 0x91, 0x96, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90,
+0x93, 0x5B, 0x12, 0x87, 0x58, 0x90, 0x93, 0x5F, 0x91, 0x96, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01,
+0xD0, 0x00, 0x12, 0x87, 0x4B, 0x90, 0x93, 0x67, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x67, 0x12, 0x87,
+0x58, 0x90, 0x91, 0x66, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x59, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12,
+0x71, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x91, 0x21, 0x90, 0x93, 0x5B, 0x22, 0x12, 0x04, 0xD8,
+0x90, 0x93, 0x5F, 0x02, 0x04, 0xEB, 0x12, 0x87, 0x64, 0x02, 0x87, 0x3E, 0x7C, 0x00, 0xE4, 0xFF,
+0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x47, 0xEC, 0xF0, 0xA3, 0xED, 0xF0, 0x90,
+0x93, 0x46, 0xEF, 0xF0, 0xA3, 0xA3, 0xE0, 0xFD, 0x12, 0x7B, 0xE0, 0x90, 0x93, 0x51, 0x12, 0x04,
+0xEB, 0x90, 0x93, 0x49, 0x12, 0x87, 0x58, 0x12, 0x04, 0xA7, 0x90, 0x93, 0x51, 0x91, 0x96, 0xC0,
+0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x93, 0x49, 0x12, 0x87, 0x58, 0x90, 0x93, 0x4D,
+0x91, 0x96, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x87, 0x4B, 0x90, 0x93, 0x55,
+0x12, 0x04, 0xEB, 0x90, 0x93, 0x47, 0xA3, 0xE0, 0xFD, 0xC0, 0x05, 0x90, 0x93, 0x55, 0x12, 0x87,
+0x58, 0x90, 0x8D, 0x9D, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x46, 0xE0, 0xFF, 0xD0, 0x05, 0x12, 0x78,
+0xDD, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x7A,
+0xEF, 0xF0, 0xED, 0x64, 0x01, 0x70, 0x31, 0xEB, 0xB4, 0x01, 0x07, 0xE0, 0x24, 0x02, 0xF5, 0x0E,
+0x80, 0x08, 0x90, 0x93, 0x7A, 0xE0, 0x24, 0xFE, 0xF5, 0x0E, 0x90, 0x93, 0x49, 0x12, 0x04, 0xF7,
+0x00, 0x00, 0x00, 0xFF, 0xAF, 0x0E, 0xB1, 0x87, 0x91, 0x9C, 0x90, 0x93, 0x49, 0x12, 0x04, 0xF7,
+0x00, 0x00, 0x00, 0xFF, 0xAF, 0x0E, 0x80, 0x22, 0x90, 0x93, 0x49, 0x12, 0x04, 0xF7, 0x00, 0x00,
+0x00, 0xFF, 0x90, 0x93, 0x7A, 0x51, 0xB7, 0xB1, 0x8B, 0x91, 0x9C, 0x90, 0x93, 0x49, 0x12, 0x04,
+0xF7, 0x00, 0x00, 0x00, 0xFF, 0x90, 0x93, 0x7A, 0xE0, 0xFF, 0xB1, 0x87, 0x7C, 0x00, 0x7F, 0x01,
+0x91, 0xA0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFC, 0xFD, 0xFE, 0x90, 0x93, 0x4D, 0x12, 0x04,
+0xEB, 0x7D, 0x18, 0x22, 0x90, 0x92, 0xA2, 0xE0, 0xFF, 0xC3, 0x13, 0xFE, 0xEF, 0x54, 0xF1, 0xFF,
+0xEE, 0x04, 0x54, 0x07, 0x25, 0xE0, 0x4F, 0xF0, 0xA3, 0xE0, 0xFF, 0x12, 0xD1, 0xF5, 0xB5, 0x07,
+0x04, 0xEE, 0x54, 0xF1, 0xF0, 0x12, 0x9E, 0xCD, 0xE4, 0x90, 0x92, 0xA4, 0xF0, 0xF1, 0x4F, 0x12,
+0xD1, 0xF5, 0xF1, 0xEB, 0xE0, 0xFA, 0xED, 0xD1, 0xE3, 0xFC, 0x54, 0x03, 0xFD, 0xEC, 0x13, 0x13,
+0x54, 0x07, 0xFB, 0xEE, 0xC4, 0xF1, 0xC2, 0xAF, 0x02, 0xB1, 0x16, 0xD1, 0xA9, 0xD1, 0xE3, 0x51,
+0xBE, 0xD1, 0xA9, 0xFF, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0xB0, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5,
+0x83, 0xE0, 0x04, 0xF0, 0x12, 0xBC, 0x8D, 0xD1, 0xF2, 0xD1, 0xA9, 0xFD, 0x7F, 0x01, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x72, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0,
+0x90, 0x93, 0x74, 0xE0, 0xFF, 0xC3, 0x94, 0x03, 0x40, 0x02, 0xC1, 0xA4, 0x90, 0x93, 0x73, 0xE0,
+0xFE, 0x12, 0xD1, 0x13, 0x75, 0xF0, 0x03, 0xEF, 0x12, 0xD1, 0xA3, 0xE0, 0x90, 0x93, 0x75, 0xF0,
+0x90, 0x93, 0x72, 0xE0, 0xFC, 0xB4, 0x02, 0x23, 0x90, 0x93, 0x75, 0xE0, 0xFD, 0xEE, 0x12, 0xD1,
+0x07, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0x93, 0x74, 0xE0, 0xD0, 0x82, 0xD0, 0x83, 0x12,
+0xB1, 0x0A, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x4D, 0x80, 0x23, 0xEC, 0xB4, 0x01, 0x23, 0x12,
+0xD1, 0xFF, 0x12, 0xD1, 0x07, 0xF5, 0x83, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0x93, 0x74, 0xE0, 0xD0,
+0x82, 0xD0, 0x83, 0x12, 0xB1, 0x0A, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x93,
+0x75, 0xF0, 0x12, 0xD1, 0xFF, 0x12, 0xD1, 0x13, 0xC0, 0x83, 0xC0, 0x82, 0x90, 0x93, 0x74, 0xE0,
+0xD0, 0x82, 0xD0, 0x83, 0x75, 0xF0, 0x03, 0x12, 0xD1, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x74, 0xE0,
+0x04, 0xF0, 0xC1, 0x10, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x92, 0xA2, 0xE0, 0xC3, 0x13, 0x54,
+0x07, 0x22, 0x8F, 0x5E, 0x7D, 0x17, 0xF1, 0x4B, 0xE5, 0x5E, 0xF1, 0xEC, 0xE0, 0xFC, 0xD1, 0xE1,
+0x12, 0xD1, 0xEB, 0xFB, 0x90, 0x92, 0xA2, 0xE0, 0xFE, 0xC4, 0xF1, 0xC2, 0xAF, 0x04, 0xB1, 0x16,
+0xD1, 0xE1, 0x51, 0xBE, 0xE5, 0x5E, 0x12, 0xBC, 0x8E, 0xD1, 0xF2, 0xAD, 0x5E, 0x7F, 0x01, 0xA1,
+0xFE, 0xE5, 0x5E, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0xA6, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83,
+0xE0, 0x22, 0xFD, 0xF1, 0x03, 0xE4, 0xFD, 0xFF, 0x90, 0x05, 0x22, 0xEF, 0xF0, 0x90, 0x92, 0x99,
+0xED, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x6B, 0x12, 0xB7, 0xDE,
+0xA3, 0xEB, 0xF0, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x25, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0x71,
+0xF0, 0x7D, 0x14, 0xF1, 0x4B, 0xEF, 0x64, 0x01, 0x70, 0x05, 0x12, 0xD0, 0x82, 0x80, 0x04, 0x7F,
+0x00, 0x80, 0x13, 0x90, 0x93, 0x71, 0xE0, 0xFF, 0x7D, 0x15, 0xD1, 0xF8, 0x80, 0x03, 0x12, 0xD0,
+0x82, 0x12, 0xC9, 0x39, 0x7F, 0x01, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7F, 0xFF, 0xD1, 0xF8, 0xE4,
+0x90, 0x93, 0x7E, 0xF0, 0xA3, 0xF0, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0x80, 0xF0, 0x7D, 0x47,
+0x7F, 0xFF, 0xD1, 0xF8, 0x90, 0x05, 0xF8, 0xE0, 0x70, 0x13, 0xA3, 0xE0, 0x70, 0x0F, 0xA3, 0xE0,
+0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07, 0xF1, 0xD6, 0xD1, 0xF8, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x93,
+0x7F, 0xE0, 0x94, 0xE8, 0x90, 0x93, 0x7E, 0xE0, 0x94, 0x03, 0x40, 0x0E, 0x90, 0x01, 0xC0, 0xE0,
+0x44, 0x20, 0xF0, 0xF1, 0xD6, 0xD1, 0xF8, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x7C,
+0x9F, 0x90, 0x93, 0x7E, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x80, 0xB7, 0x7D, 0x02, 0x7F,
+0x02, 0x12, 0x7C, 0x41, 0x7D, 0x01, 0x7F, 0x02, 0x02, 0x7C, 0x41, 0x7D, 0x02, 0x7F, 0x02, 0x02,
+0x7C, 0xA9, 0x54, 0x0F, 0x90, 0x93, 0x7D, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x02, 0x02, 0x7C, 0xA9,
+0x7F, 0x6F, 0xD1, 0xF8, 0xE1, 0x4F, 0x90, 0x93, 0x80, 0xE0, 0xFF, 0x7D, 0x48, 0x22, 0x7D, 0x21,
+0x7F, 0xFF, 0xD1, 0xF8, 0x90, 0x85, 0xBF, 0x74, 0x03, 0xF0, 0x22, 0xFD, 0x75, 0xF0, 0x0E, 0xA4,
+0x24, 0xA5, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x92,
+0xCF, 0xF0, 0xBF, 0x01, 0x09, 0x7F, 0x01, 0x11, 0x0F, 0xE4, 0x90, 0x92, 0xCF, 0xF0, 0x22, 0x90,
+0x92, 0x29, 0xEF, 0xF0, 0x31, 0xA3, 0x7F, 0xF4, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08,
+0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x3B, 0xF0, 0x31, 0xA3, 0x7F, 0xF5, 0x7E, 0x00, 0x12, 0x64,
+0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x3C, 0xF0, 0x31, 0xA3, 0x7F, 0xF6,
+0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x3D, 0xF0,
+0x31, 0xA3, 0x7F, 0xF7, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x39, 0xE0,
+0x90, 0x92, 0x3E, 0xF0, 0x31, 0xA3, 0x7F, 0xF8, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08,
+0x90, 0x92, 0x39, 0xE0, 0x90, 0x92, 0x3F, 0xF0, 0x31, 0xA3, 0x51, 0x43, 0xBF, 0x01, 0x08, 0x90,
+0x92, 0x39, 0xE0, 0x90, 0x92, 0x40, 0xF0, 0x31, 0xA3, 0x31, 0xAA, 0x70, 0x52, 0x90, 0x92, 0x39,
+0xE0, 0x90, 0x92, 0x41, 0xF0, 0x54, 0x07, 0x60, 0x08, 0x90, 0x92, 0x39, 0xE0, 0x54, 0xE0, 0x70,
+0x3E, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x3A, 0x7F, 0xFA, 0x31, 0xAC, 0x70, 0x32, 0x90, 0x92, 0x39,
+0xE0, 0xFC, 0x54, 0x07, 0x70, 0x12, 0x90, 0x92, 0x41, 0xE0, 0xFE, 0x90, 0x92, 0x3A, 0xE0, 0x54,
+0x07, 0xFD, 0xEE, 0x4D, 0x90, 0x92, 0x41, 0xF0, 0xEC, 0x54, 0xE0, 0x70, 0x12, 0x90, 0x92, 0x41,
+0xE0, 0xFF, 0x90, 0x92, 0x3A, 0xE0, 0x54, 0xE0, 0xFE, 0xEF, 0x4E, 0x90, 0x92, 0x41, 0xF0, 0x31,
+0xA3, 0x7F, 0xFD, 0x31, 0xAC, 0x70, 0x46, 0x90, 0x92, 0x39, 0xE0, 0xFE, 0x54, 0xCC, 0x90, 0x92,
+0x42, 0xF0, 0xEE, 0x54, 0x0C, 0xFF, 0x60, 0x08, 0x90, 0x92, 0x39, 0xE0, 0x54, 0xC0, 0x70, 0x2D,
+0xEF, 0x70, 0x11, 0x90, 0x92, 0x42, 0xE0, 0xFF, 0x90, 0x92, 0x39, 0xE0, 0x54, 0x03, 0xF1, 0xD2,
+0x90, 0x92, 0x42, 0xF0, 0x90, 0x92, 0x39, 0xE0, 0xFF, 0x54, 0xC0, 0x70, 0x10, 0x90, 0x92, 0x42,
+0xE0, 0xFE, 0xEF, 0x54, 0x30, 0x25, 0xE0, 0x25, 0xE0, 0xFF, 0xEE, 0x4F, 0xF0, 0x90, 0x92, 0x2A,
+0x74, 0x19, 0xF0, 0x90, 0x92, 0x38, 0x74, 0x08, 0xF0, 0x90, 0x92, 0x3B, 0xE0, 0x90, 0x92, 0x2C,
+0xF0, 0x90, 0x92, 0x3C, 0xE0, 0x90, 0x92, 0x2D, 0xF0, 0x90, 0x92, 0x3D, 0xE0, 0x90, 0x92, 0x2E,
+0xF0, 0x90, 0x92, 0x3E, 0xE0, 0x90, 0x92, 0x2F, 0xF0, 0x90, 0x92, 0x3F, 0xE0, 0x90, 0x92, 0x30,
+0xF0, 0x90, 0x92, 0x40, 0xE0, 0x90, 0x92, 0x31, 0xF0, 0x90, 0x92, 0x41, 0xE0, 0x90, 0x92, 0x32,
+0xF0, 0x90, 0x92, 0x42, 0xE0, 0x90, 0x92, 0x33, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0xB4, 0x01, 0x0E,
+0x7B, 0x01, 0x7A, 0x92, 0x79, 0x2A, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB, 0x75, 0x1B,
+0x01, 0x75, 0x1C, 0x92, 0x75, 0x1D, 0x2A, 0x75, 0x1E, 0x0A, 0x7B, 0x01, 0x7A, 0x01, 0x79, 0xA0,
+0x02, 0x6A, 0x21, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x39, 0x22, 0x7F, 0xFB, 0x7E, 0x00, 0x12, 0x64,
+0x37, 0xEF, 0x64, 0x01, 0x22, 0x7E, 0x00, 0x7F, 0x0B, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x92, 0x79,
+0xD0, 0x12, 0x06, 0xDE, 0x51, 0x3C, 0x51, 0x43, 0xBF, 0x01, 0x1C, 0x90, 0x92, 0x29, 0xE0, 0xFE,
+0x54, 0x01, 0x90, 0x92, 0xD0, 0xF0, 0xEE, 0x54, 0x04, 0x90, 0x92, 0xD2, 0xF0, 0x90, 0x92, 0x29,
+0xE0, 0x54, 0x08, 0x90, 0x92, 0xD1, 0xF0, 0x51, 0x3C, 0x31, 0xAA, 0x70, 0x34, 0x90, 0x92, 0x29,
+0xE0, 0x54, 0x07, 0x70, 0x14, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x2A, 0x7F, 0xFA, 0xFE, 0x12, 0x64,
+0x37, 0xBF, 0x01, 0x0F, 0x90, 0x92, 0x2A, 0x80, 0x03, 0x90, 0x92, 0x29, 0xE0, 0x54, 0x07, 0x90,
+0x92, 0xD4, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0x54, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0x92, 0xD3,
+0xF0, 0x51, 0x3C, 0x7F, 0xFD, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x0E, 0x90, 0x92, 0x29,
+0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x92, 0xD5, 0xF0, 0x22, 0x7B, 0x01, 0x7A, 0x92,
+0x79, 0x29, 0x22, 0x7F, 0xF9, 0x7E, 0x00, 0x02, 0x64, 0x37, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80,
+0xFD, 0x7F, 0x80, 0x12, 0x7B, 0x3E, 0x12, 0xC4, 0x0C, 0x12, 0xC6, 0xAC, 0x12, 0x7B, 0x9C, 0x51,
+0xD5, 0x12, 0xBF, 0xDE, 0x7F, 0x01, 0x12, 0x85, 0x15, 0x90, 0x92, 0xA0, 0x74, 0x02, 0xF0, 0xFF,
+0x12, 0x85, 0x15, 0x90, 0x92, 0xA0, 0xE0, 0x04, 0xF0, 0x91, 0x06, 0x51, 0xF2, 0x90, 0x01, 0xCC,
+0x74, 0x0F, 0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x7B, 0x3E, 0x75,
+0x20, 0xFF, 0x12, 0x7C, 0xCD, 0xE4, 0xFF, 0x11, 0x0F, 0x91, 0x6C, 0x90, 0x00, 0x81, 0xE0, 0x44,
+0x04, 0xFD, 0x7F, 0x81, 0x12, 0x7B, 0x3E, 0x12, 0xC0, 0x30, 0x31, 0xB5, 0x90, 0x00, 0x00, 0xE0,
+0x54, 0xFB, 0xFD, 0xE4, 0xFF, 0xF1, 0xDA, 0x44, 0x04, 0xFD, 0x7F, 0x01, 0x12, 0x7B, 0x3E, 0x90,
+0x01, 0x98, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x88, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0,
+0xE4, 0xFF, 0x02, 0x85, 0x9E, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0,
+0x54, 0xC0, 0x91, 0xD3, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80,
+0xF0, 0x22, 0xF1, 0x86, 0x12, 0x7B, 0xEF, 0x12, 0x3C, 0x03, 0x12, 0xC6, 0x1B, 0x12, 0xC8, 0x53,
+0x12, 0xCB, 0x62, 0x71, 0xE0, 0x71, 0x2D, 0x12, 0x7B, 0x64, 0x12, 0x78, 0xB9, 0x12, 0xC6, 0x9D,
+0x90, 0x89, 0x16, 0xE0, 0x54, 0x7F, 0xF0, 0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0,
+0xE4, 0x90, 0x89, 0x18, 0xF0, 0x90, 0x89, 0x16, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x7E, 0x00, 0x7F,
+0x24, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x86, 0x79, 0x72, 0x12, 0x06, 0xDE, 0x90, 0x06, 0x90, 0xE0,
+0x44, 0x20, 0xF0, 0x12, 0xCF, 0xAE, 0x71, 0xE6, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0x64, 0x02, 0x70,
+0x29, 0x71, 0xD9, 0x30, 0xE0, 0x02, 0x7E, 0x01, 0x90, 0x86, 0x90, 0x71, 0xD7, 0x30, 0xE1, 0x02,
+0x7E, 0x01, 0x90, 0x86, 0x8E, 0x71, 0xD7, 0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x86, 0x8F, 0xEE,
+0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02, 0xFB, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0x71,
+0xD0, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x90, 0x71, 0xCE, 0x30, 0xE1, 0x02, 0x7F, 0x01,
+0x90, 0x86, 0x8E, 0x71, 0xCE, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x84, 0xC5, 0xE0,
+0x64, 0x03, 0x70, 0x20, 0x71, 0xC7, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x90, 0x71, 0xC5,
+0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x8E, 0x71, 0xC5, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90,
+0x86, 0x8F, 0xEF, 0xF0, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x22, 0xEF, 0xF0,
+0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x22,
+0x12, 0xCC, 0x2F, 0x02, 0x06, 0xDE, 0xF1, 0xCA, 0xE4, 0x90, 0x88, 0xD8, 0x12, 0x95, 0xBE, 0x90,
+0x88, 0x76, 0xF0, 0x12, 0x95, 0xB9, 0x12, 0x95, 0xBF, 0x90, 0x88, 0x88, 0xF0, 0xA3, 0xF0, 0x90,
+0x88, 0xCA, 0xF0, 0xA3, 0xF0, 0x22, 0x12, 0x7C, 0x4E, 0x90, 0x84, 0xC5, 0xEF, 0xF0, 0x91, 0x3A,
+0x90, 0x01, 0x64, 0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x00, 0x17,
+0xE0, 0x54, 0xFC, 0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x7B, 0x3E, 0x90, 0x00, 0x38, 0xE0, 0x44,
+0x40, 0xFD, 0x7F, 0x38, 0x12, 0x7B, 0x3E, 0x02, 0x68, 0xE2, 0x12, 0x75, 0xB6, 0x12, 0x75, 0x58,
+0x12, 0xBF, 0xEA, 0x12, 0xC0, 0x11, 0xE4, 0xF5, 0x40, 0xF5, 0x41, 0xF5, 0x42, 0x75, 0x43, 0x80,
+0xAD, 0x40, 0x7F, 0x50, 0x12, 0x7B, 0x3E, 0xAD, 0x41, 0x7F, 0x51, 0x12, 0x7B, 0x3E, 0xAD, 0x42,
+0x7F, 0x52, 0x12, 0x7B, 0x3E, 0xAD, 0x43, 0x7F, 0x53, 0x02, 0x7B, 0x3E, 0xE4, 0x90, 0x92, 0x29,
+0xF0, 0xA3, 0xF0, 0x91, 0xBB, 0xEF, 0x64, 0x01, 0x60, 0x3A, 0xC3, 0x90, 0x92, 0x2A, 0xE0, 0x94,
+0x88, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10, 0xF0,
+0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x1C, 0x90, 0x92, 0x29, 0x12, 0xC2, 0xCD, 0xD3, 0x90,
+0x92, 0x2A, 0xE0, 0x94, 0x32, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x00, 0x40, 0xC6, 0x90, 0x01, 0xC6,
+0xE0, 0x30, 0xE3, 0xBF, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54,
+0xC0, 0x44, 0x0B, 0x91, 0xD3, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02,
+0x7F, 0x01, 0x22, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0xEF, 0x60, 0x4B, 0x90, 0x88,
+0xCE, 0xE0, 0xFF, 0x60, 0x03, 0x12, 0x7B, 0x8A, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0xF1, 0x5B, 0xEC,
+0x3E, 0x90, 0x85, 0xB7, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x7D,
+0x35, 0x7F, 0xFF, 0x12, 0xA6, 0xF8, 0x12, 0xC5, 0x61, 0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0,
+0x12, 0x72, 0x79, 0xB1, 0xF2, 0x12, 0xC2, 0xFA, 0xF1, 0x8C, 0x12, 0x76, 0xE6, 0x90, 0x01, 0x34,
+0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x02, 0x7C, 0xA9, 0x7D, 0x08, 0xE4, 0xFF, 0x12, 0x7C, 0x41,
+0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x02, 0x86, 0xE0, 0x54, 0xFB, 0xF0, 0x12, 0xCF,
+0xC1, 0xB1, 0xF3, 0x61, 0x2D, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xF1, 0x9A, 0x90, 0x86,
+0x72, 0xB1, 0xD6, 0x54, 0x04, 0xFD, 0xEF, 0x54, 0xFB, 0xB1, 0xCE, 0xF1, 0xA2, 0xB1, 0xE4, 0x54,
+0x10, 0xFD, 0xEF, 0x54, 0xEF, 0xB1, 0xCE, 0xF1, 0xAA, 0xB1, 0xE4, 0x54, 0x40, 0xFD, 0xEF, 0x54,
+0xBF, 0xB1, 0xCE, 0xF1, 0xB2, 0x12, 0x8C, 0x79, 0x54, 0x01, 0xFF, 0x90, 0x86, 0x74, 0xE0, 0x54,
+0xFE, 0x4F, 0xF0, 0x12, 0x8D, 0x96, 0xFF, 0x54, 0x01, 0xFE, 0x90, 0x86, 0x73, 0xF1, 0x92, 0x54,
0x04, 0xFF, 0xEE, 0x54, 0xFB, 0x4F, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0xC3, 0x13, 0x54, 0x01, 0xFF,
-0x12, 0x7C, 0x72, 0xF1, 0xDF, 0x54, 0x01, 0xFF, 0x12, 0x7C, 0x7E, 0xF1, 0xDF, 0x13, 0x54, 0x01,
-0xFF, 0x12, 0x66, 0xDA, 0x90, 0x86, 0x72, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0x12, 0xC0,
-0xF8, 0x90, 0x86, 0x72, 0xE0, 0x54, 0x01, 0xFF, 0x12, 0xB5, 0xF2, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0,
-0x12, 0x02, 0xF6, 0xFE, 0x22, 0x8F, 0x6E, 0x8D, 0x6F, 0xEF, 0xF1, 0x5E, 0xE0, 0xF5, 0x70, 0x54,
-0x7F, 0xF5, 0x71, 0xE5, 0x70, 0x54, 0x80, 0xF5, 0x73, 0x75, 0xF0, 0x12, 0xEF, 0x12, 0xAF, 0xD8,
-0xF5, 0x75, 0x75, 0xF0, 0x12, 0xEF, 0x71, 0x0B, 0xC4, 0x54, 0x03, 0xF5, 0x76, 0xF1, 0xCC, 0x74,
-0xFF, 0xF0, 0x12, 0xAA, 0xF2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x70, 0x45, 0x73, 0xFF, 0x12,
-0xAA, 0xE6, 0xEF, 0xF0, 0xE5, 0x6E, 0x12, 0x91, 0xDB, 0xE0, 0x54, 0x03, 0xF5, 0x74, 0x74, 0x4C,
-0x25, 0x6E, 0x12, 0xAF, 0xC4, 0xE5, 0x74, 0xF0, 0xE5, 0x71, 0x65, 0x75, 0x70, 0x40, 0xB1, 0x68,
-0xC4, 0x13, 0x54, 0x07, 0x30, 0xE0, 0x0C, 0xE5, 0x73, 0x70, 0x08, 0xE5, 0x71, 0x44, 0x80, 0xF5,
-0x70, 0xE1, 0x12, 0x12, 0xAA, 0xF2, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0xAB, 0x06, 0x12, 0xC8,
-0x95, 0xF1, 0xC1, 0xE5, 0x6E, 0xF0, 0xE4, 0x90, 0x92, 0x43, 0x12, 0x96, 0x40, 0x7B, 0x01, 0xFA,
-0x7D, 0x02, 0x7F, 0x04, 0x12, 0x96, 0x88, 0x7D, 0x07, 0xAF, 0x6E, 0x02, 0xBD, 0xF3, 0xE5, 0x71,
-0xC3, 0x95, 0x75, 0x50, 0x55, 0xAB, 0x6E, 0xAD, 0x75, 0xAF, 0x71, 0x12, 0x72, 0xEA, 0x8F, 0x72,
-0x85, 0x72, 0x70, 0xB1, 0x68, 0xC4, 0x13, 0x54, 0x01, 0xFF, 0x90, 0x92, 0x43, 0xF1, 0xC0, 0xE5,
-0x72, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x71, 0xF0, 0xE5, 0x73, 0xB1, 0x59, 0x12, 0x97, 0xD3,
-0xE4, 0xFB, 0xFA, 0xF1, 0xF4, 0xE5, 0x71, 0xC3, 0x94, 0x0C, 0x40, 0x26, 0xB1, 0x68, 0xC4, 0x13,
-0x54, 0x07, 0x30, 0xE0, 0x1D, 0xE5, 0x6F, 0x60, 0x19, 0xE5, 0x73, 0x70, 0x15, 0xE5, 0x71, 0x44,
-0x80, 0xF5, 0x70, 0xF1, 0xCC, 0xE5, 0x72, 0xF0, 0x80, 0x08, 0x12, 0xAA, 0xE6, 0xE5, 0x75, 0xF0,
-0xF5, 0x70, 0xF1, 0xC5, 0xE5, 0x70, 0xF0, 0xF1, 0xCC, 0xE0, 0xFF, 0x12, 0xC8, 0x73, 0xEF, 0xF0,
-0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x74, 0x12, 0xAF, 0xBC, 0xF0, 0x7B, 0x01, 0x7A, 0x00, 0xF1, 0xF4,
-0x90, 0x91, 0x0B, 0xE5, 0x74, 0xF0, 0xAB, 0x6F, 0xAD, 0x70, 0xAF, 0x6E, 0x02, 0x27, 0x3D, 0x4D,
-0xFF, 0x90, 0x86, 0x72, 0xF0, 0xEE, 0x22, 0x4D, 0xFF, 0x90, 0x86, 0x75, 0xF0, 0xEE, 0x22, 0x74,
-0xBC, 0x25, 0x78, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE4, 0xF0, 0xE5, 0x78, 0xC4, 0x54,
-0xF0, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x7F, 0x8F, 0x12, 0x7B, 0x51,
-0xEF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x19, 0xEF, 0xF0, 0xF1, 0x6B,
-0x30, 0xE6, 0x38, 0x7F, 0x8D, 0x12, 0x7B, 0x51, 0xEF, 0x64, 0x01, 0x70, 0x2E, 0x90, 0x93, 0x1A,
-0xF0, 0x90, 0x93, 0x1A, 0xE0, 0xFD, 0x90, 0x93, 0x19, 0xE0, 0xF1, 0x5E, 0xE5, 0x82, 0x2D, 0x12,
-0xA8, 0x53, 0xE0, 0xFB, 0xE4, 0xFF, 0x91, 0x39, 0x90, 0x93, 0x1A, 0xE0, 0x04, 0xF0, 0xE0, 0xC3,
-0x94, 0x10, 0x40, 0xDD, 0xF1, 0x6B, 0x30, 0xE0, 0x02, 0xF1, 0xE6, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
-0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x3F, 0xE4, 0xF0, 0xA3, 0x22, 0x74, 0xCC, 0x25, 0x6E,
-0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xF0, 0x90, 0x00, 0x03, 0x02, 0x03, 0x0F, 0x90,
-0x86, 0x72, 0xE0, 0x13, 0x13, 0x22, 0xE4, 0xFD, 0x7F, 0x8D, 0x02, 0x7B, 0x3E, 0xF9, 0xE4, 0x3A,
-0xFA, 0x02, 0x02, 0xF6, 0x7D, 0x05, 0x7F, 0x04, 0x02, 0x96, 0x88, 0xE0, 0x54, 0xFE, 0x4E, 0xFE,
-0xF0, 0xEF, 0x22, 0x8B, 0x5B, 0x8A, 0x5C, 0x89, 0x5D, 0x90, 0x92, 0x7F, 0xE0, 0x70, 0x0C, 0x12,
-0xC8, 0xB6, 0x30, 0xE0, 0x06, 0x90, 0x92, 0x85, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x81, 0xE0, 0x70,
-0x0F, 0x31, 0xC4, 0xC4, 0x54, 0x0F, 0xFF, 0xBF, 0x05, 0x06, 0x90, 0x92, 0x86, 0x74, 0x01, 0xF0,
-0xAB, 0x5B, 0xAA, 0x5C, 0xA9, 0x5D, 0x12, 0x8D, 0x62, 0xFF, 0xF5, 0x5F, 0x12, 0x02, 0xF6, 0xFE,
-0xC3, 0x13, 0x30, 0xE0, 0x07, 0x12, 0x8C, 0x6F, 0xF5, 0x60, 0x80, 0x02, 0x8F, 0x60, 0x85, 0x5F,
-0x5E, 0xE5, 0x5E, 0xD3, 0x95, 0x60, 0x50, 0x28, 0x31, 0xC4, 0x54, 0x01, 0xFD, 0xAF, 0x5E, 0x12,
-0x6E, 0x5F, 0xAF, 0x5E, 0x12, 0x77, 0x39, 0xEF, 0xAF, 0x5E, 0x70, 0x04, 0x11, 0x9B, 0x80, 0x02,
-0xF1, 0xE9, 0x90, 0x92, 0x86, 0xE0, 0x60, 0x04, 0xAF, 0x5E, 0x11, 0x9B, 0x05, 0x5E, 0x80, 0xD1,
-0xE5, 0x5F, 0x70, 0x16, 0xFF, 0x12, 0x77, 0x39, 0xEF, 0x70, 0x0F, 0x12, 0xB3, 0xEE, 0x12, 0x79,
-0x61, 0x12, 0xC8, 0xCE, 0x54, 0xBF, 0xF0, 0x54, 0x7F, 0xF0, 0x22, 0x7D, 0x01, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x07, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x7D, 0x44, 0x7F, 0x6F,
-0x11, 0xDE, 0x11, 0xE9, 0x90, 0x92, 0x08, 0xE0, 0x90, 0x92, 0x07, 0xB4, 0x01, 0x09, 0xE0, 0x31,
-0xDB, 0xE0, 0x44, 0x04, 0xF0, 0x80, 0x07, 0xE0, 0x31, 0xDB, 0xE0, 0x54, 0xFB, 0xF0, 0xE4, 0xFD,
-0xFF, 0x11, 0xDE, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0xB3, 0xEE, 0xE4, 0xFD, 0xFF, 0x90, 0x05,
-0x22, 0xEF, 0xF0, 0x90, 0x92, 0x76, 0xED, 0xF0, 0x22, 0xE4, 0x90, 0x93, 0x0B, 0xF0, 0xA3, 0xF0,
-0x90, 0x05, 0x22, 0xE0, 0x90, 0x93, 0x0D, 0xF0, 0x7D, 0x47, 0x7F, 0xFF, 0x11, 0xDE, 0x90, 0x05,
-0xF8, 0xE0, 0x70, 0x13, 0xA3, 0xE0, 0x70, 0x0F, 0xA3, 0xE0, 0x70, 0x0B, 0xA3, 0xE0, 0x70, 0x07,
-0x31, 0xBC, 0x11, 0xDE, 0x7F, 0x01, 0x22, 0xD3, 0x90, 0x93, 0x0C, 0xE0, 0x94, 0xE8, 0x90, 0x93,
-0x0B, 0xE0, 0x94, 0x03, 0x40, 0x0E, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x20, 0xF0, 0x31, 0xBC, 0x11,
-0xDE, 0x7F, 0x00, 0x22, 0x7F, 0x32, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90, 0x93, 0x0B, 0xE4, 0x75,
-0xF0, 0x01, 0x12, 0x07, 0x0A, 0x80, 0xB7, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92,
-0x6B, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x84, 0xC3, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D, 0xE0,
-0x60, 0x2D, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x92, 0x6F, 0xF0, 0x7D, 0x26, 0x7F, 0xFF, 0x11, 0xDE,
-0x11, 0xE9, 0xEF, 0x64, 0x01, 0x70, 0x0B, 0x31, 0xCD, 0xFB, 0x7D, 0x01, 0x12, 0x3A, 0xC2, 0x12,
-0xC7, 0xF1, 0x90, 0x92, 0x6F, 0xE0, 0xFF, 0x7D, 0x27, 0x11, 0xDE, 0x31, 0xB4, 0x80, 0x13, 0x31,
-0xB4, 0x31, 0xCD, 0xFB, 0x90, 0x93, 0x0A, 0x74, 0x0A, 0xF0, 0x7D, 0x01, 0x12, 0xBF, 0x72, 0x12,
-0xC7, 0xF1, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x12, 0xC6, 0x77, 0x74, 0x01, 0xF0, 0xFF, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x90, 0x92, 0x6B, 0xE0, 0xFF, 0x02, 0x5C, 0xA3, 0x90, 0x93, 0x0D, 0xE0,
-0xFF, 0x7D, 0x48, 0x22, 0xAB, 0x5B, 0xAA, 0x5C, 0xA9, 0x5D, 0x02, 0x02, 0xF6, 0x90, 0x84, 0xC8,
-0xE0, 0xFF, 0x90, 0x92, 0x6C, 0xE0, 0x22, 0xE0, 0xFD, 0xE5, 0x78, 0xC4, 0x54, 0xF0, 0x24, 0x05,
-0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x90, 0x04, 0x85, 0xE0, 0xF5, 0x6B, 0x90, 0x92,
-0xCB, 0xE0, 0x04, 0xF0, 0xE4, 0xF5, 0x62, 0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE5, 0x62, 0xC3, 0x9F,
-0x40, 0x02, 0xC1, 0x2C, 0xE5, 0x62, 0x12, 0x8F, 0x5E, 0xE0, 0xF5, 0x6D, 0x12, 0xC8, 0x67, 0xE0,
-0x65, 0x6D, 0x60, 0x16, 0x90, 0x8A, 0x71, 0xE5, 0x6D, 0xF0, 0xE4, 0xA3, 0xF0, 0xAB, 0x62, 0xFD,
-0xFF, 0x12, 0x52, 0xC3, 0x12, 0xC8, 0x67, 0xE5, 0x6D, 0xF0, 0x90, 0x04, 0xA0, 0xE0, 0x64, 0x01,
-0x70, 0x4E, 0xA3, 0xE0, 0x65, 0x62, 0x70, 0x48, 0xA3, 0xE0, 0xF5, 0x63, 0xA3, 0xE0, 0x90, 0x92,
-0x38, 0xF0, 0xE5, 0x62, 0x12, 0x8F, 0x5E, 0xE0, 0x65, 0x63, 0x70, 0x02, 0xC1, 0x28, 0xE5, 0x62,
-0x12, 0x8F, 0x5E, 0xE5, 0x63, 0xF0, 0xE5, 0x62, 0x31, 0xDB, 0xE0, 0x54, 0xFC, 0xFF, 0x90, 0x92,
-0x38, 0xE0, 0x54, 0x03, 0x4F, 0xFF, 0xE5, 0x62, 0x31, 0xDB, 0xEF, 0xF0, 0x90, 0x8A, 0x71, 0xE5,
-0x63, 0xF0, 0xA3, 0x74, 0xFF, 0xF0, 0xAB, 0x62, 0xE4, 0xFD, 0xFF, 0x12, 0x52, 0xC3, 0xC1, 0x28,
-0xAF, 0x62, 0x12, 0x77, 0x39, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0x8B, 0x0B, 0x12, 0x8D, 0x59,
-0xFD, 0xF1, 0xB4, 0xED, 0xF0, 0x90, 0x92, 0x41, 0x12, 0x8F, 0xC0, 0xE5, 0x62, 0xF0, 0x12, 0xA9,
-0x84, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x5C, 0xFE, 0xEF,
-0x5D, 0xFF, 0x90, 0x92, 0x45, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x7B, 0x02, 0x7A, 0x00, 0xE4, 0xFD,
-0x7F, 0x01, 0xD1, 0x88, 0x12, 0xAB, 0xFF, 0xFF, 0xF1, 0xC9, 0x12, 0x05, 0x28, 0xE0, 0xFD, 0xE5,
-0x62, 0x12, 0xC8, 0x2C, 0x54, 0x80, 0xFB, 0xF1, 0xB4, 0xEB, 0xF0, 0x12, 0xC8, 0x73, 0xED, 0xF0,
-0x90, 0x92, 0x3F, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0x90, 0x92, 0x45, 0xF0, 0xA3, 0xF0, 0x7B,
-0x03, 0xFA, 0xFD, 0x7F, 0x01, 0xD1, 0x88, 0xAF, 0x62, 0x12, 0x77, 0x39, 0xEF, 0x70, 0x02, 0xC1,
-0x28, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0x8B, 0x0B, 0x12, 0x8D, 0x59, 0x30, 0xE0, 0x02, 0xC1,
-0x28, 0xE5, 0x62, 0x12, 0xA9, 0x84, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9,
-0xFF, 0xEE, 0x5C, 0xFE, 0xEF, 0x5D, 0x4E, 0x60, 0x02, 0xC1, 0x28, 0x12, 0xAB, 0xFF, 0x4E, 0x70,
-0x0A, 0xF1, 0xC9, 0x12, 0x05, 0x28, 0xE0, 0x70, 0x02, 0xC1, 0x28, 0xE5, 0x62, 0x75, 0xF0, 0x12,
-0xA4, 0x24, 0x44, 0xF9, 0x74, 0x89, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0x90, 0x92, 0x33, 0x12, 0x87,
-0x79, 0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0x12, 0xC8, 0xC6, 0x12, 0x03, 0xED, 0x2F, 0xFF, 0xF1,
-0xA2, 0x2F, 0xFF, 0xF1, 0xA8, 0x2F, 0xFF, 0xF1, 0xAE, 0x2F, 0xF5, 0x6C, 0x75, 0xF0, 0x12, 0xE5,
-0x62, 0x90, 0x89, 0x40, 0x12, 0x05, 0x28, 0xE0, 0xF5, 0x68, 0xA3, 0xE0, 0xF5, 0x69, 0xF1, 0xC9,
-0x12, 0x05, 0x28, 0xE0, 0xFF, 0x90, 0x92, 0x36, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE5, 0x62, 0x12,
-0x8F, 0x5E, 0xE0, 0xF5, 0x63, 0x54, 0x80, 0xF5, 0x65, 0xE5, 0x63, 0x54, 0x7F, 0xF5, 0x64, 0x12,
-0xC8, 0x83, 0xD1, 0xFC, 0x12, 0xC8, 0xC6, 0x90, 0x92, 0x41, 0xF1, 0x00, 0xF1, 0xA2, 0xFF, 0x90,
-0x92, 0x43, 0xF1, 0x00, 0xF1, 0xA8, 0xFF, 0x90, 0x92, 0x45, 0xF1, 0x00, 0x7B, 0x01, 0xF1, 0x9A,
-0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0xF1, 0xAE, 0xD1, 0xFC, 0x90, 0x92, 0x36, 0x12, 0xC8, 0x95,
-0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0x12, 0xC8, 0xBE, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x63, 0xF0, 0x7B,
-0x02, 0xF1, 0x9A, 0x74, 0x7C, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0xE0, 0xC3,
-0x94, 0x05, 0x40, 0x02, 0xC1, 0x0D, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x12, 0xAF, 0xD8, 0xFF, 0xE5,
-0x64, 0xD3, 0x9F, 0x40, 0x08, 0x8F, 0x64, 0xE5, 0x64, 0x45, 0x65, 0xF5, 0x63, 0xE5, 0x64, 0x90,
-0x82, 0xE1, 0x93, 0xF5, 0x6A, 0xE5, 0x65, 0x60, 0x04, 0x05, 0x6A, 0x05, 0x6A, 0x90, 0x04, 0x8C,
-0xE0, 0x64, 0x01, 0x70, 0x28, 0xE5, 0x64, 0xC3, 0x94, 0x0C, 0x40, 0x21, 0x74, 0x84, 0x25, 0x64,
-0xF5, 0x82, 0xE4, 0x34, 0x04, 0xF5, 0x83, 0xE0, 0xFF, 0x54, 0x7F, 0xFE, 0xEF, 0x30, 0xE7, 0x06,
-0xE5, 0x6A, 0x2E, 0xFF, 0x80, 0x05, 0xC3, 0xE5, 0x6A, 0x9E, 0xFF, 0x8F, 0x6A, 0xE5, 0x6A, 0xD3,
-0x94, 0x1A, 0xAF, 0x6A, 0x40, 0x02, 0x7F, 0x1A, 0x8F, 0x6A, 0xD1, 0x32, 0x7B, 0x03, 0xFA, 0xF1,
-0x9C, 0xE5, 0x63, 0x90, 0x83, 0x59, 0x93, 0xFF, 0xD3, 0x90, 0x92, 0x37, 0xE0, 0x9F, 0x90, 0x92,
-0x36, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x80, 0x73, 0xC3, 0xE5, 0x69, 0x94, 0x0A, 0xE5, 0x68, 0x94,
-0x00, 0x40, 0x02, 0xA1, 0x5B, 0xD1, 0x76, 0xE0, 0xC3, 0x94, 0x01, 0x40, 0x05, 0xD1, 0x76, 0xE0,
-0x14, 0xF0, 0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0xF1, 0xAE, 0xFF, 0x90, 0x92, 0x37, 0xE0, 0x2F,
-0xFF, 0x90, 0x92, 0x36, 0xE0, 0x35, 0xF0, 0xFE, 0xF1, 0xA8, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0xFE,
-0xF1, 0xA2, 0x2F, 0xFD, 0xEE, 0x35, 0xF0, 0xFC, 0xE5, 0x68, 0xC3, 0x13, 0xFE, 0xE5, 0x69, 0x13,
-0xFF, 0xD3, 0xED, 0x9F, 0xEC, 0x9E, 0x40, 0x28, 0xE5, 0x62, 0x94, 0x05, 0x50, 0x05, 0xD1, 0x76,
-0x74, 0x03, 0xF0, 0x90, 0x92, 0x3F, 0x12, 0xC8, 0xBE, 0xE5, 0x68, 0xC3, 0x13, 0xA3, 0xF0, 0xE5,
-0x69, 0x13, 0xA3, 0xD1, 0x48, 0xF1, 0xD2, 0x7B, 0x01, 0xD1, 0x82, 0x12, 0xAA, 0x14, 0xC1, 0x0D,
-0x12, 0xC8, 0x83, 0x65, 0x6C, 0x70, 0x02, 0xE5, 0xF0, 0x70, 0x50, 0x90, 0x92, 0x3F, 0xF0, 0xA3,
-0xE5, 0x6C, 0xF0, 0xC3, 0x13, 0xFF, 0xA3, 0xE4, 0xF0, 0xA3, 0xEF, 0xD1, 0x48, 0xF1, 0xD2, 0x7B,
-0x02, 0xD1, 0x82, 0xE5, 0x62, 0xC3, 0x94, 0x05, 0x50, 0x0E, 0xD1, 0x76, 0xE0, 0xD3, 0x94, 0x00,
-0x40, 0x06, 0xD1, 0x2D, 0x7B, 0x03, 0x80, 0x0B, 0xE5, 0x6C, 0xC3, 0x94, 0x03, 0x50, 0x10, 0xD1,
-0x2D, 0x7B, 0x04, 0xFA, 0xD1, 0x84, 0x7D, 0x06, 0xAF, 0x62, 0x12, 0xBD, 0xF3, 0xC1, 0x28, 0xE4,
-0xFD, 0xAF, 0x62, 0x12, 0x8E, 0x15, 0x12, 0xBD, 0xEF, 0xC1, 0x0D, 0xD1, 0x2D, 0x7B, 0x08, 0xFA,
-0xD1, 0x84, 0x7D, 0x01, 0xAF, 0x62, 0x12, 0x65, 0xC2, 0xC1, 0x0D, 0xD1, 0x76, 0xE4, 0xF0, 0x90,
-0x92, 0x3D, 0x74, 0x02, 0xF0, 0xAB, 0x6A, 0xAD, 0x62, 0xAF, 0x69, 0xAE, 0x68, 0x12, 0xAB, 0x14,
-0x8E, 0x66, 0x8F, 0x67, 0x12, 0xC8, 0x1E, 0xC3, 0x74, 0x01, 0x93, 0x95, 0x67, 0xE4, 0x93, 0x95,
-0x66, 0x50, 0x18, 0xD1, 0xF0, 0xE4, 0xF0, 0x7D, 0x01, 0xAF, 0x62, 0x12, 0x8E, 0x15, 0x12, 0xC7,
-0xA3, 0xE4, 0x90, 0x92, 0x43, 0xD1, 0x40, 0x7B, 0x01, 0x80, 0x22, 0xF1, 0x92, 0xC3, 0xE5, 0x67,
-0x9F, 0xE5, 0x66, 0x94, 0x00, 0x50, 0x1B, 0xD1, 0xF0, 0xE4, 0xF0, 0x12, 0xAA, 0x14, 0x12, 0xC7,
-0xBE, 0xF1, 0x92, 0x12, 0xC8, 0x73, 0xEF, 0xF0, 0xE4, 0xD1, 0x3F, 0x7B, 0x02, 0xFA, 0xF1, 0xBB,
-0x80, 0x4B, 0x12, 0xBD, 0xEF, 0x12, 0xC7, 0xA3, 0xF1, 0x92, 0xF1, 0xB4, 0xEF, 0xF0, 0xD1, 0xF0,
-0xF1, 0xD2, 0x7B, 0x03, 0x7A, 0x00, 0xF1, 0xBB, 0xD1, 0xF0, 0xE0, 0x04, 0xF0, 0xE5, 0x64, 0x90,
-0x83, 0x6D, 0x93, 0xFF, 0xD1, 0xF0, 0xE0, 0xC3, 0x9F, 0x40, 0x22, 0xD1, 0xF0, 0xE4, 0xF0, 0xF1,
-0x92, 0x12, 0xC8, 0x1E, 0x74, 0x01, 0x93, 0x2F, 0xFF, 0xE4, 0x93, 0x34, 0x00, 0xC3, 0x13, 0xFE,
-0xEF, 0x13, 0xFF, 0xE5, 0x62, 0x12, 0xAB, 0x08, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xF5, 0x6C,
-0xFD, 0xAF, 0x62, 0x12, 0x65, 0xC2, 0xE4, 0x90, 0x92, 0x3F, 0xF0, 0xD1, 0x3B, 0xA3, 0xF0, 0x7B,
-0x01, 0xFA, 0x7D, 0xFF, 0x7F, 0x01, 0xD1, 0x88, 0x05, 0x62, 0x21, 0xF7, 0x22, 0x90, 0x92, 0xCB,
-0xE0, 0xFF, 0x90, 0x92, 0x3F, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
-0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xF0, 0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0x90,
-0x00, 0x06, 0x12, 0x04, 0x18, 0xFF, 0xAE, 0xF0, 0x90, 0x00, 0x08, 0x12, 0x04, 0x18, 0x2F, 0xFF,
-0xE5, 0xF0, 0x3E, 0xFE, 0x90, 0x00, 0x04, 0x12, 0x04, 0x18, 0x2F, 0xFF, 0xEE, 0x35, 0xF0, 0x90,
-0x92, 0x43, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0xDC, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5,
-0x83, 0x22, 0x7A, 0x00, 0x7D, 0x03, 0x7F, 0x01, 0x90, 0x04, 0x84, 0xE0, 0xFE, 0x60, 0x60, 0x90,
-0x92, 0x49, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEB, 0xA3, 0xF0, 0xEA, 0xA3, 0xF0, 0x90, 0x92, 0x3F,
-0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92, 0x4D, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x41, 0xE0, 0xFC,
-0xA3, 0xE0, 0x90, 0x92, 0x4F, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x43, 0xE0, 0xFC, 0xA3, 0xE0,
-0x90, 0x92, 0x51, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x45, 0xE0, 0xFC, 0xA3, 0xE0, 0x90, 0x92,
-0x53, 0xF0, 0xEC, 0xA3, 0xF0, 0x90, 0x92, 0x47, 0x74, 0xFE, 0xF0, 0x90, 0x92, 0x55, 0x74, 0x0C,
-0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x47, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x12, 0x87, 0xBB, 0x22,
-0x74, 0xAC, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0xFF, 0x90, 0x92, 0x3F,
-0xE5, 0xF0, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x8D, 0x78, 0xEF, 0x30, 0xE6, 0x17, 0x12, 0x8F, 0x5C,
-0x31, 0xD7, 0xF1, 0xC1, 0xE4, 0xFB, 0xAF, 0x78, 0x12, 0x27, 0x3D, 0x12, 0x8F, 0x4F, 0xF1, 0x8B,
-0x74, 0x01, 0x80, 0x5E, 0xF1, 0xDD, 0xE0, 0x04, 0xF0, 0xF1, 0xDD, 0xE0, 0x64, 0x02, 0x70, 0x27,
-0x74, 0xCC, 0x25, 0x78, 0x12, 0x8F, 0xD0, 0xE0, 0xFD, 0xF4, 0x60, 0x02, 0x80, 0x05, 0x12, 0x8F,
-0x5C, 0xE0, 0xFD, 0x31, 0xD9, 0xF1, 0xC1, 0x7B, 0x01, 0xAF, 0x78, 0x12, 0x27, 0x3D, 0x12, 0x8F,
-0x5C, 0xF1, 0x8B, 0x74, 0x02, 0x80, 0x2B, 0xF1, 0xDD, 0xE0, 0xD3, 0x94, 0x03, 0x40, 0x0E, 0xAF,
-0x78, 0x12, 0x6D, 0x94, 0x12, 0x8F, 0x4F, 0xF1, 0x8B, 0x74, 0x03, 0x80, 0x15, 0x12, 0x8F, 0x5C,
-0x31, 0xD7, 0xF1, 0xC1, 0x7B, 0x01, 0xAF, 0x78, 0x12, 0x27, 0x3D, 0x12, 0x8F, 0x5C, 0xF1, 0x8B,
-0x74, 0x02, 0xF0, 0xAB, 0x78, 0xE4, 0xFD, 0xFF, 0x02, 0x52, 0xC3, 0xE0, 0x90, 0x8A, 0x71, 0xF0,
-0xA3, 0x22, 0xE5, 0x64, 0x90, 0x83, 0x1D, 0x93, 0xFF, 0x22, 0x7A, 0x00, 0x7D, 0x01, 0x7F, 0x01,
-0xC1, 0x88, 0x90, 0x00, 0x04, 0x02, 0x04, 0x18, 0x90, 0x00, 0x06, 0x02, 0x04, 0x18, 0x90, 0x00,
-0x08, 0x02, 0x04, 0x18, 0x90, 0x92, 0x43, 0xE4, 0xF0, 0xA3, 0x22, 0x7D, 0x05, 0x7F, 0x01, 0xC1,
-0x88, 0xE0, 0x54, 0x03, 0x90, 0x91, 0x0B, 0xF0, 0x22, 0x75, 0xF0, 0x12, 0xE5, 0x62, 0x90, 0x89,
-0x42, 0x22, 0xE0, 0xFF, 0x90, 0x92, 0x45, 0xE4, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x74, 0xBC, 0x25,
-0x78, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x22, 0xE4, 0xFD, 0x01, 0x9D, 0x7D, 0x20, 0x7F,
-0xFF, 0x11, 0xDE, 0x12, 0xB5, 0xBE, 0x90, 0x85, 0xBF, 0x74, 0x02, 0xF0, 0x22, 0x12, 0x02, 0xF6,
-0xFF, 0x90, 0x92, 0x78, 0xF0, 0xBF, 0x01, 0x07, 0x11, 0x10, 0xE4, 0x90, 0x92, 0x78, 0xF0, 0x22,
-0x11, 0xC0, 0x7F, 0xF5, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x06, 0x90, 0x92, 0x07, 0xE0,
-0xA3, 0xF0, 0x11, 0xC0, 0x7F, 0xF6, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92,
-0x07, 0xE0, 0x90, 0x92, 0x09, 0xF0, 0x11, 0xC0, 0x7F, 0xF4, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF,
-0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x0A, 0xF0, 0x11, 0xC0, 0x7F, 0xF3, 0x7E, 0x01,
-0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92, 0x0B, 0xF0, 0x11, 0xC0,
-0x7F, 0xF2, 0x7E, 0x01, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x07, 0xE0, 0x90, 0x92,
-0x0C, 0xF0, 0x90, 0x92, 0x08, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0xA3, 0xE0, 0xFB, 0xA3, 0xE0, 0x90,
-0x92, 0x10, 0xF0, 0x90, 0x92, 0x0C, 0xE0, 0x90, 0x92, 0x11, 0xF0, 0x90, 0x92, 0x12, 0x74, 0x12,
-0xF0, 0x90, 0x92, 0x20, 0x74, 0x05, 0xF0, 0x90, 0x92, 0x14, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xA3,
-0xEB, 0xF0, 0x90, 0x92, 0x10, 0xE0, 0x90, 0x92, 0x17, 0xF0, 0x90, 0x92, 0x11, 0xE0, 0x90, 0x92,
-0x18, 0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x12, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB,
-0x7B, 0x01, 0x7A, 0x92, 0x79, 0x07, 0x22, 0x31, 0xAC, 0x7F, 0xF4, 0x7E, 0x00, 0x12, 0x64, 0x37,
-0xBF, 0x01, 0x06, 0x90, 0x92, 0x16, 0xE0, 0xA3, 0xF0, 0x31, 0xAC, 0x7F, 0xF5, 0x7E, 0x00, 0x12,
-0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x18, 0xF0, 0x31, 0xAC, 0x7F,
-0xF6, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x19,
-0xF0, 0x31, 0xAC, 0x7F, 0xF7, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01, 0x08, 0x90, 0x92, 0x16,
-0xE0, 0x90, 0x92, 0x1A, 0xF0, 0x31, 0xAC, 0x7F, 0xF8, 0x7E, 0x00, 0x12, 0x64, 0x37, 0xBF, 0x01,
-0x08, 0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x1B, 0xF0, 0x31, 0xAC, 0x51, 0x2D, 0xBF, 0x01, 0x08,
-0x90, 0x92, 0x16, 0xE0, 0x90, 0x92, 0x1C, 0xF0, 0x31, 0xAC, 0x51, 0x26, 0xBF, 0x01, 0x08, 0x90,
-0x92, 0x16, 0xE0, 0x90, 0x92, 0x1D, 0xF0, 0x31, 0xAC, 0x31, 0xB3, 0xBF, 0x01, 0x08, 0x90, 0x92,
-0x16, 0xE0, 0x90, 0x92, 0x1E, 0xF0, 0x90, 0x92, 0x07, 0x74, 0x19, 0xF0, 0x90, 0x92, 0x15, 0x74,
-0x08, 0xF0, 0x90, 0x92, 0x17, 0xE0, 0x90, 0x92, 0x09, 0xF0, 0x90, 0x92, 0x18, 0xE0, 0x90, 0x92,
-0x0A, 0xF0, 0x90, 0x92, 0x19, 0xE0, 0x90, 0x92, 0x0B, 0xF0, 0x90, 0x92, 0x1A, 0xE0, 0x90, 0x92,
-0x0C, 0xF0, 0x90, 0x92, 0x1B, 0xE0, 0x90, 0x92, 0x0D, 0xF0, 0x90, 0x92, 0x1C, 0xE0, 0x90, 0x92,
-0x0E, 0xF0, 0x90, 0x92, 0x1D, 0xE0, 0x90, 0x92, 0x0F, 0xF0, 0x90, 0x92, 0x1E, 0xE0, 0x90, 0x92,
-0x10, 0xF0, 0x11, 0xC0, 0x12, 0x5E, 0x10, 0x7F, 0x04, 0x02, 0x87, 0xBB, 0x7B, 0x01, 0x7A, 0x92,
-0x79, 0x16, 0x22, 0x7F, 0xFD, 0x7E, 0x00, 0x02, 0x64, 0x37, 0x7E, 0x00, 0x7F, 0x0B, 0x7D, 0x00,
-0x7B, 0x01, 0x7A, 0x92, 0x79, 0x7F, 0x12, 0x06, 0xDE, 0x51, 0x1F, 0x51, 0x2D, 0xBF, 0x01, 0x1C,
-0x90, 0x92, 0x29, 0xE0, 0xFE, 0x54, 0x01, 0x90, 0x92, 0x7F, 0xF0, 0xEE, 0x54, 0x04, 0x90, 0x92,
-0x81, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0x54, 0x08, 0x90, 0x92, 0x80, 0xF0, 0x51, 0x1F, 0x51, 0x26,
-0xBF, 0x01, 0x16, 0x90, 0x92, 0x29, 0xE0, 0xFE, 0x54, 0x07, 0x90, 0x92, 0x83, 0xF0, 0xEE, 0x54,
-0xE0, 0xC4, 0x13, 0x54, 0x07, 0x90, 0x92, 0x82, 0xF0, 0x51, 0x1F, 0x31, 0xB3, 0xBF, 0x01, 0x0E,
-0x90, 0x92, 0x29, 0xE0, 0x54, 0x0C, 0x13, 0x13, 0x54, 0x3F, 0x90, 0x92, 0x84, 0xF0, 0x22, 0x7B,
-0x01, 0x7A, 0x92, 0x79, 0x29, 0x22, 0x7F, 0xFB, 0x7E, 0x00, 0x02, 0x64, 0x37, 0x7F, 0xF9, 0x7E,
-0x00, 0x02, 0x64, 0x37, 0x12, 0x02, 0xF6, 0xFF, 0x90, 0x92, 0x7E, 0xF0, 0xBF, 0x01, 0x07, 0x11,
-0xC7, 0xE4, 0x90, 0x92, 0x7E, 0xF0, 0x22, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x80, 0xFD, 0x7F, 0x80,
-0x12, 0x7B, 0x3E, 0x12, 0xB8, 0x40, 0x12, 0xBE, 0xE5, 0x12, 0x7B, 0x9C, 0x51, 0xD1, 0x12, 0xB7,
-0x7E, 0x7F, 0x01, 0x12, 0x85, 0x15, 0x90, 0x92, 0x7D, 0x74, 0x02, 0xF0, 0xFF, 0x12, 0x85, 0x15,
-0x90, 0x92, 0x7D, 0xE0, 0x04, 0xF0, 0x12, 0xB8, 0x02, 0x51, 0xEF, 0x90, 0x01, 0xCC, 0x74, 0x0F,
-0xF0, 0x90, 0x00, 0x80, 0xE0, 0x44, 0x40, 0xFD, 0x7F, 0x80, 0x12, 0x7B, 0x3E, 0x75, 0x20, 0xFF,
-0x12, 0x7C, 0xCD, 0x12, 0xB6, 0xAD, 0x90, 0x00, 0x81, 0xE0, 0x44, 0x04, 0xFD, 0x7F, 0x81, 0x12,
-0x7B, 0x3E, 0x12, 0xB8, 0x37, 0x31, 0xBA, 0x90, 0x00, 0x00, 0xE0, 0x54, 0xFB, 0xFD, 0xE4, 0xFF,
-0x12, 0xB6, 0x8A, 0x44, 0x04, 0xFD, 0x7F, 0x01, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x98, 0x74, 0x80,
-0xF0, 0xA3, 0x74, 0x88, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x80, 0xF0, 0xE4, 0xFF, 0x02, 0x85,
-0x9E, 0x90, 0x01, 0x01, 0xE0, 0x44, 0x04, 0xF0, 0x90, 0x01, 0x9A, 0xE0, 0x54, 0xC0, 0x12, 0xB7,
-0x13, 0x90, 0x01, 0x99, 0xE0, 0x44, 0xC0, 0xF0, 0x90, 0x01, 0x9B, 0x74, 0x80, 0xF0, 0x22, 0xF1,
-0xED, 0x12, 0x7B, 0xEF, 0x12, 0x3C, 0x03, 0x12, 0xBE, 0x63, 0xF1, 0xF3, 0x12, 0xC3, 0x14, 0x71,
-0xD9, 0x71, 0x26, 0x12, 0x7B, 0x64, 0x12, 0x78, 0xB9, 0x90, 0x89, 0x16, 0xE0, 0x54, 0x7F, 0xF0,
-0x54, 0xBF, 0xF0, 0x54, 0xDF, 0xF0, 0x54, 0xF0, 0xF0, 0xE4, 0x90, 0x89, 0x18, 0xF0, 0x90, 0x89,
-0x16, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x24, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x86,
-0x79, 0x72, 0x12, 0x06, 0xDE, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x20, 0xF0, 0x12, 0xB7, 0x1B, 0x71,
-0xDF, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0x64, 0x02, 0x70, 0x29, 0x71, 0xD2, 0x30, 0xE0, 0x02, 0x7E,
-0x01, 0x90, 0x86, 0x90, 0x71, 0xD0, 0x30, 0xE1, 0x02, 0x7E, 0x01, 0x90, 0x86, 0x8E, 0x71, 0xD0,
-0x30, 0xE2, 0x02, 0x7E, 0x01, 0x90, 0x86, 0x8F, 0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x90, 0x02,
-0xFB, 0xF0, 0x22, 0xEF, 0x64, 0x01, 0x70, 0x1D, 0x71, 0xC9, 0x30, 0xE0, 0x02, 0x7F, 0x01, 0x90,
-0x86, 0x90, 0x71, 0xC7, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x8E, 0x71, 0xC7, 0x30, 0xE2,
-0x02, 0x7F, 0x01, 0x80, 0x23, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x03, 0x70, 0x20, 0x71, 0xC0, 0x30,
-0xE0, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x90, 0x71, 0xBE, 0x30, 0xE1, 0x02, 0x7F, 0x01, 0x90, 0x86,
-0x8E, 0x71, 0xBE, 0x30, 0xE2, 0x02, 0x7F, 0x01, 0x90, 0x86, 0x8F, 0xEF, 0xF0, 0x22, 0xEF, 0xF0,
-0x90, 0xFD, 0x78, 0xE0, 0x7F, 0x00, 0x22, 0xEF, 0xF0, 0x90, 0xFD, 0x70, 0xE0, 0x7F, 0x00, 0x22,
-0xEE, 0xF0, 0x90, 0xFD, 0x80, 0xE0, 0x7E, 0x00, 0x22, 0x12, 0xC3, 0xE3, 0x02, 0x06, 0xDE, 0x12,
-0xC5, 0xD1, 0xE4, 0x90, 0x88, 0xD8, 0x12, 0x96, 0x40, 0x90, 0x88, 0x76, 0xF0, 0x12, 0x96, 0x3B,
-0x12, 0x96, 0x41, 0x90, 0x88, 0x88, 0xF0, 0xA3, 0xF0, 0x90, 0x88, 0xCA, 0xF0, 0xA3, 0xF0, 0x22,
-0x90, 0x86, 0x72, 0x91, 0x0B, 0x30, 0xE0, 0x02, 0x71, 0xDF, 0x22, 0xE0, 0xFF, 0xC4, 0x13, 0x13,
-0x54, 0x03, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x8B, 0x5B, 0x8A, 0x5C, 0x89, 0x5D,
-0x90, 0x05, 0x27, 0xE0, 0xF5, 0x5E, 0x8B, 0x1B, 0x8A, 0x1C, 0x89, 0x1D, 0x75, 0x1E, 0x01, 0x7B,
-0x01, 0x7A, 0x85, 0x79, 0xBC, 0x12, 0x6A, 0x21, 0x12, 0x91, 0xC4, 0xFF, 0xC3, 0x13, 0x20, 0xE0,
-0x02, 0x81, 0xCE, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x72, 0xF1, 0x28, 0x75, 0x5E, 0x21, 0xF1,
-0x9A, 0x30, 0xE0, 0x05, 0x12, 0xC8, 0x0E, 0x80, 0x0D, 0xE4, 0x90, 0x85, 0xBD, 0xF0, 0xA3, 0xF0,
-0x7D, 0x40, 0xFF, 0x12, 0x7C, 0x41, 0xF1, 0x91, 0x54, 0x1F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x12,
-0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x14, 0x90, 0x85, 0xBC, 0xE0, 0xC4, 0x13,
-0x54, 0x07, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x80, 0x90, 0x85, 0xBC, 0xF1, 0xD6, 0x20, 0xE0, 0x03,
-0x43, 0x5E, 0x40, 0xB1, 0x72, 0x90, 0x85, 0xBF, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0xB4, 0x21,
-0x90, 0x85, 0xBC, 0x91, 0x0B, 0x30, 0xE0, 0x04, 0x7F, 0x04, 0x80, 0x0B, 0xF1, 0xAC, 0xEF, 0x60,
-0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0xB4, 0x21, 0xA1, 0x3D, 0xB1, 0x6F, 0x90, 0x85,
-0xBF, 0xE0, 0x64, 0x04, 0x60, 0x02, 0xA1, 0x6A, 0xFF, 0x12, 0xB4, 0x21, 0xA1, 0x6A, 0x90, 0x85,
-0xBC, 0xE0, 0x30, 0xE0, 0x70, 0xF1, 0x28, 0x43, 0x5E, 0x31, 0xF1, 0x9A, 0x30, 0xE0, 0x05, 0x12,
-0xC8, 0x0E, 0x80, 0x07, 0x7D, 0x40, 0xE4, 0xFF, 0x12, 0x7C, 0x41, 0xF1, 0x91, 0x54, 0x1F, 0x30,
-0xE0, 0x03, 0x43, 0x5E, 0x02, 0xEF, 0xC4, 0x54, 0x0F, 0x30, 0xE0, 0x03, 0x43, 0x5E, 0x04, 0xB1,
-0x72, 0x90, 0x85, 0xBC, 0x91, 0x0B, 0x30, 0xE0, 0x0A, 0xF1, 0x48, 0x60, 0x30, 0xE4, 0xFD, 0x7F,
-0x02, 0x80, 0x1E, 0x12, 0xB6, 0x82, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x18, 0x12, 0x7A, 0xA2,
-0xF1, 0xAC, 0xBF, 0x01, 0x09, 0x90, 0x85, 0xC7, 0xE0, 0xFF, 0x7D, 0x01, 0x80, 0x03, 0xE4, 0xFD,
-0xFF, 0xB1, 0x7D, 0x80, 0x08, 0x90, 0x85, 0xC8, 0xE0, 0x90, 0x85, 0xC0, 0xF0, 0x90, 0x05, 0x40,
-0x74, 0x22, 0xF0, 0x80, 0x25, 0xB1, 0x6F, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x06, 0x7D, 0x01,
-0x7F, 0x04, 0x80, 0x0B, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x08, 0x06, 0x7D, 0x01, 0x7F, 0x0C, 0xB1,
-0x7D, 0xF1, 0xA3, 0x90, 0x85, 0xC7, 0xF1, 0x8B, 0xF1, 0xF3, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x75,
-0x5E, 0x01, 0x90, 0x05, 0x27, 0xE5, 0x5E, 0xF0, 0x22, 0x7D, 0x01, 0x7F, 0x04, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x1F, 0xED, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0xFE, 0xC4, 0x13,
-0x13, 0x54, 0x03, 0x30, 0xE0, 0x02, 0xC1, 0xD8, 0xEE, 0x12, 0x8D, 0x59, 0x30, 0xE0, 0x02, 0xC1,
-0xD8, 0x90, 0x85, 0xC8, 0xE0, 0xFE, 0x6F, 0x70, 0x02, 0xC1, 0xD8, 0xEF, 0x70, 0x02, 0xC1, 0x43,
-0x24, 0xFE, 0x70, 0x02, 0xC1, 0x80, 0x24, 0xFE, 0x60, 0x4D, 0x24, 0xFC, 0x70, 0x02, 0xC1, 0xBF,
-0x24, 0xFC, 0x60, 0x02, 0xC1, 0xD1, 0xEE, 0xB4, 0x0E, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8,
-0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12,
-0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x0F, 0x90, 0x93, 0x1F, 0xE0, 0xFF, 0x60, 0x05,
-0x12, 0x6D, 0x4C, 0x80, 0x03, 0x12, 0x79, 0x61, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x08, 0x60, 0x02,
-0xC1, 0xD1, 0x12, 0x7A, 0xB9, 0xC1, 0xD1, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01, 0x12,
-0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0,
-0xB4, 0x0E, 0x08, 0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0x64,
-0x0C, 0x60, 0x02, 0xC1, 0xD1, 0xD1, 0xDD, 0xEF, 0x64, 0x01, 0x60, 0x02, 0xC1, 0xD1, 0x12, 0x70,
-0x9E, 0xC1, 0xD1, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12,
-0x74, 0x93, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0,
-0xB4, 0x0C, 0x08, 0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90, 0x85, 0xC8, 0xE0, 0x64,
-0x04, 0x70, 0x5E, 0x12, 0xC4, 0x08, 0xEF, 0x64, 0x01, 0x70, 0x56, 0x12, 0x77, 0xFE, 0x80, 0x51,
-0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0E, 0x08, 0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12, 0x74, 0x93, 0x90,
-0x85, 0xC8, 0xE0, 0xB4, 0x06, 0x03, 0x12, 0x73, 0x8E, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x08,
-0xD1, 0xDD, 0xBF, 0x01, 0x03, 0x12, 0x70, 0x9E, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x05, 0x7F, 0x01,
-0x12, 0x79, 0x80, 0x90, 0x85, 0xC8, 0xE0, 0xB4, 0x04, 0x17, 0x12, 0x79, 0xF3, 0x80, 0x12, 0x90,
-0x85, 0xC8, 0xE0, 0xB4, 0x0C, 0x0B, 0x12, 0xA1, 0x91, 0x54, 0x3F, 0x30, 0xE0, 0x03, 0x12, 0x7A,
-0x8A, 0x90, 0x85, 0xC8, 0x12, 0xC8, 0x3A, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7A, 0x29, 0xEF, 0x64, 0x01, 0x60, 0x05, 0x75, 0x0E, 0x01, 0x80,
-0x24, 0x90, 0x85, 0xC1, 0xE0, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x05, 0x75, 0x0E, 0x02,
-0x80, 0x13, 0x90, 0x85, 0xC7, 0xE0, 0xD3, 0x94, 0x04, 0x40, 0x05, 0x75, 0x0E, 0x08, 0x80, 0x05,
-0x12, 0xB3, 0xDE, 0x80, 0x0E, 0x90, 0x01, 0xB9, 0x74, 0x02, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x0E,
-0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x7D, 0x03, 0x7F, 0x02, 0x02, 0x7B, 0xFD, 0x90,
-0x85, 0xBC, 0x91, 0x0B, 0x30, 0xE0, 0x0A, 0xF1, 0x48, 0x60, 0x06, 0x7D, 0x01, 0x7F, 0x02, 0xB1,
-0x7D, 0xF1, 0x48, 0x60, 0x02, 0xF1, 0x4F, 0x22, 0x90, 0x85, 0xC0, 0xE0, 0x64, 0x02, 0x22, 0x90,
-0x85, 0xC5, 0xE0, 0x64, 0x02, 0x60, 0x0F, 0xF1, 0xE4, 0x60, 0x0B, 0x12, 0x7A, 0x29, 0xEF, 0x70,
-0x05, 0xFD, 0x7F, 0x0C, 0xB1, 0x7D, 0x22, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x01, 0x70, 0x1B, 0xF1,
-0xE4, 0x60, 0x0F, 0xE4, 0xFD, 0x7F, 0x0C, 0xB1, 0x7D, 0xE4, 0xFD, 0xFF, 0x12, 0x90, 0xDE, 0x02,
-0x6B, 0x98, 0x90, 0x85, 0xC8, 0xE0, 0x70, 0x02, 0xB1, 0x79, 0x22, 0xE0, 0xFF, 0x7D, 0x01, 0xA1,
-0x7D, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x13, 0x13, 0x13, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x13, 0x13,
-0x54, 0x3F, 0x22, 0x12, 0x7A, 0x29, 0xEF, 0x70, 0x02, 0xF1, 0x67, 0x22, 0x90, 0x05, 0x43, 0xE0,
-0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F, 0x01, 0x22, 0xAE, 0x07, 0xF1, 0xAC, 0xBF, 0x01, 0x11, 0x90,
-0x85, 0xBC, 0xF1, 0xD6, 0x20, 0xE0, 0x09, 0xAF, 0x06, 0x7D, 0x01, 0xB1, 0x7D, 0x7F, 0x01, 0x22,
-0x7F, 0x00, 0x22, 0x90, 0x86, 0x72, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22, 0x90, 0x85, 0xC9,
-0xE0, 0x44, 0x01, 0xF0, 0x90, 0x85, 0xC3, 0xE0, 0x54, 0x0F, 0x22, 0x81, 0x00, 0xE4, 0xFD, 0xFF,
-0x02, 0x6E, 0x5F, 0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xBC, 0x12,
-0x06, 0xDE, 0x90, 0x85, 0xBC, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0x12, 0x96, 0x41, 0xA3, 0x74, 0x0C,
-0xF0, 0x22, 0x12, 0x02, 0xF6, 0x54, 0x01, 0xFF, 0x90, 0x92, 0x8A, 0xE0, 0x54, 0xFE, 0x4F, 0xF0,
-0x22, 0x12, 0x02, 0xF6, 0x90, 0x86, 0x71, 0xF0, 0x22, 0x12, 0xC8, 0x47, 0x90, 0x92, 0x79, 0x12,
-0x8F, 0xFB, 0x54, 0x02, 0xFF, 0xEE, 0x54, 0xFD, 0x12, 0x8D, 0x60, 0x90, 0x92, 0x7A, 0x12, 0x8C,
-0x6E, 0x90, 0x92, 0x7B, 0xF0, 0xB1, 0x86, 0x90, 0x92, 0x79, 0xE0, 0x54, 0x01, 0xFF, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xEF, 0x64, 0x01, 0x70, 0x19, 0x11, 0x96, 0x60, 0x09, 0x11, 0x8F,
-0x12, 0x7B, 0xFD, 0xB1, 0x74, 0x80, 0x07, 0x11, 0x8F, 0x12, 0x7B, 0xBF, 0x91, 0x60, 0x12, 0x7A,
-0x8A, 0x80, 0x17, 0x11, 0x96, 0x60, 0x07, 0x11, 0x8F, 0x12, 0x7B, 0xFD, 0x80, 0x05, 0x11, 0x8F,
-0x12, 0x7B, 0xBF, 0xB1, 0x30, 0xB1, 0x5D, 0x12, 0x7A, 0xB9, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74,
-0x10, 0xF0, 0xFD, 0x7F, 0x03, 0x22, 0x90, 0x92, 0x7B, 0xE0, 0x90, 0x01, 0x3F, 0x22, 0x91, 0x6E,
-0x64, 0x01, 0x60, 0x02, 0x21, 0x85, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x21, 0x85, 0x90, 0x05,
-0x63, 0xE0, 0x90, 0x92, 0x90, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x92, 0x91, 0xF0, 0x90, 0x05,
-0x61, 0xE0, 0x90, 0x92, 0x92, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x92, 0x93, 0xF0, 0xB1, 0xE7,
-0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEC, 0xF0, 0x31, 0xA9, 0x24, 0xFD, 0x50, 0x02, 0x80, 0x0D, 0x90,
-0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x04, 0x51, 0xCA, 0x80, 0x02, 0x51, 0x7D, 0x31, 0xA9, 0x64, 0x01,
-0x70, 0x22, 0x90, 0x06, 0xAB, 0xE0, 0x90, 0x85, 0xCC, 0xF0, 0x90, 0x06, 0xAA, 0xE0, 0x90, 0x85,
-0xCB, 0xF0, 0xA3, 0xE0, 0xFF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xFE, 0xFF, 0x80, 0x00, 0x90,
-0x85, 0xCC, 0xEF, 0xF0, 0x12, 0xBA, 0x2A, 0xE4, 0x90, 0x85, 0xCE, 0xF0, 0x12, 0xC5, 0x47, 0x31,
-0x91, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x5C, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x20, 0xE0, 0x22,
-0x31, 0xA1, 0x6F, 0x70, 0x4E, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x40, 0xF0, 0xB1, 0x7D, 0x90, 0x01,
-0x3F, 0x11, 0x8F, 0x12, 0x7B, 0xFD, 0x91, 0x67, 0xB1, 0x56, 0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0,
-0x80, 0x31, 0x90, 0x85, 0xC3, 0xE0, 0xC4, 0x54, 0x0F, 0x64, 0x01, 0x70, 0x26, 0x31, 0xA1, 0xFE,
-0x6F, 0x60, 0x20, 0x90, 0x05, 0x73, 0xE0, 0xFF, 0xEE, 0x6F, 0x60, 0x17, 0x31, 0x91, 0x54, 0x3F,
-0x30, 0xE0, 0x10, 0xEF, 0x54, 0xBF, 0xF0, 0x90, 0x01, 0x3F, 0x11, 0x8F, 0x12, 0x7B, 0xBF, 0xB1,
-0x5D, 0xB1, 0x30, 0x31, 0x99, 0x90, 0x85, 0xBC, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x02, 0x31, 0x99,
-0x22, 0x90, 0x85, 0xC2, 0xE0, 0xFF, 0x13, 0x13, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x44, 0x04, 0xF0,
-0x22, 0x90, 0x85, 0xCB, 0xE0, 0xFF, 0xA3, 0xE0, 0x22, 0x90, 0x85, 0xC3, 0xE0, 0xFF, 0xC4, 0x54,
-0x0F, 0x22, 0xE4, 0xF5, 0x77, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x41, 0x4F, 0x91, 0x6E, 0x64,
-0x01, 0x60, 0x02, 0x41, 0x4F, 0x12, 0xC7, 0xC9, 0x31, 0xA9, 0x60, 0x22, 0x24, 0xFE, 0x60, 0x03,
-0x04, 0x70, 0x1E, 0x90, 0x85, 0xCC, 0xE0, 0x14, 0xF0, 0xE0, 0xFF, 0x60, 0x06, 0x90, 0x85, 0xCE,
-0xE0, 0x60, 0x0E, 0xEF, 0x70, 0x08, 0x90, 0x85, 0xCB, 0xE0, 0xA3, 0xF0, 0x80, 0x00, 0x75, 0x77,
-0x01, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x12, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x02, 0x03, 0xE4,
-0xF5, 0x77, 0x12, 0x9F, 0xAC, 0xEF, 0x70, 0x02, 0xF5, 0x77, 0xE5, 0x77, 0x60, 0x41, 0x90, 0x85,
-0xC8, 0xE0, 0x20, 0xE2, 0x03, 0x12, 0x9D, 0x79, 0xB1, 0x6C, 0x90, 0x85, 0xCE, 0xE0, 0x60, 0x04,
-0x64, 0x01, 0x70, 0x13, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x51, 0x5B, 0x51,
-0x6F, 0x90, 0x85, 0xCE, 0xE0, 0x80, 0x12, 0xE4, 0x90, 0x91, 0x6E, 0x51, 0x50, 0x51, 0x6F, 0x90,
-0x85, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0x51, 0x5B, 0x90, 0x85, 0xDE, 0xF0, 0x22,
-0xF0, 0x90, 0x85, 0xCE, 0xE0, 0x75, 0xF0, 0x03, 0xA4, 0x24, 0xFE, 0xFF, 0x90, 0x85, 0xCD, 0xE0,
-0x2F, 0x22, 0xE0, 0x44, 0x02, 0xF0, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x86, 0x6E, 0xE0, 0x90,
-0x91, 0x6F, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02, 0x61, 0x41, 0xE4, 0xF5, 0x77,
-0x90, 0x06, 0xA9, 0xE0, 0xF5, 0x77, 0x54, 0xC0, 0x70, 0x07, 0x51, 0xC2, 0x54, 0xFD, 0xF0, 0xA1,
-0x90, 0xE5, 0x77, 0x30, 0xE6, 0x19, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x01, 0x70, 0x13, 0x12, 0x9F,
-0xDD, 0x64, 0x02, 0x60, 0x05, 0x12, 0x77, 0x61, 0x80, 0x07, 0x12, 0x79, 0x41, 0x80, 0x02, 0x51,
-0xC2, 0xE5, 0x77, 0x90, 0x85, 0xC9, 0x30, 0xE7, 0x04, 0x51, 0x62, 0xA1, 0x64, 0xE0, 0x54, 0xFD,
-0xF0, 0x22, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0x90, 0x06, 0xA9, 0xE0, 0x90, 0x92,
-0x56, 0xF0, 0xE0, 0xFD, 0x54, 0xC0, 0x70, 0x04, 0x51, 0xC2, 0x80, 0x56, 0xED, 0x30, 0xE6, 0x41,
-0x90, 0x85, 0xC5, 0xE0, 0x64, 0x02, 0x70, 0x28, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0xC3, 0x13, 0x20,
-0xE0, 0x09, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x1C, 0x12, 0x9F, 0xE4, 0x64, 0x01,
-0x70, 0x21, 0x90, 0x85, 0xC9, 0xE0, 0x44, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x62, 0x8E, 0x80, 0x13,
-0x12, 0x9F, 0xDD, 0x64, 0x02, 0x60, 0x05, 0x12, 0x77, 0x61, 0x80, 0x07, 0x12, 0x79, 0x41, 0x80,
-0x02, 0x51, 0xC2, 0x90, 0x92, 0x56, 0xE0, 0x90, 0x85, 0xC9, 0x30, 0xE7, 0x04, 0x51, 0x62, 0xA1,
-0x64, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x06, 0x90, 0x85, 0xBE,
-0x74, 0x01, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x02, 0x61, 0xEE, 0x90, 0x85, 0xDC, 0xE0, 0x04,
-0xF0, 0x90, 0x05, 0x61, 0x91, 0x59, 0x78, 0x08, 0x12, 0x04, 0xD8, 0xA8, 0x04, 0xA9, 0x05, 0xAA,
-0x06, 0xAB, 0x07, 0x90, 0x05, 0x60, 0x91, 0x59, 0x12, 0x87, 0x4B, 0xC0, 0x04, 0xC0, 0x05, 0xC0,
-0x06, 0xC0, 0x07, 0x90, 0x05, 0x62, 0x91, 0x59, 0x78, 0x10, 0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0,
-0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12, 0x87, 0x4B, 0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07,
-0xA3, 0x91, 0x59, 0x78, 0x18, 0x12, 0x04, 0xD8, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00,
-0x12, 0x87, 0x4B, 0x90, 0x85, 0xFC, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x8B, 0xE0, 0x54,
-0xFE, 0xF0, 0xE0, 0xC3, 0x13, 0x30, 0xE0, 0x0E, 0x12, 0xBA, 0x1D, 0xFB, 0x12, 0x51, 0x7D, 0x90,
-0x92, 0x8B, 0xE0, 0x54, 0xFD, 0xF0, 0x31, 0x91, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x09, 0x90, 0x01,
-0x3B, 0xE0, 0x30, 0xE4, 0x02, 0x91, 0x60, 0x90, 0x93, 0x1C, 0xE0, 0x04, 0xF0, 0xE0, 0xC3, 0x94,
-0x80, 0x40, 0x0B, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xFE, 0xF0, 0xE0, 0x44, 0x01, 0xF0, 0x12, 0x5D,
-0x1F, 0x12, 0x6E, 0x1D, 0xE4, 0x90, 0x88, 0xE0, 0xF0, 0x7F, 0x01, 0x12, 0xB8, 0xBA, 0xB1, 0xFD,
-0x12, 0x9F, 0xD3, 0x30, 0xE0, 0x52, 0x90, 0x88, 0x76, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7C, 0x00,
-0x7D, 0x64, 0x12, 0x03, 0x82, 0x90, 0x88, 0xCA, 0xE0, 0x6E, 0x70, 0x03, 0xA3, 0xE0, 0x6F, 0x60,
-0x0A, 0x90, 0x88, 0xCA, 0xE4, 0x75, 0xF0, 0x01, 0x02, 0x07, 0x0A, 0x90, 0x88, 0x7A, 0xE0, 0xFE,
-0xA3, 0xE0, 0xFF, 0x90, 0x88, 0x88, 0xE0, 0xB5, 0x06, 0x14, 0xA3, 0xE0, 0xB5, 0x07, 0x0F, 0xEF,
-0x4E, 0x60, 0x0B, 0x90, 0x01, 0xC7, 0x74, 0x31, 0xF0, 0x7F, 0x01, 0x02, 0x5F, 0xE9, 0x12, 0xC1,
-0xE1, 0xE4, 0x90, 0x88, 0xCA, 0xF0, 0xA3, 0xF0, 0x22, 0xE0, 0xFF, 0xE4, 0xFC, 0xFD, 0xFE, 0x22,
-0x7D, 0x02, 0x7F, 0x02, 0x12, 0x7C, 0x41, 0x7D, 0x01, 0x7F, 0x02, 0x02, 0x7C, 0x41, 0xE4, 0xFF,
-0x12, 0x77, 0x39, 0xEF, 0x22, 0xE4, 0x90, 0x92, 0x67, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x4F,
-0x91, 0x6E, 0x64, 0x01, 0x70, 0x49, 0xB1, 0x7D, 0x12, 0xC7, 0xC9, 0x90, 0x92, 0x67, 0x74, 0x01,
-0xF0, 0xE4, 0x90, 0x85, 0xCC, 0xF0, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x85, 0xC0,
-0xE0, 0xB4, 0x02, 0x05, 0xE4, 0x90, 0x92, 0x67, 0xF0, 0x12, 0x9F, 0xAC, 0xEF, 0x70, 0x04, 0x90,
-0x92, 0x67, 0xF0, 0x90, 0x92, 0x67, 0xE0, 0x60, 0x16, 0x90, 0x85, 0xC8, 0xE0, 0x20, 0xE2, 0x03,
-0x12, 0x9D, 0x79, 0xB1, 0x6C, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x85, 0xCD, 0x51, 0x6E, 0x22,
-0x31, 0x91, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0,
-0x02, 0xB1, 0x56, 0xB1, 0xF3, 0x30, 0xE0, 0x08, 0xB1, 0xBD, 0x54, 0x07, 0x70, 0x39, 0x80, 0x35,
-0xF1, 0xA1, 0x40, 0x31, 0x91, 0x6E, 0x64, 0x01, 0x70, 0x2D, 0x12, 0x9F, 0xE4, 0x70, 0x05, 0x12,
-0x70, 0xDB, 0x80, 0x24, 0x12, 0x70, 0xDB, 0x90, 0x85, 0xCF, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94,
-0x02, 0x40, 0x09, 0xB1, 0x28, 0xE4, 0x90, 0x85, 0xCF, 0xF0, 0x80, 0x03, 0x12, 0x79, 0x41, 0xE4,
-0x90, 0x85, 0xCE, 0xF0, 0x22, 0xB1, 0x90, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xFB, 0xF0, 0x22,
-0x7D, 0x02, 0x7F, 0x02, 0x02, 0x7C, 0xA9, 0x91, 0x75, 0xB1, 0x30, 0x90, 0x92, 0x79, 0xE0, 0x30,
-0xE0, 0x13, 0xB1, 0x74, 0x90, 0x92, 0x7C, 0xE0, 0x60, 0x05, 0x14, 0xF0, 0x02, 0x7A, 0x8A, 0xB1,
-0x86, 0xE4, 0xFF, 0x11, 0x4E, 0x22, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x7C, 0x41, 0x7D, 0x01, 0x7F,
-0x02, 0x02, 0x7C, 0xA9, 0x90, 0x85, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0x90, 0x85, 0xC9, 0xE0,
-0x44, 0x10, 0xF0, 0x22, 0x90, 0x92, 0x7B, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x85, 0xCB,
-0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x90, 0x92, 0x7A, 0xE0, 0x14, 0x90, 0x92, 0x7C, 0xF0, 0x22,
-0x90, 0x85, 0xBC, 0xE0, 0x90, 0x85, 0xC7, 0x30, 0xE0, 0x05, 0xE0, 0xFF, 0x02, 0x9F, 0xB8, 0x02,
-0x9F, 0x8B, 0x91, 0x6E, 0x64, 0x01, 0x70, 0x14, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0E, 0xB1, 0xE7,
-0x90, 0x85, 0xC1, 0xE0, 0xB1, 0xBE, 0x54, 0x07, 0x70, 0x02, 0xB1, 0x90, 0x22, 0xEF, 0x54, 0xFB,
-0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x01, 0x57, 0xE0, 0x60, 0x17, 0xB1,
-0xEA, 0xB1, 0xF3, 0x30, 0xE0, 0x02, 0x80, 0xE5, 0xF1, 0xA1, 0x40, 0x0A, 0xE4, 0xFF, 0x12, 0x77,
-0x39, 0xBF, 0x01, 0x02, 0xB1, 0x28, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74,
-0x02, 0xF0, 0x22, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0x92, 0x79,
-0xE0, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x02, 0x91, 0x60, 0x22, 0x90, 0x85,
-0xC5, 0xE0, 0x60, 0x0F, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x6B, 0x98, 0x12, 0xC8,
-0xCE, 0xB1, 0x90, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF, 0x01, 0x0E, 0x90, 0x85, 0xC5, 0xE0,
-0x60, 0x08, 0x51, 0xC2, 0x54, 0x07, 0x70, 0x02, 0xB1, 0x90, 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, 0x3B, 0xF0, 0x74, 0xA6,
-0xA3, 0xF0, 0x12, 0x71, 0x90, 0xE5, 0x4C, 0x30, 0xE1, 0x02, 0xF1, 0xD5, 0xE5, 0x4C, 0x30, 0xE3,
-0x03, 0x12, 0xB8, 0xD0, 0xE5, 0x4C, 0x30, 0xE4, 0x03, 0x12, 0xB8, 0xC9, 0xE5, 0x4C, 0x30, 0xE5,
-0x03, 0x12, 0xBE, 0xF2, 0xE5, 0x4C, 0x30, 0xE6, 0x03, 0x12, 0xBD, 0x76, 0xE5, 0x4E, 0x30, 0xE0,
-0x02, 0xD1, 0xFC, 0xE5, 0x4E, 0x30, 0xE1, 0x02, 0x71, 0x36, 0xE5, 0x4E, 0x30, 0xE2, 0x03, 0x12,
-0xBD, 0x83, 0xE5, 0x4E, 0x30, 0xE3, 0x02, 0xF1, 0x15, 0xE5, 0x4E, 0x30, 0xE4, 0x02, 0xB1, 0xA2,
-0xE5, 0x4E, 0x30, 0xE5, 0x03, 0x12, 0xBD, 0xB2, 0xE5, 0x4E, 0x30, 0xE6, 0x02, 0xD1, 0x24, 0xE5,
-0x4F, 0x30, 0xE1, 0x03, 0x12, 0xBD, 0xCE, 0xE5, 0x4F, 0x30, 0xE4, 0x03, 0x12, 0xBF, 0x2E, 0xE5,
-0x4F, 0x30, 0xE5, 0x02, 0xF1, 0x2E, 0x74, 0x3B, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xA6, 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, 0x85, 0xBC, 0xE0,
-0x30, 0xE0, 0x10, 0xA3, 0x74, 0x01, 0xF0, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0,
-0x02, 0xF1, 0xBA, 0x21, 0xB2, 0x91, 0x6E, 0x64, 0x01, 0x70, 0x12, 0x90, 0x85, 0xC5, 0xE0, 0x60,
-0x0C, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0x51, 0x65, 0x22, 0xE4, 0xF5,
-0x77, 0x90, 0x85, 0xBB, 0xE0, 0xFF, 0xE5, 0x77, 0xC3, 0x9F, 0x50, 0x64, 0xAF, 0x77, 0x12, 0x77,
-0x39, 0xEF, 0x60, 0x58, 0xE5, 0x77, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x77, 0x54, 0x07,
-0xFE, 0x74, 0x75, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x12,
-0xA9, 0x9B, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x60,
-0x2B, 0xE5, 0x77, 0x12, 0xC8, 0x2C, 0x20, 0xE7, 0x02, 0x80, 0x13, 0xE5, 0x77, 0xC4, 0x54, 0xF0,
-0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01,
-0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80, 0x05, 0xAD, 0x77, 0x12, 0x97, 0x07, 0x05, 0x77, 0x80, 0x91,
-0x22, 0x90, 0x85, 0xCE, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x86,
-0x6D, 0xE0, 0xFF, 0x90, 0x85, 0xCE, 0xE0, 0xD3, 0x9F, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
-0xD0, 0x12, 0x9F, 0xAC, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0xB4, 0x21,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0xFF, 0x90, 0x92, 0x56, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0,
-0xFF, 0xA3, 0xE0, 0x90, 0x92, 0x66, 0xF0, 0xE0, 0xFE, 0x6F, 0x60, 0x66, 0x90, 0x92, 0x57, 0x74,
-0x03, 0xF0, 0x90, 0x92, 0x65, 0x74, 0x08, 0xF0, 0xEE, 0x04, 0x54, 0x0F, 0xFF, 0xE4, 0xFE, 0xEF,
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2E,
-0x11, 0x53, 0xE0, 0xFD, 0x74, 0x59, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xED, 0xF0,
-0x0E, 0xEE, 0xB4, 0x08, 0xDA, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x57, 0x12, 0x5E, 0x10, 0x90, 0x92,
-0x66, 0xE0, 0x04, 0x54, 0x0F, 0xFF, 0xF0, 0xBF, 0x0F, 0x02, 0xE4, 0xF0, 0x90, 0x92, 0x66, 0xE0,
-0x90, 0x04, 0x7F, 0xF0, 0x90, 0x92, 0x56, 0xE0, 0x7F, 0x04, 0x70, 0x03, 0x02, 0xB8, 0xBA, 0x12,
-0x87, 0xBB, 0x22, 0xF5, 0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54,
-0x0F, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x92, 0x01, 0xE0, 0xFD, 0x70, 0x02, 0x21, 0x68, 0x90, 0x85,
-0x1D, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x85,
-0x1E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01,
-0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x93, 0x17, 0xE0, 0x31, 0x9A, 0x08, 0x80, 0x05, 0xC3,
-0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x70, 0x02, 0x21, 0x4B, 0xE4, 0x90, 0x92,
-0x02, 0xF0, 0x90, 0x92, 0x02, 0xE0, 0xF9, 0xC3, 0x94, 0x04, 0x50, 0x40, 0x31, 0x6A, 0xA4, 0xFF,
-0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xD0, 0x31, 0x72, 0x90, 0x84,
-0xCD, 0x12, 0x05, 0x28, 0xE5, 0x82, 0x29, 0x11, 0x53, 0xEF, 0x31, 0x69, 0xA4, 0x2D, 0xFF, 0xEC,
-0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x31, 0x72, 0x90, 0x84, 0xD1, 0x12, 0x05, 0x28, 0xE5, 0x82, 0x29,
-0x11, 0x53, 0xEF, 0xF0, 0x90, 0x92, 0x02, 0xE0, 0x04, 0xF0, 0x80, 0xB6, 0x90, 0x92, 0x01, 0xE0,
-0xFF, 0x90, 0x93, 0x17, 0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8,
-0xFC, 0xF4, 0x5F, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0xFF, 0x74, 0x01, 0xA8, 0x07,
-0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0x04,
-0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x85, 0x1E, 0xF1, 0xB5, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF,
-0x70, 0x02, 0x01, 0x65, 0xE4, 0x90, 0x85, 0x1E, 0xF0, 0x01, 0x65, 0x90, 0x01, 0xC0, 0xE0, 0x44,
-0x02, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0x44, 0x80, 0x90, 0x00, 0x8A, 0x31, 0x69, 0x90, 0x01, 0xD0,
-0x12, 0x05, 0x28, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22, 0xF0, 0x90, 0x93, 0x17, 0xE0, 0x75, 0xF0,
-0x04, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x85, 0x1E, 0xE0,
-0x75, 0xF0, 0x08, 0x22, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x24, 0x75, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
-0xF5, 0x83, 0xE0, 0xFD, 0x7C, 0x00, 0xE5, 0x62, 0x54, 0x07, 0xFF, 0x74, 0x01, 0x7E, 0x00, 0xA8,
-0x07, 0x22, 0xE4, 0xF5, 0x73, 0xEF, 0x14, 0xF5, 0x72, 0xED, 0xFF, 0xE5, 0x72, 0xF5, 0x82, 0x33,
-0x95, 0xE0, 0xF5, 0x83, 0xC3, 0xE5, 0x82, 0x9F, 0x74, 0x80, 0xF8, 0x65, 0x83, 0x98, 0x40, 0x51,
-0xE5, 0x72, 0x78, 0x03, 0xA2, 0xE7, 0x13, 0xD8, 0xFB, 0xFF, 0x33, 0x95, 0xE0, 0xFE, 0xEB, 0xF1,
-0xE0, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE5, 0x83, 0x3E, 0xF5, 0x83, 0xE0, 0xF5, 0x82, 0x75, 0x83,
-0x00, 0xE5, 0x72, 0x31, 0x98, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF,
-0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x13, 0x85, 0x72, 0x74, 0x05, 0x73, 0x90,
-0x92, 0x3E, 0xE0, 0x65, 0x73, 0x60, 0x0A, 0xE5, 0x74, 0xD3, 0x9D, 0x40, 0x04, 0x15, 0x72, 0x80,
-0x98, 0xAF, 0x74, 0x22, 0x7D, 0x01, 0xAF, 0x62, 0xAC, 0x05, 0x90, 0x92, 0x39, 0xEF, 0xF0, 0xFD,
-0xE0, 0xFF, 0x12, 0x8F, 0x5E, 0xE0, 0xF5, 0x6E, 0x54, 0x7F, 0xF5, 0x70, 0x75, 0xF0, 0x12, 0xEF,
-0x90, 0x89, 0x3D, 0x12, 0x05, 0x28, 0xE0, 0xF9, 0x90, 0x92, 0x39, 0xE0, 0xF1, 0xD5, 0xFE, 0xEF,
-0x12, 0x91, 0xDB, 0xE0, 0x54, 0x03, 0xF5, 0x6F, 0xE5, 0x70, 0x90, 0x83, 0x1D, 0x93, 0xFB, 0xED,
-0x71, 0x08, 0xE4, 0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x8B, 0x07, 0xC4, 0x54, 0x03, 0x90, 0x92, 0x3A,
-0xF0, 0x74, 0xCC, 0x2D, 0x51, 0xEA, 0xE5, 0x70, 0xF0, 0x74, 0x4C, 0x2D, 0xF1, 0xC4, 0xE5, 0x6F,
-0xF0, 0xE5, 0x70, 0xD3, 0x9E, 0x40, 0x06, 0x8E, 0x70, 0xAF, 0x06, 0x8F, 0x6E, 0x8C, 0x71, 0xE4,
-0xFF, 0xEF, 0xC3, 0x95, 0x71, 0x50, 0x2F, 0xE5, 0x6E, 0x30, 0xE7, 0x09, 0x85, 0x70, 0x6E, 0x1C,
-0xEC, 0x70, 0x20, 0x80, 0x21, 0xE5, 0x70, 0xD3, 0x99, 0x40, 0x14, 0xAD, 0x01, 0x90, 0x92, 0x39,
-0xE0, 0xFB, 0x90, 0x92, 0x3E, 0xEC, 0xF0, 0xAF, 0x70, 0x31, 0xA2, 0x8F, 0x6E, 0x80, 0x07, 0x89,
-0x6E, 0x80, 0x03, 0x0F, 0x80, 0xCB, 0x90, 0x92, 0x39, 0xE0, 0xFF, 0x12, 0x8F, 0xC5, 0xEF, 0xF0,
-0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x6E, 0xF1, 0xBC, 0x91, 0x0F, 0x7B, 0x01, 0xFA, 0x7D, 0x05, 0x7F,
-0x08, 0x12, 0x96, 0x88, 0x90, 0x92, 0x39, 0xE0, 0xFF, 0x90, 0x91, 0x0B, 0xE5, 0x6F, 0xF0, 0xE4,
-0xFB, 0xAD, 0x6E, 0x02, 0x27, 0x3D, 0x74, 0xCC, 0x25, 0x6E, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5,
-0x83, 0x22, 0xE5, 0x71, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4,
-0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x6E, 0x25, 0xE0, 0x24, 0x7B, 0xF5, 0x82, 0xE4, 0x34,
-0x8F, 0xF5, 0x83, 0x22, 0x90, 0x92, 0x39, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0xEB,
-0x75, 0xF0, 0x06, 0xA4, 0xFF, 0x90, 0x89, 0x21, 0x12, 0x87, 0x70, 0xE9, 0x2F, 0xF9, 0xEA, 0x35,
-0xF0, 0xFA, 0x90, 0x92, 0x41, 0x12, 0x87, 0x79, 0x90, 0x92, 0x3B, 0xE0, 0x71, 0x08, 0xE0, 0xFF,
-0xA3, 0xE0, 0x90, 0x92, 0x3E, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x92, 0x41,
-0x12, 0x87, 0x70, 0x90, 0x92, 0x40, 0xE0, 0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x12, 0x03, 0x0F,
-0xFD, 0x7C, 0x00, 0x90, 0x92, 0x3B, 0xE0, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x44, 0x12, 0x05, 0x28,
-0x75, 0xF0, 0x02, 0xEF, 0x91, 0x07, 0xFF, 0x90, 0x92, 0x3D, 0xE0, 0xFB, 0xEF, 0xA8, 0x03, 0x08,
-0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x71, 0xF7, 0xEE, 0x8F, 0xF0, 0x12, 0x07,
-0x0A, 0x90, 0x92, 0x40, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x05, 0xB2, 0x90, 0x92, 0x41, 0x12, 0x87,
-0x70, 0x90, 0x00, 0x05, 0x12, 0x03, 0x0F, 0xFD, 0x7C, 0x00, 0x90, 0x92, 0x3D, 0xE0, 0xFF, 0x90,
-0x92, 0x39, 0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13,
-0xD8, 0xF9, 0x71, 0xF7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x9E, 0x40, 0x08, 0xED,
-0x9F, 0xFF, 0xEC, 0x9E, 0xFE, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x00, 0x90, 0x92, 0x3E, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x3E, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x3B, 0xE0, 0x71,
-0x08, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xFF, 0x12, 0x03, 0x70, 0x90, 0x92, 0x3E, 0x22, 0x75,
-0xF0, 0x12, 0xE5, 0x62, 0x90, 0x89, 0x40, 0x12, 0x05, 0x28, 0xE0, 0xFE, 0xA3, 0xE0, 0x22, 0xF0,
-0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x92,
-0xEA, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0x91, 0x0F, 0x90, 0x92, 0xF2, 0xF0, 0xA3,
-0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x16, 0xF0, 0x74, 0xAC, 0xA3, 0xF0, 0x90, 0x01, 0x1F,
-0xE0, 0xFE, 0x90, 0x01, 0x1E, 0xF1, 0x57, 0xEC, 0x3E, 0x90, 0x92, 0xE1, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x02, 0x87, 0xE0, 0x90, 0x92, 0xE9, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0x20, 0xE0, 0x02, 0xC1,
-0xFD, 0xE4, 0x90, 0x92, 0xE8, 0xF0, 0x90, 0x92, 0xE9, 0xE0, 0xFF, 0x90, 0x92, 0xE8, 0xE0, 0xC3,
-0x9F, 0x40, 0x02, 0xC1, 0xFD, 0x90, 0x92, 0xE1, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF, 0x90,
-0xFD, 0x11, 0xF0, 0x90, 0x92, 0xF2, 0xEF, 0xF0, 0xF1, 0x92, 0xF5, 0x83, 0xE0, 0xFE, 0xF1, 0x44,
-0xF1, 0xCC, 0x54, 0x3F, 0xFE, 0x90, 0x92, 0xE3, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0xEE, 0xEE,
-0xF0, 0xA3, 0xF1, 0xA7, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0xF1, 0x9B, 0x54, 0x03,
-0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x92, 0xF3, 0xF0, 0x90, 0x92, 0xE2, 0xE0, 0x2F, 0xFF,
-0x90, 0x92, 0xE1, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x92, 0xE5, 0xF1, 0x29, 0xC0, 0x07, 0xF1, 0x0E,
-0x7D, 0x01, 0x12, 0x55, 0x36, 0xC0, 0x07, 0xF1, 0x0E, 0x7D, 0x04, 0x12, 0x55, 0x36, 0xAB, 0x07,
-0xD0, 0x05, 0xD0, 0x07, 0x12, 0x5D, 0x98, 0x90, 0x92, 0xEA, 0xEF, 0xF1, 0x0D, 0xE4, 0xFD, 0x12,
-0x55, 0x36, 0xEF, 0x54, 0xFC, 0x90, 0x92, 0xE7, 0xF0, 0x90, 0x92, 0xF3, 0xE0, 0xFF, 0x90, 0x92,
-0xE3, 0xE4, 0x8F, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x92, 0xE3, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12,
-0x7A, 0xD0, 0x90, 0x92, 0xE3, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xF1, 0x3B, 0x7D, 0x0F, 0x12, 0x55,
-0x36, 0x90, 0x92, 0xE3, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x92, 0xE1, 0xEC, 0x8D, 0xF0, 0x12,
-0x07, 0x0A, 0x90, 0x85, 0xB7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x92, 0xE2, 0xE0, 0x9D,
-0x90, 0x92, 0xE1, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x85, 0xB8, 0xE0, 0x24, 0x01, 0xFD, 0x90, 0x85,
-0xB7, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x92, 0xE2, 0xE0, 0x9D, 0xF0, 0x90, 0x92, 0xE1, 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, 0x92, 0xE7, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x2C, 0x90, 0x86, 0x75, 0xE0,
-0xFF, 0x12, 0x8D, 0x59, 0x20, 0xE0, 0x02, 0xC1, 0x81, 0x90, 0x86, 0x87, 0xE0, 0x04, 0xF1, 0x0D,
-0x12, 0x59, 0x20, 0xEF, 0x70, 0x02, 0xC1, 0x81, 0x90, 0x92, 0xE7, 0xE0, 0xFF, 0x12, 0x7B, 0x77,
-0x90, 0x86, 0x88, 0xE0, 0x04, 0xF0, 0xC1, 0x81, 0x12, 0x9F, 0xD3, 0x30, 0xE0, 0x5A, 0x90, 0x92,
-0xEA, 0xE0, 0xFF, 0x90, 0x92, 0xE6, 0xE0, 0x2F, 0xFF, 0x90, 0x92, 0xE5, 0xE0, 0x34, 0x00, 0xCF,
-0x24, 0x08, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x92, 0xF0, 0xF1, 0x29, 0xEF, 0x64, 0x45, 0x70, 0x38,
-0xF1, 0x18, 0x12, 0xC7, 0x6A, 0xEF, 0x64, 0x01, 0x70, 0x2E, 0xF1, 0x18, 0x12, 0xC7, 0x2D, 0xEF,
-0x64, 0x01, 0x70, 0x24, 0x90, 0x92, 0xF4, 0x04, 0xF1, 0x17, 0xA3, 0xE0, 0xFD, 0x12, 0xC6, 0x86,
-0xEF, 0x70, 0x0D, 0x90, 0x92, 0xF2, 0xE0, 0xFD, 0x90, 0xFD, 0x11, 0xF1, 0x17, 0x12, 0xC6, 0xDE,
-0x90, 0x92, 0xF2, 0xE0, 0x90, 0xFD, 0x11, 0xF0, 0xF1, 0x0E, 0x12, 0x59, 0x20, 0xEF, 0x60, 0x18,
-0xF1, 0x0E, 0x90, 0x92, 0xEA, 0xE0, 0xFD, 0x90, 0x92, 0xED, 0xE0, 0xFB, 0x12, 0x54, 0x02, 0xEF,
-0x60, 0x06, 0x90, 0x92, 0xF4, 0x74, 0x01, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0xC3, 0x13, 0x30, 0xE0,
-0x13, 0xF1, 0x0E, 0x90, 0x92, 0xEA, 0xE0, 0xFD, 0x12, 0x38, 0x10, 0xEF, 0x60, 0x06, 0x90, 0x92,
-0xF4, 0x74, 0x01, 0xF0, 0x12, 0x8F, 0xDF, 0x54, 0x3F, 0x30, 0xE0, 0x0A, 0xF1, 0x0E, 0x90, 0x92,
-0xEA, 0xE0, 0xFD, 0x12, 0x21, 0xB6, 0x90, 0x86, 0x72, 0xE0, 0xFF, 0x12, 0x8D, 0x59, 0x30, 0xE0,
-0x10, 0x90, 0x92, 0xF4, 0xE0, 0x70, 0x0A, 0xF1, 0x0E, 0x90, 0x92, 0xEA, 0xE0, 0xFD, 0x12, 0x4A,
+0x12, 0x7C, 0x72, 0xB1, 0xEB, 0x54, 0x01, 0xFF, 0x12, 0x7C, 0x7E, 0xB1, 0xEB, 0x13, 0x54, 0x01,
+0xFF, 0x12, 0x66, 0xDA, 0x90, 0x86, 0x72, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x01, 0xFF, 0xB1, 0xFF,
+0x90, 0x86, 0x72, 0xE0, 0x54, 0x01, 0xFF, 0x91, 0xDB, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x4D, 0xFF,
+0x90, 0x86, 0x72, 0xF0, 0xEE, 0x22, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x54, 0x02, 0xFF,
+0xEE, 0x54, 0xFD, 0x4F, 0xFF, 0xF0, 0x12, 0x02, 0xF6, 0xFE, 0x22, 0x90, 0x86, 0x72, 0xE0, 0x13,
+0x13, 0x22, 0x22, 0x90, 0x86, 0x72, 0x12, 0x9D, 0x41, 0x30, 0xE0, 0x02, 0x71, 0xE6, 0x22, 0xEF,
+0x60, 0x04, 0xD1, 0x07, 0xD1, 0xA4, 0x22, 0xE4, 0xFD, 0xFC, 0x90, 0x88, 0xD8, 0xE0, 0xFF, 0xF1,
+0xC2, 0xAB, 0x05, 0x74, 0x01, 0x2B, 0xF1, 0x7A, 0x2B, 0xF1, 0x72, 0x12, 0xB7, 0xBD, 0x90, 0x88,
+0x76, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
+0xFE, 0x74, 0x02, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xD1, 0x9B, 0x90, 0x88, 0x78, 0xF0, 0xA3,
+0xEF, 0xF0, 0x74, 0x05, 0x2B, 0xF1, 0x6A, 0xE0, 0xFE, 0x74, 0x04, 0x2B, 0xF5, 0x82, 0xE4, 0x34,
+0xFC, 0xD1, 0x9B, 0x90, 0x88, 0x7A, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x07, 0x2B, 0xF5, 0x82, 0xE4,
+0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x06, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xD1, 0x9B,
+0x90, 0x88, 0x7C, 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, 0x88, 0x7E, 0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xF5, 0x83, 0xE0, 0x24, 0x00,
+0xFF, 0xEA, 0x3E, 0x22, 0x90, 0x88, 0xD9, 0xF1, 0x42, 0x12, 0xCA, 0xE5, 0xFD, 0x90, 0x92, 0x07,
+0xE0, 0x24, 0x2C, 0x12, 0xC9, 0xE5, 0x90, 0x92, 0x07, 0xE0, 0x2F, 0x24, 0x30, 0xA3, 0xF0, 0xE0,
+0xFD, 0x24, 0x04, 0xF1, 0xBA, 0xE0, 0xFE, 0x74, 0x05, 0x2D, 0xF1, 0x6A, 0xF1, 0x63, 0xEC, 0x3E,
+0x90, 0x88, 0x80, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x08, 0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34,
+0xFC, 0xF1, 0x53, 0x75, 0x1E, 0x04, 0x7B, 0x01, 0x7A, 0x88, 0x79, 0x82, 0x12, 0x6A, 0x21, 0x90,
+0x92, 0x08, 0xE0, 0x24, 0x14, 0xF0, 0xE0, 0xFD, 0x24, 0x01, 0xF1, 0x7A, 0x2D, 0xF1, 0x72, 0xF1,
+0x63, 0xEC, 0x3E, 0x90, 0x88, 0x86, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x88, 0xDA, 0xF1, 0x42, 0x90,
+0x88, 0x7C, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x4E, 0x60, 0x11, 0x90, 0x92, 0x07, 0xE0, 0xF1, 0x4D,
+0x8F, 0x1E, 0x7B, 0x01, 0x7A, 0x88, 0x79, 0x8A, 0x12, 0x6A, 0x21, 0x90, 0x88, 0xDB, 0xF1, 0x42,
+0xF1, 0x4D, 0x90, 0x88, 0x7E, 0xA3, 0xE0, 0xF5, 0x1E, 0x7B, 0x01, 0x7A, 0x88, 0x79, 0xAA, 0x02,
+0x6A, 0x21, 0xE0, 0xFF, 0x12, 0x7B, 0x2A, 0x90, 0x92, 0x07, 0xEF, 0xF0, 0x22, 0x24, 0x00, 0xF9,
+0xE4, 0x34, 0xFC, 0x75, 0x1B, 0x01, 0xF5, 0x1C, 0x89, 0x1D, 0x22, 0x90, 0x01, 0x17, 0xE0, 0xFE,
+0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE0, 0xFE, 0x74, 0x00, 0x22, 0xE4, 0xFD, 0xFF, 0x02, 0x6E, 0x5F, 0xE4, 0xFD, 0xFF, 0x02,
+0xA6, 0xF8, 0xE0, 0x54, 0xFE, 0x4E, 0xFE, 0xF0, 0xEF, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x54, 0x01,
+0xFE, 0x22, 0x54, 0x08, 0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0x22, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF,
+0x4E, 0x22, 0x54, 0x80, 0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0x22, 0x12, 0x7B, 0x2A, 0x7C, 0x00, 0xAD, 0x07, 0x22, 0x90, 0x86, 0x72, 0xE0, 0x54, 0xBF,
+0xF0, 0x22, 0x25, 0xE0, 0x25, 0xE0, 0xFE, 0xEF, 0x4E, 0x22, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x01,
+0xE0, 0x22, 0x90, 0x01, 0xCC, 0xE0, 0x54, 0x0F, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x92, 0x01, 0xE0,
+0xFD, 0x70, 0x03, 0x02, 0xB0, 0xDF, 0x90, 0x85, 0x1D, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64,
+0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x85, 0x1E, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80,
+0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0x90, 0x93,
+0x8A, 0xE0, 0x31, 0x2E, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF,
+0x5D, 0x70, 0x02, 0x01, 0xC1, 0xE4, 0x90, 0x92, 0x02, 0xF0, 0x90, 0x92, 0x02, 0xE0, 0xF9, 0xC3,
+0x94, 0x04, 0x50, 0x31, 0x11, 0xE0, 0xA4, 0xFF, 0xE9, 0xFD, 0x7C, 0x00, 0x2F, 0xFF, 0xEC, 0x35,
+0xF0, 0xFE, 0x74, 0xD0, 0x11, 0xF8, 0x90, 0x84, 0xCD, 0x11, 0xE8, 0x11, 0xE0, 0xA4, 0x2D, 0xFF,
+0xEC, 0x35, 0xF0, 0xFE, 0x74, 0xF0, 0x11, 0xF8, 0x90, 0x84, 0xD1, 0x11, 0xE8, 0x90, 0x92, 0x02,
+0xE0, 0x04, 0xF0, 0x80, 0xC5, 0x90, 0x92, 0x01, 0xE0, 0xFF, 0x90, 0x93, 0x8A, 0x31, 0x10, 0x80,
+0x02, 0xC3, 0x33, 0xD8, 0xFC, 0xF4, 0x5F, 0x90, 0x92, 0x01, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0xFF,
+0x74, 0x01, 0xA8, 0x07, 0x08, 0x80, 0x02, 0xC3, 0x33, 0xD8, 0xFC, 0x90, 0x01, 0xCC, 0xF0, 0x90,
+0x93, 0x8A, 0xE0, 0x04, 0xF0, 0xE0, 0x54, 0x03, 0xF0, 0x90, 0x85, 0x1E, 0xF1, 0xA6, 0xB4, 0x0A,
+0x02, 0x7F, 0x01, 0xEF, 0x70, 0x03, 0x02, 0xAF, 0xEC, 0xE4, 0x90, 0x85, 0x1E, 0xF0, 0x02, 0xAF,
+0xEC, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x02, 0xF0, 0x90, 0x93, 0x8A, 0xE0, 0x44, 0x80, 0x90, 0x00,
+0x8A, 0xF0, 0x11, 0xE0, 0x90, 0x01, 0xD0, 0x12, 0x05, 0x28, 0xE0, 0x90, 0x01, 0xC3, 0xF0, 0x22,
+0x90, 0x93, 0x8A, 0xE0, 0x75, 0xF0, 0x04, 0x22, 0x12, 0x05, 0x28, 0xE5, 0x82, 0x29, 0xF5, 0x82,
+0xE4, 0x35, 0x83, 0xF5, 0x83, 0xEF, 0xF0, 0x22, 0x2F, 0xF5, 0x82, 0x74, 0x01, 0x3E, 0xF5, 0x83,
+0xE0, 0xFF, 0x90, 0x85, 0x1E, 0xE0, 0x75, 0xF0, 0x08, 0x22, 0x75, 0xF0, 0x03, 0x12, 0x05, 0x28,
+0xE0, 0xFE, 0x74, 0x01, 0xA8, 0x06, 0x08, 0x22, 0x13, 0x13, 0x13, 0x54, 0x1F, 0x24, 0x75, 0xF5,
+0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFD, 0x7C, 0x00, 0xE5, 0x63, 0x54, 0x07, 0xFF, 0x74,
+0x01, 0x7E, 0x00, 0xA8, 0x07, 0x22, 0xE4, 0xF5, 0x74, 0xEF, 0x14, 0xF5, 0x73, 0xED, 0xFF, 0xE5,
+0x73, 0xF5, 0x82, 0x33, 0x95, 0xE0, 0xF5, 0x83, 0xC3, 0xE5, 0x82, 0x9F, 0x74, 0x80, 0xF8, 0x65,
+0x83, 0x98, 0x40, 0x52, 0xE5, 0x73, 0x78, 0x03, 0xA2, 0xE7, 0x13, 0xD8, 0xFB, 0xFF, 0x33, 0x95,
+0xE0, 0xFE, 0xEB, 0x12, 0xD1, 0x21, 0xE5, 0x82, 0x2F, 0xF5, 0x82, 0xE5, 0x83, 0x3E, 0xF5, 0x83,
+0xE0, 0xF5, 0x82, 0x75, 0x83, 0x00, 0xE5, 0x73, 0x31, 0x2C, 0x08, 0x80, 0x05, 0xC3, 0x33, 0xCE,
+0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEE, 0x55, 0x83, 0xFE, 0xEF, 0x55, 0x82, 0x4E, 0x60, 0x13, 0x85,
+0x73, 0x75, 0x05, 0x74, 0x90, 0x92, 0x56, 0xE0, 0x65, 0x74, 0x60, 0x0A, 0xE5, 0x75, 0xD3, 0x9D,
+0x40, 0x04, 0x15, 0x73, 0x80, 0x97, 0xAF, 0x75, 0x22, 0xE4, 0xF5, 0x78, 0x90, 0x85, 0xBB, 0xE0,
+0xFF, 0xE5, 0x78, 0xC3, 0x9F, 0x50, 0x63, 0xAF, 0x78, 0x12, 0x77, 0x39, 0xEF, 0x60, 0x57, 0xE5,
+0x78, 0x13, 0x13, 0x13, 0x54, 0x1F, 0xFF, 0xE5, 0x78, 0x54, 0x07, 0xFE, 0x74, 0x75, 0x2F, 0xF5,
+0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0xE0, 0xFD, 0xAF, 0x06, 0x31, 0x2F, 0x08, 0x80, 0x05, 0xC3,
+0x33, 0xCE, 0x33, 0xCE, 0xD8, 0xF9, 0xFF, 0xEF, 0x5D, 0x60, 0x2B, 0xE5, 0x78, 0x12, 0xD1, 0x70,
+0x20, 0xE7, 0x02, 0x80, 0x13, 0xE5, 0x78, 0xC4, 0x54, 0xF0, 0x24, 0x02, 0xF5, 0x82, 0xE4, 0x34,
+0x81, 0xF5, 0x83, 0xE0, 0xFF, 0x20, 0xE7, 0x09, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x20, 0xF0, 0x80,
+0x05, 0xAD, 0x78, 0x12, 0x90, 0xE3, 0x05, 0x78, 0x80, 0x92, 0x22, 0x7D, 0x01, 0xAF, 0x63, 0xAC,
+0x05, 0x90, 0x92, 0x51, 0xEF, 0xF0, 0xFD, 0xE0, 0xFF, 0x12, 0x91, 0x68, 0xE0, 0xF5, 0x6F, 0x54,
+0x7F, 0xF5, 0x71, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x3D, 0x12, 0x05, 0x28, 0xE0, 0xF9, 0x90,
+0x92, 0x51, 0xE0, 0xF1, 0xD0, 0xFE, 0xEF, 0x12, 0x90, 0xD6, 0xE0, 0x54, 0x03, 0xF5, 0x70, 0xE5,
+0x71, 0x90, 0x83, 0x1D, 0x93, 0xFB, 0xED, 0x71, 0x1A, 0xE4, 0xF0, 0xA3, 0xEB, 0xF0, 0x12, 0x8B,
+0x12, 0xC4, 0x54, 0x03, 0x90, 0x92, 0x52, 0xF0, 0x74, 0xCC, 0x2D, 0x51, 0xFC, 0xE5, 0x71, 0xF0,
+0x74, 0x4C, 0x2D, 0xF1, 0xB5, 0xE5, 0x70, 0xF0, 0xE5, 0x71, 0xD3, 0x9E, 0x40, 0x06, 0x8E, 0x71,
+0xAF, 0x06, 0x8F, 0x6F, 0x8C, 0x72, 0xE4, 0xFF, 0xEF, 0xC3, 0x95, 0x72, 0x50, 0x2F, 0xE5, 0x6F,
+0x30, 0xE7, 0x09, 0x85, 0x71, 0x6F, 0x1C, 0xEC, 0x70, 0x20, 0x80, 0x21, 0xE5, 0x71, 0xD3, 0x99,
+0x40, 0x14, 0xAD, 0x01, 0x90, 0x92, 0x51, 0xE0, 0xFB, 0x90, 0x92, 0x56, 0xEC, 0xF0, 0xAF, 0x71,
+0x31, 0x36, 0x8F, 0x6F, 0x80, 0x07, 0x89, 0x6F, 0x80, 0x03, 0x0F, 0x80, 0xCB, 0x90, 0x92, 0x51,
+0xE0, 0xFF, 0x51, 0xF1, 0xEF, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0xE5, 0x6F, 0xF1, 0xAD, 0x91, 0x0F,
+0x7B, 0x01, 0xFA, 0x7D, 0x05, 0x7F, 0x08, 0x12, 0x96, 0x06, 0x90, 0x92, 0x51, 0xE0, 0xFF, 0x90,
+0x91, 0x0B, 0xE5, 0x70, 0xF0, 0xE4, 0xFB, 0xAD, 0x6F, 0x02, 0x27, 0x3D, 0xE4, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0x92, 0x57, 0xE4, 0xF0, 0xA3, 0x22, 0x74, 0xCC, 0x25, 0x6F, 0xF5, 0x82, 0xE4, 0x34,
+0x90, 0xF5, 0x83, 0x22, 0xE5, 0x72, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5,
+0x83, 0xE4, 0x93, 0xFE, 0x74, 0x01, 0x93, 0xFF, 0xE5, 0x6F, 0x25, 0xE0, 0x24, 0x7B, 0xF5, 0x82,
+0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0x90, 0x92, 0x51, 0xF1, 0xDE, 0xEB, 0x75, 0xF0, 0x06, 0xA4,
+0xFF, 0x90, 0x89, 0x21, 0x12, 0x87, 0x70, 0xE9, 0x2F, 0xF9, 0xEA, 0x35, 0xF0, 0xFA, 0x90, 0x92,
+0x59, 0x12, 0x87, 0x79, 0x90, 0x92, 0x53, 0xE0, 0x71, 0x1A, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92,
+0x56, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xA3, 0xF0, 0x90, 0x92, 0x59, 0x12, 0x87, 0x70, 0x90,
+0x92, 0x58, 0xE0, 0xFF, 0xF5, 0x82, 0x75, 0x83, 0x00, 0x12, 0x03, 0x0F, 0xFD, 0x7C, 0x00, 0x90,
+0x92, 0x53, 0xE0, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x44, 0x12, 0x05, 0x28, 0x75, 0xF0, 0x02, 0xEF,
+0x12, 0x05, 0x28, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x55, 0xE0, 0xFB, 0xEF, 0xA8, 0x03,
+0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9, 0x91, 0x05, 0xEE, 0x8F, 0xF0, 0x12,
+0x07, 0x0A, 0x90, 0x92, 0x58, 0xE0, 0x04, 0xF0, 0xE0, 0xB4, 0x05, 0xAD, 0x90, 0x92, 0x59, 0x12,
+0x87, 0x70, 0x12, 0x8F, 0xED, 0xFD, 0x7C, 0x00, 0x90, 0x92, 0x55, 0xE0, 0xFF, 0x90, 0x92, 0x51,
+0xE0, 0xFE, 0xA3, 0xE0, 0xA8, 0x07, 0x08, 0x80, 0x05, 0xCE, 0xC3, 0x13, 0xCE, 0x13, 0xD8, 0xF9,
+0x91, 0x05, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x9F, 0xEC, 0x9E, 0x40, 0x08, 0xED, 0x9F, 0xFF,
+0xEC, 0x9E, 0xFE, 0x80, 0x04, 0x7E, 0x00, 0x7F, 0x00, 0x90, 0x92, 0x56, 0xEE, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0x92, 0x56, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x90, 0x92, 0x53, 0xE0, 0x71, 0x1A, 0xEE,
+0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0xFF, 0x12, 0x03, 0x70, 0x90, 0x92, 0x56, 0x22, 0x21, 0xA9, 0xF0,
+0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0x90, 0x93,
+0x3B, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x08, 0xF0, 0xA3, 0x91, 0x0F, 0x90, 0x93, 0x43, 0xF0, 0xA3,
+0xF0, 0xA3, 0xF0, 0x90, 0x01, 0xC4, 0x74, 0x16, 0xF0, 0x74, 0xB4, 0xA3, 0xF0, 0x90, 0x01, 0x1F,
+0xE0, 0xFE, 0x90, 0x01, 0x1E, 0x12, 0xAF, 0x63, 0xEC, 0x3E, 0x90, 0x93, 0x32, 0xF0, 0xA3, 0xEF,
+0xF0, 0x90, 0x02, 0x87, 0xE0, 0x90, 0x93, 0x3A, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0x20, 0xE0, 0x02,
+0xC1, 0xFD, 0xE4, 0x90, 0x93, 0x39, 0xF0, 0x90, 0x93, 0x3A, 0xE0, 0xFF, 0x90, 0x93, 0x39, 0xE0,
+0xC3, 0x9F, 0x40, 0x02, 0xC1, 0xFD, 0x90, 0x93, 0x32, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xEC, 0xFF,
+0x90, 0xFD, 0x11, 0xF0, 0x90, 0x93, 0x43, 0xEF, 0xF0, 0xF1, 0x83, 0xF5, 0x83, 0xE0, 0xFE, 0xF1,
+0x44, 0xF1, 0xBD, 0x54, 0x3F, 0xFE, 0x90, 0x93, 0x34, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x93, 0x3F,
+0xEE, 0xF0, 0xA3, 0xF1, 0x98, 0x54, 0x0F, 0x33, 0x33, 0x33, 0x54, 0xF8, 0xFF, 0xF1, 0x8C, 0x54,
+0x03, 0xFE, 0xEF, 0x24, 0x18, 0x2E, 0xFF, 0x90, 0x93, 0x44, 0xF0, 0x90, 0x93, 0x33, 0xE0, 0x2F,
+0xFF, 0x90, 0x93, 0x32, 0xE0, 0x34, 0x00, 0xFE, 0x90, 0x93, 0x36, 0xF1, 0x29, 0xC0, 0x07, 0xF1,
+0x0E, 0x7D, 0x01, 0x12, 0x55, 0x36, 0xC0, 0x07, 0xF1, 0x0E, 0x7D, 0x04, 0x12, 0x55, 0x36, 0xAB,
+0x07, 0xD0, 0x05, 0xD0, 0x07, 0x12, 0x5D, 0x98, 0x90, 0x93, 0x3B, 0xEF, 0xF1, 0x0D, 0xE4, 0xFD,
+0x12, 0x55, 0x36, 0xEF, 0x54, 0xFC, 0x90, 0x93, 0x38, 0xF0, 0x90, 0x93, 0x44, 0xE0, 0xFF, 0x90,
+0x93, 0x34, 0xE4, 0x8F, 0xF0, 0x12, 0x07, 0x0A, 0x90, 0x93, 0x34, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
+0x12, 0x7A, 0xD0, 0x90, 0x93, 0x34, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xF1, 0x3B, 0x7D, 0x0F, 0x12,
+0x55, 0x36, 0x90, 0x93, 0x34, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x90, 0x93, 0x32, 0xEC, 0x8D, 0xF0,
+0x12, 0x07, 0x0A, 0x90, 0x85, 0xB7, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0xD3, 0x90, 0x93, 0x33, 0xE0,
+0x9D, 0x90, 0x93, 0x32, 0xE0, 0x9C, 0x40, 0x1B, 0x90, 0x85, 0xB8, 0xE0, 0x24, 0x01, 0xFD, 0x90,
+0x85, 0xB7, 0xE0, 0x34, 0x00, 0xFC, 0xC3, 0x90, 0x93, 0x33, 0xE0, 0x9D, 0xF0, 0x90, 0x93, 0x32,
+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, 0x93, 0x38, 0xE0, 0x24, 0x40, 0x60, 0x04, 0x24, 0x20, 0x70, 0x2C, 0x90, 0x86, 0x75,
+0xE0, 0xFF, 0x12, 0x8E, 0x8B, 0x20, 0xE0, 0x02, 0xC1, 0x81, 0x90, 0x86, 0x87, 0xE0, 0x04, 0xF1,
+0x0D, 0x12, 0x59, 0x20, 0xEF, 0x70, 0x02, 0xC1, 0x81, 0x90, 0x93, 0x38, 0xE0, 0xFF, 0x12, 0x7B,
+0x77, 0x90, 0x86, 0x88, 0xE0, 0x04, 0xF0, 0xC1, 0x81, 0xF1, 0xC6, 0x30, 0xE0, 0x5A, 0x90, 0x93,
+0x3B, 0xE0, 0xFF, 0x90, 0x93, 0x37, 0xE0, 0x2F, 0xFF, 0x90, 0x93, 0x36, 0xE0, 0x34, 0x00, 0xCF,
+0x24, 0x08, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x93, 0x41, 0xF1, 0x29, 0xEF, 0x64, 0x45, 0x70, 0x38,
+0xF1, 0x18, 0x12, 0xCA, 0xA1, 0xEF, 0x64, 0x01, 0x70, 0x2E, 0xF1, 0x18, 0x12, 0xCB, 0x28, 0xEF,
+0x64, 0x01, 0x70, 0x24, 0x90, 0x93, 0x45, 0x04, 0xF1, 0x17, 0xA3, 0xE0, 0xFD, 0x12, 0xCF, 0xE7,
+0xEF, 0x70, 0x0D, 0x90, 0x93, 0x43, 0xE0, 0xFD, 0x90, 0xFD, 0x11, 0xF1, 0x17, 0x12, 0xD0, 0x35,
+0x90, 0x93, 0x43, 0xE0, 0x90, 0xFD, 0x11, 0xF0, 0xF1, 0x0E, 0x12, 0x59, 0x20, 0xEF, 0x60, 0x18,
+0xF1, 0x0E, 0x90, 0x93, 0x3B, 0xE0, 0xFD, 0x90, 0x93, 0x3E, 0xE0, 0xFB, 0x12, 0x54, 0x02, 0xEF,
+0x60, 0x06, 0x90, 0x93, 0x45, 0x74, 0x01, 0xF0, 0x90, 0x86, 0x72, 0xE0, 0xC3, 0x13, 0x30, 0xE0,
+0x13, 0xF1, 0x0E, 0x90, 0x93, 0x3B, 0xE0, 0xFD, 0x12, 0x38, 0x10, 0xEF, 0x60, 0x06, 0x90, 0x93,
+0x45, 0x74, 0x01, 0xF0, 0x12, 0xAD, 0xEB, 0x54, 0x3F, 0x30, 0xE0, 0x0A, 0xF1, 0x0E, 0x90, 0x93,
+0x3B, 0xE0, 0xFD, 0x12, 0x21, 0xB6, 0x90, 0x86, 0x72, 0xE0, 0xFF, 0x12, 0x8E, 0x8B, 0x30, 0xE0,
+0x10, 0x90, 0x93, 0x45, 0xE0, 0x70, 0x0A, 0xF1, 0x0E, 0x90, 0x93, 0x3B, 0xE0, 0xFD, 0x12, 0x4A,
0x3F, 0x12, 0x79, 0x00, 0xEF, 0x64, 0x01, 0x60, 0x07, 0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x10,
0xF1, 0x32, 0x30, 0xE0, 0x06, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x7F, 0x01, 0x12, 0x5F, 0xE9,
0x90, 0x01, 0x3F, 0xE0, 0x30, 0xE2, 0x02, 0xF1, 0x21, 0x12, 0x7A, 0xE7, 0xEF, 0x64, 0x01, 0x70,
@@ -3082,423 +3509,449 @@ u1Byte Array_MP_8188F_FW_WoWLAN[] = { 0x1F, 0xF1, 0x21, 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, 0x5F, 0xE9, 0x80, 0x1D,
0xF1, 0x3B, 0x12, 0x7C, 0x0B, 0x80, 0x0E, 0xF1, 0x32, 0x20, 0xE0, 0x11, 0x90, 0x86, 0x72, 0xE0,
-0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x92, 0xE8, 0xE0, 0x04, 0xF0, 0x81, 0x66, 0x74, 0x16, 0x04,
-0x90, 0x01, 0xC4, 0xF0, 0x74, 0xAC, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x92,
-0xE5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xF0, 0x90, 0x92, 0xF0, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
+0x54, 0xFE, 0xF0, 0x80, 0x08, 0x90, 0x93, 0x39, 0xE0, 0x04, 0xF0, 0x81, 0x67, 0x74, 0x16, 0x04,
+0x90, 0x01, 0xC4, 0xF0, 0x74, 0xB4, 0xA3, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF0, 0x90, 0x93,
+0x36, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xF0, 0x90, 0x93, 0x41, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
0x22, 0x90, 0x86, 0x7A, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4, 0xFD, 0x02,
-0x55, 0x36, 0x90, 0x86, 0x74, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x90, 0x92, 0xE1, 0xE0, 0xFE,
-0xA3, 0xE0, 0xFF, 0x22, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0x90,
-0x01, 0x17, 0xE0, 0xFE, 0x90, 0x01, 0x16, 0xE0, 0x7C, 0x00, 0x24, 0x00, 0xFF, 0x22, 0xE4, 0xFC,
-0xED, 0x2C, 0x24, 0x00, 0xF1, 0x47, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, 0xF1, 0x44, 0xEF,
-0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0xF1, 0x92, 0xF5, 0x83, 0xF1, 0xA7, 0x54, 0xF0, 0xF0, 0xF1, 0x9B,
-0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44, 0x10,
-0xF0, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0x22, 0x74, 0x03, 0x2D, 0xF5, 0x82,
-0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4, 0x34,
-0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0xF0, 0xA3, 0xE4, 0xF0,
-0xA3, 0xE5, 0x6F, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x22, 0xE0, 0x7A, 0x00, 0x24,
-0x00, 0xFF, 0xEA, 0x3E, 0x22, 0x75, 0xF0, 0x12, 0x90, 0x89, 0x3C, 0x12, 0x05, 0x28, 0xE0, 0x22,
-0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0x1E, 0xE0, 0xFF, 0x90, 0x85, 0x1D, 0xE0, 0xB5, 0x07,
-0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x70, 0x48, 0x90, 0x85, 0x1D, 0xE0, 0xFE, 0x75,
-0xF0, 0x08, 0x90, 0x84, 0xCD, 0x12, 0x05, 0x28, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24,
-0xCE, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA, 0x7B, 0x01, 0xAF, 0x05, 0x12, 0x88, 0xD7, 0x90, 0x85,
-0x1D, 0x12, 0xAF, 0xB5, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85, 0x1D,
-0xF0, 0x7D, 0x68, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x12, 0x40, 0xB9, 0x90, 0x84, 0xC1, 0xE0, 0x44,
-0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x85, 0xB5, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0,
-0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF, 0x90, 0x85, 0xB6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01,
-0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xC0,
-0x01, 0x90, 0x85, 0xB6, 0xE0, 0x75, 0xF0, 0x0F, 0xA4, 0x24, 0x1F, 0xF9, 0x74, 0x85, 0x35, 0xF0,
-0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01, 0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x02, 0xD0, 0x7D, 0xCC,
-0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xB6, 0x12, 0xAF, 0xB5, 0xB4, 0x0A, 0x02, 0x7F, 0x01,
-0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85, 0xB6, 0xF0, 0x22, 0x90, 0x92, 0x21, 0xEF, 0xF0, 0xA3, 0x12,
-0x87, 0x79, 0x90, 0x93, 0x18, 0xE0, 0xFE, 0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x03, 0x4E,
-0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01,
-0x90, 0x92, 0x22, 0x12, 0x87, 0x70, 0x8B, 0x1B, 0x8A, 0x1C, 0x89, 0x1D, 0x75, 0x1E, 0x02, 0xD0,
-0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x6A, 0x21, 0x90, 0x92, 0x21, 0xE0, 0x24, 0x02, 0xF9, 0xE4,
-0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x87, 0x70, 0xE9,
-0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x1B, 0xF5, 0x1C, 0x89, 0x1D, 0x90, 0x92, 0x22, 0x31, 0x2B,
-0xF5, 0x1E, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x02, 0x6A, 0x21, 0x12, 0x87, 0x70, 0x90, 0x00,
-0x0E, 0x02, 0x03, 0x0F, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x25, 0x12, 0x87,
-0x79, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x66, 0x80, 0xEF, 0x60, 0x48, 0x12, 0xAF, 0x4F, 0xEC, 0x3E,
-0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E, 0xFE, 0x90, 0x92, 0x28, 0xEF, 0xF0, 0xEE, 0xFF, 0x90,
-0xFD, 0x11, 0xF0, 0x90, 0x92, 0x28, 0xE0, 0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90,
-0x92, 0x25, 0x31, 0x2B, 0x24, 0x02, 0xFF, 0xE4, 0x33, 0xFE, 0x12, 0x5A, 0xA5, 0x90, 0x92, 0x28,
-0xE0, 0x24, 0x18, 0xFF, 0x90, 0x92, 0x25, 0x12, 0x87, 0x70, 0x12, 0x56, 0xF4, 0x90, 0x02, 0x96,
-0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x02, 0x8B, 0x13, 0xE4, 0x90, 0x92, 0x2B, 0xF0,
-0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x92, 0x2B, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x9B, 0x90, 0x01, 0xC4,
-0xF0, 0x74, 0xB1, 0xA3, 0xF0, 0x12, 0x7C, 0x66, 0xBF, 0x01, 0x03, 0x12, 0x5B, 0x25, 0x90, 0x85,
-0xC5, 0xE0, 0x60, 0x0F, 0x90, 0x85, 0xC8, 0xE0, 0xFF, 0x90, 0x85, 0xC7, 0xE0, 0x6F, 0x60, 0x03,
-0x12, 0xA5, 0x90, 0xC2, 0xAF, 0xF1, 0x4D, 0xBF, 0x01, 0x02, 0x51, 0x04, 0xD2, 0xAF, 0x71, 0x0D,
-0x90, 0x92, 0x2C, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x54, 0x7F, 0x45, 0xF0, 0x70, 0x0D,
-0x7F, 0xFF, 0x12, 0x7B, 0x51, 0xEF, 0x04, 0xFD, 0x7F, 0xFF, 0x12, 0x7B, 0x3E, 0x31, 0x98, 0x12,
-0x84, 0x4D, 0x80, 0xA0, 0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x85, 0xBC, 0xE0, 0xFF,
-0x30, 0xE0, 0x0E, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0xD1, 0x92, 0xBF, 0x01, 0x06, 0x80, 0x02, 0x80,
-0x00, 0x51, 0x24, 0x22, 0x90, 0x85, 0xC8, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0D, 0x71, 0x71,
-0xBF, 0x01, 0x08, 0x51, 0x3C, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01,
-0xC3, 0xC0, 0xD0, 0x51, 0xBB, 0x51, 0x4C, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xF1, 0x2E, 0x7F, 0x08,
-0x12, 0x7B, 0x51, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x7B, 0x3E, 0xE4, 0xFF, 0x51, 0x6F,
-0x7D, 0x35, 0x7F, 0x27, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xEF, 0xF0, 0x22, 0x90,
-0x93, 0x11, 0xEF, 0x12, 0xAC, 0x0F, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7, 0x02, 0x7F,
-0x01, 0x90, 0x93, 0x11, 0xE0, 0x6F, 0x60, 0x32, 0xC3, 0x90, 0x93, 0x13, 0xE0, 0x94, 0x88, 0x90,
-0x93, 0x12, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0, 0x22, 0x90,
-0x93, 0x12, 0xD1, 0x9F, 0xD3, 0x90, 0x93, 0x13, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x12, 0xE0, 0x94,
-0x00, 0x40, 0xC3, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xBC, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x44,
-0x10, 0xF0, 0x90, 0x85, 0xD0, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xC6, 0xE0,
-0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06, 0x90, 0x01,
-0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x10, 0xFD, 0x7F, 0x08, 0x12,
-0x7B, 0x3E, 0x7F, 0x01, 0x51, 0x6F, 0x7D, 0x34, 0x7F, 0x27, 0x12, 0x7B, 0x3E, 0x7F, 0x90, 0x71,
-0xE6, 0x7F, 0x90, 0x12, 0x7B, 0x3E, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0xD3, 0x10, 0xAF,
-0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x85, 0xE0, 0x60, 0x25, 0x7F, 0x54, 0x7E, 0x09, 0x12, 0x70,
-0x61, 0x71, 0x65, 0xEF, 0x44, 0xFE, 0xFF, 0xEE, 0x44, 0x03, 0xFE, 0xED, 0x44, 0x04, 0xFD, 0xEC,
-0x71, 0x65, 0x90, 0x91, 0x66, 0x12, 0x04, 0xEB, 0x7F, 0x54, 0x7E, 0x09, 0x12, 0x71, 0x18, 0x90,
-0x92, 0x80, 0xE0, 0x70, 0x04, 0x90, 0x07, 0xCC, 0xF0, 0x90, 0x92, 0x88, 0xE0, 0x70, 0x0A, 0x90,
-0x92, 0x85, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x07, 0x90, 0x00, 0x1F, 0xE0, 0x54, 0xF0, 0xF0,
-0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x92, 0x2E, 0x12, 0x04, 0xEB, 0x90, 0x92, 0x2E, 0x02, 0x87,
-0x58, 0x90, 0x92, 0x79, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x48, 0x90, 0x02, 0x87, 0xE0, 0x60, 0x02,
-0x80, 0x08, 0x90, 0x01, 0x00, 0xE0, 0x64, 0x3F, 0x60, 0x05, 0x75, 0x61, 0x01, 0x80, 0x40, 0x90,
-0x86, 0x72, 0xE0, 0x30, 0xE0, 0x0B, 0x90, 0x02, 0x82, 0xE0, 0x60, 0x05, 0x75, 0x61, 0x02, 0x80,
-0x2E, 0x90, 0x86, 0x7A, 0xE0, 0x30, 0xE0, 0x05, 0x75, 0x61, 0x08, 0x80, 0x22, 0x90, 0x02, 0x86,
-0xE0, 0x20, 0xE1, 0x02, 0x80, 0x07, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE3, 0x05, 0x75, 0x61, 0x04,
-0x80, 0x0D, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x05, 0x75, 0x61, 0x40, 0x80, 0x02, 0x80, 0x0F, 0x90,
-0x01, 0xB9, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x61, 0xF0, 0x7F, 0x00, 0x22, 0x90, 0x01,
-0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x01, 0xFD, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x02, 0x71, 0xE6, 0x7F, 0x02, 0xD1, 0x8A, 0x44, 0x02, 0xF0,
-0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74,
-0x86, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x12, 0x90, 0xD8, 0x90, 0x85, 0xBF, 0x74, 0x01, 0xF0,
-0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85, 0xBF, 0xE0, 0x90, 0x93, 0x1E, 0xF0,
-0x6F, 0x70, 0x02, 0xA1, 0x28, 0xEF, 0x14, 0x60, 0x42, 0x14, 0x60, 0x6C, 0x14, 0x70, 0x02, 0x81,
-0xD4, 0x14, 0x70, 0x02, 0x81, 0xFF, 0x24, 0x04, 0x60, 0x02, 0xA1, 0x28, 0x90, 0x93, 0x1E, 0xE0,
-0xB4, 0x04, 0x04, 0xB1, 0x3C, 0xA1, 0x28, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x02, 0x04, 0xB1, 0x2D,
-0xA1, 0x28, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0x53, 0xA1, 0x28, 0x90, 0x93, 0x1E,
-0xE0, 0x64, 0x01, 0x60, 0x02, 0xA1, 0x28, 0xB1, 0x2F, 0xA1, 0x28, 0x90, 0x93, 0x1E, 0xE0, 0xB4,
-0x04, 0x04, 0xB1, 0x40, 0xA1, 0x28, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x02, 0x04, 0x91, 0x17, 0xA1,
-0x28, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0x57, 0xA1, 0x28, 0x90, 0x93, 0x1E, 0xE0,
-0x60, 0x02, 0xA1, 0x28, 0xB1, 0x84, 0xA1, 0x28, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x04, 0x04, 0xB1,
-0xA9, 0x80, 0x75, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x01, 0x05, 0x12, 0x97, 0xED, 0x80, 0x69, 0x90,
-0x93, 0x1E, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0xA1, 0x80, 0x5E, 0x90, 0x93, 0x1E, 0xE0, 0x70, 0x58,
-0xB1, 0xA4, 0x80, 0x54, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x04, 0x04, 0xB1, 0x5F, 0x80, 0x49, 0x90,
-0x93, 0x1E, 0xE0, 0xB4, 0x01, 0x04, 0xB1, 0x98, 0x80, 0x3E, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x02,
-0x04, 0xB1, 0x4A, 0x80, 0x33, 0x90, 0x93, 0x1E, 0xE0, 0x70, 0x2D, 0xB1, 0x96, 0x80, 0x29, 0x90,
-0x93, 0x1E, 0xE0, 0xB4, 0x03, 0x04, 0xB1, 0xB0, 0x80, 0x1E, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x01,
-0x04, 0xB1, 0x88, 0x80, 0x13, 0x90, 0x93, 0x1E, 0xE0, 0xB4, 0x02, 0x04, 0xB1, 0x6A, 0x80, 0x08,
-0x90, 0x93, 0x1E, 0xE0, 0x70, 0x02, 0xB1, 0x86, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x91, 0x17, 0x90,
-0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x85, 0xBF, 0xF0, 0x22, 0xB1, 0x40, 0x80, 0xEF,
-0xE4, 0xFD, 0xFF, 0xB1, 0x7C, 0x44, 0x40, 0xF0, 0x81, 0x1A, 0x71, 0xEE, 0x90, 0x85, 0xBF, 0x74,
-0x03, 0xF0, 0x22, 0xB1, 0x57, 0x80, 0xD8, 0xE4, 0xFD, 0xFF, 0x12, 0x90, 0xDE, 0x81, 0x1A, 0x7D,
-0x22, 0x7F, 0xFF, 0xB1, 0x7C, 0x44, 0x40, 0xF0, 0x80, 0xE2, 0x71, 0xEE, 0x7D, 0x24, 0xB1, 0x7A,
-0x54, 0xBF, 0xF0, 0x90, 0x85, 0xBF, 0x74, 0x04, 0xF0, 0x22, 0x7F, 0x6F, 0x12, 0x90, 0xDE, 0x90,
-0x05, 0x27, 0xE0, 0x22, 0x81, 0x1A, 0xB1, 0x84, 0x7D, 0x1F, 0xB1, 0x7A, 0x54, 0xBF, 0xF0, 0x90,
-0x85, 0xBF, 0x74, 0x04, 0xF0, 0x22, 0xB1, 0x84, 0x7D, 0x21, 0x7F, 0xFF, 0x12, 0x90, 0xDE, 0x80,
-0xAB, 0x02, 0x97, 0xF3, 0xB1, 0x84, 0x02, 0x97, 0xED, 0xD1, 0x82, 0x7D, 0x23, 0x02, 0x97, 0xEF,
-0x7D, 0x25, 0xB1, 0x7A, 0x54, 0xBF, 0xF0, 0x90, 0x85, 0xBF, 0x74, 0x04, 0xF0, 0x22, 0xD3, 0x10,
-0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x02, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0xFE, 0xFD, 0x7F, 0x02,
-0x12, 0x7B, 0x3E, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0x90,
-0x01, 0x01, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0, 0xD0, 0xD0, 0x92,
-0xAF, 0x22, 0xEF, 0x60, 0x49, 0x90, 0x88, 0xCE, 0xE0, 0xFF, 0x60, 0x03, 0x12, 0x7B, 0x8A, 0x90,
-0x01, 0xC7, 0xE4, 0xF0, 0x12, 0xAF, 0x4F, 0xEC, 0x3E, 0x90, 0x85, 0xB7, 0xF0, 0xA3, 0xEF, 0xF0,
-0x90, 0x06, 0x09, 0xE0, 0x54, 0xFE, 0xF0, 0x7D, 0x35, 0x7F, 0xFF, 0x12, 0x90, 0xDE, 0xB1, 0xBE,
-0x90, 0x02, 0x86, 0xE0, 0x44, 0x04, 0xF0, 0x12, 0x72, 0x79, 0xD1, 0x5B, 0x12, 0x90, 0xD8, 0x12,
-0x76, 0xE6, 0x90, 0x01, 0x34, 0x74, 0x08, 0xF0, 0xFD, 0xE4, 0xFF, 0x02, 0x7C, 0xA9, 0x7D, 0x08,
-0xE4, 0xFF, 0x12, 0x7C, 0x41, 0x90, 0x06, 0x90, 0xE0, 0x54, 0xF0, 0xF0, 0x90, 0x02, 0x86, 0xE0,
-0x54, 0xFB, 0xF0, 0xD1, 0x5C, 0x12, 0x9F, 0xEB, 0x02, 0x9B, 0x26, 0x22, 0xF1, 0x1B, 0x12, 0x77,
-0x89, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0xB4, 0x01, 0x07, 0x90,
-0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90, 0xFE, 0x10, 0xE0, 0x54, 0xFB,
-0xF0, 0x22, 0x90, 0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x01,
-0xE0, 0x22, 0x90, 0x85, 0xBF, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xE4,
-0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0xE4, 0x90, 0x92,
-0x29, 0xF0, 0xA3, 0xF0, 0xD1, 0xFB, 0xEF, 0x64, 0x01, 0x60, 0x39, 0xC3, 0x90, 0x92, 0x2A, 0xE0,
-0x94, 0x88, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x13, 0x40, 0x0F, 0x90, 0x01, 0xC1, 0xE0, 0x44, 0x10,
-0xF0, 0x90, 0x01, 0xC7, 0x74, 0xFD, 0xF0, 0x80, 0x1B, 0x90, 0x92, 0x29, 0xD1, 0x9F, 0xD3, 0x90,
-0x92, 0x2A, 0xE0, 0x94, 0x32, 0x90, 0x92, 0x29, 0xE0, 0x94, 0x00, 0x40, 0xC7, 0x90, 0x01, 0xC6,
-0xE0, 0x30, 0xE3, 0xC0, 0x90, 0x01, 0xC7, 0x74, 0xFE, 0xF0, 0x22, 0x90, 0x01, 0x9A, 0xE0, 0x54,
-0xC0, 0x44, 0x0B, 0xF1, 0x13, 0x90, 0x01, 0x98, 0xE0, 0x54, 0xC0, 0x7F, 0x00, 0xB4, 0x40, 0x02,
-0x7F, 0x01, 0x22, 0xF0, 0x7F, 0x0A, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0xD3, 0x10, 0xAF, 0x01, 0xC3,
-0xC0, 0xD0, 0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x7B, 0x3E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x01,
-0xC4, 0x74, 0x2E, 0xF0, 0x74, 0xB7, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x7B, 0x51, 0xEF, 0x20, 0xE0,
-0xF7, 0x74, 0x2E, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xB7, 0xA3, 0xF0, 0x22, 0x7D, 0x02, 0x90,
-0x01, 0xC4, 0x74, 0x4D, 0xF0, 0x74, 0xB7, 0xA3, 0xF0, 0x90, 0x92, 0x7D, 0xE0, 0xFF, 0xED, 0xC3,
-0x9F, 0x50, 0x18, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8,
-0x74, 0x08, 0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0xE4, 0x90,
-0x84, 0xC1, 0x12, 0x96, 0x40, 0x90, 0x92, 0x76, 0xF0, 0x22, 0xE4, 0xF5, 0x40, 0xF5, 0x41, 0xF5,
-0x42, 0x75, 0x43, 0x80, 0xAD, 0x40, 0x7F, 0x50, 0x12, 0x7B, 0x3E, 0xAD, 0x41, 0x7F, 0x51, 0x12,
-0x7B, 0x3E, 0xAD, 0x42, 0x7F, 0x52, 0x12, 0x7B, 0x3E, 0xAD, 0x43, 0x7F, 0x53, 0x02, 0x7B, 0x3E,
-0x12, 0x75, 0xB6, 0x12, 0x75, 0x58, 0xF1, 0xDB, 0xF1, 0xBC, 0x80, 0xCE, 0x75, 0x52, 0x06, 0x75,
-0x53, 0x01, 0x75, 0x54, 0x03, 0x75, 0x55, 0x62, 0x90, 0x01, 0x38, 0xE5, 0x52, 0xF0, 0xA3, 0xE5,
-0x53, 0xF0, 0xA3, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0x22, 0x75, 0x48, 0x12, 0xE4, 0xF5,
-0x49, 0x75, 0x4A, 0x07, 0x75, 0x4B, 0x32, 0xF5, 0x50, 0x90, 0x01, 0x30, 0xE5, 0x48, 0xF0, 0xA3,
-0xE5, 0x49, 0xF0, 0xA3, 0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0x90, 0x01, 0x20, 0xE5, 0x50,
-0xF0, 0x22, 0x12, 0x7C, 0x4E, 0x90, 0x84, 0xC5, 0xEF, 0xF0, 0x12, 0xB7, 0xB0, 0x90, 0x01, 0x64,
-0x74, 0x01, 0xF0, 0x90, 0x04, 0x23, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x00, 0x17, 0xE0, 0x54, 0xFC,
-0x44, 0x04, 0xFD, 0x7F, 0x17, 0x12, 0x7B, 0x3E, 0x90, 0x00, 0x38, 0xE0, 0x44, 0x40, 0xFD, 0x7F,
-0x38, 0x12, 0x7B, 0x3E, 0x02, 0x68, 0xE2, 0x90, 0x01, 0xE4, 0x74, 0x01, 0xF0, 0xA3, 0xF0, 0x22,
-0x90, 0x84, 0xA1, 0x74, 0x02, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0x90, 0x84, 0xA7, 0x74, 0x80, 0xF0,
-0xA3, 0x74, 0x03, 0xF0, 0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x86, 0x4E, 0x90, 0x92,
-0x32, 0xEF, 0xF0, 0x60, 0xF0, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5,
-0xC2, 0xAF, 0xEF, 0x30, 0xE0, 0x0F, 0x90, 0x84, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12,
-0x2D, 0xBD, 0x12, 0x91, 0xE8, 0x11, 0xB0, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0x60, 0x5D,
-0x11, 0xB0, 0x30, 0xE2, 0x06, 0x54, 0xFB, 0xF0, 0x12, 0x6A, 0x6D, 0x11, 0xB0, 0x30, 0xE4, 0x0C,
-0x54, 0xEF, 0xF0, 0x12, 0x6F, 0x22, 0xBF, 0x01, 0x03, 0x12, 0xAC, 0x16, 0xD2, 0xAF, 0x80, 0xB5,
-0xD2, 0xAF, 0xC2, 0xAF, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x22, 0x8F, 0x0D, 0x7F, 0x02, 0x12, 0x86,
-0x27, 0x90, 0x84, 0xC1, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0x12, 0x40, 0xB9, 0x7F, 0x02, 0x80, 0xEA,
-0x90, 0x86, 0x72, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x11, 0xBA, 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, 0xDC, 0xF0, 0x74,
-0xB8, 0xA3, 0xF0, 0x12, 0x75, 0x28, 0xE5, 0x56, 0x30, 0xE1, 0x02, 0x51, 0x13, 0xE5, 0x56, 0x30,
-0xE2, 0x03, 0x12, 0xA6, 0x0E, 0xE5, 0x57, 0x30, 0xE0, 0x02, 0x31, 0xDF, 0xE5, 0x58, 0x30, 0xE1,
-0x02, 0x91, 0x61, 0xE5, 0x58, 0x30, 0xE0, 0x02, 0x91, 0x19, 0xE5, 0x58, 0x30, 0xE4, 0x02, 0x51,
-0x12, 0xE5, 0x59, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0x11, 0xBA, 0xE5, 0x59, 0x30, 0xE4, 0x03, 0x12,
-0xA5, 0x37, 0xE5, 0x59, 0x30, 0xE5, 0x02, 0x31, 0x76, 0xE5, 0x59, 0x30, 0xE6, 0x02, 0x31, 0x9D,
-0x74, 0xDC, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xB8, 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, 0x85, 0xC1, 0x12, 0x9C, 0x0B, 0x30, 0xE0, 0x19, 0xEF,
-0x54, 0xBF, 0x31, 0xCB, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x08, 0xE0, 0x54, 0xFE,
-0x31, 0xD4, 0x74, 0x04, 0xF0, 0x12, 0xA5, 0x90, 0xE4, 0xFF, 0x02, 0x68, 0x8F, 0x90, 0x85, 0xC1,
-0xE0, 0xFF, 0x12, 0x8D, 0x59, 0x30, 0xE0, 0x1E, 0xEF, 0x54, 0x7F, 0x31, 0xCB, 0x30, 0xE1, 0x06,
-0xE0, 0x44, 0x02, 0xF0, 0x80, 0x07, 0xE0, 0x54, 0xFD, 0x31, 0xD4, 0x04, 0xF0, 0x90, 0x85, 0xC5,
-0xE0, 0x60, 0x03, 0x12, 0xA5, 0x90, 0x7F, 0x01, 0x02, 0x68, 0x8F, 0xF0, 0x90, 0x04, 0xE0, 0xE0,
-0x90, 0x85, 0xC2, 0x22, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0, 0x90, 0x01, 0xB8, 0x22, 0x91,
-0xAA, 0x90, 0x92, 0x67, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4, 0x80, 0x02, 0xE4, 0xFD,
-0xFF, 0x12, 0x57, 0x82, 0x90, 0x92, 0x67, 0xE0, 0x30, 0xE6, 0x11, 0x90, 0x01, 0x2F, 0xE0, 0x30,
-0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0, 0x51, 0x1D, 0xFB, 0x02,
-0x51, 0x7D, 0x22, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x03, 0x12, 0xA4, 0xD0, 0x22, 0x90, 0x85, 0xD7,
-0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x85, 0xDE, 0xE0, 0x22, 0xE4, 0x90, 0x92, 0x56, 0xF0, 0xA3,
-0xF0, 0xA3, 0xF0, 0x90, 0x92, 0x94, 0x12, 0x87, 0x58, 0x90, 0x92, 0x90, 0x12, 0x87, 0x64, 0xC3,
-0x12, 0x04, 0xB4, 0x40, 0x50, 0x90, 0x85, 0xC1, 0xE0, 0x90, 0x92, 0x94, 0x30, 0xE0, 0x14, 0x71,
-0xA1, 0x74, 0x0A, 0x9E, 0x2F, 0xFF, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x2F, 0xFF, 0x90, 0x92,
-0xC5, 0x80, 0x0A, 0x71, 0xA1, 0x74, 0x0A, 0x9E, 0x2F, 0xFF, 0x90, 0x92, 0xC6, 0xE0, 0xFE, 0xC3,
-0xEF, 0x9E, 0x90, 0x92, 0x57, 0xF0, 0x90, 0x92, 0x57, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x15,
-0x74, 0x98, 0x2F, 0x71, 0xB9, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xDB, 0xE0, 0x04, 0xF0, 0xE0, 0xFD,
-0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xDB, 0xE0, 0xFF, 0xD3, 0x90, 0x92, 0xC8, 0xE0, 0x9F,
-0x90, 0x92, 0xC7, 0xE0, 0x94, 0x00, 0x40, 0x02, 0x61, 0x6D, 0x71, 0x7F, 0x71, 0x76, 0x50, 0x1C,
-0x71, 0x89, 0x90, 0x92, 0x58, 0xE0, 0xD3, 0x9F, 0x40, 0x0A, 0x90, 0x92, 0x56, 0xE0, 0x90, 0x92,
-0x59, 0xF0, 0x80, 0x08, 0x90, 0x92, 0x56, 0xE0, 0x04, 0xF0, 0x80, 0xE0, 0x71, 0x7F, 0x71, 0x76,
-0x50, 0x2C, 0x71, 0x89, 0xC3, 0x90, 0x92, 0xC8, 0xE0, 0x9F, 0xFF, 0x90, 0x92, 0xC7, 0xE0, 0x94,
-0x00, 0xFE, 0x90, 0x92, 0x58, 0xE0, 0xD3, 0x9F, 0xE4, 0x9E, 0x40, 0x0A, 0x90, 0x92, 0x56, 0xE0,
-0x90, 0x92, 0x5A, 0xF0, 0x80, 0x08, 0x90, 0x92, 0x56, 0xE0, 0x04, 0xF0, 0x80, 0xD0, 0x90, 0x92,
-0x59, 0xE0, 0x90, 0x85, 0xE0, 0xF0, 0x90, 0x92, 0x5A, 0xE0, 0x90, 0x85, 0xE1, 0x71, 0x6E, 0x94,
-0x0A, 0x40, 0x0A, 0xEF, 0x24, 0xF6, 0x90, 0x85, 0xD8, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x85,
-0xD8, 0x71, 0x6E, 0x74, 0x0A, 0x9F, 0x90, 0x85, 0xD7, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xA3,
-0xE0, 0xC3, 0x9F, 0x90, 0x85, 0xDE, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x92,
-0xC5, 0x80, 0x03, 0x90, 0x92, 0xC6, 0xE0, 0xFF, 0x90, 0x85, 0xDE, 0xE0, 0x2F, 0x04, 0xF0, 0x90,
-0x85, 0xDE, 0xE0, 0xC3, 0x94, 0x0A, 0x50, 0x03, 0x74, 0x0A, 0xF0, 0x90, 0x85, 0xDE, 0xE0, 0x24,
-0x02, 0xF0, 0x51, 0x1D, 0xFB, 0x12, 0x51, 0x7D, 0xE4, 0xFF, 0x12, 0x69, 0x33, 0x22, 0xF0, 0x90,
-0x85, 0xE0, 0xE0, 0xFF, 0xC3, 0x22, 0x90, 0x92, 0x56, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x22, 0xE4,
-0x90, 0x92, 0x58, 0xF0, 0x90, 0x92, 0x56, 0xF0, 0x22, 0x74, 0x98, 0x2F, 0xF5, 0x82, 0xE4, 0x34,
-0x92, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x92, 0x58, 0xE0, 0x2F, 0xF0, 0x90, 0x92, 0xC9, 0xE0, 0xFF,
-0x22, 0x12, 0x87, 0x64, 0x90, 0x92, 0x90, 0x12, 0x87, 0x58, 0x12, 0x87, 0x30, 0x78, 0x0A, 0x12,
-0x04, 0xC5, 0x90, 0x85, 0xDD, 0xE0, 0xFE, 0xC3, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83,
-0x22, 0xE4, 0xFE, 0x74, 0x98, 0x2E, 0x71, 0xB9, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x2D, 0xF4, 0xE4,
-0x90, 0x85, 0xDC, 0xF0, 0x90, 0x85, 0xDB, 0xF0, 0x90, 0x85, 0xDF, 0xF0, 0xEF, 0xB4, 0x01, 0x07,
-0xA3, 0x74, 0x2D, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0x90, 0x93, 0x14, 0x12, 0x87, 0x79, 0x12, 0x71,
-0x54, 0x90, 0x85, 0xC5, 0xE0, 0xFF, 0x12, 0x60, 0xD0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x19, 0x90,
-0x93, 0x14, 0x12, 0x87, 0x70, 0x12, 0x8D, 0x62, 0x54, 0x0F, 0xFF, 0x12, 0x8C, 0x6F, 0xFD, 0x12,
-0x6A, 0xB8, 0x51, 0x1D, 0xFB, 0x12, 0x51, 0x7D, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x30, 0xE0,
-0x3F, 0x90, 0x85, 0xC0, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x85, 0xBF, 0xE0,
-0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x25, 0xEF, 0xC3, 0x13, 0x30, 0xE0,
-0x03, 0x02, 0xA7, 0xBA, 0x12, 0x9F, 0x2F, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x08, 0x06, 0xE4, 0xFD,
-0x7F, 0x0C, 0x80, 0x09, 0x90, 0x85, 0xC0, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x9D, 0x7D,
-0x22, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x30, 0xE0, 0x40, 0x90, 0x85, 0xC0, 0xE0, 0x7E, 0x00, 0xB4,
-0x02, 0x02, 0x7E, 0x01, 0x90, 0x85, 0xBF, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED,
-0x4E, 0x70, 0x26, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x03, 0x02, 0xA7, 0xBA, 0x12, 0xA5, 0xC9, 0x90,
-0x85, 0xC0, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A, 0x90, 0x85, 0xC0, 0xE0,
-0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x9D, 0x7D, 0x22, 0xE4, 0x90, 0x92, 0x69, 0xF0, 0xA3,
-0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51, 0x90, 0x92, 0x68, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51,
-0xAE, 0x07, 0x90, 0x92, 0x68, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x92, 0x6A, 0xE0,
-0x94, 0x64, 0x90, 0x92, 0x69, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40,
-0xF0, 0x90, 0x92, 0x68, 0xE0, 0xFF, 0x22, 0x90, 0x92, 0x69, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07,
-0x0A, 0x80, 0xBE, 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, 0xF4, 0xF0, 0x74, 0xBC, 0xA3, 0xF0, 0x12, 0x6C, 0xBC, 0x74, 0xF4,
-0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xBC, 0xA3, 0xF0, 0xD0, 0x07, 0xD0, 0x06, 0xD0, 0x05, 0xD0,
+0x55, 0x36, 0x90, 0x86, 0x74, 0xE0, 0xC4, 0x13, 0x54, 0x07, 0x22, 0x90, 0x93, 0x32, 0xE0, 0xFE,
+0xA3, 0xE0, 0xFF, 0x22, 0x74, 0x00, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0x22, 0xE4,
+0xFC, 0xED, 0x2C, 0x24, 0x00, 0xF1, 0x47, 0xE4, 0xF0, 0x0C, 0xEC, 0xB4, 0x18, 0xF3, 0xF1, 0x44,
+0xEF, 0xF0, 0xEE, 0x54, 0x3F, 0xFF, 0xF1, 0x83, 0xF5, 0x83, 0xF1, 0x98, 0x54, 0xF0, 0xF0, 0xF1,
+0x8C, 0x44, 0x80, 0xF0, 0x74, 0x0B, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x44,
+0x10, 0xF0, 0x22, 0x74, 0x01, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFB, 0x22, 0x74, 0x03, 0x2D, 0xF5,
+0x82, 0xE4, 0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xEF, 0xF0, 0x74, 0x02, 0x2D, 0xF5, 0x82, 0xE4,
+0x34, 0xFB, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0x04, 0xF0, 0xE0, 0x7F, 0x00, 0x22, 0xF0, 0xA3, 0xE4,
+0xF0, 0xA3, 0xE5, 0x70, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83, 0x22, 0xE0, 0x7A, 0x00,
+0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x22, 0x90, 0x86, 0x72, 0xE0, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x22,
+0x75, 0xF0, 0x12, 0x90, 0x89, 0x3C, 0x12, 0x05, 0x28, 0xE0, 0x22, 0x90, 0x92, 0x4B, 0xEE, 0xF0,
+0xA3, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x85,
+0x1E, 0xE0, 0xFF, 0x90, 0x85, 0x1D, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00,
+0xEF, 0x70, 0x48, 0x90, 0x85, 0x1D, 0xE0, 0xFE, 0x75, 0xF0, 0x08, 0x90, 0x84, 0xCD, 0x12, 0x05,
+0x28, 0xE0, 0xFD, 0xEE, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0xCE, 0xF9, 0x74, 0x84, 0x35, 0xF0, 0xFA,
+0x7B, 0x01, 0xAF, 0x05, 0x12, 0x88, 0xDA, 0x90, 0x85, 0x1D, 0x12, 0xB7, 0xA6, 0xB4, 0x0A, 0x02,
+0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85, 0x1D, 0xF0, 0x7D, 0x68, 0x7F, 0xFE, 0x12, 0x7B,
+0x3E, 0x12, 0x40, 0xB9, 0x90, 0x84, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22,
+0x90, 0x85, 0xB5, 0xE0, 0xFF, 0x70, 0x06, 0xA3, 0xE0, 0x64, 0x09, 0x60, 0x0A, 0xEF, 0x14, 0xFF,
+0x90, 0x85, 0xB6, 0xE0, 0xB5, 0x07, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x00, 0xEF, 0x60, 0x08,
+0x90, 0x01, 0xC1, 0xE0, 0x44, 0x02, 0xF0, 0x22, 0xC0, 0x01, 0x90, 0x85, 0xB6, 0xE0, 0x75, 0xF0,
+0x0F, 0xA4, 0x24, 0x1F, 0xF9, 0x74, 0x85, 0x35, 0xF0, 0xA8, 0x01, 0xFC, 0x7D, 0x01, 0xD0, 0x01,
+0x7E, 0x00, 0x7F, 0x0F, 0x12, 0x02, 0xD0, 0x7D, 0xCC, 0x7F, 0xFE, 0x12, 0x7B, 0x3E, 0x90, 0x85,
+0xB6, 0x12, 0xB7, 0xA6, 0xB4, 0x0A, 0x02, 0x7F, 0x01, 0xEF, 0x60, 0x05, 0xE4, 0x90, 0x85, 0xB6,
+0xF0, 0x22, 0x90, 0x92, 0x21, 0xEF, 0xF0, 0xA3, 0x12, 0x87, 0x79, 0x90, 0x93, 0x8B, 0xE0, 0xFE,
+0x04, 0xF0, 0x90, 0x00, 0x01, 0xEE, 0x12, 0x03, 0x4E, 0x74, 0x00, 0x2F, 0xF9, 0xE4, 0x34, 0xFB,
+0xFA, 0x7B, 0x01, 0xC0, 0x03, 0xC0, 0x02, 0xC0, 0x01, 0x90, 0x92, 0x22, 0x12, 0x87, 0x70, 0x8B,
+0x1B, 0x8A, 0x1C, 0x89, 0x1D, 0x75, 0x1E, 0x02, 0xD0, 0x01, 0xD0, 0x02, 0xD0, 0x03, 0x12, 0x6A,
+0x21, 0x90, 0x92, 0x21, 0xE0, 0x24, 0x02, 0xF9, 0xE4, 0x34, 0xFB, 0xFA, 0x7B, 0x01, 0xC0, 0x03,
+0xC0, 0x02, 0xC0, 0x01, 0xA3, 0x12, 0x87, 0x70, 0xE9, 0x24, 0x02, 0xF9, 0xE4, 0x3A, 0x8B, 0x1B,
+0xF5, 0x1C, 0x89, 0x1D, 0x90, 0x92, 0x22, 0x31, 0x24, 0xF5, 0x1E, 0xD0, 0x01, 0xD0, 0x02, 0xD0,
+0x03, 0x02, 0x6A, 0x21, 0x12, 0x87, 0x70, 0x90, 0x00, 0x0E, 0x02, 0x03, 0x0F, 0xD3, 0x10, 0xAF,
+0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0x25, 0x12, 0x87, 0x79, 0x7F, 0x96, 0x7E, 0x02, 0x12, 0x66,
+0x80, 0xEF, 0x60, 0x48, 0x12, 0xAF, 0x5B, 0xEC, 0x3E, 0xFE, 0xEF, 0x24, 0x01, 0xFF, 0xE4, 0x3E,
+0xFE, 0x90, 0x92, 0x28, 0xEF, 0xF0, 0xEE, 0xFF, 0x90, 0xFD, 0x11, 0xF0, 0x90, 0x92, 0x28, 0xE0,
+0xFD, 0x90, 0x02, 0x94, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x25, 0x31, 0x24, 0x24, 0x02, 0xFF,
+0xE4, 0x33, 0xFE, 0x12, 0x5A, 0xA5, 0x90, 0x92, 0x28, 0xE0, 0x24, 0x18, 0xFF, 0x90, 0x92, 0x25,
+0x12, 0x87, 0x70, 0x12, 0x56, 0xF4, 0x90, 0x02, 0x96, 0x74, 0x01, 0xF0, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0x90, 0x92, 0x6E, 0xEF, 0xF0, 0x90, 0x04, 0x7E, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92, 0x7E,
+0xF0, 0xE0, 0xFE, 0x6F, 0x60, 0x64, 0x90, 0x92, 0x6F, 0x74, 0x03, 0xF0, 0x90, 0x92, 0x7D, 0x74,
+0x08, 0xF0, 0xEE, 0x04, 0x54, 0x0F, 0xFF, 0xE4, 0xFE, 0xEF, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00,
+0xF5, 0x82, 0xE4, 0x34, 0x80, 0xF5, 0x83, 0xE5, 0x82, 0x2E, 0x51, 0x0F, 0xFD, 0x74, 0x71, 0x2E,
+0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xED, 0xF0, 0x0E, 0xEE, 0xB4, 0x08, 0xDB, 0x7B, 0x01,
+0x7A, 0x92, 0x79, 0x6F, 0x12, 0x5E, 0x10, 0x90, 0x92, 0x7E, 0xE0, 0x04, 0x54, 0x0F, 0xFF, 0xF0,
+0xBF, 0x0F, 0x02, 0xE4, 0xF0, 0x90, 0x92, 0x7E, 0xE0, 0x90, 0x04, 0x7F, 0xF0, 0x90, 0x92, 0x6E,
+0xE0, 0x7F, 0x04, 0x70, 0x02, 0x80, 0x11, 0x12, 0x87, 0xBB, 0x22, 0xE4, 0xFF, 0x80, 0x82, 0xF5,
+0x82, 0xE4, 0x35, 0x83, 0xF5, 0x83, 0xE0, 0x22, 0x8F, 0x0D, 0x7F, 0x02, 0x12, 0x86, 0x27, 0x90,
+0x84, 0xC1, 0xE0, 0x45, 0x0D, 0xF0, 0x22, 0x12, 0x40, 0xB9, 0x7F, 0x02, 0x80, 0xEA, 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, 0x2E,
+0xF0, 0x74, 0xBA, 0xA3, 0xF0, 0x12, 0x71, 0x90, 0xE5, 0x4C, 0x30, 0xE1, 0x02, 0x51, 0x0B, 0xE5,
+0x4C, 0x30, 0xE3, 0x02, 0x51, 0xEE, 0xE5, 0x4C, 0x30, 0xE4, 0x02, 0x51, 0x27, 0xE5, 0x4C, 0x30,
+0xE5, 0x03, 0x12, 0xC6, 0xB9, 0xE5, 0x4C, 0x30, 0xE6, 0x03, 0x12, 0xC5, 0x09, 0xE5, 0x4E, 0x30,
+0xE0, 0x02, 0xD1, 0xD5, 0xE5, 0x4E, 0x30, 0xE1, 0x03, 0x12, 0xA1, 0x97, 0xE5, 0x4E, 0x30, 0xE2,
+0x03, 0x12, 0xC5, 0x16, 0xE5, 0x4E, 0x30, 0xE3, 0x02, 0x51, 0xFA, 0xE5, 0x4E, 0x30, 0xE4, 0x02,
+0x71, 0x8D, 0xE5, 0x4E, 0x30, 0xE5, 0x03, 0x12, 0xC5, 0x45, 0xE5, 0x4E, 0x30, 0xE6, 0x02, 0x71,
+0x0C, 0xE5, 0x4F, 0x30, 0xE1, 0x03, 0x12, 0x9E, 0x80, 0xE5, 0x4F, 0x30, 0xE4, 0x02, 0xF1, 0xC3,
+0xE5, 0x4F, 0x30, 0xE5, 0x03, 0x12, 0xB4, 0x0D, 0x74, 0x2E, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74,
+0xBA, 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, 0x86,
+0x72, 0xE0, 0x30, 0xE0, 0x04, 0x7F, 0x10, 0x51, 0x18, 0x22, 0x71, 0xA6, 0x70, 0x0D, 0x90, 0x85,
+0xC5, 0xE0, 0x60, 0x07, 0x91, 0xA2, 0x91, 0xE2, 0x12, 0x9E, 0xFC, 0x22, 0xE4, 0xFF, 0x12, 0x77,
+0x39, 0xBF, 0x01, 0x0E, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x08, 0x71, 0x23, 0x54, 0x07, 0x70, 0x02,
+0x71, 0x77, 0x22, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xFE, 0xF0, 0x22, 0xE4, 0xF5, 0x78, 0x90, 0x06,
+0xA9, 0xE0, 0xF5, 0x78, 0x54, 0xC0, 0x70, 0x07, 0x71, 0x23, 0x54, 0xFD, 0xF0, 0x80, 0x38, 0xE5,
+0x78, 0x30, 0xE6, 0x19, 0x90, 0x85, 0xC5, 0xE0, 0x64, 0x01, 0x70, 0x13, 0x12, 0x9E, 0xBF, 0x64,
+0x02, 0x60, 0x05, 0x12, 0x77, 0x61, 0x80, 0x07, 0x12, 0x79, 0x41, 0x80, 0x02, 0x71, 0x23, 0xE5,
+0x78, 0x90, 0x85, 0xC9, 0x30, 0xE7, 0x0B, 0xE0, 0x44, 0x02, 0xF0, 0x91, 0xE2, 0x12, 0x9E, 0xFC,
+0xE1, 0xD6, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x90, 0x85, 0xC7, 0x30, 0xE0,
+0x05, 0xE0, 0xFF, 0x02, 0x9E, 0x2C, 0xE0, 0xFF, 0x7D, 0x01, 0x02, 0x9A, 0x74, 0x71, 0xA6, 0x70,
+0x14, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0E, 0x91, 0xA2, 0x90, 0x85, 0xC1, 0xE0, 0x91, 0xCD, 0x54,
+0x07, 0x70, 0x02, 0x71, 0x77, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xEF, 0x64, 0x01, 0x22, 0x12,
+0xA1, 0x76, 0x13, 0x54, 0x1F, 0x30, 0xE0, 0x0B, 0xEF, 0xC4, 0x13, 0x13, 0x54, 0x03, 0x30, 0xE0,
+0x02, 0xF1, 0xC8, 0x91, 0xD8, 0x30, 0xE0, 0x08, 0x91, 0xCC, 0x54, 0x07, 0x70, 0x37, 0x80, 0x33,
+0xD1, 0xBC, 0x40, 0x2F, 0x71, 0xA6, 0x70, 0x2D, 0x12, 0x9E, 0xC6, 0x70, 0x05, 0x12, 0x70, 0xDB,
+0x80, 0x24, 0x12, 0x70, 0xDB, 0x90, 0x85, 0xCF, 0xE0, 0x04, 0xF0, 0xE0, 0xD3, 0x94, 0x02, 0x40,
+0x09, 0x91, 0x06, 0xE4, 0x90, 0x85, 0xCF, 0xF0, 0x80, 0x03, 0x12, 0x79, 0x41, 0xE4, 0x90, 0x85,
+0xCE, 0xF0, 0x22, 0x71, 0x77, 0x22, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x90, 0x85,
+0xC5, 0xE0, 0x60, 0x02, 0x71, 0xAF, 0x90, 0x92, 0xA1, 0xE0, 0x30, 0xE0, 0x52, 0x90, 0x92, 0xA4,
+0xE0, 0x70, 0x24, 0x7D, 0x16, 0x12, 0xA7, 0xD0, 0x12, 0xA6, 0xA9, 0x91, 0x8E, 0x7D, 0x01, 0x12,
+0xA7, 0x03, 0x12, 0xA6, 0xA9, 0x91, 0x7F, 0xE0, 0x44, 0x01, 0xF0, 0x91, 0x70, 0x12, 0x9E, 0xFC,
+0x90, 0x92, 0xA4, 0x74, 0x01, 0xF0, 0x22, 0x90, 0x92, 0xA4, 0xE0, 0x64, 0x01, 0x70, 0x1D, 0x90,
+0x92, 0xA2, 0x91, 0x79, 0xE0, 0x30, 0xE0, 0x14, 0x91, 0x8D, 0x7D, 0x01, 0x12, 0xA7, 0x03, 0x91,
+0x70, 0xF0, 0xE4, 0xFB, 0xFD, 0x7F, 0x54, 0x7E, 0x01, 0x02, 0x61, 0x41, 0x12, 0xA5, 0x94, 0x22,
+0xE4, 0x90, 0x91, 0x6E, 0xF0, 0xA3, 0x74, 0x03, 0x22, 0xE0, 0xC3, 0x13, 0x54, 0x07, 0xFF, 0x75,
+0xF0, 0x0E, 0xA4, 0x24, 0xAD, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xEF, 0x75, 0xF0,
+0x0E, 0xA4, 0x24, 0xB1, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0x7E, 0x00, 0xE4,
+0xFB, 0x22, 0x90, 0x01, 0x57, 0xE4, 0xF0, 0x90, 0x01, 0x3C, 0x74, 0x02, 0xF0, 0x22, 0x90, 0x01,
+0x57, 0xE0, 0x60, 0x17, 0x91, 0xA5, 0x91, 0xD8, 0x30, 0xE0, 0x02, 0x80, 0x0F, 0xD1, 0xBC, 0x40,
+0x0A, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF, 0x01, 0x02, 0x91, 0x06, 0x22, 0xEF, 0x54, 0xFB, 0xF0,
+0x90, 0x85, 0xC9, 0xE0, 0x54, 0xFD, 0xF0, 0x22, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x13, 0x13, 0x54,
+0x3F, 0x22, 0xE4, 0x90, 0x91, 0x6E, 0xF0, 0x90, 0x86, 0x6E, 0xE0, 0x90, 0x91, 0x6F, 0x22, 0x90,
+0x85, 0xC5, 0xE0, 0x60, 0x0F, 0x90, 0x06, 0x92, 0xE0, 0x30, 0xE1, 0x03, 0x02, 0x6B, 0x98, 0x12,
+0xD2, 0x69, 0x71, 0x77, 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, 0x05, 0xF0, 0x74, 0xBD, 0xA3, 0xF0, 0x12, 0x75, 0x28, 0xE5,
+0x56, 0x30, 0xE1, 0x02, 0x91, 0x0E, 0xE5, 0x56, 0x30, 0xE2, 0x02, 0x91, 0xEF, 0xE5, 0x56, 0x30,
+0xE5, 0x02, 0xD1, 0x6E, 0xE5, 0x57, 0x30, 0xE0, 0x02, 0xF1, 0x42, 0xE5, 0x58, 0x30, 0xE1, 0x02,
+0xD1, 0x27, 0xE5, 0x58, 0x30, 0xE0, 0x02, 0xF1, 0x7B, 0xE5, 0x58, 0x30, 0xE4, 0x02, 0xF1, 0xC2,
+0xE5, 0x59, 0x30, 0xE1, 0x04, 0x7F, 0x04, 0x51, 0x18, 0xE5, 0x59, 0x30, 0xE4, 0x02, 0xD1, 0x94,
+0xE5, 0x59, 0x30, 0xE5, 0x02, 0xB1, 0xA4, 0xE5, 0x59, 0x30, 0xE6, 0x02, 0xB1, 0xCA, 0x74, 0x05,
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xBD, 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, 0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0, 0x75, 0xD0, 0x00,
-0xC0, 0x05, 0xC0, 0x07, 0x7D, 0x45, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0xBD, 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, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x05, 0xE4, 0xA3, 0xF0,
-0xA3, 0xF0, 0x22, 0x90, 0x88, 0xE7, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x30, 0xE0,
-0x05, 0x12, 0x9F, 0x48, 0x60, 0x1B, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x04, 0xEF, 0x30, 0xE0, 0x0B,
-0x90, 0x85, 0xC8, 0xE0, 0x64, 0x02, 0x60, 0x09, 0x12, 0xA0, 0x9E, 0x90, 0x01, 0xE6, 0xE0, 0x04,
-0xF0, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF, 0x01, 0x13, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x0D,
-0x12, 0x9F, 0xE4, 0x64, 0x02, 0x60, 0x03, 0x02, 0x77, 0x61, 0x12, 0x79, 0x41, 0x22, 0x90, 0x85,
-0xC5, 0xE0, 0x70, 0x07, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x13, 0x90, 0x85, 0xBC, 0xE0, 0x30,
-0xE0, 0x09, 0x12, 0x9F, 0xAC, 0xBF, 0x01, 0x06, 0x02, 0x9F, 0x4F, 0x12, 0x9F, 0x67, 0x22, 0x7D,
-0x07, 0xAF, 0x62, 0xED, 0x30, 0xE0, 0x21, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x44, 0xD1, 0x42,
-0xEF, 0x90, 0x89, 0x46, 0xD1, 0x42, 0xEF, 0x90, 0x89, 0x48, 0xD1, 0x42, 0xEF, 0x90, 0x89, 0x4A,
-0xD1, 0x42, 0xEF, 0x90, 0x89, 0x4C, 0xD1, 0x4D, 0xED, 0x30, 0xE1, 0x09, 0x75, 0xF0, 0x12, 0xEF,
-0x90, 0x89, 0x40, 0xD1, 0x4D, 0xED, 0x30, 0xE2, 0x0C, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x42,
-0x12, 0x05, 0x28, 0xE4, 0xF0, 0xD1, 0x55, 0xE0, 0x54, 0xBF, 0x44, 0x80, 0xFE, 0xD1, 0x55, 0xEE,
-0xF0, 0x22, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3, 0xF0, 0x75, 0xF0, 0x12, 0x22, 0x12, 0x05, 0x28,
-0xE4, 0xF0, 0xA3, 0xF0, 0x22, 0xEF, 0xC4, 0x54, 0xF0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x81,
-0xF5, 0x83, 0x22, 0x7B, 0x00, 0x7A, 0x00, 0x79, 0x00, 0x90, 0x89, 0x1B, 0x12, 0x87, 0x79, 0x7B,
-0xFF, 0x7A, 0x82, 0x79, 0x00, 0x90, 0x89, 0x1E, 0x12, 0x87, 0x79, 0x7A, 0x82, 0x79, 0x3F, 0x90,
-0x89, 0x21, 0x12, 0x87, 0x79, 0x7A, 0x82, 0x79, 0xE1, 0x90, 0x89, 0x27, 0x12, 0x87, 0x79, 0x7A,
-0x82, 0x79, 0xF5, 0x90, 0x89, 0x2A, 0x12, 0x87, 0x79, 0x7A, 0x83, 0x79, 0x1D, 0x90, 0x89, 0x2D,
-0x12, 0x87, 0x79, 0x7A, 0x83, 0x79, 0x31, 0x90, 0x89, 0x33, 0x12, 0x87, 0x79, 0x7A, 0x83, 0x79,
-0x59, 0x90, 0x89, 0x36, 0x12, 0x87, 0x79, 0x7A, 0x83, 0x79, 0x81, 0x90, 0x89, 0x39, 0x12, 0x87,
-0x79, 0xE4, 0x90, 0x92, 0xCB, 0xF0, 0x90, 0x92, 0x29, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0xFF, 0xC3,
-0x94, 0x05, 0x50, 0x10, 0x74, 0xDC, 0x2F, 0x12, 0x96, 0x7A, 0xE4, 0xF0, 0x90, 0x92, 0x29, 0xE0,
-0x04, 0xF0, 0x80, 0xE6, 0x22, 0x90, 0x01, 0x94, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4,
-0xF0, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x92, 0x56, 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, 0x75, 0xB6, 0x90,
-0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12, 0x7B, 0x3E, 0x80, 0xFE, 0x22, 0xE4, 0xFF,
-0x02, 0x2D, 0xBD, 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, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0, 0xE4, 0x2F,
-0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x08, 0xED, 0xF0, 0xA3, 0xEB,
-0xF0, 0x90, 0x93, 0x07, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xC2, 0x9E, 0x90, 0x93, 0x07, 0xE0,
-0x90, 0x04, 0x25, 0xF0, 0x90, 0x93, 0x08, 0xE0, 0x60, 0x06, 0x12, 0xC8, 0x4F, 0x44, 0x80, 0xF0,
-0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54, 0xC0, 0xF0,
-0x12, 0xC8, 0x4F, 0x54, 0xC0, 0xF0, 0x90, 0x93, 0x0A, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x18, 0x2E,
-0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3, 0x94, 0x03,
-0x74, 0x10, 0x40, 0x08, 0x12, 0xC8, 0x8C, 0x74, 0x04, 0xF0, 0x80, 0x05, 0x12, 0xC8, 0x8C, 0xE4,
-0xF0, 0xAF, 0x05, 0x12, 0xC0, 0x1F, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x93, 0x09, 0xE0,
-0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x12, 0xC0, 0x1F, 0xF5, 0x83, 0xEE,
-0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0, 0x74, 0x29,
-0x2F, 0x11, 0x38, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x74,
-0x12, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x22, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34,
-0xFC, 0xF5, 0x83, 0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0,
-0x22, 0x90, 0x88, 0xD9, 0x11, 0xDF, 0x11, 0x28, 0xFD, 0x90, 0x92, 0x07, 0xE0, 0x24, 0x2C, 0x51,
-0x92, 0x90, 0x92, 0x07, 0xE0, 0x2F, 0x24, 0x30, 0xA3, 0xF0, 0xE0, 0xFD, 0x24, 0x04, 0x51, 0x8A,
-0xE0, 0xFE, 0x74, 0x05, 0x2D, 0x31, 0x9D, 0x12, 0xAF, 0x57, 0xEC, 0x3E, 0x90, 0x88, 0x80, 0xF0,
-0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x08, 0xE0, 0x24, 0x0C, 0xF9, 0xE4, 0x34, 0xFC, 0x11, 0xF0, 0x75,
-0x1E, 0x04, 0x7B, 0x01, 0x7A, 0x88, 0x79, 0x82, 0x12, 0x6A, 0x21, 0x90, 0x92, 0x08, 0xE0, 0x24,
-0x14, 0xF0, 0xE0, 0xFD, 0x24, 0x01, 0x31, 0xAD, 0x2D, 0x31, 0xA5, 0x12, 0xAF, 0x57, 0xEC, 0x3E,
-0x90, 0x88, 0x86, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x88, 0xDA, 0x11, 0xDF, 0x90, 0x88, 0x7C, 0xE0,
-0xFE, 0xA3, 0xE0, 0xFF, 0x4E, 0x60, 0x11, 0x90, 0x92, 0x07, 0xE0, 0x11, 0xEA, 0x8F, 0x1E, 0x7B,
-0x01, 0x7A, 0x88, 0x79, 0x8A, 0x12, 0x6A, 0x21, 0x90, 0x88, 0xDB, 0x11, 0xDF, 0x11, 0xEA, 0x90,
-0x88, 0x7E, 0xA3, 0xE0, 0xF5, 0x1E, 0x7B, 0x01, 0x7A, 0x88, 0x79, 0xAA, 0x02, 0x6A, 0x21, 0xE0,
-0xFF, 0x12, 0x7B, 0x2A, 0x90, 0x92, 0x07, 0xEF, 0xF0, 0x22, 0x24, 0x00, 0xF9, 0xE4, 0x34, 0xFC,
-0x75, 0x1B, 0x01, 0xF5, 0x1C, 0x89, 0x1D, 0x22, 0xEF, 0x60, 0x04, 0x31, 0x00, 0x11, 0x41, 0x22,
-0xE4, 0xFD, 0xFC, 0x90, 0x88, 0xD8, 0xE0, 0xFF, 0x51, 0x9E, 0xAB, 0x05, 0x74, 0x01, 0x2B, 0x31,
-0xAD, 0x2B, 0x31, 0xA5, 0x12, 0xAF, 0xCC, 0x90, 0x88, 0x76, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x03,
-0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x02, 0x2B, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0x31, 0x94, 0x90, 0x88, 0x78, 0xF0, 0xA3, 0xEF, 0xF0, 0x74, 0x05, 0x2B, 0x31, 0x9D,
-0xE0, 0xFE, 0x74, 0x04, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x31, 0x94, 0x90, 0x88, 0x7A, 0xF0,
-0xA3, 0xEF, 0xF0, 0x74, 0x07, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74,
-0x06, 0x2B, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0x31, 0x94, 0x90, 0x88, 0x7C, 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, 0x88, 0x7E, 0xF0,
-0xA3, 0xEF, 0xF0, 0x22, 0xF5, 0x83, 0xE0, 0x24, 0x00, 0xFF, 0xEA, 0x3E, 0x22, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFE, 0x74, 0x00, 0x22, 0xAD, 0x07, 0x90, 0x88, 0x80, 0xE4, 0x75,
-0xF0, 0x01, 0x12, 0x07, 0x0A, 0x90, 0x88, 0x80, 0xE0, 0xFF, 0xAE, 0x05, 0x74, 0x04, 0x2E, 0x51,
-0x8A, 0xEF, 0xF0, 0x90, 0x88, 0x80, 0xA3, 0xE0, 0xFF, 0x74, 0x05, 0x2E, 0x31, 0x9D, 0xEF, 0xF0,
-0x22, 0xE4, 0x90, 0x92, 0x59, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x20, 0xF0, 0x12,
-0x75, 0xE4, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x41, 0x80, 0x90, 0x88, 0xD9, 0xE0, 0xFF, 0x90, 0x93,
-0x0A, 0x74, 0x0A, 0xF0, 0x7B, 0x08, 0x7D, 0x01, 0x12, 0xBF, 0x72, 0x90, 0x92, 0x56, 0xEE, 0xF0,
-0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x56, 0xA3, 0x11, 0x28, 0xFD, 0x74, 0x2C, 0x2E, 0x51, 0x92, 0x90,
-0x92, 0x58, 0xEF, 0xF0, 0x90, 0x92, 0x56, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA,
-0x7B, 0x01, 0xE4, 0xFD, 0x12, 0x52, 0x21, 0x90, 0x92, 0x58, 0xE0, 0xFF, 0x90, 0x92, 0x57, 0xE0,
-0x2F, 0xFF, 0x90, 0x92, 0x56, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0x90,
-0x92, 0x59, 0xF0, 0xA3, 0xEF, 0xF0, 0x31, 0xB9, 0x51, 0x81, 0x90, 0x88, 0xD9, 0xE0, 0xFB, 0xE4,
-0xFF, 0x12, 0x15, 0x44, 0x51, 0x81, 0x90, 0x88, 0xD5, 0xE0, 0xFB, 0x7F, 0x11, 0x12, 0x15, 0x44,
-0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x90, 0x88, 0x88, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A,
-0x22, 0x90, 0x92, 0x59, 0xE0, 0xFC, 0xA3, 0xE0, 0xFD, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
-0x83, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0x02, 0x5D, 0x98, 0x12, 0x7B,
-0x2A, 0x7C, 0x00, 0xAD, 0x07, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0xF5,
-0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x12, 0x70, 0x61, 0x90, 0x92, 0xFF, 0x12, 0x04, 0xEB, 0x90, 0x92,
-0xF7, 0x12, 0x87, 0x58, 0x12, 0x04, 0xA7, 0x90, 0x92, 0xFF, 0x12, 0x87, 0x64, 0x12, 0x87, 0x3E,
-0xC0, 0x04, 0xC0, 0x05, 0xC0, 0x06, 0xC0, 0x07, 0x90, 0x92, 0xF7, 0x12, 0x87, 0x58, 0x90, 0x92,
-0xFB, 0x12, 0x87, 0x64, 0x12, 0x87, 0x3E, 0xD0, 0x03, 0xD0, 0x02, 0xD0, 0x01, 0xD0, 0x00, 0x12,
-0x87, 0x4B, 0x90, 0x93, 0x03, 0x12, 0x04, 0xEB, 0x90, 0x93, 0x03, 0x12, 0x87, 0x58, 0x90, 0x91,
-0x66, 0x12, 0x04, 0xEB, 0x90, 0x92, 0xF5, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x12, 0x71, 0x18, 0xD0,
-0xD0, 0x92, 0xAF, 0x22, 0x7E, 0x00, 0x7F, 0xAC, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xC1,
-0x12, 0x06, 0xDE, 0x71, 0xE3, 0x12, 0x06, 0xDE, 0x90, 0x85, 0xC4, 0x74, 0x02, 0xF0, 0x90, 0x85,
-0xCB, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x90, 0x85, 0xD1, 0xE4, 0xF0, 0xA3, 0x74,
-0x02, 0x71, 0xD3, 0x71, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x57, 0x82, 0x7D, 0x0C, 0x7F, 0x02, 0x12,
-0x57, 0x82, 0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x57, 0x82, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0xB4, 0x01,
-0x08, 0x90, 0x85, 0xD0, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x85, 0xD0, 0xB4, 0x03, 0x05,
-0x74, 0xD4, 0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x2C, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0x0F,
-0xFF, 0xBF, 0x05, 0x08, 0x90, 0x85, 0xFB, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x85, 0xFB,
-0xF0, 0x90, 0x86, 0x6D, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44,
-0x28, 0xF0, 0xA3, 0x74, 0x07, 0x71, 0xD3, 0xE4, 0x90, 0x85, 0xD7, 0xF0, 0xA3, 0xF0, 0x7F, 0x01,
-0x12, 0x69, 0x33, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0,
-0x90, 0x06, 0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0xE4, 0xFD, 0xFF, 0x12, 0x90, 0xDE, 0xE4, 0x90, 0x86,
-0x71, 0xF0, 0x22, 0xF0, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90, 0x85, 0xDD, 0xF0, 0xA3, 0x74,
-0x0A, 0xF0, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x79, 0x22,
-0x90, 0x92, 0xC5, 0x74, 0x04, 0xF0, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x64,
-0xF0, 0xA3, 0x74, 0x05, 0xF0, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12,
-0x7A, 0x29, 0xEF, 0x64, 0x01, 0x60, 0x05, 0x75, 0x0F, 0x01, 0x80, 0x52, 0x90, 0x85, 0xC9, 0xE0,
-0xFF, 0x54, 0x03, 0x60, 0x05, 0x75, 0x0F, 0x02, 0x80, 0x44, 0x90, 0x85, 0xC7, 0xE0, 0xFE, 0xE4,
-0xC3, 0x9E, 0x50, 0x05, 0x75, 0x0F, 0x04, 0x80, 0x35, 0xEF, 0x30, 0xE2, 0x05, 0x75, 0x0F, 0x08,
-0x80, 0x2C, 0x90, 0x85, 0xC9, 0xE0, 0x30, 0xE4, 0x05, 0x75, 0x0F, 0x10, 0x80, 0x20, 0x90, 0x85,
-0xC2, 0xE0, 0x13, 0x13, 0x54, 0x3F, 0x20, 0xE0, 0x05, 0x75, 0x0F, 0x20, 0x80, 0x10, 0x90, 0x86,
-0x71, 0xE0, 0x60, 0x05, 0x75, 0x0F, 0x80, 0x80, 0x05, 0x12, 0xB3, 0xDE, 0x80, 0x0E, 0x90, 0x01,
-0xB9, 0x74, 0x04, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x0F, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF,
-0x22, 0xAC, 0x07, 0x90, 0x92, 0x8B, 0xE0, 0xF9, 0x30, 0xE0, 0x02, 0xA1, 0x35, 0x90, 0x85, 0xC1,
-0xE0, 0x30, 0xE0, 0x16, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90, 0x85, 0xDA, 0xF0, 0x90, 0x85,
-0xFB, 0xE0, 0x24, 0x03, 0x90, 0x85, 0xD9, 0xF0, 0x80, 0x0D, 0x90, 0x85, 0xDA, 0x74, 0x02, 0xF0,
-0x90, 0x85, 0xD9, 0x14, 0xF0, 0x0B, 0x0B, 0x90, 0x85, 0xD9, 0xE0, 0xFA, 0x90, 0x85, 0xD8, 0xE0,
-0xD3, 0x9A, 0x50, 0x0E, 0x90, 0x85, 0xCD, 0xEB, 0xF0, 0x90, 0x85, 0xDA, 0xE0, 0xC3, 0x9D, 0x2C,
-0x80, 0x11, 0xC3, 0xED, 0x9A, 0x2B, 0x90, 0x85, 0xCD, 0xF0, 0x90, 0x85, 0xD9, 0xE0, 0xFF, 0xA3,
-0xE0, 0xC3, 0x9F, 0x90, 0x85, 0xDD, 0xF0, 0x90, 0x85, 0xDA, 0xE0, 0xFF, 0x24, 0x0A, 0xFD, 0xE4,
-0x33, 0xFC, 0x90, 0x85, 0xDD, 0xB1, 0x3D, 0x98, 0x40, 0x04, 0xEF, 0x24, 0x0A, 0xF0, 0x90, 0x85,
-0xDD, 0xE0, 0xFF, 0x24, 0x23, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85, 0xCD, 0xB1, 0x3D, 0x98, 0x40,
-0x04, 0xEF, 0x24, 0x23, 0xF0, 0x90, 0x85, 0xDD, 0xE0, 0xFF, 0x7E, 0x00, 0x90, 0x85, 0xD1, 0xEE,
-0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xE0, 0x6F, 0x70, 0x01, 0xE4, 0x60, 0x02, 0xB1, 0x47,
-0xE9, 0x54, 0xFD, 0x80, 0x03, 0xE9, 0x44, 0x02, 0x90, 0x92, 0x8B, 0xF0, 0x22, 0xE0, 0xD3, 0x9D,
-0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x22, 0x90, 0x85, 0xD1, 0xA3, 0xE0, 0x90, 0x05, 0x58, 0xF0,
-0x22, 0x12, 0xA7, 0xAE, 0x40, 0x2B, 0x90, 0x85, 0xDF, 0xE0, 0x04, 0xF0, 0x90, 0x92, 0xCA, 0xE0,
-0xFF, 0x90, 0x85, 0xDF, 0xE0, 0xD3, 0x9F, 0x50, 0x18, 0x90, 0x85, 0xD7, 0xE0, 0x04, 0x12, 0xA2,
-0x50, 0x90, 0x85, 0xDE, 0xF0, 0xFB, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x12, 0x51,
-0x7D, 0x22, 0x90, 0x92, 0x70, 0xEF, 0xF0, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x02, 0x70, 0x1F, 0x90,
-0x92, 0x70, 0xE0, 0xFD, 0x64, 0x01, 0x70, 0x32, 0x12, 0xAF, 0x21, 0x12, 0x8D, 0x55, 0x30, 0xE0,
-0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64, 0x80, 0xF0, 0x80, 0x20, 0xAF, 0x05, 0x80, 0x19, 0x90, 0x01,
-0x00, 0x74, 0xFF, 0xF0, 0x7F, 0x64, 0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90, 0x06, 0x90, 0xE0, 0x44,
-0x01, 0xF0, 0x90, 0x92, 0x70, 0xE0, 0xFF, 0x12, 0x2A, 0x87, 0x90, 0x88, 0xE1, 0xE0, 0x54, 0xFE,
-0xF0, 0x90, 0x86, 0x72, 0xE0, 0x54, 0xBF, 0xF0, 0x22, 0x90, 0x92, 0x71, 0xEE, 0xF0, 0xA3, 0xEF,
-0xF0, 0xE4, 0x90, 0x92, 0x75, 0xF0, 0x7D, 0x09, 0x12, 0x55, 0x36, 0xEF, 0x64, 0x06, 0x70, 0x2A,
-0xD1, 0x6E, 0x7D, 0x14, 0x12, 0x55, 0x36, 0xEF, 0x70, 0x20, 0xD1, 0x6E, 0x7D, 0x15, 0x12, 0x55,
-0x36, 0xEF, 0x64, 0x50, 0x70, 0x14, 0xD1, 0x6E, 0x7D, 0x21, 0x12, 0x55, 0x36, 0xEF, 0x20, 0xE0,
-0x03, 0x30, 0xE2, 0x06, 0x90, 0x92, 0x75, 0x74, 0x01, 0xF0, 0x90, 0x86, 0x73, 0xE0, 0x13, 0x13,
-0x54, 0x3F, 0x30, 0xE0, 0x3F, 0xD1, 0x6E, 0x7D, 0x09, 0x12, 0x55, 0x36, 0xEF, 0x64, 0x11, 0x70,
-0x33, 0x90, 0x92, 0x72, 0xE0, 0x24, 0x14, 0xFF, 0x90, 0x92, 0x71, 0xE0, 0x34, 0x00, 0xFE, 0x90,
-0x92, 0x73, 0xF0, 0xA3, 0xEF, 0xF0, 0x7D, 0x02, 0x12, 0x55, 0x36, 0xEF, 0x70, 0x16, 0x90, 0x92,
-0x73, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x03, 0x12, 0x55, 0x36, 0xBF, 0x89, 0x06, 0x90, 0x92,
-0x75, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x75, 0xE0, 0xFF, 0xD1, 0x77, 0xEF, 0xF0, 0x22, 0x90, 0x92,
-0x71, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0x90, 0x84, 0xBF, 0xA3, 0xE0, 0x24, 0x7F, 0xF5, 0x82,
-0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0xD1, 0xCC, 0xA3, 0xED, 0xF0, 0x90, 0x88, 0x7C, 0xE0, 0x70,
-0x02, 0xA3, 0xE0, 0x60, 0x23, 0xE4, 0x90, 0x92, 0x36, 0xF0, 0xD1, 0xD5, 0x50, 0x1D, 0xF1, 0x19,
+0xF0, 0xD0, 0xE0, 0x32, 0x90, 0x85, 0xC1, 0x12, 0x9D, 0x41, 0x30, 0xE0, 0x18, 0xEF, 0x54, 0xBF,
+0xD1, 0x80, 0x30, 0xE0, 0x06, 0xE0, 0x44, 0x01, 0xF0, 0x80, 0x08, 0xE0, 0x54, 0xFE, 0xD1, 0x89,
+0x74, 0x04, 0xF0, 0x71, 0x77, 0xE4, 0xFF, 0x02, 0x68, 0x8F, 0x90, 0x85, 0xC1, 0xE0, 0xFF, 0x12,
+0x8E, 0x8B, 0x30, 0xE0, 0x1D, 0xEF, 0x54, 0x7F, 0xD1, 0x80, 0x30, 0xE1, 0x06, 0xE0, 0x44, 0x02,
+0xF0, 0x80, 0x07, 0xE0, 0x54, 0xFD, 0xD1, 0x89, 0x04, 0xF0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x02,
+0x71, 0x77, 0x7F, 0x01, 0x12, 0x68, 0x8F, 0x90, 0x04, 0xE0, 0xE0, 0x30, 0xE1, 0x02, 0xD1, 0x01,
+0x22, 0x90, 0x92, 0xA1, 0xE0, 0x30, 0xE0, 0x1E, 0xA3, 0x91, 0x79, 0xE0, 0xFE, 0x30, 0xE0, 0x16,
+0xEF, 0x91, 0x7F, 0xEE, 0x54, 0xFE, 0xF0, 0x90, 0x92, 0xA4, 0x74, 0x05, 0xF0, 0x12, 0xA6, 0xA9,
+0xFD, 0x7F, 0x02, 0x12, 0xA5, 0xFE, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0xFF, 0x30, 0xE0, 0x3E, 0x90,
+0x85, 0xC0, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x85, 0xBF, 0xE0, 0x7D, 0x00,
+0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x24, 0xEF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0xE1,
+0x27, 0x91, 0xAE, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x0C, 0x06, 0xE4, 0xFD, 0x7F, 0x08, 0x80, 0x0A,
+0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x04, 0x06, 0xE4, 0xFD, 0xFF, 0x12, 0x9A, 0x74, 0x22, 0x90, 0x92,
+0xA1, 0xE0, 0x30, 0xE0, 0x0A, 0xF1, 0xCF, 0xE4, 0x90, 0x92, 0xA4, 0xF0, 0x12, 0x9E, 0xCD, 0x22,
+0xF0, 0x90, 0x04, 0xE0, 0xE0, 0x90, 0x85, 0xC2, 0x22, 0xF0, 0x90, 0x01, 0xB9, 0x74, 0x01, 0xF0,
+0x90, 0x01, 0xB8, 0x22, 0x12, 0x9F, 0x07, 0x12, 0xA7, 0xBB, 0x7F, 0x01, 0xD1, 0xF1, 0x90, 0x92,
+0x9C, 0xE0, 0x30, 0xE0, 0x16, 0x12, 0xD2, 0x19, 0x90, 0x92, 0x9F, 0xE0, 0x60, 0x05, 0x14, 0xF0,
+0x02, 0x7A, 0x8A, 0x12, 0xD1, 0xE1, 0xE4, 0xFF, 0x12, 0xA0, 0x2E, 0x22, 0x90, 0x85, 0xCE, 0xE0,
+0x04, 0xF0, 0x90, 0x85, 0xC9, 0xE0, 0x54, 0xEF, 0xF0, 0x90, 0x86, 0x6D, 0xE0, 0xFF, 0x90, 0x85,
+0xCE, 0xE0, 0xD3, 0x9F, 0x22, 0x90, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x10, 0xA3, 0x74, 0x01, 0xF0,
+0x90, 0x85, 0xBC, 0xE0, 0xFF, 0xC3, 0x13, 0x30, 0xE0, 0x02, 0xF1, 0x27, 0x12, 0x9D, 0x67, 0xE4,
+0xFF, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0xDC, 0xE0, 0xFE, 0x13, 0x13, 0x54,
+0x3F, 0x30, 0xE0, 0x1E, 0x90, 0x92, 0x7F, 0x74, 0x1E, 0xF0, 0x90, 0x92, 0x8D, 0x74, 0x01, 0xF0,
+0x90, 0x92, 0x81, 0xEF, 0xF0, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x7F, 0x12, 0x5E, 0x10, 0x7F, 0x04,
+0x51, 0x18, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x9D,
+0x5B, 0xBF, 0x01, 0x04, 0x7F, 0x01, 0x80, 0x02, 0x7F, 0x02, 0x12, 0x9C, 0x1F, 0xD0, 0xD0, 0x92,
+0xAF, 0x22, 0x12, 0xC8, 0x0A, 0x90, 0x92, 0x7F, 0xEF, 0xF0, 0x30, 0xE0, 0x05, 0x7D, 0x01, 0xE4,
+0x80, 0x02, 0xE4, 0xFD, 0xFF, 0x12, 0x57, 0x82, 0x90, 0x92, 0x7F, 0xE0, 0x30, 0xE6, 0x11, 0x90,
+0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x04, 0xE4, 0xF0, 0x80, 0x06, 0x90, 0x01, 0x2F, 0x74, 0x80, 0xF0,
+0x12, 0xCF, 0x41, 0x90, 0x85, 0xDE, 0xE0, 0xFB, 0x02, 0x51, 0x7D, 0x90, 0x85, 0xBC, 0xE0, 0xFF,
+0x30, 0xE0, 0x3E, 0x90, 0x85, 0xC0, 0xE0, 0x7E, 0x00, 0xB4, 0x02, 0x02, 0x7E, 0x01, 0x90, 0x85,
+0xBF, 0xE0, 0x7D, 0x00, 0xB4, 0x04, 0x02, 0x7D, 0x01, 0xED, 0x4E, 0x70, 0x24, 0xEF, 0xC3, 0x13,
+0x30, 0xE0, 0x02, 0x80, 0x82, 0x12, 0x9E, 0x48, 0x90, 0x85, 0xC0, 0xE0, 0xB4, 0x08, 0x06, 0xE4,
+0xFD, 0x7F, 0x0C, 0x80, 0x09, 0x90, 0x85, 0xC0, 0xE0, 0x70, 0x06, 0xFD, 0x7F, 0x04, 0x12, 0x9A,
+0x74, 0x22, 0x22, 0xE4, 0xFF, 0x02, 0x2D, 0xBD, 0x7D, 0x02, 0x7F, 0x02, 0x02, 0x7C, 0x41, 0x7D,
+0x20, 0xE4, 0xFF, 0x02, 0x7B, 0xBF, 0x90, 0x85, 0xC1, 0xE0, 0x44, 0x04, 0xF0, 0x22, 0xE4, 0x90,
+0x84, 0xC1, 0x12, 0x95, 0xBE, 0x90, 0x92, 0x99, 0xF0, 0x22, 0x75, 0x48, 0x12, 0xE4, 0xF5, 0x49,
+0x75, 0x4A, 0x07, 0x75, 0x4B, 0x32, 0xF5, 0x50, 0x90, 0x01, 0x30, 0xE5, 0x48, 0xF0, 0xA3, 0xE5,
+0x49, 0xF0, 0xA3, 0xE5, 0x4A, 0xF0, 0xA3, 0xE5, 0x4B, 0xF0, 0x90, 0x01, 0x20, 0xE5, 0x50, 0xF0,
+0x22, 0x75, 0x52, 0x06, 0x75, 0x53, 0x01, 0x75, 0x54, 0x03, 0x75, 0x55, 0x62, 0x90, 0x01, 0x38,
+0xE5, 0x52, 0xF0, 0xA3, 0xE5, 0x53, 0xF0, 0xA3, 0xE5, 0x54, 0xF0, 0xA3, 0xE5, 0x55, 0xF0, 0x22,
+0x90, 0x01, 0xE4, 0x74, 0x01, 0xF0, 0xA3, 0x74, 0x0D, 0xF0, 0x22, 0x7D, 0x02, 0x90, 0x01, 0xC4,
+0x74, 0x3B, 0xF0, 0x74, 0xC0, 0xA3, 0xF0, 0x90, 0x92, 0xA0, 0xE0, 0xFF, 0xED, 0xC3, 0x9F, 0x50,
+0x18, 0xED, 0x25, 0xE0, 0x24, 0x81, 0xF8, 0xE6, 0x30, 0xE4, 0x0B, 0x90, 0x01, 0xB8, 0x74, 0x08,
+0xF0, 0xA3, 0xF0, 0x7F, 0x00, 0x22, 0x0D, 0x80, 0xDE, 0x7F, 0x01, 0x22, 0xE4, 0x90, 0x92, 0x43,
+0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x92, 0x43, 0xE0, 0x64, 0x01, 0xF0, 0x24, 0x6C, 0x90, 0x01,
+0xC4, 0xF0, 0x74, 0xC0, 0xA3, 0xF0, 0x12, 0x7C, 0x66, 0xBF, 0x01, 0x03, 0x12, 0x5B, 0x25, 0x90,
+0x85, 0xC5, 0xE0, 0x60, 0x0F, 0x90, 0x85, 0xC8, 0xE0, 0xFF, 0x90, 0x85, 0xC7, 0xE0, 0x6F, 0x60,
+0x03, 0x12, 0xBB, 0x77, 0xC2, 0xAF, 0x11, 0x3B, 0xBF, 0x01, 0x02, 0x11, 0xD6, 0xD2, 0xAF, 0x31,
+0xDF, 0x90, 0x92, 0x44, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x54, 0x7F, 0x45, 0xF0, 0x70,
+0x0D, 0x7F, 0xFF, 0x12, 0x7B, 0x51, 0xEF, 0x04, 0xFD, 0x7F, 0xFF, 0x12, 0x7B, 0x3E, 0x12, 0x8F,
+0xF9, 0x12, 0x84, 0x4D, 0x80, 0x9F, 0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x18, 0x90, 0x85, 0xBC,
+0xE0, 0xFF, 0x30, 0xE0, 0x0E, 0xC3, 0x13, 0x30, 0xE0, 0x07, 0x51, 0xC0, 0xBF, 0x01, 0x06, 0x80,
+0x02, 0x80, 0x00, 0x11, 0xF6, 0x22, 0x90, 0x85, 0xC8, 0xE0, 0xFF, 0x60, 0x03, 0xB4, 0x08, 0x0D,
+0x51, 0x43, 0xBF, 0x01, 0x08, 0x31, 0x0E, 0x90, 0x01, 0xE5, 0xE0, 0x04, 0xF0, 0x22, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x31, 0x8D, 0x31, 0x1E, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x51, 0xDB,
+0x7F, 0x08, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0xEF, 0xFD, 0x7F, 0x08, 0x12, 0x7B, 0x3E, 0xE4, 0xFF,
+0x31, 0x41, 0x7D, 0x35, 0x7F, 0x27, 0x12, 0x7B, 0x3E, 0x90, 0x85, 0xC2, 0xE0, 0x54, 0xEF, 0xF0,
+0x22, 0x90, 0x93, 0x84, 0xEF, 0x12, 0xB4, 0x0F, 0x90, 0x01, 0x09, 0xE0, 0x7F, 0x00, 0x30, 0xE7,
+0x02, 0x7F, 0x01, 0x90, 0x93, 0x84, 0xE0, 0x6F, 0x60, 0x32, 0xC3, 0x90, 0x93, 0x86, 0xE0, 0x94,
+0x88, 0x90, 0x93, 0x85, 0xE0, 0x94, 0x13, 0x40, 0x08, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x10, 0xF0,
+0x22, 0x90, 0x93, 0x85, 0x51, 0xCD, 0xD3, 0x90, 0x93, 0x86, 0xE0, 0x94, 0x32, 0x90, 0x93, 0x85,
+0xE0, 0x94, 0x00, 0x40, 0xC3, 0x90, 0x01, 0xC6, 0xE0, 0x30, 0xE0, 0xBC, 0x22, 0x90, 0x85, 0xC2,
+0xE0, 0x44, 0x10, 0xF0, 0x90, 0x85, 0xD0, 0xE0, 0xFD, 0x7F, 0x93, 0x12, 0x7B, 0x3E, 0x90, 0x85,
+0xC6, 0xE0, 0x60, 0x12, 0x90, 0x01, 0x2F, 0xE0, 0x30, 0xE7, 0x05, 0x74, 0x10, 0xF0, 0x80, 0x06,
+0x90, 0x01, 0x2F, 0x74, 0x90, 0xF0, 0x7F, 0x08, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x10, 0xFD, 0x7F,
+0x08, 0x12, 0x7B, 0x3E, 0x7F, 0x01, 0x31, 0x41, 0x7D, 0x34, 0x7F, 0x27, 0x12, 0x7B, 0x3E, 0x7F,
+0x90, 0x51, 0xB8, 0x7F, 0x90, 0x12, 0x7B, 0x3E, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0xD3,
+0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x92, 0xD6, 0xE0, 0x60, 0x25, 0x7F, 0x54, 0x7E, 0x09,
+0x12, 0x70, 0x61, 0x51, 0x37, 0xEF, 0x44, 0xFE, 0xFF, 0xEE, 0x44, 0x03, 0xFE, 0xED, 0x44, 0x04,
+0xFD, 0xEC, 0x51, 0x37, 0x90, 0x91, 0x66, 0x12, 0x04, 0xEB, 0x7F, 0x54, 0x7E, 0x09, 0x12, 0x71,
+0x18, 0x90, 0x92, 0xD1, 0xE0, 0x70, 0x04, 0x90, 0x07, 0xCC, 0xF0, 0x90, 0x92, 0xD9, 0xE0, 0x70,
+0x0A, 0x90, 0x92, 0xD6, 0xE0, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0x07, 0x90, 0x00, 0x1F, 0xE0, 0x54,
+0xF0, 0xF0, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x92, 0x46, 0x12, 0x04, 0xEB, 0x90, 0x92, 0x46,
+0x02, 0x87, 0x58, 0x90, 0x92, 0x9C, 0xE0, 0xC3, 0x13, 0x20, 0xE0, 0x48, 0x90, 0x02, 0x87, 0xE0,
+0x60, 0x02, 0x80, 0x08, 0x90, 0x01, 0x00, 0xE0, 0x64, 0x3F, 0x60, 0x05, 0x75, 0x62, 0x01, 0x80,
+0x40, 0x90, 0x86, 0x72, 0xE0, 0x30, 0xE0, 0x0B, 0x90, 0x02, 0x82, 0xE0, 0x60, 0x05, 0x75, 0x62,
+0x02, 0x80, 0x2E, 0x90, 0x86, 0x7A, 0xE0, 0x30, 0xE0, 0x05, 0x75, 0x62, 0x08, 0x80, 0x22, 0x90,
+0x02, 0x86, 0xE0, 0x20, 0xE1, 0x02, 0x80, 0x07, 0x90, 0x02, 0x86, 0xE0, 0x30, 0xE3, 0x05, 0x75,
+0x62, 0x04, 0x80, 0x0D, 0x90, 0x04, 0x1D, 0xE0, 0x60, 0x05, 0x75, 0x62, 0x40, 0x80, 0x02, 0x80,
+0x0F, 0x90, 0x01, 0xB9, 0x74, 0x08, 0xF0, 0x90, 0x01, 0xB8, 0xE5, 0x62, 0xF0, 0x7F, 0x00, 0x22,
+0x90, 0x01, 0xB8, 0xE4, 0xF0, 0x7F, 0x01, 0x22, 0x12, 0x7B, 0x51, 0xEF, 0x44, 0x01, 0xFD, 0x22,
+0x90, 0x85, 0xBF, 0xE0, 0x64, 0x02, 0x7F, 0x01, 0x60, 0x02, 0x7F, 0x00, 0x22, 0xE4, 0x75, 0xF0,
+0x01, 0x12, 0x07, 0x0A, 0x7F, 0x14, 0x7E, 0x00, 0x02, 0x7C, 0x9F, 0x90, 0x01, 0xC4, 0x74, 0xDB,
+0xF0, 0x74, 0xC2, 0xA3, 0xF0, 0x7F, 0x90, 0x12, 0x7B, 0x51, 0xEF, 0x20, 0xE0, 0xF7, 0x74, 0xDB,
+0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xC2, 0xA3, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0,
+0xD0, 0x7F, 0x02, 0x51, 0xB8, 0x7F, 0x02, 0x12, 0xAF, 0xDA, 0x44, 0x02, 0xF0, 0x90, 0x01, 0x00,
+0x74, 0xFF, 0xF0, 0x90, 0x06, 0xB7, 0x74, 0x09, 0xF0, 0x90, 0x06, 0xB4, 0x74, 0x86, 0xF0, 0xD0,
+0xD0, 0x92, 0xAF, 0x22, 0x51, 0xFA, 0x7D, 0x24, 0x71, 0x39, 0x54, 0xBF, 0xF0, 0x90, 0x85, 0xBF,
+0x74, 0x04, 0xF0, 0x22, 0x51, 0xFA, 0x02, 0xA7, 0xE4, 0x7F, 0x6F, 0x12, 0xA6, 0xF8, 0x90, 0x05,
+0x27, 0xE0, 0x22, 0xE4, 0xFD, 0xFF, 0x71, 0x3B, 0x44, 0x40, 0xF0, 0x02, 0x9F, 0xE1, 0x71, 0x43,
+0x90, 0x05, 0x27, 0xE0, 0x54, 0xBF, 0xF0, 0xE4, 0x90, 0x85, 0xBF, 0xF0, 0x22, 0x12, 0x9F, 0xE8,
+0x80, 0xEE, 0x12, 0x9F, 0xDB, 0x80, 0xE9, 0x7D, 0x22, 0x7F, 0xFF, 0x71, 0x3B, 0x44, 0x40, 0xF0,
+0x02, 0xA7, 0xE4, 0x7D, 0x1F, 0x71, 0x39, 0x54, 0xBF, 0xF0, 0x90, 0x85, 0xBF, 0x74, 0x04, 0xF0,
+0x22, 0x12, 0x9F, 0xD9, 0x80, 0xED, 0x7D, 0x25, 0x71, 0x39, 0x54, 0xBF, 0xF0, 0x90, 0x85, 0xBF,
+0x74, 0x04, 0xF0, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x12, 0x7A, 0x29, 0xEF, 0x64,
+0x01, 0x60, 0x05, 0x75, 0x10, 0x01, 0x80, 0x51, 0x90, 0x85, 0xC9, 0xE0, 0xFF, 0x54, 0x03, 0x60,
+0x05, 0x75, 0x10, 0x02, 0x80, 0x43, 0x90, 0x85, 0xC7, 0xE0, 0xFE, 0xE4, 0xC3, 0x9E, 0x50, 0x05,
+0x75, 0x10, 0x04, 0x80, 0x34, 0xEF, 0x30, 0xE2, 0x05, 0x75, 0x10, 0x08, 0x80, 0x2B, 0x90, 0x85,
+0xC9, 0xE0, 0x30, 0xE4, 0x05, 0x75, 0x10, 0x10, 0x80, 0x1F, 0x90, 0x85, 0xC2, 0xE0, 0x13, 0x13,
+0x54, 0x3F, 0x20, 0xE0, 0x05, 0x75, 0x10, 0x20, 0x80, 0x0F, 0x90, 0x86, 0x71, 0xE0, 0x60, 0x05,
+0x75, 0x10, 0x80, 0x80, 0x04, 0x51, 0xB0, 0x80, 0x0E, 0x90, 0x01, 0xB9, 0x74, 0x04, 0xF0, 0x90,
+0x01, 0xB8, 0xE5, 0x10, 0xF0, 0x7F, 0x00, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x84, 0xA1, 0x74,
+0x02, 0xF0, 0xA3, 0x74, 0x10, 0xF0, 0x90, 0x84, 0xA7, 0x74, 0x80, 0xF0, 0xA3, 0x74, 0x03, 0xF0,
+0x22, 0xE4, 0xFB, 0xFA, 0xFD, 0x7F, 0x01, 0x12, 0x86, 0x4E, 0x90, 0x92, 0x4A, 0xEF, 0xF0, 0x60,
+0xF0, 0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x70, 0x04, 0xA3, 0xE0, 0x60, 0xE5, 0xC2, 0xAF, 0xEF, 0x30,
+0xE0, 0x0F, 0x90, 0x84, 0xC1, 0xE0, 0x54, 0xFE, 0xF0, 0xE4, 0xFF, 0x12, 0x2D, 0xBD, 0x12, 0x91,
+0x75, 0x91, 0x7C, 0x30, 0xE1, 0x06, 0x54, 0xFD, 0xF0, 0x12, 0x60, 0x5D, 0x91, 0x7C, 0x30, 0xE2,
+0x06, 0x54, 0xFB, 0xF0, 0x12, 0x6A, 0x6D, 0x91, 0x7C, 0x30, 0xE4, 0x0C, 0x54, 0xEF, 0xF0, 0x12,
+0x6F, 0x22, 0xBF, 0x01, 0x03, 0x12, 0xB4, 0x16, 0xD2, 0xAF, 0x80, 0xB5, 0xD2, 0xAF, 0xC2, 0xAF,
+0x90, 0x84, 0xC1, 0xE0, 0xFF, 0x22, 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, 0x87, 0xF0, 0x74, 0xC4, 0xA3, 0xF0, 0x12, 0x6C,
+0xBC, 0x74, 0x87, 0x04, 0x90, 0x01, 0xC4, 0xF0, 0x74, 0xC4, 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, 0x32, 0xC0, 0xE0, 0xC0, 0x83, 0xC0, 0x82, 0xC0, 0xD0,
+0x75, 0xD0, 0x00, 0xC0, 0x05, 0xC0, 0x07, 0x7D, 0xD8, 0x90, 0x01, 0xC4, 0xED, 0xF0, 0x74, 0xC4,
+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, 0x85, 0xBC, 0xE0, 0x30, 0xE0, 0x05,
+0xE4, 0xA3, 0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x88, 0xE7, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xBC, 0xE0,
+0xFF, 0x30, 0xE0, 0x05, 0x12, 0x9E, 0x61, 0x60, 0x1B, 0x90, 0x85, 0xC5, 0xE0, 0x70, 0x04, 0xEF,
+0x30, 0xE0, 0x0B, 0x90, 0x85, 0xC8, 0xE0, 0x64, 0x02, 0x60, 0x09, 0x12, 0xA0, 0x7F, 0x90, 0x01,
+0xE6, 0xE0, 0x04, 0xF0, 0x22, 0xE4, 0xFF, 0x12, 0x77, 0x39, 0xBF, 0x01, 0x13, 0x90, 0x85, 0xC5,
+0xE0, 0x60, 0x0D, 0x12, 0x9E, 0xC6, 0x64, 0x02, 0x60, 0x03, 0x02, 0x77, 0x61, 0x12, 0x79, 0x41,
+0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x7F, 0x02, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0xFE,
+0xFD, 0x7F, 0x02, 0x12, 0x7B, 0x3E, 0x90, 0x01, 0x00, 0x74, 0x3F, 0xF0, 0x90, 0x01, 0x34, 0x74,
+0x08, 0xF0, 0x90, 0x01, 0x01, 0xE0, 0x54, 0xFD, 0xF0, 0x90, 0x05, 0x53, 0xE0, 0x44, 0x20, 0xF0,
+0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xB1, 0x9F, 0x7D, 0x23, 0x02, 0x9F, 0xEF, 0x02, 0x9F, 0xF4, 0x90,
+0x05, 0x27, 0xE0, 0x44, 0x40, 0xF0, 0x22, 0x7D, 0x07, 0xAF, 0x63, 0xED, 0x30, 0xE0, 0x21, 0x75,
+0xF0, 0x12, 0xEF, 0x90, 0x89, 0x44, 0xB1, 0xFA, 0xEF, 0x90, 0x89, 0x46, 0xB1, 0xFA, 0xEF, 0x90,
+0x89, 0x48, 0xB1, 0xFA, 0xEF, 0x90, 0x89, 0x4A, 0xB1, 0xFA, 0xEF, 0x90, 0x89, 0x4C, 0xD1, 0x05,
+0xED, 0x30, 0xE1, 0x09, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x40, 0xD1, 0x05, 0xED, 0x30, 0xE2,
+0x0C, 0x75, 0xF0, 0x12, 0xEF, 0x90, 0x89, 0x42, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xD1, 0x0D, 0xE0,
+0x54, 0xBF, 0x44, 0x80, 0xFE, 0xD1, 0x0D, 0xEE, 0xF0, 0x22, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3,
+0xF0, 0x75, 0xF0, 0x12, 0x22, 0x12, 0x05, 0x28, 0xE4, 0xF0, 0xA3, 0xF0, 0x22, 0xEF, 0xC4, 0x54,
+0xF0, 0x24, 0x03, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0x22, 0x7B, 0x00, 0x7A, 0x00, 0x79,
+0x00, 0x90, 0x89, 0x1B, 0x12, 0x87, 0x79, 0x7B, 0xFF, 0x7A, 0x82, 0x79, 0x00, 0x90, 0x89, 0x1E,
+0x12, 0x87, 0x79, 0x7A, 0x82, 0x79, 0x3F, 0x90, 0x89, 0x21, 0x12, 0x87, 0x79, 0x7A, 0x82, 0x79,
+0xE1, 0x90, 0x89, 0x27, 0x12, 0x87, 0x79, 0x7A, 0x82, 0x79, 0xF5, 0x90, 0x89, 0x2A, 0x12, 0x87,
+0x79, 0x7A, 0x83, 0x79, 0x1D, 0x90, 0x89, 0x2D, 0x12, 0x87, 0x79, 0x7A, 0x83, 0x79, 0x31, 0x90,
+0x89, 0x33, 0x12, 0x87, 0x79, 0x7A, 0x83, 0x79, 0x59, 0x90, 0x89, 0x36, 0x12, 0x87, 0x79, 0x7A,
+0x83, 0x79, 0x81, 0x90, 0x89, 0x39, 0x12, 0x87, 0x79, 0xE4, 0x90, 0x93, 0x1C, 0xF0, 0x90, 0x92,
+0x29, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0xFF, 0xC3, 0x94, 0x05, 0x50, 0x10, 0x74, 0x2D, 0x2F, 0x12,
+0x95, 0xF8, 0xE4, 0xF0, 0x90, 0x92, 0x29, 0xE0, 0x04, 0xF0, 0x80, 0xE6, 0x22, 0x7E, 0x00, 0x7F,
+0x2E, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0xA1, 0x02, 0x06, 0xDE, 0x90, 0x01, 0x94, 0xE0,
+0x44, 0x01, 0xF0, 0x90, 0x01, 0xC7, 0xE4, 0xF0, 0x22, 0x90, 0x01, 0xCF, 0xE0, 0x90, 0x92, 0x6E,
+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, 0x75, 0xB6, 0x90, 0x00, 0x03, 0xE0, 0x54, 0xFB, 0xFD, 0x7F, 0x03, 0x12,
+0x7B, 0x3E, 0x80, 0xFE, 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, 0xC3, 0xEE, 0x94, 0x01, 0x40, 0x0A, 0x0D, 0xED, 0x13, 0x90, 0xFD, 0x10, 0xF0,
+0xE4, 0x2F, 0xFF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90, 0x93, 0x77, 0xED, 0xF0,
+0xA3, 0xEB, 0xF0, 0x90, 0x93, 0x76, 0xEF, 0xF0, 0xE4, 0xFD, 0xFC, 0x12, 0xAF, 0xC2, 0x90, 0x93,
+0x76, 0xE0, 0x90, 0x04, 0x25, 0xF0, 0x90, 0x93, 0x77, 0xE0, 0x60, 0x06, 0x12, 0xD1, 0x97, 0x44,
+0x80, 0xF0, 0xAF, 0x05, 0x74, 0x20, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x54,
+0xC0, 0xF0, 0x12, 0xD1, 0x97, 0x54, 0xC0, 0xF0, 0x90, 0x93, 0x79, 0xE0, 0xFF, 0xAE, 0x05, 0x74,
+0x18, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0, 0x90, 0x00, 0x8B, 0xE0, 0xD3,
+0x94, 0x03, 0x74, 0x10, 0x40, 0x08, 0x12, 0xD2, 0x10, 0x74, 0x04, 0xF0, 0x80, 0x05, 0x12, 0xD2,
+0x10, 0xE4, 0xF0, 0xAF, 0x05, 0x12, 0xD2, 0x2B, 0xF5, 0x83, 0xE0, 0x54, 0x01, 0xFE, 0x90, 0x93,
+0x78, 0xE0, 0x25, 0xE0, 0x25, 0xE0, 0xFB, 0xEE, 0x44, 0x02, 0x4B, 0xFE, 0x12, 0xD2, 0x2B, 0xF5,
+0x83, 0xEE, 0xF0, 0x74, 0x11, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x74, 0xFF, 0xF0,
+0x74, 0x29, 0x2F, 0x12, 0xCA, 0xF5, 0x54, 0xF7, 0xF0, 0xAE, 0x04, 0xAF, 0x05, 0xD0, 0xD0, 0x92,
+0xAF, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFE, 0xFD, 0xEF, 0xB4, 0x01, 0x0D,
+0xEB, 0xB4, 0x02, 0x03, 0x0D, 0x80, 0x06, 0xEB, 0xB4, 0x01, 0x02, 0x7D, 0x02, 0xAF, 0x06, 0xEF,
+0xC4, 0x54, 0xF0, 0x4D, 0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0xE4, 0x90, 0x92, 0x81, 0xF0, 0xA3,
+0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51, 0x90, 0x92, 0x80, 0xEF, 0xF0, 0x7F, 0x83, 0x12, 0x7B, 0x51,
+0xAE, 0x07, 0x90, 0x92, 0x80, 0xE0, 0xFF, 0xB5, 0x06, 0x01, 0x22, 0xC3, 0x90, 0x92, 0x82, 0xE0,
+0x94, 0x64, 0x90, 0x92, 0x81, 0xE0, 0x94, 0x00, 0x40, 0x0D, 0x90, 0x01, 0xC0, 0xE0, 0x44, 0x40,
+0xF0, 0x90, 0x92, 0x80, 0xE0, 0xFF, 0x22, 0x90, 0x92, 0x81, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07,
+0x0A, 0x80, 0xBE, 0x7E, 0x00, 0x7F, 0x01, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xBC, 0x12,
+0x06, 0xDE, 0x90, 0x85, 0xBC, 0xE0, 0x54, 0xFD, 0xF0, 0xE4, 0x12, 0x95, 0xBF, 0xA3, 0x74, 0x0C,
+0xF0, 0x22, 0x12, 0x9F, 0xD9, 0x02, 0x9F, 0xED, 0x12, 0x9F, 0xD9, 0x02, 0xA7, 0xDE, 0x12, 0x7A,
+0x29, 0xEF, 0x70, 0x03, 0x12, 0x9E, 0x9E, 0x22, 0xD3, 0x10, 0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0x90,
+0x92, 0x8E, 0xEF, 0xF0, 0xA3, 0xED, 0xF0, 0x90, 0x84, 0xC3, 0xE0, 0x04, 0xF0, 0x90, 0x04, 0x1D,
+0xE0, 0x60, 0x37, 0x90, 0x05, 0x22, 0xE0, 0x90, 0x92, 0x92, 0xF0, 0x7D, 0x26, 0x12, 0xA7, 0x4B,
+0xEF, 0x64, 0x01, 0x70, 0x17, 0x31, 0x0E, 0xFB, 0x7D, 0x01, 0x12, 0x3A, 0xC2, 0x31, 0x23, 0xE0,
+0x20, 0xE0, 0x09, 0x90, 0x92, 0xA1, 0xE0, 0x20, 0xE0, 0x02, 0x31, 0x18, 0x90, 0x92, 0x92, 0xE0,
+0xFF, 0x7D, 0x27, 0x12, 0xA6, 0xF8, 0x31, 0x06, 0x80, 0x1F, 0x31, 0x06, 0x31, 0x0E, 0xFB, 0x90,
+0x93, 0x79, 0x74, 0x0A, 0xF0, 0x7D, 0x01, 0x12, 0xC7, 0x34, 0x31, 0x23, 0xE0, 0x20, 0xE0, 0x09,
+0x90, 0x92, 0xA1, 0xE0, 0x20, 0xE0, 0x02, 0x31, 0x18, 0x31, 0x39, 0x31, 0xF1, 0x74, 0x01, 0xF0,
+0xFF, 0xD0, 0xD0, 0x92, 0xAF, 0x22, 0x90, 0x92, 0x8E, 0xE0, 0xFF, 0x02, 0x5C, 0xA3, 0x90, 0x84,
+0xC8, 0xE0, 0xFF, 0x90, 0x92, 0x8F, 0xE0, 0x22, 0x90, 0x92, 0x90, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF,
+0x02, 0x50, 0xD7, 0x90, 0x92, 0x90, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x92, 0x8E,
+0xE0, 0xFF, 0x12, 0x65, 0x61, 0x90, 0x92, 0xA2, 0x22, 0x90, 0x04, 0x1F, 0x74, 0x20, 0xF0, 0x22,
+0xE4, 0x90, 0x92, 0x71, 0xF0, 0xA3, 0xF0, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x20, 0xF0, 0x12, 0x75,
+0xE4, 0xEF, 0x64, 0x01, 0x60, 0x02, 0x21, 0xDB, 0x90, 0x88, 0xD9, 0xE0, 0xFF, 0x90, 0x93, 0x79,
+0x74, 0x0A, 0xF0, 0x7B, 0x08, 0x7D, 0x01, 0x12, 0xC7, 0x34, 0x90, 0x92, 0x6E, 0xEE, 0xF0, 0xA3,
+0xEF, 0xF0, 0x90, 0x92, 0x6E, 0xA3, 0x51, 0xE5, 0xFD, 0x74, 0x2C, 0x2E, 0x31, 0xE5, 0x90, 0x92,
+0x70, 0xEF, 0xF0, 0x90, 0x92, 0x6E, 0xA3, 0xE0, 0x24, 0x28, 0xF9, 0xE4, 0x34, 0xFC, 0xFA, 0x7B,
+0x01, 0xE4, 0xFD, 0x12, 0x52, 0x21, 0x90, 0x92, 0x70, 0xE0, 0xFF, 0x90, 0x92, 0x6F, 0xE0, 0x2F,
+0xFF, 0x90, 0x92, 0x6E, 0xE0, 0x34, 0x00, 0xCF, 0x24, 0x30, 0xCF, 0x34, 0x00, 0xFE, 0x90, 0x92,
+0x71, 0xF0, 0xA3, 0xEF, 0xF0, 0x51, 0xFE, 0x31, 0xDC, 0x90, 0x88, 0xD9, 0xE0, 0xFB, 0xE4, 0xFF,
+0x12, 0x15, 0x44, 0x31, 0xDC, 0x90, 0x88, 0xD5, 0xE0, 0xFB, 0x7F, 0x11, 0x12, 0x15, 0x44, 0x31,
+0x39, 0x90, 0x88, 0x88, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x22, 0x90, 0x92, 0x71, 0xE0,
+0xFC, 0xA3, 0xE0, 0xFD, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0xFB, 0x02, 0x5D,
+0x98, 0x90, 0x84, 0xBF, 0xA3, 0xE0, 0x24, 0x7F, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22,
+0x90, 0x92, 0x94, 0x51, 0x9A, 0x90, 0x92, 0x98, 0xF0, 0x7D, 0x09, 0x12, 0x55, 0x36, 0xEF, 0x64,
+0x06, 0x70, 0x2A, 0x51, 0x91, 0x7D, 0x14, 0x12, 0x55, 0x36, 0xEF, 0x70, 0x20, 0x51, 0x91, 0x7D,
+0x15, 0x12, 0x55, 0x36, 0xEF, 0x64, 0x50, 0x70, 0x14, 0x51, 0x91, 0x7D, 0x21, 0x12, 0x55, 0x36,
+0xEF, 0x20, 0xE0, 0x03, 0x30, 0xE2, 0x06, 0x90, 0x92, 0x98, 0x74, 0x01, 0xF0, 0x90, 0x86, 0x73,
+0xE0, 0x13, 0x13, 0x54, 0x3F, 0x30, 0xE0, 0x3F, 0x51, 0x91, 0x7D, 0x09, 0x12, 0x55, 0x36, 0xEF,
+0x64, 0x11, 0x70, 0x33, 0x90, 0x92, 0x95, 0xE0, 0x24, 0x14, 0xFF, 0x90, 0x92, 0x94, 0xE0, 0x34,
+0x00, 0xFE, 0x90, 0x92, 0x96, 0xF0, 0xA3, 0xEF, 0xF0, 0x7D, 0x02, 0x12, 0x55, 0x36, 0xEF, 0x70,
+0x16, 0x90, 0x92, 0x96, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x7D, 0x03, 0x12, 0x55, 0x36, 0xBF, 0x89,
+0x06, 0x90, 0x92, 0x98, 0x74, 0x01, 0xF0, 0x90, 0x92, 0x98, 0xE0, 0xFF, 0x31, 0xF1, 0xEF, 0xF0,
+0x22, 0x90, 0x92, 0x94, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x22, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0xE4,
+0x22, 0x90, 0x92, 0x4B, 0x51, 0x9A, 0xA3, 0xF0, 0x90, 0x92, 0x4D, 0xE0, 0xFD, 0xC3, 0x94, 0x04,
+0x50, 0x27, 0x90, 0x92, 0x4C, 0xE0, 0x24, 0x10, 0x51, 0xDC, 0x12, 0x55, 0x36, 0x90, 0x92, 0x4D,
+0xE0, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00,
+0x22, 0x90, 0x92, 0x4D, 0xE0, 0x04, 0xF0, 0x80, 0xCF, 0x7F, 0x01, 0x22, 0xFF, 0x90, 0x92, 0x4B,
+0xE0, 0x34, 0x00, 0xFE, 0x22, 0xE0, 0xFE, 0x24, 0x28, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83,
+0xE0, 0xFF, 0x74, 0x29, 0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xAD, 0x07,
+0x90, 0x88, 0x80, 0xE4, 0x75, 0xF0, 0x01, 0x12, 0x07, 0x0A, 0x90, 0x88, 0x80, 0xE0, 0xFF, 0xAE,
+0x05, 0x74, 0x04, 0x2E, 0x12, 0xAF, 0xBA, 0xEF, 0xF0, 0x90, 0x88, 0x80, 0xA3, 0xE0, 0xFF, 0x74,
+0x05, 0x2E, 0x12, 0xAF, 0x6A, 0xEF, 0xF0, 0x22, 0x90, 0x92, 0x4B, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0,
+0x24, 0x16, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x88, 0x86, 0xA3, 0xE0,
+0xB5, 0x07, 0x19, 0x90, 0x92, 0x4C, 0xE0, 0x24, 0x16, 0x51, 0xDC, 0x7D, 0x01, 0x12, 0x55, 0x36,
+0xEF, 0xFD, 0x90, 0x88, 0x86, 0xE0, 0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x7F,
+0x01, 0x22, 0x7E, 0x00, 0x7F, 0xAC, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x85, 0x79, 0xC1, 0x12, 0x06,
+0xDE, 0x91, 0x2F, 0x12, 0x06, 0xDE, 0x90, 0x85, 0xC4, 0x74, 0x02, 0xF0, 0x90, 0x85, 0xCB, 0x14,
+0xF0, 0xA3, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x90, 0x85, 0xD1, 0xE4, 0xF0, 0xA3, 0x74, 0x02, 0x91,
+0x1F, 0x91, 0x3C, 0xE4, 0xFD, 0xFF, 0x12, 0x57, 0x82, 0x7D, 0x0C, 0x7F, 0x02, 0x12, 0x57, 0x82,
+0x7D, 0x0C, 0x7F, 0x01, 0x12, 0x57, 0x82, 0x90, 0x84, 0xC5, 0xE0, 0xFF, 0xB4, 0x01, 0x08, 0x90,
+0x85, 0xD0, 0x74, 0xDD, 0xF0, 0x80, 0x0F, 0xEF, 0x90, 0x85, 0xD0, 0xB4, 0x03, 0x05, 0x74, 0xD4,
+0xF0, 0x80, 0x03, 0x74, 0x40, 0xF0, 0x7F, 0x2C, 0x12, 0x7B, 0x51, 0xEF, 0x54, 0x0F, 0xFF, 0xBF,
+0x05, 0x08, 0x90, 0x85, 0xFB, 0x74, 0x02, 0xF0, 0x80, 0x05, 0xE4, 0x90, 0x85, 0xFB, 0xF0, 0x90,
+0x86, 0x6D, 0x74, 0x03, 0xF0, 0xA3, 0x74, 0x0F, 0xF0, 0xA3, 0xE0, 0x54, 0x01, 0x44, 0x28, 0xF0,
+0xA3, 0x74, 0x07, 0x91, 0x1F, 0xE4, 0x90, 0x85, 0xD7, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x12, 0x69,
+0x33, 0x90, 0x05, 0x58, 0x74, 0x02, 0xF0, 0x90, 0x06, 0x04, 0xE0, 0x54, 0x7F, 0xF0, 0x90, 0x06,
+0x0A, 0xE0, 0x54, 0xF8, 0xF0, 0x90, 0x05, 0x22, 0xE4, 0xF0, 0x90, 0x86, 0x71, 0xF0, 0x22, 0xF0,
+0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90, 0x85, 0xDD, 0xF0, 0xA3, 0x74, 0x0A, 0xF0, 0x22, 0x7E,
+0x00, 0x7F, 0x04, 0x7D, 0x00, 0x7B, 0x01, 0x7A, 0x92, 0x79, 0x9C, 0x22, 0x90, 0x93, 0x16, 0x74,
+0x04, 0xF0, 0x14, 0xF0, 0xA3, 0xF0, 0xA3, 0xE4, 0xF0, 0xA3, 0x74, 0x64, 0xF0, 0xA3, 0x74, 0x05,
+0xF0, 0xA3, 0xF0, 0x22, 0x90, 0x93, 0x87, 0x12, 0x87, 0x79, 0x12, 0x71, 0x54, 0x90, 0x85, 0xC5,
+0xE0, 0xFF, 0x12, 0x60, 0xD0, 0x90, 0x85, 0xC5, 0xE0, 0x60, 0x15, 0x90, 0x93, 0x87, 0x12, 0x87,
+0x70, 0x12, 0x8D, 0x96, 0x54, 0x0F, 0xFF, 0x12, 0x8C, 0x7A, 0xFD, 0x12, 0x6A, 0xB8, 0x91, 0x81,
+0x22, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x90, 0x85, 0xDE, 0xE0, 0xFB, 0x02, 0x51,
+0x7D, 0xE4, 0x90, 0x92, 0x6E, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x90, 0x92, 0xE5, 0x12, 0x87, 0x58,
+0x90, 0x92, 0xE1, 0x12, 0x87, 0x64, 0xC3, 0x12, 0x04, 0xB4, 0x40, 0x46, 0x90, 0x85, 0xC1, 0xE0,
+0x90, 0x92, 0xE5, 0x30, 0xE0, 0x0F, 0xB1, 0xFA, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x2F, 0xFF,
+0x90, 0x93, 0x16, 0x80, 0x05, 0xB1, 0xFA, 0x90, 0x93, 0x17, 0xE0, 0xFE, 0xC3, 0xEF, 0x9E, 0x90,
+0x92, 0x6F, 0xF0, 0x90, 0x92, 0x6F, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x50, 0x15, 0x74, 0xE9, 0x2F,
+0xD1, 0x17, 0xE0, 0x04, 0xF0, 0x90, 0x85, 0xDB, 0xE0, 0x04, 0xF0, 0xE0, 0xFD, 0x7F, 0xFE, 0x12,
+0x7B, 0x3E, 0x90, 0x85, 0xDB, 0xE0, 0xFF, 0xD3, 0x90, 0x93, 0x19, 0xE0, 0x9F, 0x90, 0x93, 0x18,
+0xE0, 0x94, 0x00, 0x40, 0x02, 0xA1, 0xC6, 0xB1, 0xD8, 0xB1, 0xCF, 0x50, 0x1C, 0xB1, 0xE2, 0x90,
+0x92, 0x70, 0xE0, 0xD3, 0x9F, 0x40, 0x0A, 0x90, 0x92, 0x6E, 0xE0, 0x90, 0x92, 0x71, 0xF0, 0x80,
+0x08, 0x90, 0x92, 0x6E, 0xE0, 0x04, 0xF0, 0x80, 0xE0, 0xB1, 0xD8, 0xB1, 0xCF, 0x50, 0x2C, 0xB1,
+0xE2, 0xC3, 0x90, 0x93, 0x19, 0xE0, 0x9F, 0xFF, 0x90, 0x93, 0x18, 0xE0, 0x94, 0x00, 0xFE, 0x90,
+0x92, 0x70, 0xE0, 0xD3, 0x9F, 0xE4, 0x9E, 0x40, 0x0A, 0x90, 0x92, 0x6E, 0xE0, 0x90, 0x92, 0x72,
+0xF0, 0x80, 0x08, 0x90, 0x92, 0x6E, 0xE0, 0x04, 0xF0, 0x80, 0xD0, 0x90, 0x92, 0x71, 0xE0, 0x90,
+0x85, 0xE0, 0xF0, 0x90, 0x92, 0x72, 0xE0, 0x90, 0x85, 0xE1, 0xB1, 0xC7, 0x94, 0x0A, 0x40, 0x0A,
+0xEF, 0x24, 0xF6, 0x90, 0x85, 0xD8, 0xF0, 0xE4, 0x80, 0x09, 0xE4, 0x90, 0x85, 0xD8, 0xB1, 0xC7,
+0x74, 0x0A, 0x9F, 0x90, 0x85, 0xD7, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F,
+0x90, 0x85, 0xDE, 0xF0, 0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x05, 0x90, 0x93, 0x16, 0x80, 0x03,
+0x90, 0x93, 0x17, 0xE0, 0xFF, 0x90, 0x85, 0xDE, 0xE0, 0x2F, 0x04, 0xF0, 0x90, 0x85, 0xDE, 0xE0,
+0xC3, 0x94, 0x0A, 0x50, 0x03, 0x74, 0x0A, 0xF0, 0x90, 0x85, 0xDE, 0xE0, 0x24, 0x02, 0xF0, 0x91,
+0x81, 0xE4, 0xFF, 0x12, 0x69, 0x33, 0x22, 0xF0, 0x90, 0x85, 0xE0, 0xE0, 0xFF, 0xC3, 0x22, 0x90,
+0x92, 0x6E, 0xE0, 0xFF, 0xC3, 0x94, 0x2D, 0x22, 0xE4, 0x90, 0x92, 0x70, 0xF0, 0x90, 0x92, 0x6E,
+0xF0, 0x22, 0x74, 0xE9, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0xE0, 0xFF, 0x90, 0x92,
+0x70, 0xE0, 0x2F, 0xF0, 0x90, 0x93, 0x1A, 0xE0, 0xFF, 0x22, 0x12, 0x87, 0x64, 0x90, 0x92, 0xE1,
+0x12, 0x87, 0x58, 0x12, 0x87, 0x30, 0x78, 0x0A, 0x12, 0x04, 0xC5, 0x90, 0x85, 0xDD, 0xE0, 0xFE,
+0xC3, 0x74, 0x0A, 0x9E, 0x2F, 0xFF, 0x22, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83, 0x22, 0xE4,
+0xFE, 0x74, 0xE9, 0x2E, 0xD1, 0x17, 0xE4, 0xF0, 0x0E, 0xEE, 0xB4, 0x2D, 0xF4, 0xE4, 0x90, 0x85,
+0xDC, 0xF0, 0x90, 0x85, 0xDB, 0xF0, 0x90, 0x85, 0xDF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0xA3, 0x74,
+0x2D, 0xF0, 0xE4, 0xA3, 0xF0, 0x22, 0xAC, 0x07, 0x90, 0x92, 0xDC, 0xE0, 0xF9, 0x30, 0xE0, 0x02,
+0xC1, 0xFA, 0x90, 0x85, 0xC1, 0xE0, 0x30, 0xE0, 0x16, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x04, 0x90,
+0x85, 0xDA, 0xF0, 0x90, 0x85, 0xFB, 0xE0, 0x24, 0x03, 0x90, 0x85, 0xD9, 0xF0, 0x80, 0x0D, 0x90,
+0x85, 0xDA, 0x74, 0x02, 0xF0, 0x90, 0x85, 0xD9, 0x14, 0xF0, 0x0B, 0x0B, 0x90, 0x85, 0xD9, 0xE0,
+0xFA, 0x90, 0x85, 0xD8, 0xE0, 0xD3, 0x9A, 0x50, 0x0E, 0x90, 0x85, 0xCD, 0xEB, 0xF0, 0x90, 0x85,
+0xDA, 0xE0, 0xC3, 0x9D, 0x2C, 0x80, 0x11, 0xC3, 0xED, 0x9A, 0x2B, 0x90, 0x85, 0xCD, 0xF0, 0x90,
+0x85, 0xD9, 0xE0, 0xFF, 0xA3, 0xE0, 0xC3, 0x9F, 0x90, 0x85, 0xDD, 0xF0, 0x90, 0x85, 0xDA, 0xE0,
+0xFF, 0x24, 0x0A, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85, 0xDD, 0xF1, 0x02, 0x98, 0x40, 0x04, 0xEF,
+0x24, 0x0A, 0xF0, 0x90, 0x85, 0xDD, 0xE0, 0xFF, 0x24, 0x23, 0xFD, 0xE4, 0x33, 0xFC, 0x90, 0x85,
+0xCD, 0xF1, 0x02, 0x98, 0x40, 0x04, 0xEF, 0x24, 0x23, 0xF0, 0x90, 0x85, 0xDD, 0xE0, 0xFF, 0x7E,
+0x00, 0x90, 0x85, 0xD1, 0xEE, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x05, 0x58, 0xE0, 0x6F, 0x70, 0x01,
+0xE4, 0x60, 0x02, 0xF1, 0x0C, 0xE9, 0x54, 0xFD, 0x80, 0x03, 0xE9, 0x44, 0x02, 0x90, 0x92, 0xDC,
+0xF0, 0x22, 0xE0, 0xD3, 0x9D, 0xEC, 0x64, 0x80, 0xF8, 0x74, 0x80, 0x22, 0x90, 0x85, 0xD1, 0xA3,
+0xE0, 0x90, 0x05, 0x58, 0xF0, 0x22, 0x12, 0xBE, 0xC9, 0x40, 0x25, 0x90, 0x85, 0xDF, 0xE0, 0x04,
+0xF0, 0x90, 0x93, 0x1B, 0xE0, 0xFF, 0x90, 0x85, 0xDF, 0xE0, 0xD3, 0x9F, 0x50, 0x12, 0x90, 0x85,
+0xD7, 0xE0, 0x04, 0x12, 0x9E, 0x0A, 0x90, 0x85, 0xDE, 0xF0, 0xFB, 0xF1, 0x41, 0x12, 0x51, 0x7D,
+0x22, 0x90, 0x85, 0xD7, 0xE0, 0xFF, 0xA3, 0xE0, 0xFD, 0x22, 0x90, 0x92, 0x9C, 0xE0, 0x30, 0xE0,
+0x0A, 0x90, 0x01, 0x3B, 0xE0, 0x30, 0xE4, 0x03, 0x12, 0xA7, 0xAD, 0x22, 0x90, 0x92, 0x93, 0xEF,
+0xF0, 0x90, 0x84, 0xC5, 0xE0, 0x64, 0x02, 0x70, 0x1F, 0x90, 0x92, 0x93, 0xE0, 0xFD, 0x64, 0x01,
+0x70, 0x32, 0x12, 0xB7, 0x21, 0x12, 0x8E, 0x87, 0x30, 0xE0, 0x09, 0x90, 0x01, 0x4D, 0xE0, 0x64,
+0x80, 0xF0, 0x80, 0x20, 0xAF, 0x05, 0x80, 0x19, 0x90, 0x01, 0x00, 0x74, 0xFF, 0xF0, 0x7F, 0x64,
+0x7E, 0x00, 0x12, 0x7C, 0x9F, 0x90, 0x06, 0x90, 0xE0, 0x44, 0x01, 0xF0, 0x90, 0x92, 0x93, 0xE0,
+0xFF, 0x12, 0x2A, 0x87, 0x90, 0x88, 0xE1, 0xE0, 0x54, 0xFE, 0xF0, 0x02, 0xAF, 0xCA, 0xD3, 0x10,
+0xAF, 0x01, 0xC3, 0xC0, 0xD0, 0xE4, 0xFD, 0x7F, 0x8F, 0x12, 0x7B, 0x3E, 0xD0, 0xD0, 0x92, 0xAF,
+0x22, 0xF1, 0xAE, 0x12, 0x77, 0x89, 0x90, 0x01, 0x3F, 0x74, 0x04, 0xF0, 0x90, 0x84, 0xC5, 0xE0,
+0xFF, 0xB4, 0x01, 0x07, 0x90, 0xFD, 0x00, 0xE0, 0x54, 0xEF, 0xF0, 0xEF, 0xB4, 0x01, 0x07, 0x90,
+0xFE, 0x10, 0xE0, 0x54, 0xFB, 0xF0, 0x22, 0x12, 0xB7, 0xDB, 0x90, 0x88, 0x7C, 0xE0, 0x70, 0x02,
+0xA3, 0xE0, 0x60, 0x24, 0xE4, 0x90, 0x92, 0x4E, 0xF0, 0x12, 0xD0, 0x2C, 0x50, 0x1D, 0x11, 0x6E,
0x24, 0x8A, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22,
-0x90, 0x92, 0x36, 0xE0, 0x04, 0xF0, 0x80, 0xE2, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x32, 0xE0, 0x44,
-0x40, 0xF0, 0xE4, 0x90, 0x88, 0x88, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x92, 0x33, 0xEE,
-0xF0, 0xA3, 0xEF, 0xF0, 0x22, 0x90, 0x92, 0x36, 0xE0, 0xFD, 0xC3, 0x94, 0x02, 0x22, 0xD1, 0xCC,
-0xA3, 0xED, 0xF0, 0xE4, 0xA3, 0xF0, 0xD1, 0xD5, 0x50, 0x17, 0xF1, 0x19, 0x24, 0xAA, 0xF5, 0x82,
-0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xB5, 0x07, 0x1D, 0x90, 0x92, 0x36, 0xE0, 0x04, 0xF0, 0x80,
-0xE5, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x01, 0xC7, 0x74, 0x30, 0xF0, 0x7F, 0x01,
-0x12, 0x5F, 0xE9, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x92, 0x33, 0xE0, 0xFE, 0xA3, 0xE0,
-0xFF, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x92, 0x36, 0xE0, 0x22, 0xD1, 0xCC, 0x24,
-0x16, 0xFF, 0xE4, 0x3E, 0xFE, 0xE4, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x88, 0x86, 0xA3, 0xE0, 0xB5,
-0x07, 0x19, 0x90, 0x92, 0x34, 0xE0, 0x24, 0x16, 0xF1, 0x61, 0x7D, 0x01, 0x12, 0x55, 0x36, 0xEF,
-0xFD, 0x90, 0x88, 0x86, 0xE0, 0x6D, 0x70, 0x01, 0xE4, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x7F, 0x01,
-0x22, 0xFF, 0x90, 0x92, 0x33, 0xE0, 0x34, 0x00, 0xFE, 0x22, 0xD1, 0xCC, 0xE4, 0xA3, 0xF0, 0x90,
-0x92, 0x35, 0xE0, 0xFD, 0xC3, 0x94, 0x04, 0x50, 0x27, 0x90, 0x92, 0x34, 0xE0, 0x24, 0x10, 0xF1,
-0x61, 0x12, 0x55, 0x36, 0x90, 0x92, 0x35, 0xE0, 0x24, 0x82, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5,
-0x83, 0xE0, 0x6F, 0x60, 0x03, 0x7F, 0x00, 0x22, 0x90, 0x92, 0x35, 0xE0, 0x04, 0xF0, 0x80, 0xCF,
-0x7F, 0x01, 0x22, 0xE5, 0x64, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83,
-0xE4, 0x93, 0xFF, 0x74, 0x01, 0x93, 0x90, 0x92, 0x41, 0xCF, 0xF0, 0xA3, 0xEF, 0xF0, 0x90, 0x92,
-0x3F, 0xE5, 0x66, 0xF0, 0xA3, 0xE5, 0x67, 0xF0, 0x22, 0x90, 0x05, 0x63, 0xE0, 0x90, 0x92, 0x94,
-0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x92, 0x95, 0xF0, 0x90, 0x05, 0x61, 0xE0, 0x90, 0x92, 0x96,
-0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x92, 0x97, 0xF0, 0x90, 0x92, 0x8B, 0xE0, 0x44, 0x01, 0xF0,
-0x22, 0x90, 0x92, 0x6D, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90, 0x92, 0x6B, 0xE0, 0xFF,
-0x12, 0x65, 0x61, 0x90, 0x92, 0x6D, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0x02, 0x50, 0xD7, 0x90, 0x01,
-0x34, 0x74, 0x40, 0xF0, 0xFD, 0xE4, 0xFF, 0x12, 0x7C, 0xA9, 0x43, 0x5E, 0x08, 0x22, 0xE5, 0x64,
-0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0xC4, 0x54, 0xF0, 0x24,
-0x01, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0x90, 0x01, 0xBA, 0xF0, 0x90,
-0x85, 0xC7, 0xE0, 0x90, 0x01, 0xBB, 0x22, 0x12, 0x02, 0xF6, 0xFF, 0x54, 0x01, 0xFE, 0x22, 0x74,
-0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xE0, 0x22, 0xF0, 0x74, 0xCC, 0x2D, 0xF5,
-0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0x74, 0xBC, 0x25, 0x62, 0xF5, 0x82, 0xE4, 0x34, 0x8F,
-0xF5, 0x83, 0x22, 0x90, 0x92, 0x41, 0xE4, 0xF0, 0xA3, 0x22, 0x90, 0x92, 0x07, 0x12, 0x87, 0x79,
-0x02, 0x02, 0xF6, 0x90, 0x92, 0x33, 0x12, 0x87, 0x70, 0x02, 0x03, 0xED, 0x2E, 0xF5, 0x82, 0xE4,
-0x34, 0xFC, 0xF5, 0x83, 0x22, 0xE0, 0xFF, 0xA3, 0xE0, 0x90, 0x92, 0x41, 0xCF, 0x22, 0x54, 0x08,
-0xFE, 0xEF, 0x54, 0xF7, 0x4E, 0x22, 0x54, 0x20, 0xFE, 0xEF, 0x54, 0xDF, 0x4E, 0x22, 0x54, 0x80,
-0xFE, 0xEF, 0x54, 0x7F, 0x4E, 0x22, 0x12, 0x02, 0xF6, 0x13, 0x13, 0x54, 0x3F, 0x22, 0xE5, 0x68,
-0xF0, 0xA3, 0xE5, 0x69, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x04, 0x18, 0xFF, 0x22, 0x90, 0x85,
-0xC1, 0xE0, 0x54, 0xF7, 0xF0, 0x22, 0x8B, 0xAC,
+0x90, 0x92, 0x4E, 0xE0, 0x04, 0xF0, 0x80, 0xE1, 0x7F, 0x00, 0x22, 0x90, 0x06, 0x32, 0xE0, 0x44,
+0x40, 0xF0, 0xE4, 0x90, 0x88, 0x88, 0xF0, 0xA3, 0xF0, 0x7F, 0x01, 0x22, 0x90, 0x92, 0x4E, 0xE0,
+0xFD, 0xC3, 0x94, 0x02, 0x22, 0x12, 0xB7, 0xDB, 0xE4, 0xA3, 0xF0, 0x11, 0x2C, 0x50, 0x17, 0x11,
+0x6E, 0x24, 0xAA, 0xF5, 0x82, 0xE4, 0x34, 0x88, 0xF5, 0x83, 0xE0, 0xB5, 0x07, 0x1D, 0x90, 0x92,
+0x4E, 0xE0, 0x04, 0xF0, 0x80, 0xE5, 0x90, 0x06, 0x32, 0xE0, 0x44, 0x80, 0xF0, 0x90, 0x01, 0xC7,
+0x74, 0x30, 0xF0, 0x7F, 0x01, 0x12, 0x5F, 0xE9, 0x7F, 0x01, 0x22, 0x7F, 0x00, 0x22, 0x90, 0x92,
+0x4B, 0xE0, 0xFE, 0xA3, 0xE0, 0xFF, 0xED, 0x24, 0x1C, 0xFD, 0x12, 0x55, 0x36, 0x90, 0x92, 0x4E,
+0xE0, 0x22, 0x90, 0x93, 0x6B, 0xA3, 0xE0, 0xFF, 0x90, 0x93, 0x79, 0x74, 0x03, 0xF0, 0x7B, 0x06,
+0x7D, 0x01, 0x12, 0xC7, 0x34, 0x90, 0x93, 0x6F, 0xEE, 0xF0, 0xFC, 0xA3, 0xEF, 0xF0, 0xFD, 0x90,
+0x93, 0x6E, 0xE0, 0xFF, 0x74, 0x10, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0xEF, 0xF0,
+0x90, 0x93, 0x6D, 0xE0, 0xFF, 0x02, 0x65, 0x61, 0xE5, 0x65, 0x25, 0xE0, 0x24, 0xF5, 0xF5, 0x82,
+0xE4, 0x34, 0x82, 0xF5, 0x83, 0xE4, 0x93, 0xFF, 0x74, 0x01, 0x93, 0x90, 0x92, 0x59, 0xCF, 0xF0,
+0xA3, 0xEF, 0xF0, 0x90, 0x92, 0x57, 0xE5, 0x67, 0xF0, 0xA3, 0xE5, 0x68, 0xF0, 0x22, 0x90, 0x05,
+0x63, 0xE0, 0x90, 0x92, 0xE5, 0xF0, 0x90, 0x05, 0x62, 0xE0, 0x90, 0x92, 0xE6, 0xF0, 0x90, 0x05,
+0x61, 0xE0, 0x90, 0x92, 0xE7, 0xF0, 0x90, 0x05, 0x60, 0xE0, 0x90, 0x92, 0xE8, 0xF0, 0x90, 0x92,
+0xDC, 0xE0, 0x44, 0x01, 0xF0, 0x22, 0xEB, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0xA9, 0xF5, 0x82, 0xE4,
+0x34, 0x92, 0x22, 0x75, 0xF0, 0x0E, 0xA4, 0x24, 0xA7, 0xF5, 0x82, 0xE4, 0x34, 0x92, 0xF5, 0x83,
+0x22, 0x75, 0xF0, 0x08, 0xA4, 0x24, 0x00, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0xF5, 0x83, 0x22, 0x74,
+0x1D, 0x25, 0x6F, 0xF5, 0x82, 0xE4, 0x34, 0x93, 0xF5, 0x83, 0x22, 0x75, 0xF0, 0x12, 0xE5, 0x63,
+0x90, 0x89, 0x42, 0x12, 0x05, 0x28, 0xE0, 0x22, 0x75, 0xF0, 0x12, 0xE5, 0x63, 0x90, 0x89, 0x40,
+0x12, 0x05, 0x28, 0xE0, 0x22, 0x74, 0xBC, 0x25, 0x79, 0xF5, 0x82, 0xE4, 0x34, 0x90, 0xF5, 0x83,
+0xE0, 0x22, 0xE0, 0x54, 0x03, 0x90, 0x91, 0x0B, 0xF0, 0x7B, 0x01, 0xAF, 0x79, 0x02, 0x27, 0x3D,
+0xC4, 0x54, 0xF0, 0x24, 0x01, 0xF5, 0x82, 0xE4, 0x34, 0x81, 0xF5, 0x83, 0xE0, 0x22, 0xE0, 0x90,
+0x01, 0xBA, 0xF0, 0x90, 0x85, 0xC7, 0xE0, 0x90, 0x01, 0xBB, 0x22, 0xE5, 0x65, 0x25, 0xE0, 0x24,
+0xF5, 0xF5, 0x82, 0xE4, 0x34, 0x82, 0x22, 0x74, 0x21, 0x2F, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5,
+0x83, 0xE0, 0x22, 0x12, 0x05, 0x28, 0xE0, 0xFC, 0xA3, 0xE0, 0xF5, 0x82, 0x8C, 0x83, 0x22, 0xF0,
+0x74, 0xCC, 0x2D, 0xF5, 0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0x74, 0xBC, 0x25, 0x63, 0xF5,
+0x82, 0xE4, 0x34, 0x8F, 0xF5, 0x83, 0x22, 0x90, 0x92, 0x5B, 0xE4, 0xF0, 0xA3, 0x22, 0x90, 0x92,
+0x59, 0xE4, 0xF0, 0xA3, 0x22, 0x90, 0x00, 0x06, 0x02, 0x04, 0x18, 0x90, 0x00, 0x08, 0x02, 0x04,
+0x18, 0x90, 0x92, 0x9D, 0xE0, 0x14, 0x90, 0x92, 0x9F, 0xF0, 0x22, 0xFE, 0x54, 0x03, 0xFD, 0xEE,
+0x13, 0x13, 0x54, 0x07, 0x22, 0x90, 0x92, 0xA2, 0xE0, 0xFE, 0xC3, 0x13, 0x54, 0x07, 0x22, 0x90,
+0x93, 0x75, 0xE0, 0xFF, 0x90, 0x93, 0x73, 0xE0, 0x22, 0x8B, 0x5B, 0x8A, 0x5C, 0x89, 0x5D, 0x22,
+0x2E, 0xF5, 0x82, 0xE4, 0x34, 0xFC, 0xF5, 0x83, 0x22, 0x90, 0x92, 0x9E, 0xE0, 0x90, 0x05, 0x73,
+0xF0, 0x22, 0x90, 0x85, 0xCB, 0xE0, 0x90, 0x05, 0x73, 0xF0, 0x22, 0x74, 0x12, 0x2F, 0xF5, 0x82,
+0xE4, 0x34, 0xFC, 0x22, 0x12, 0x02, 0xF6, 0x13, 0x13, 0x54, 0x3F, 0x22, 0x90, 0x85, 0xC9, 0xE0,
+0x44, 0x10, 0xF0, 0x22, 0xF9, 0xE4, 0x3A, 0xFA, 0x02, 0x02, 0xF6, 0x7D, 0x05, 0x7F, 0x01, 0x02,
+0x96, 0x06, 0xE5, 0x69, 0xF0, 0xA3, 0xE5, 0x6A, 0xF0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x04, 0x18,
+0xFF, 0x22, 0x7D, 0x05, 0x7F, 0x04, 0x02, 0x96, 0x06, 0x90, 0x85, 0xC1, 0xE0, 0x54, 0xF7, 0xF0,
+0x22, 0xFF, 0x12, 0x02, 0xF6, 0xFE, 0x54, 0x0F, 0x22, 0x00, 0xF8, 0x34,
};
-u4Byte ArrayLength_MP_8188F_FW_WoWLAN = 18680;
+u4Byte ArrayLength_MP_8188F_FW_WoWLAN = 21148;
void
diff --git a/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_mac.c b/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_mac.c index b35376b..7ae319d 100755 --- a/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_mac.c +++ b/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_mac.c @@ -281,7 +281,7 @@ ODM_ReadAndConfig_MP_8188F_MAC_REG( u4Byte
ODM_GetVersion_MP_8188F_MAC_REG(void)
{
- return 24;
+ return 28;
}
#endif /* end of HWIMG_SUPPORT*/
diff --git a/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_rf.c b/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_rf.c index c8b39dd..0221806 100755 --- a/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_rf.c +++ b/rtl8188FU/hal/phydm/rtl8188f/halhwimg8188f_rf.c @@ -124,6 +124,11 @@ u4Byte Array_MP_8188F_RadioA[] = { 0x008, 0x00008400,
0x018, 0x00000407,
0x019, 0x00000012,
+ 0x80000400, 0x00000000, 0x40000000, 0x00000000,
+ 0x01B, 0x00000C6C,
+ 0xA0000000, 0x00000000,
+ 0x01B, 0x00001C6C,
+ 0xB0000000, 0x00000000,
0x01E, 0x00080009,
0x01F, 0x00000880,
0x02F, 0x0001A060,
@@ -158,11 +163,19 @@ u4Byte Array_MP_8188F_RadioA[] = { 0x0EF, 0x000001A0,
0x81000000, 0x00000000, 0x40000000, 0x00000000,
0x051, 0x000E8231,
- 0x052, 0x000FAC88,
- 0x053, 0x00000141,
0xA0000000, 0x00000000,
0x051, 0x000E8333,
+ 0xB0000000, 0x00000000,
+ 0x80000400, 0x00000000, 0x40000000, 0x00000000,
0x052, 0x000FAC88,
+ 0x91000000, 0x00000000, 0x40000000, 0x00000000,
+ 0x052, 0x000FAC2C,
+ 0xA0000000, 0x00000000,
+ 0x052, 0x000FAC2C,
+ 0xB0000000, 0x00000000,
+ 0x81000000, 0x00000000, 0x40000000, 0x00000000,
+ 0x053, 0x00000141,
+ 0xA0000000, 0x00000000,
0x053, 0x00000103,
0xB0000000, 0x00000000,
0x056, 0x000517F0,
@@ -198,6 +211,18 @@ u4Byte Array_MP_8188F_RadioA[] = { 0x034, 0x00002CC8,
0x034, 0x00001C4B,
0x034, 0x00000C48,
+ 0x91000000, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000ADD2,
+ 0x034, 0x00009DD0,
+ 0x034, 0x00008CF3,
+ 0x034, 0x00007CF0,
+ 0x034, 0x00006CED,
+ 0x034, 0x00005CD2,
+ 0x034, 0x00004CCF,
+ 0x034, 0x00003CCC,
+ 0x034, 0x00002CC9,
+ 0x034, 0x00001C4C,
+ 0x034, 0x00000C49,
0xA0000000, 0x00000000,
0x034, 0x0000ADD6,
0x034, 0x00009DD3,
@@ -314,7 +339,7 @@ ODM_ReadAndConfig_MP_8188F_RadioA( u4Byte
ODM_GetVersion_MP_8188F_RadioA(void)
{
- return 24;
+ return 28;
}
/******************************************************************************
@@ -470,12 +495,12 @@ u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_USB_8188F[][DELTA_SWINGIDX_SIZE };
u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_USB_8188F[] = {0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9};
u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_USB_8188F[] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 7, 8, 8, 8, 8};
-u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8188F[] = {0, 0, 1, 1, 1, 1, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 9, 11, 12, 13, 14, 15, 15, 17, 17, 17, 17, 17, 17, 17};
-u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8188F[] = {0, 2, 2, 4, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 12, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14};
+u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_USB_8188F[] = {0, 1, 1, 2, 3, 4, 4, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15};
+u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_USB_8188F[] = {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15};
u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_USB_8188F[] = {0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9};
u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_USB_8188F[] = {0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 6, 7, 7};
-u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8188F[] = {0, 1, 1, 2, 3, 3, 3, 5, 5, 7, 7, 8, 8, 9, 9, 10, 12, 12, 13, 14, 14, 16, 16, 17, 17, 17, 17, 17, 17, 17};
-u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8188F[] = {0, 1, 2, 2, 2, 4, 4, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14};
+u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_USB_8188F[] = {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16};
+u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_USB_8188F[] = {0, 0, 1, 2, 2, 3, 3, 4, 6, 6, 7, 8, 8, 10, 10, 11, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15};
#endif
void
@@ -544,10 +569,10 @@ const char *Array_MP_8188F_TXPWR_LMT[] = { "FCC", "2.4G", "20M", "CCK", "1T", "11", "32",
"ETSI", "2.4G", "20M", "CCK", "1T", "11", "26",
"MKK", "2.4G", "20M", "CCK", "1T", "11", "32",
- "FCC", "2.4G", "20M", "CCK", "1T", "12", "63",
+ "FCC", "2.4G", "20M", "CCK", "1T", "12", "30",
"ETSI", "2.4G", "20M", "CCK", "1T", "12", "26",
"MKK", "2.4G", "20M", "CCK", "1T", "12", "32",
- "FCC", "2.4G", "20M", "CCK", "1T", "13", "63",
+ "FCC", "2.4G", "20M", "CCK", "1T", "13", "26",
"ETSI", "2.4G", "20M", "CCK", "1T", "13", "26",
"MKK", "2.4G", "20M", "CCK", "1T", "13", "32",
"FCC", "2.4G", "20M", "CCK", "1T", "14", "63",
@@ -586,10 +611,10 @@ const char *Array_MP_8188F_TXPWR_LMT[] = { "FCC", "2.4G", "20M", "OFDM", "1T", "11", "28",
"ETSI", "2.4G", "20M", "OFDM", "1T", "11", "30",
"MKK", "2.4G", "20M", "OFDM", "1T", "11", "30",
- "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63",
+ "FCC", "2.4G", "20M", "OFDM", "1T", "12", "24",
"ETSI", "2.4G", "20M", "OFDM", "1T", "12", "30",
"MKK", "2.4G", "20M", "OFDM", "1T", "12", "30",
- "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63",
+ "FCC", "2.4G", "20M", "OFDM", "1T", "13", "16",
"ETSI", "2.4G", "20M", "OFDM", "1T", "13", "30",
"MKK", "2.4G", "20M", "OFDM", "1T", "13", "30",
"FCC", "2.4G", "20M", "OFDM", "1T", "14", "63",
@@ -628,10 +653,10 @@ const char *Array_MP_8188F_TXPWR_LMT[] = { "FCC", "2.4G", "20M", "HT", "1T", "11", "28",
"ETSI", "2.4G", "20M", "HT", "1T", "11", "30",
"MKK", "2.4G", "20M", "HT", "1T", "11", "30",
- "FCC", "2.4G", "20M", "HT", "1T", "12", "63",
+ "FCC", "2.4G", "20M", "HT", "1T", "12", "24",
"ETSI", "2.4G", "20M", "HT", "1T", "12", "30",
"MKK", "2.4G", "20M", "HT", "1T", "12", "30",
- "FCC", "2.4G", "20M", "HT", "1T", "13", "63",
+ "FCC", "2.4G", "20M", "HT", "1T", "13", "16",
"ETSI", "2.4G", "20M", "HT", "1T", "13", "30",
"MKK", "2.4G", "20M", "HT", "1T", "13", "30",
"FCC", "2.4G", "20M", "HT", "1T", "14", "63",
@@ -706,10 +731,10 @@ const char *Array_MP_8188F_TXPWR_LMT[] = { "FCC", "2.4G", "40M", "HT", "1T", "09", "26",
"ETSI", "2.4G", "40M", "HT", "1T", "09", "26",
"MKK", "2.4G", "40M", "HT", "1T", "09", "26",
- "FCC", "2.4G", "40M", "HT", "1T", "10", "26",
+ "FCC", "2.4G", "40M", "HT", "1T", "10", "24",
"ETSI", "2.4G", "40M", "HT", "1T", "10", "26",
"MKK", "2.4G", "40M", "HT", "1T", "10", "26",
- "FCC", "2.4G", "40M", "HT", "1T", "11", "26",
+ "FCC", "2.4G", "40M", "HT", "1T", "11", "10",
"ETSI", "2.4G", "40M", "HT", "1T", "11", "26",
"MKK", "2.4G", "40M", "HT", "1T", "11", "26",
"FCC", "2.4G", "40M", "HT", "1T", "12", "63",
diff --git a/rtl8188FU/hal/phydm/rtl8188f/halphyrf_8188f.c b/rtl8188FU/hal/phydm/rtl8188f/halphyrf_8188f.c index 3f9290a..26e373e 100755 --- a/rtl8188FU/hal/phydm/rtl8188f/halphyrf_8188f.c +++ b/rtl8188FU/hal/phydm/rtl8188f/halphyrf_8188f.c @@ -1566,12 +1566,16 @@ _PHY_MACSettingCalibration8188F( #endif ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("MAC settings for Calibration.\n")); +#if 0 ODM_Write1Byte(pDM_Odm, MACReg[i], 0x3F); for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++) ODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)(MACBackup[i] & (~BIT3))); ODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)(MACBackup[i] & (~BIT5))); +#else + ODM_SetBBReg(pDM_Odm, 0x520, 0x00ff0000, 0xff); +#endif } VOID @@ -1844,6 +1848,7 @@ phy_IQCalibrate_8188F( if (t == 0) pDM_Odm->RFCalibrateInfo.bRfPiEnable = (u1Byte)ODM_GetBBReg(pDM_Odm, rFPGA0_XA_HSSIParameter1, BIT(8)); +#if 0 if (!pDM_Odm->RFCalibrateInfo.bRfPiEnable) { // Switch BB to PI mode to do IQ Calibration. #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) @@ -1852,6 +1857,7 @@ phy_IQCalibrate_8188F( _PHY_PIModeSwitch8188F(pDM_Odm, TRUE); #endif } +#endif //save RF path Path_SEL_BB = ODM_GetBBReg(pDM_Odm, 0x948, bMaskDWord); @@ -1859,7 +1865,7 @@ phy_IQCalibrate_8188F( //BB setting - ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0x00); + /*ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0x00);*/ ODM_SetBBReg(pDM_Odm, rOFDM0_TRxPathEnable, bMaskDWord, 0x03a05600); ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800e4); ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x25204000); @@ -2080,71 +2086,46 @@ phy_LCCalibrate_8188F( ) { u1Byte tmpReg; - u4Byte RF_Amode = 0, RF_Bmode = 0, LC_Cal; + u4Byte RF_Amode = 0, RF_Bmode = 0, LC_Cal, cnt; #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) PADAPTER pAdapter = pDM_Odm->Adapter; #endif - //Check continuous TX and Packet TX + /*Check continuous TX and Packet TX*/ tmpReg = ODM_Read1Byte(pDM_Odm, 0xd03); - if ((tmpReg & 0x70) != 0) //Deal with contisuous TX case - ODM_Write1Byte(pDM_Odm, 0xd03, tmpReg & 0x8F); //disable all continuous TX - else // Deal with Packet TX case - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF); // block all queues + if ((tmpReg & 0x70) != 0) /*Deal with contisuous TX case*/ + ODM_Write1Byte(pDM_Odm, 0xd03, tmpReg & 0x8F); /*disable all continuous TX*/ + else /* Deal with Packet TX case*/ + ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF); /* block all queues*/ - if ((tmpReg & 0x70) != 0) { - //1. Read original RF mode - //Path-A -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - RF_Amode = PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, bMask12Bits); - //Path-B - if (is2T) - RF_Bmode = PHY_QueryRFReg(pAdapter, ODM_RF_PATH_B, RF_AC, bMask12Bits); -#else - RF_Amode = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bMask12Bits); + /*backup RF0x18*/ + LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - //Path-B - if (is2T) - RF_Bmode = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_AC, bMask12Bits); -#endif + /*Start LCK*/ + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal|0x08000); - //2. Set RF mode = standby mode - //Path-A - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bMask12Bits, (RF_Amode & 0x8FFFF) | 0x10000); - - //Path-B - if (is2T) - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_AC, bMask12Bits, (RF_Bmode & 0x8FFFF) | 0x10000); + for(cnt=0;cnt<100;cnt++) + { + if(ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) + break; + ODM_delay_ms(10); } - //3. Read RF reg18 -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - LC_Cal = PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_CHNLBW, bMask12Bits); -#else - LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bMask12Bits); -#endif - - //4. Set LC calibration begin bit15 - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xB0, bRFRegOffsetMask, 0xDFBF0); // LDO ON - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal | 0x08000); + /*Recover channel number*/ + ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); - ODM_delay_ms(100); - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xB0, bRFRegOffsetMask, 0xDFFF0); // LDO OFF - - //Restore original situation - if ((tmpReg & 0x70) != 0) { //Deal with contisuous TX case - //Path-A + /*Restore original situation*/ + if ((tmpReg&0x70) != 0) { + /*Deal with contisuous TX case*/ ODM_Write1Byte(pDM_Odm, 0xd03, tmpReg); - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bMask12Bits, RF_Amode); - - //Path-B - if (is2T) - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_AC, bMask12Bits, RF_Bmode); - } else // Deal with Packet TX case + } else { + /* Deal with Packet TX case*/ ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00); + } + } //Analog Pre-distortion calibration diff --git a/rtl8188FU/hal/phydm/rtl8188f/version_rtl8188f.h b/rtl8188FU/hal/phydm/rtl8188f/version_rtl8188f.h index e351e4c..3c47841 100755 --- a/rtl8188FU/hal/phydm/rtl8188f/version_rtl8188f.h +++ b/rtl8188FU/hal/phydm/rtl8188f/version_rtl8188f.h @@ -5,6 +5,6 @@ You do not need to fill up the version.h anymore,
only the maintenance supervisor fills it before formal release.
*/
-#define RELEASE_DATE_8188F 20150921
+#define RELEASE_DATE_8188F 20160516
#define COMMIT_BY_8188F "BB_DAVID"
-#define RELEASE_VERSION_8188F 24
+#define RELEASE_VERSION_8188F 28
diff --git a/rtl8188FU/hal/rtl8188f/rtl8188f_cmd.c b/rtl8188FU/hal/rtl8188f/rtl8188f_cmd.c index 635e7ee..18a8bb1 100755 --- a/rtl8188FU/hal/rtl8188f/rtl8188f_cmd.c +++ b/rtl8188FU/hal/rtl8188f/rtl8188f_cmd.c @@ -707,6 +707,25 @@ void rtl8188f_set_FwPwrMode_cmd(PADAPTER padapter, u8 psmode) _func_exit_; } +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW +void rtl8188f_set_BcnEarly_C2H_Rpt_cmd(PADAPTER padapter, u8 enable) +{ + u8 u1H2CSetPwrMode[H2C_PWRMODE_LEN] = {0}; + + SET_8188F_H2CCMD_PWRMODE_PARM_MODE(u1H2CSetPwrMode, 1); + SET_8188F_H2CCMD_PWRMODE_PARM_RLBM(u1H2CSetPwrMode, 1); + SET_8188F_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CSetPwrMode, 0); + SET_8188F_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1H2CSetPwrMode, 0); + SET_8188F_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1H2CSetPwrMode, 0); + SET_8188F_H2CCMD_PWRMODE_PARM_BCN_EARLY_C2H_RPT(u1H2CSetPwrMode, enable); + SET_8188F_H2CCMD_PWRMODE_PARM_PWR_STATE(u1H2CSetPwrMode, 0x0C); + SET_8188F_H2CCMD_PWRMODE_PARM_BYTE5(u1H2CSetPwrMode, 0); + FillH2CCmd8188F(padapter, H2C_8188F_SET_PWR_MODE, sizeof(u1H2CSetPwrMode), u1H2CSetPwrMode); +} +#endif +#endif + void rtl8188f_set_FwPsTuneParam_cmd(PADAPTER padapter) { struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); @@ -896,9 +915,8 @@ void rtl8188f_set_FwJoinBssRpt_cmd(PADAPTER padapter, u8 mstatus) void rtl8188f_Add_RateATid(PADAPTER pAdapter, u64 rate_bitmap, u8 *arg, u8 rssi_level) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - struct mlme_ext_priv *pmlmeext = &pAdapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct sta_info *psta; + struct macid_ctl_t *macid_ctl = &pAdapter->dvobj->macid_ctl; + struct sta_info *psta = NULL; u8 mac_id = arg[0]; u8 raid = arg[1]; u8 shortGI = arg[2]; @@ -906,9 +924,13 @@ void rtl8188f_Add_RateATid(PADAPTER pAdapter, u64 rate_bitmap, u8 *arg, u8 rssi_ u32 bitmap = (u32) rate_bitmap; u32 mask = bitmap & 0x0FFFFFFF; - psta = pmlmeinfo->FW_sta_info[mac_id].psta; - if (psta == NULL) + if (mac_id < macid_ctl->num) + psta = macid_ctl->sta[mac_id]; + if (psta == NULL) { + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" macid:%u, sta is NULL\n" + , FUNC_ADPT_ARG(pAdapter), mac_id); return; + } bw = psta->bw_mode; diff --git a/rtl8188FU/hal/rtl8188f/rtl8188f_dm.c b/rtl8188FU/hal/rtl8188f/rtl8188f_dm.c index 748bb1b..9d5b0d4 100755 --- a/rtl8188FU/hal/rtl8188f/rtl8188f_dm.c +++ b/rtl8188FU/hal/rtl8188f/rtl8188f_dm.c @@ -239,7 +239,6 @@ static void Init_ODM_ComInfo_8188f(PADAPTER Adapter) Init_ODM_ComInfo(Adapter); ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType); - ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8188F); fab_ver = ODM_TSMC; cut_ver = GET_CVID_CUT_VERSION(pHalData->VersionID); @@ -254,8 +253,6 @@ static void Init_ODM_ComInfo_8188f(PADAPTER Adapter) SupportAbility = ODM_RF_CALIBRATION | ODM_RF_TX_PWR_TRACK /*| */ ; - /*if(pHalData->AntDivCfg) */ - /* pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV; */ #endif ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, SupportAbility); @@ -273,8 +270,8 @@ static void Update_ODM_ComInfo_8188f(PADAPTER Adapter) | ODM_BB_DYNAMIC_TXPWR | ODM_BB_FA_CNT | ODM_BB_RSSI_MONITOR - /*| ODM_BB_CCK_PD - | ODM_BB_PWR_SAVE */ + | ODM_BB_CCK_PD + /* | ODM_BB_PWR_SAVE */ | ODM_BB_CFO_TRACKING | ODM_MAC_EDCA_TURBO | ODM_RF_TX_PWR_TRACK @@ -327,8 +324,7 @@ rtl8188f_InitHalDm( Update_ODM_ComInfo_8188f(Adapter); - if (Adapter->registrypriv.mp_mode == 0) - ODM_DMInit(pDM_Odm); + ODM_DMInit(pDM_Odm); } diff --git a/rtl8188FU/hal/rtl8188f/rtl8188f_hal_init.c b/rtl8188FU/hal/rtl8188f/rtl8188f_hal_init.c index cc28349..4bc98e6 100755 --- a/rtl8188FU/hal/rtl8188f/rtl8188f_hal_init.c +++ b/rtl8188FU/hal/rtl8188f/rtl8188f_hal_init.c @@ -84,7 +84,7 @@ _BlockWrite( #endif #ifdef CONFIG_USB_HCI - blockSize_p1 = 254; + blockSize_p1 = 196; // the same as 8188e #endif /*printk("====>%s %d\n", __func__, __LINE__); */ @@ -311,7 +311,7 @@ static s32 polling_fwdl_chksum(_adapter *adapter, u32 min_cnt, u32 timeout_ms) do { cnt++; value32 = rtw_read32(adapter, REG_MCUFWDL); - if (value32 & FWDL_ChkSum_rpt || RTW_CANNOT_RUN(adapter)) + if (value32 & FWDL_ChkSum_rpt || RTW_CANNOT_IO(adapter)) break; rtw_yield_os(); } while (rtw_get_passing_time_ms(start) < timeout_ms || cnt < min_cnt); @@ -352,7 +352,7 @@ static s32 _FWFreeToGo(_adapter *adapter, u32 min_cnt, u32 timeout_ms) cnt++; value32 = rtw_read32(adapter, REG_MCUFWDL); value_to_check = value32 & value_expected; - if ((value_to_check == value_expected) || RTW_CANNOT_RUN(adapter)) + if ((value_to_check == value_expected) || RTW_CANNOT_IO(adapter)) break; rtw_yield_os(); } while (rtw_get_passing_time_ms(start) < timeout_ms || cnt < min_cnt); @@ -1080,7 +1080,6 @@ s32 rtl8188f_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw) u8 write_fw = 0; u32 fwdl_start_time; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - s8 R8188FFwImageFileName[] = {RTL8188F_FW_IMG}; u8 *FwImage; u32 FwImageLen; u8 *pFwImageFileName; @@ -1234,9 +1233,18 @@ s32 rtl8188f_FirmwareDownload(PADAPTER padapter, BOOLEAN bUsedWoWLANFw) #if 1 DBG_871X("%s by IO write!\n", __func__); + /* + * Suggested by Filen. If 8051 is running in RAM code, driver should inform Fw to reset by itself, + * or it will cause download Fw fail. 2010.02.01. by tynli. + */ + if (rtw_read8(padapter, REG_MCUFWDL) & RAM_DL_SEL) { + rtw_write8(padapter, REG_MCUFWDL, 0x00); + _8051Reset8188(padapter); + } + _FWDownloadEnable(padapter, _TRUE); - while (!RTW_CANNOT_RUN(padapter) + while (!RTW_CANNOT_IO(padapter) && (write_fw++ < 3 || rtw_get_passing_time_ms(fwdl_start_time) < 500)) { /* reset FWDL chksum */ rtw_write8(padapter, REG_MCUFWDL, rtw_read8(padapter, REG_MCUFWDL) | FWDL_ChkSum_rpt); @@ -1338,6 +1346,8 @@ exit: if (pFirmware) rtw_mfree((u8 *)pFirmware, sizeof(RT_FIRMWARE_8188F)); + rtl8188f_InitializeFirmwareVars(padapter); + DBG_871X(" <=== %s()\n", __func__); return rtStatus; @@ -1360,42 +1370,6 @@ void rtl8188f_InitializeFirmwareVars(PADAPTER padapter) /*pHalData->H2CStopInsertQueue = _FALSE; */ } -#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) -/*=========================================== */ - -/* */ -/* Description: Prepare some information to Fw for WoWLAN. */ -/* (1) Download wowlan Fw. */ -/* (2) Download RSVD page packets. */ -/* (3) Enable AP offload if needed. */ -/* */ -/* 2011.04.12 by tynli. */ -/* */ -VOID -SetFwRelatedForWoWLAN8188f( - IN PADAPTER padapter, - IN u8 bHostIsGoingtoSleep -) -{ - int status = _FAIL; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 bRecover = _FALSE; - /* */ - /* 1. Before WoWLAN we need to re-download WoWLAN Fw. */ - /* */ - status = rtl8188f_FirmwareDownload(padapter, bHostIsGoingtoSleep); - if (status != _SUCCESS) { - DBG_871X("SetFwRelatedForWoWLAN8188f(): Re-Download Firmware failed!!\n"); - return; - } else - DBG_871X("SetFwRelatedForWoWLAN8188f(): Re-Download Firmware Success !!\n"); - /* */ - /* 2. Re-Init the variables about Fw related setting. */ - /* */ - rtl8188f_InitializeFirmwareVars(padapter); -} -#endif /*CONFIG_WOWLAN */ - /*=========================================================== */ /* Efuse related code */ /*=========================================================== */ @@ -1511,7 +1485,7 @@ Hal_GetEfuseDefinition( pu2Tmp = (u16 *)pOut; if (efuseType == EFUSE_WIFI) - *pu2Tmp = EFUSE_MAX_MAP_LEN; + *pu2Tmp = EFUSE_MAP_LEN_8188F; else *pu2Tmp = EFUSE_BT_MAP_LEN; } @@ -1667,11 +1641,7 @@ Hal_EfusePowerSwitch( if (bWrite == _TRUE) { /* Enable LDO 2.5V before read/write action */ tempval = rtw_read8(padapter, EFUSE_TEST + 3); - tempval &= 0x0F; - tempval |= (VOLTAGE_V25 << 4); rtw_write8(padapter, EFUSE_TEST + 3, (tempval | 0x80)); - - /*rtw_write8(padapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON); */ } } else { rtw_write8(padapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF); @@ -2272,9 +2242,10 @@ Hal_EfuseWordEnableDataWrite( tmpaddr = start_addr; efuse_OneByteWrite(padapter, start_addr++, data[0], bPseudoTest); efuse_OneByteWrite(padapter, start_addr++, data[1], bPseudoTest); - + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 0); efuse_OneByteRead(padapter, tmpaddr, &tmpdata[0], bPseudoTest); efuse_OneByteRead(padapter, tmpaddr + 1, &tmpdata[1], bPseudoTest); + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 1); if ((data[0] != tmpdata[0]) || (data[1] != tmpdata[1])) badworden &= (~BIT(0)); } @@ -2282,9 +2253,10 @@ Hal_EfuseWordEnableDataWrite( tmpaddr = start_addr; efuse_OneByteWrite(padapter, start_addr++, data[2], bPseudoTest); efuse_OneByteWrite(padapter, start_addr++, data[3], bPseudoTest); - + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 0); efuse_OneByteRead(padapter, tmpaddr, &tmpdata[2], bPseudoTest); efuse_OneByteRead(padapter, tmpaddr + 1, &tmpdata[3], bPseudoTest); + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 1); if ((data[2] != tmpdata[2]) || (data[3] != tmpdata[3])) badworden &= (~BIT(1)); } @@ -2292,9 +2264,10 @@ Hal_EfuseWordEnableDataWrite( tmpaddr = start_addr; efuse_OneByteWrite(padapter, start_addr++, data[4], bPseudoTest); efuse_OneByteWrite(padapter, start_addr++, data[5], bPseudoTest); - + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 0); efuse_OneByteRead(padapter, tmpaddr, &tmpdata[4], bPseudoTest); efuse_OneByteRead(padapter, tmpaddr + 1, &tmpdata[5], bPseudoTest); + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 1); if ((data[4] != tmpdata[4]) || (data[5] != tmpdata[5])) badworden &= (~BIT(2)); } @@ -2302,9 +2275,10 @@ Hal_EfuseWordEnableDataWrite( tmpaddr = start_addr; efuse_OneByteWrite(padapter, start_addr++, data[6], bPseudoTest); efuse_OneByteWrite(padapter, start_addr++, data[7], bPseudoTest); - + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 0); efuse_OneByteRead(padapter, tmpaddr, &tmpdata[6], bPseudoTest); efuse_OneByteRead(padapter, tmpaddr + 1, &tmpdata[7], bPseudoTest); + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 1); if ((data[6] != tmpdata[6]) || (data[7] != tmpdata[7])) badworden &= (~BIT(3)); } @@ -2613,6 +2587,42 @@ hal_EfusePartialWriteCheck( return bRet; } +BOOLEAN +hal_EfuseFixHeaderProcess( + IN PADAPTER pAdapter, + IN u1Byte efuseType, + IN PPGPKT_STRUCT pFixPkt, + IN pu2Byte pAddr, + IN BOOLEAN bPseudoTest +) +{ + u1Byte originaldata[8], badworden=0; + u2Byte efuse_addr=*pAddr; + u4Byte PgWriteSuccess=0; + + _rtw_memset((PVOID)originaldata, 8, 0xff); + + if (Efuse_PgPacketRead(pAdapter, pFixPkt->offset, originaldata, bPseudoTest)) { + badworden = Hal_EfuseWordEnableDataWrite(pAdapter, efuse_addr+1, pFixPkt->word_en, originaldata, bPseudoTest); + + if (badworden != 0xf) { + + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); + if (!PgWriteSuccess) + return FALSE; + else + efuse_addr = Hal_EfuseGetCurrentSize(pAdapter, efuseType, bPseudoTest); + } else { + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; + } + } else { + efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; + } + + *pAddr = efuse_addr; + return TRUE; +} + static u8 hal_EfusePgPacketWrite1ByteHeader( PADAPTER pAdapter, @@ -2627,21 +2637,41 @@ hal_EfusePgPacketWrite1ByteHeader( u8 repeatcnt = 0; - /*DBG_8192C("%s\n", __func__); */ + /* RTW_INFO("%s\n", __FUNCTION__); */ pg_header = ((pTargetPkt->offset << 4) & 0xf0) | pTargetPkt->word_en; + if (IS_HARDWARE_TYPE_8723BE(pAdapter)) + efuse_OneByteWrite(pAdapter, 0x1FF, 00, FALSE); /* increase current */ - do { efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); + + PHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 0); + efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - if (tmp_header != 0xFF) break; + + PHY_SetMacReg(pAdapter, EFUSE_TEST, BIT26, 1); + + while (tmp_header == 0xFF || pg_header != tmp_header) { if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) { - DBG_8192C("%s: Repeat over limit for pg_header!!\n", __func__); + DBG_8192C("retry %d times fail!!\n", repeatcnt); return _FALSE; } - } while (1); + efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest); + DBG_8192C("===>%s: Keep %d-th retrying,pg_header = 0x%X tmp_header = 0x%X\n", __FUNCTION__,repeatcnt, pg_header, tmp_header); + } - if (tmp_header != pg_header) { - DBG_8192C(KERN_ERR "%s: PG Header Fail!!(pg=0x%02X read=0x%02X)\n", __func__, pg_header, tmp_header); + if (pg_header == tmp_header) + bRet = _TRUE; + else { + PGPKT_STRUCT fixPkt; + + DBG_8192C(" pg_header(0x%X) != tmp_header(0x%X)\n", pg_header, tmp_header); + DBG_8192C("Error condition for fixed PG packet, need to cover the existed data: (Addr, Data) = (0x%X, 0x%X)\n", + efuse_addr, tmp_header); + fixPkt.offset = (tmp_header>>4) & 0x0F; + fixPkt.word_en = tmp_header & 0x0F; + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); + if (!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) return _FALSE; } @@ -2659,54 +2689,81 @@ hal_EfusePgPacketWrite2ByteHeader( u8 bPseudoTest) { u16 efuse_addr, efuse_max_available_len = 0; - u8 pg_header = 0, tmp_header = 0; + u8 pg_header = 0, tmp_header = 0, pg_header_temp = 0; u8 repeatcnt = 0; - /*DBG_8192C("%s\n", __func__); */ + /* RTW_INFO("%s\n", __FUNCTION__); */ EFUSE_GetEfuseDefinition(padapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_BANK, &efuse_max_available_len, bPseudoTest); efuse_addr = *pAddr; + if (efuse_addr >= efuse_max_available_len) { - DBG_8192C("%s: addr(%d) over available(%d)!!\n", __func__, efuse_addr, efuse_max_available_len); + DBG_8192C("%s: addr(%d) over avaliable(%d)!!\n", __FUNCTION__, efuse_addr, efuse_max_available_len); return _FALSE; } + while (efuse_addr < efuse_max_available_len) { pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F; - /*DBG_8192C("%s: pg_header=0x%x\n", __func__, pg_header); */ - - do { efuse_OneByteWrite(padapter, efuse_addr, pg_header, bPseudoTest); + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 0); efuse_OneByteRead(padapter, efuse_addr, &tmp_header, bPseudoTest); - if (tmp_header != 0xFF) break; + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 1); + + while (tmp_header == 0xFF || pg_header != tmp_header) { if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) { - DBG_8192C("%s: Repeat over limit for pg_header!!\n", __func__); + DBG_8192C("%s, Repeat over limit for pg_header!!\n", __FUNCTION__); return _FALSE; } - } while (1); - if (tmp_header != pg_header) { - DBG_8192C(KERN_ERR "%s: PG Header Fail!!(pg=0x%02X read=0x%02X)\n", __func__, pg_header, tmp_header); - return _FALSE; + efuse_OneByteWrite(padapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(padapter, efuse_addr, &tmp_header, bPseudoTest); } - /* to write ext_header */ + /*to write ext_header*/ + if (tmp_header == pg_header) { efuse_addr++; + pg_header_temp = pg_header; pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en; - do { efuse_OneByteWrite(padapter, efuse_addr, pg_header, bPseudoTest); + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 0); efuse_OneByteRead(padapter, efuse_addr, &tmp_header, bPseudoTest); - if (tmp_header != 0xFF) break; + PHY_SetMacReg(padapter, EFUSE_TEST, BIT26, 1); + + while (tmp_header == 0xFF || pg_header != tmp_header) { if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) { - DBG_8192C("%s: Repeat over limit for ext_header!!\n", __func__); + DBG_8192C("%s, Repeat over limit for ext_header!!\n", __FUNCTION__); return _FALSE; } - } while (1); - if (tmp_header != pg_header) { /*offset PG fail */ - DBG_8192C(KERN_ERR "%s: PG EXT Header Fail!!(pg=0x%02X read=0x%02X)\n", __func__, pg_header, tmp_header); + efuse_OneByteWrite(padapter, efuse_addr, pg_header, bPseudoTest); + efuse_OneByteRead(padapter, efuse_addr, &tmp_header, bPseudoTest); + } + + if ((tmp_header & 0x0F) == 0x0F) { + if (repeatcnt++ > EFUSE_REPEAT_THRESHOLD_) { + DBG_8192C("Repeat over limit for word_en!!\n"); + return _FALSE; + } else { + efuse_addr++; + continue; + } + } else if (pg_header != tmp_header) { + PGPKT_STRUCT fixPkt; + DBG_8192C("Error, efuse_PgPacketWrite2ByteHeader(), offset PG fail, need to cover the existed data!!\n"); + DBG_8192C("Error condition for offset PG fail, need to cover the existed data\n"); + fixPkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1); + fixPkt.word_en = tmp_header & 0x0F; + fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); + if (!hal_EfuseFixHeaderProcess(padapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) return _FALSE; + } else + break; + } else if ((tmp_header & 0x1F) == 0x0F) {/*wrong extended header*/ + efuse_addr += 2; + continue; + } } *pAddr = efuse_addr; @@ -2742,16 +2799,24 @@ hal_EfusePgPacketWriteData( { u16 efuse_addr; u8 badworden; + u8 PgWriteSuccess = 0; efuse_addr = *pAddr; badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr + 1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest); - if (badworden != 0x0F) { - DBG_8192C("%s: Fail!!\n", __func__); - return _FALSE; + if (badworden == 0x0F) { + DBG_8192C("%s: Fail!!\n", __FUNCTION__); + return _TRUE; + } else { /* Reorganize other pg packet */ + DBG_8192C ("Error, efuse_PgPacketWriteData(), wirte data fail!!\n"); + DBG_8192C ("efuse_PgPacketWriteData Fail!!\n"); + PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); + if (!PgWriteSuccess) + return FALSE; + else + return TRUE; } - /*DBG_8192C("%s: ok\n", __func__); */ return _TRUE; } @@ -3125,19 +3190,19 @@ void UpdateHalRAMask8188F(PADAPTER padapter, u32 mac_id, u8 rssi_level) { u32 mask, rate_bitmap; u8 shortGIrate = _FALSE; - struct sta_info *psta; + struct sta_info *psta = NULL; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); + struct macid_ctl_t *macid_ctl = &padapter->dvobj->macid_ctl; - DBG_871X("%s(): mac_id=%d rssi_level=%d\n", __func__, mac_id, rssi_level); - - if (mac_id >= NUM_STA) /*CAM_SIZE */ - return; - - psta = pmlmeinfo->FW_sta_info[mac_id].psta; - if (psta == NULL) + if (mac_id < macid_ctl->num) + psta = macid_ctl->sta[mac_id]; + if (psta == NULL) { + DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" macid:%u, sta is NULL\n" + , FUNC_ADPT_ARG(padapter), mac_id); return; + } shortGIrate = query_ra_short_GI(psta); @@ -3323,36 +3388,20 @@ void rtl8188f_set_hal_ops(struct hal_ops *pHalFunc) pHalFunc->fill_h2c_cmd = &FillH2CCmd8188F; pHalFunc->fill_fake_txdesc = &rtl8188f_fill_fake_txdesc; -#ifdef CONFIG_WOWLAN - pHalFunc->hal_set_wowlan_fw = &SetFwRelatedForWoWLAN8188f; -#endif + pHalFunc->fw_dl = &rtl8188f_FirmwareDownload; pHalFunc->hal_get_tx_buff_rsvd_page_num = &GetTxBufferRsvdPageNum8188F; } void rtl8188f_InitAntenna_Selection(PADAPTER padapter) { - PHAL_DATA_TYPE pHalData; - u8 val; - +#ifdef CONFIG_ANTENNA_DIVERSITY + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + + if (pHalData->AntDivCfg == 0) + return; - pHalData = GET_HAL_DATA(padapter); -#if 0 - val = rtw_read8(padapter, REG_LEDCFG2); - /* Let 8051 take control antenna setting */ - val |= BIT(7); /* DPDT_SEL_EN, 0x4C[23] */ - rtw_write8(padapter, REG_LEDCFG2, val); -#else - /* TODO: <20130114, Kordan> The following setting is only for DPDT and Fixed board type. */ - /* TODO: A better solution is configure it according EFUSE during the run-time. */ - PHY_SetMacReg(padapter, 0x64, BIT20, 0x0); /*0x66[4]=0 */ - PHY_SetMacReg(padapter, 0x64, BIT24, 0x0); /*0x66[8]=0 */ - PHY_SetMacReg(padapter, 0x40, BIT4, 0x0); /*0x40[4]=0 */ - PHY_SetMacReg(padapter, 0x40, BIT3, 0x1); /*0x40[3]=1 */ - PHY_SetMacReg(padapter, 0x4C, BIT24, 0x1); /*0x4C[24:23]=10 */ - PHY_SetMacReg(padapter, 0x4C, BIT23, 0x0); /*0x4C[24:23]=10 */ - PHY_SetBBReg(padapter, 0x944, BIT1 | BIT0, 0x3); /*0x944[1:0]=11 */ - PHY_SetBBReg(padapter, 0x930, bMaskByte0, 0x77); /*0x930[7:0]=77 */ - PHY_SetMacReg(padapter, 0x38, BIT11, 0x1); /*0x38[11]=1 */ + /* LED(GPIO4) disable for AntDiv */ + PHY_SetMacReg(padapter, 0x4C, BIT21, 0x0); #endif } @@ -3389,12 +3438,14 @@ void init_hal_spec_8188f(_adapter *adapter) { struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter); + hal_spec->ic_name = "rtl8188f"; hal_spec->macid_num = MACID_NUM_8188F; hal_spec->sec_cam_ent_num = SEC_CAM_ENT_NUM_8188F; hal_spec->sec_cap = 0; hal_spec->nss_num = NSS_NUM_8188F; hal_spec->band_cap = BAND_CAP_8188F; hal_spec->bw_cap = BW_CAP_8188F; + hal_spec->proto_cap = PROTO_CAP_8188F; hal_spec->wl_func = 0 | WL_FUNC_P2P @@ -4194,122 +4245,6 @@ Hal_EfuseParseEEPROMVer_8188F( pHalData->EEPROMVersion)); } -#ifndef DBG_PPG_MAC_HIDDEN_HANDLE - #define DBG_PPG_MAC_HIDDEN_HANDLE 0 -#endif - -#define PPG_MAC_HIDDEN_START_8188F 0xF8 -#define PPG_MAC_HIDDEN_END_8188F 0xFD - -#define IS_PPG_RANGE_UUID_8188F ((PPG_MAC_HIDDEN_START_8188F <= 0xF4) && (PPG_MAC_HIDDEN_END_8188F >= 0xF7)) -#define GET_PMH_UUID_X_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xF4 - PPG_MAC_HIDDEN_START_8188F, 0, 8) -#define GET_PMH_UUID_Y_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xF5 - PPG_MAC_HIDDEN_START_8188F, 0, 8) -#define GET_PMH_UUID_Z_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xF6 - PPG_MAC_HIDDEN_START_8188F, 0, 5) -#define GET_PMH_UUID_CRC_8188F(_pmh_m) LE_BITS_TO_2BYTE(((u8 *)(_pmh_m)) + 0xF6 - PPG_MAC_HIDDEN_START_8188F, 5, 11) - -#define IS_PPG_RANGE_HCI_TYPE_8188F ((PPG_MAC_HIDDEN_START_8188F <= 0xF8) && (PPG_MAC_HIDDEN_END_8188F >= 0xF8)) -#define IS_PPG_RANGE_PACKAGE_TYPE_8188F ((PPG_MAC_HIDDEN_START_8188F <= 0xF8) && (PPG_MAC_HIDDEN_END_8188F >= 0xF8)) -#define GET_PMH_HCI_TYPE_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xF8 - PPG_MAC_HIDDEN_START_8188F, 0, 4) -#define GET_PMH_PACKAGE_TYPE_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xF8 - PPG_MAC_HIDDEN_START_8188F, 4, 4) - -#define IS_PPG_RANGE_WL_FUNC_8188F ((PPG_MAC_HIDDEN_START_8188F <= 0xF9) && (PPG_MAC_HIDDEN_END_8188F >= 0xF9)) -#define IS_PPG_RANGE_HW_SPECIAL_TYPE_8188F ((PPG_MAC_HIDDEN_START_8188F <= 0xF9) && (PPG_MAC_HIDDEN_END_8188F >= 0xF9)) -#define GET_PMH_WL_FUNC_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xF9 - PPG_MAC_HIDDEN_START_8188F, 0, 4) -#define GET_PMH_HW_SPECIAL_TYPE_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xF9 - PPG_MAC_HIDDEN_START_8188F, 4, 4) - -#define IS_PPG_RANGE_BW_8188F ((PPG_MAC_HIDDEN_START_8188F <= 0xFB) && (PPG_MAC_HIDDEN_END_8188F >= 0xFB)) -#define IS_PPG_RANGE_ANT_NUM_8188F ((PPG_MAC_HIDDEN_START_8188F <= 0xFB) && (PPG_MAC_HIDDEN_END_8188F >= 0xFB)) -#define GET_PMH_BW_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xFB - PPG_MAC_HIDDEN_START_8188F, 0, 3) -#define GET_PMH_ANT_NUM_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xFB - PPG_MAC_HIDDEN_START_8188F, 5, 3) - -#define IS_PPG_RANGE_80211_PROTOCOL_8188F ((PPG_MAC_HIDDEN_START_8188F <= 0xFD) && (PPG_MAC_HIDDEN_END_8188F >= 0xFD)) -#define IS_PPG_RANGE_NIC_8188F ((PPG_MAC_HIDDEN_START_8188F <= 0xFD) && (PPG_MAC_HIDDEN_END_8188F >= 0xFD)) -#define GET_PMH_80211_PROTOCOL_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xFD - PPG_MAC_HIDDEN_START_8188F, 2, 2) -#define GET_PMH_NIC_8188F(_pmh_m) LE_BITS_TO_1BYTE(((u8 *)(_pmh_m)) + 0xFD - PPG_MAC_HIDDEN_START_8188F, 6, 2) - -VOID -Hal_EfuseParseMacHidden_8188F( - IN PADAPTER adapter, - IN u8 *hwinfo, - IN BOOLEAN AutoLoadFail -) -{ - HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); - struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter); - - u8 pmh_map[PPG_MAC_HIDDEN_END_8188F - PPG_MAC_HIDDEN_START_8188F + 1]; - u16 start = PPG_MAC_HIDDEN_START_8188F; - u16 end = PPG_MAC_HIDDEN_END_8188F; - int i; - - u8 uuid_x = 0; - u8 uuid_y = 0; - u8 uuid_z = 0; - u16 uuid_crc = 0; - u8 hci_type = 0x0F; /* no used */ - u8 package_type = 0x0F; /* QFN24 */ - u8 wl_func = 0xF; /* all support */ - u8 hw_stype = 0x0F; /* no used */ - u8 bw = 0x6; /* 40MHz */ - u8 ant_num = 0x01 /* 1 ANT */; - u8 protocol = 0x02; /* 11n only */ - u8 nic = 0x03; /* NIC */ - - Efuse_PowerSwitch(adapter, _FALSE, _TRUE); - for (i = 0; i <= end - start; i++) - efuse_OneByteRead(adapter, start + i, pmh_map + i, FALSE); - Efuse_PowerSwitch(adapter, _FALSE, _FALSE); - -#if IS_PPG_RANGE_UUID_8188F - uuid_x = GET_PMH_UUID_X_8188F(pmh_map); - uuid_y = GET_PMH_UUID_Y_8188F(pmh_map); - uuid_z = GET_PMH_UUID_Z_8188F(pmh_map); - uuid_crc = GET_PMH_UUID_CRC_8188F(pmh_map); -#endif -#if IS_PPG_RANGE_HCI_TYPE_8188F - hci_type = GET_PMH_HCI_TYPE_8188F(pmh_map); -#endif -#if IS_PPG_RANGE_PACKAGE_TYPE_8188F - package_type = GET_PMH_PACKAGE_TYPE_8188F(pmh_map); -#endif -#if IS_PPG_RANGE_WL_FUNC_8188F - wl_func = GET_PMH_WL_FUNC_8188F(pmh_map); -#endif -#if IS_PPG_RANGE_HW_SPECIAL_TYPE_8188F - hw_stype = GET_PMH_HW_SPECIAL_TYPE_8188F(pmh_map); -#endif -#if IS_PPG_RANGE_BW_8188F - bw = GET_PMH_BW_8188F(pmh_map); -#endif -#if IS_PPG_RANGE_ANT_NUM_8188F - ant_num = GET_PMH_ANT_NUM_8188F(pmh_map); -#endif -#if IS_PPG_RANGE_80211_PROTOCOL_8188F - protocol = GET_PMH_80211_PROTOCOL_8188F(pmh_map); -#endif -#if IS_PPG_RANGE_NIC_8188F - nic = GET_PMH_NIC_8188F(pmh_map); -#endif - - if (DBG_PPG_MAC_HIDDEN_HANDLE) { - if (IS_PPG_RANGE_UUID_8188F) - DBG_871X("uuid x:0x%02x y:0x%02x z:0x%x crc:0x%x\n", uuid_x, uuid_y, uuid_z, uuid_crc); - DBG_871X("hci_type:0x%x\n", hci_type); - DBG_871X("package_type:0x%x\n", package_type); - DBG_871X("wl_func:0x%x\n", wl_func); - DBG_871X("hw_stype:0x%x\n", hw_stype); - DBG_871X("bw:0x%x\n", bw); - DBG_871X("ant_num:0x%x\n", ant_num); - DBG_871X("protocol:0x%x\n", protocol); - DBG_871X("nic:0x%x\n", nic); - } - - hal_data->PackageType = package_type; - hal_spec->wl_func &= mac_hidden_wl_func_to_hal_wl_func(wl_func); - hal_spec->bw_cap &= mac_hidden_max_bw_to_hal_bw_cap(bw); - hal_spec->nss_num = rtw_min(hal_spec->nss_num, ant_num); -} - #if 0 /* Do not need for rtl8188f */ VOID Hal_EfuseParseVoltage_8188F( @@ -4336,13 +4271,13 @@ Hal_EfuseParseChnlPlan_8188F( { padapter->mlmepriv.ChannelPlan = hal_com_config_channel_plan( padapter + , hwinfo ? &hwinfo[EEPROM_COUNTRY_CODE_8188F] : NULL , hwinfo ? hwinfo[EEPROM_ChannelPlan_8188F] : 0xFF + , padapter->registrypriv.alpha2 , padapter->registrypriv.channel_plan , RTW_CHPLAN_WORLD_NULL , AutoLoadFail ); - - RT_TRACE(_module_hci_hal_init_c_, _drv_notice_, ("EEPROM ChannelPlan=0x%02x\n", padapter->mlmepriv.ChannelPlan)); } VOID @@ -4411,29 +4346,34 @@ Hal_EfuseParseAntennaDiversity_8188F( PHAL_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 */ + /* default:rtw_antdiv_cfg, 0:OFF, 1:ON, 2:By EFUSE */ + if (registry_par->antdiv_cfg == 2) { + if (0x01 == hwinfo[EEPROM_RF_ANTENNA_OPT_8188F]) pHalData->AntDivCfg = 1; else - pHalData->AntDivCfg = registry_par->antdiv_cfg; - } + pHalData->AntDivCfg = 0; + } else if (registry_par->antdiv_cfg == 1) + pHalData->AntDivCfg = 1; + else + pHalData->AntDivCfg = 0; /* If TRxAntDivType is AUTO in advanced setting, use EFUSE value instead. */ + /* default:rtw_antdiv_type */ if (registry_par->antdiv_type == 0) { +#if 0 pHalData->TRxAntDivType = hwinfo[EEPROM_RFE_OPTION_8188F]; 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 = S0S1_SW_ANTDIV; else DBG_8192C("%s: efuse[0x%x]=0x%02x is unknown type\n", - __func__, EEPROM_RFE_OPTION_8188F, pHalData->TRxAntDivType); + __func__, EEPROM_RFE_OPTION_8188F, pHalData->TRxAntDivType); +#else + /* 8188F only intrnal switch S0S1 */ + pHalData->TRxAntDivType = S0S1_SW_ANTDIV; +#endif } else { - pHalData->TRxAntDivType = registry_par->antdiv_type;/*GetRegAntDivType(pAdapter); */ + /* 8188F only intrnal switch S0S1 */ + pHalData->TRxAntDivType = S0S1_SW_ANTDIV; } DBG_8192C("%s: AntDivCfg=%d, AntDivType=%d\n", @@ -4493,39 +4433,39 @@ void Hal_EfuseParseKFreeData_8188F( IN u8 *PROMContent, IN BOOLEAN AutoloadFail) { -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM +#define THERMAL_K_MEAN_OFFSET_8188F 5 /* 8188F FT thermal K mean value has +5 offset, it's special case */ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); struct kfree_data_t *kfree_data = &pHalData->kfree_data; + u8 pg_pwrtrim = 0xFF, pg_therm = 0xFF; - if ((Adapter->registrypriv.RegRfKFreeEnable == 1) || !AutoloadFail) { - kfree_data->bb_gain[BB_GAIN_2G][RF_PATH_A] - = KFREE_BB_GAIN_2G_TX_OFFSET(EFUSE_Read1Byte(Adapter, PPG_BB_GAIN_2G_TXA_OFFSET_8188F) & PPG_BB_GAIN_2G_TX_OFFSET_MASK); - kfree_data->thermal - = KFREE_THERMAL_OFFSET(EFUSE_Read1Byte(Adapter, PPG_THERMAL_OFFSET_8188F) & PPG_THERMAL_OFFSET_MASK); - - if (GET_PG_KFREE_ON_8188F(PROMContent) && PROMContent[0xc1] != 0xff) - kfree_data->flag |= KFREE_FLAG_ON; - if (GET_PG_KFREE_THERMAL_K_ON_8188F(PROMContent) && PROMContent[0xc8] != 0xff) - kfree_data->flag |= KFREE_FLAG_THERMAL_K_ON; + pg_pwrtrim = EFUSE_Read1Byte(Adapter, PPG_BB_GAIN_2G_TXA_OFFSET_8188F); + pg_therm = EFUSE_Read1Byte(Adapter, PPG_THERMAL_OFFSET_8188F); + if (pg_pwrtrim != 0xFF) { + kfree_data->bb_gain[BB_GAIN_2G][RF_PATH_A] + = KFREE_BB_GAIN_2G_TX_OFFSET(pg_pwrtrim & PPG_BB_GAIN_2G_TX_OFFSET_MASK); + kfree_data->flag |= KFREE_FLAG_ON; } - if (Adapter->registrypriv.RegRfKFreeEnable == 1) { - kfree_data->flag |= KFREE_FLAG_ON; + if (pg_therm != 0xFF) { + kfree_data->thermal + = KFREE_THERMAL_OFFSET(pg_therm & PPG_THERMAL_OFFSET_MASK) - THERMAL_K_MEAN_OFFSET_8188F; + if (GET_PG_KFREE_THERMAL_K_ON_8188F(PROMContent)) kfree_data->flag |= KFREE_FLAG_THERMAL_K_ON; } if (kfree_data->flag & KFREE_FLAG_THERMAL_K_ON) - pHalData->EEPROMThermalMeter += kfree_data->thermal; + pHalData->EEPROMThermalMeter -= kfree_data->thermal; - DBG_871X("kfree flag:%u\n", kfree_data->flag); - if (Adapter->registrypriv.RegRfKFreeEnable == 1 || kfree_data->flag & KFREE_FLAG_ON) + DBG_871X("kfree Pwr Trim flag:%u\n", kfree_data->flag); + if (kfree_data->flag & KFREE_FLAG_ON) DBG_871X("bb_gain:%d\n", kfree_data->bb_gain[BB_GAIN_2G][RF_PATH_A]); - if (Adapter->registrypriv.RegRfKFreeEnable == 1 || kfree_data->flag & KFREE_FLAG_THERMAL_K_ON) + if (kfree_data->flag & KFREE_FLAG_THERMAL_K_ON) DBG_871X("thermal:%d\n", kfree_data->thermal); -#endif /*CONFIG_RF_GAIN_OFFSET */ +#endif /*CONFIG_RF_POWER_TRIM */ } u8 @@ -4716,8 +4656,12 @@ static void rtl8188f_fill_default_txdesc( SET_TX_DESC_SEC_TYPE_8188F(pbuf, fill_txdesc_sectype(pattrib)); fill_txdesc_vcs_8188f(padapter, pattrib, pbuf); - if (pattrib->icmp_pkt == 1 && padapter->registrypriv.wifi_spec == 1) - drv_userate = 1; +#ifdef CONFIG_P2P + if (!rtw_p2p_chk_state(&padapter->wdinfo, P2P_STATE_NONE)) { + if (pattrib->icmp_pkt == 1 && padapter->registrypriv.wifi_spec == 1) + drv_userate = 1; + } +#endif if ((pattrib->ether_type != 0x888e) && (pattrib->ether_type != 0x0806) && @@ -5896,6 +5840,7 @@ s32 c2h_handler_8188f(PADAPTER padapter, u8 *buf) break; #endif */ + default: break; } @@ -6014,13 +5959,24 @@ void rtl8188f_c2h_packet_handler(PADAPTER padapter, u8 *pbuf, u16 length) process_c2h_event(padapter, &C2hEvent, pdata); break; + case C2H_BCN_EARLY_RPT: +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW + rtw_tdls_ch_sw_back_to_base_chnl(padapter); +#endif +#endif + break; + + case C2H_FW_CHNL_SWITCH_COMPLETE: +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW + rtw_tdls_chsw_oper_done(padapter); +#endif +#endif + break; + default: - pdata = rtw_zmalloc(length); - if (pdata == NULL) - break; - _rtw_memcpy(pdata, pbuf, length); - if (rtw_c2h_packet_wk_cmd(padapter, pdata, length) == _FAIL) - rtw_mfree(pdata, length); + rtw_c2h_packet_wk_cmd(padapter, pbuf, length); break; } } @@ -6443,24 +6399,6 @@ void SetHwReg8188F(PADAPTER padapter, u8 variable, u8 *val) rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR) | (RCR_CBSSID_DATA)); break; #endif /*CONFIG_TDLS */ - -#ifdef CONFIG_ANTENNA_DIVERSITY - case HW_VAR_ANTENNA_DIVERSITY_SELECT: - { - u8 Optimum_antenna = (*(u8 *)val); - u8 Ant; - /*switch antenna to Optimum_antenna*/ - /*DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");*/ - if (pHalData->CurAntenna != Optimum_antenna) { - Ant = (Optimum_antenna == 2) ? MAIN_ANT : AUX_ANT; - ODM_UpdateRxIdleAnt(&pHalData->odmpriv, Ant); - - pHalData->CurAntenna = Optimum_antenna; - /*DBG_8192C("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B");*/ - } - } - break; -#endif case HW_VAR_EFUSE_USAGE: pHalData->EfuseUsedPercentage = *val; @@ -6728,6 +6666,13 @@ void SetHwReg8188F(PADAPTER padapter, u8 variable, u8 *val) case HW_VAR_EN_HW_UPDATE_TSF: hw_var_set_hw_update_tsf(padapter); break; +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW + case HW_VAR_TDLS_BCN_EARLY_C2H_RPT: + rtl8188f_set_BcnEarly_C2H_Rpt_cmd(padapter, *val); + break; +#endif +#endif default: SetHwReg(padapter, variable, val); break; @@ -6851,12 +6796,6 @@ void GetHwReg8188F(PADAPTER padapter, u8 variable, u8 *val) } break; -#ifdef CONFIG_ANTENNA_DIVERSITY - case HW_VAR_CURRENT_ANTENNA: - *val = pHalData->CurAntenna; - break; -#endif - case HW_VAR_EFUSE_USAGE: *val = pHalData->EfuseUsedPercentage; break; @@ -6954,6 +6893,91 @@ void SetHwRegWithBuf8188F(PADAPTER padapter, u8 variable, u8 *pbuf, int len) } #endif /* CONFIG_C2H_PACKET_EN */ +void hal_ra_info_dump(_adapter *padapter , void *sel) +{ + int i; + u8 mac_id; + u32 cmd; + u32 ra_info1, ra_info2, bw_set; + u32 rate_mask1, rate_mask2; + u8 curr_tx_rate, curr_tx_sgi, hight_rate, lowest_rate; + HAL_DATA_TYPE *HalData = GET_HAL_DATA(padapter); + struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + + for (i = 0; i < macid_ctl->num; i++) { + + if (rtw_macid_is_used(macid_ctl, i) && !rtw_macid_is_bmc(macid_ctl, i)) { + + mac_id = (u8) i; + DBG_871X_SEL(sel , "============ RA status check Mac_id:%d ===================\n", mac_id); + + cmd = 0x40000100 | mac_id; + rtw_write32(padapter, REG_HMEBOX_DBG_2_8188F, cmd); + rtw_msleep_os(10); + ra_info1 = rtw_read32(padapter, 0x2F0); + curr_tx_rate = ra_info1 & 0x7F; + curr_tx_sgi = (ra_info1 >> 7) & 0x01; + + DBG_871X_SEL(sel , "[ ra_info1:0x%08x ] =>cur_tx_rate= %s,cur_sgi:%d\n" , ra_info1 , HDATA_RATE(curr_tx_rate), curr_tx_sgi); + DBG_871X_SEL(sel , "[ ra_info1:0x%08x ] => PWRSTS = 0x%02x\n", ra_info1, (ra_info1 >> 8) & 0x07); + + cmd = 0x40000400 | mac_id; + rtw_write32(padapter, REG_HMEBOX_DBG_2_8188F, cmd); + rtw_msleep_os(10); + ra_info1 = rtw_read32(padapter, 0x2F0); + ra_info2 = rtw_read32(padapter, 0x2F4); + rate_mask1 = rtw_read32(padapter, 0x2F8); + rate_mask2 = rtw_read32(padapter, 0x2FC); + hight_rate = ra_info2 & 0xFF; + lowest_rate = (ra_info2 >> 8) & 0xFF; + bw_set = (ra_info1 >> 8) & 0xFF; + + DBG_871X_SEL(sel , "[ ra_info1:0x%08x ] => VHT_EN=0x%02x, ", ra_info1, (ra_info1>>24) & 0xFF); + + switch (bw_set) { + + case CHANNEL_WIDTH_20: + DBG_871X_SEL(sel , "BW_setting=20M\n"); + break; + + case CHANNEL_WIDTH_40: + DBG_871X_SEL(sel , "BW_setting=40M\n"); + break; + + case CHANNEL_WIDTH_80: + DBG_871X_SEL(sel , "BW_setting=80M\n"); + break; + + case CHANNEL_WIDTH_160: + DBG_871X_SEL(sel , "BW_setting=160M\n"); + break; + + default: + DBG_871X_SEL(sel , "BW_setting=0x%02x\n", bw_set); + break; + + } + + DBG_871X_SEL(sel , "[ ra_info1:0x%08x ] =>RSSI=%d, DISRA=0x%02x\n", + ra_info1, + ra_info1 & 0xFF, + (ra_info1 >> 16) & 0xFF); + + DBG_871X_SEL(sel , "[ ra_info2:0x%08x ] =>hight_rate=%s, lowest_rate=%s, SGI=0x%02x, RateID=%d\n", + ra_info2, + HDATA_RATE(hight_rate), + HDATA_RATE(lowest_rate), + (ra_info2 >> 16) & 0xFF, + (ra_info2 >> 24) & 0xFF); + + DBG_871X_SEL(sel , "rate_mask2=0x%08x, rate_mask1=0x%08x\n", rate_mask2, rate_mask1); + + + } + } +} + /* * Description: * Query setting of specified variable. @@ -7000,54 +7024,8 @@ u8 GetHalDefVar8188F(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval) *((u8 *)pval) = _FALSE; break; - case HW_DEF_RA_INFO_DUMP: { - u8 mac_id = *(u8 *)pval; - u32 cmd; - u32 ra_info1, ra_info2; - u32 rate_mask1, rate_mask2; - u8 curr_tx_rate, curr_tx_sgi, hight_rate, lowest_rate; - - DBG_8192C("============ RA status check Mac_id:%d ===================\n", mac_id); - - cmd = 0x40000100 | mac_id; - rtw_write32(padapter, REG_HMEBOX_DBG_2_8188F, cmd); - rtw_msleep_os(10); - ra_info1 = rtw_read32(padapter, 0x2F0); - curr_tx_rate = ra_info1 & 0x7F; - curr_tx_sgi = (ra_info1 >> 7) & 0x01; - DBG_8192C("[ ra_info1:0x%08x ] =>cur_tx_rate= %s,cur_sgi:%d, PWRSTS = 0x%02x\n", - ra_info1, - HDATA_RATE(curr_tx_rate), - curr_tx_sgi, - (ra_info1 >> 8) & 0x07); - - cmd = 0x40000400 | mac_id; - rtw_write32(padapter, REG_HMEBOX_DBG_2_8188F, cmd); - rtw_msleep_os(10); - ra_info1 = rtw_read32(padapter, 0x2F0); - ra_info2 = rtw_read32(padapter, 0x2F4); - rate_mask1 = rtw_read32(padapter, 0x2F8); - rate_mask2 = rtw_read32(padapter, 0x2FC); - hight_rate = ra_info2 & 0xFF; - lowest_rate = (ra_info2 >> 8) & 0xFF; - - DBG_8192C("[ ra_info1:0x%08x ] =>RSSI=%d, BW_setting=0x%02x, DISRA=0x%02x, VHT_EN=0x%02x\n", - ra_info1, - ra_info1 & 0xFF, - (ra_info1 >> 8) & 0xFF, - (ra_info1 >> 16) & 0xFF, - (ra_info1 >> 24) & 0xFF); - - DBG_8192C("[ ra_info2:0x%08x ] =>hight_rate=%s, lowest_rate=%s, SGI=0x%02x, RateID=%d\n", - ra_info2, - HDATA_RATE(hight_rate), - HDATA_RATE(lowest_rate), - (ra_info2 >> 16) & 0xFF, - (ra_info2 >> 24) & 0xFF); - - DBG_8192C("rate_mask2=0x%08x, rate_mask1=0x%08x\n", rate_mask2, rate_mask1); - - } + case HW_DEF_RA_INFO_DUMP: + hal_ra_info_dump(padapter, pval); break; case HAL_DEF_TX_PAGE_BOUNDARY: diff --git a/rtl8188FU/hal/rtl8188f/rtl8188f_phycfg.c b/rtl8188FU/hal/rtl8188f/rtl8188f_phycfg.c index 94fa1a9..40fe483 100755 --- a/rtl8188FU/hal/rtl8188f/rtl8188f_phycfg.c +++ b/rtl8188FU/hal/rtl8188f/rtl8188f_phycfg.c @@ -234,6 +234,7 @@ phy_RFSerialRead_8188F( u4Byte MaskforPhySet = 0; int i = 0; + _enter_critical_mutex(&(adapter_to_dvobj(Adapter)->rf_read_reg_mutex) , NULL); /* */ /* Make sure RF register offset is correct */ /* */ @@ -277,6 +278,7 @@ phy_RFSerialRead_8188F( /*RT_DISP(FINIT, INIT_RF,("Readback from RF-SI : 0x%x\n", retValue)); */ } + _exit_critical_mutex(&(adapter_to_dvobj(Adapter)->rf_read_reg_mutex) , NULL); return retValue; } @@ -471,17 +473,12 @@ s32 PHY_MACConfig8188F(PADAPTER Adapter) { int rtStatus = _SUCCESS; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - s8 *pszMACRegFile; - s8 sz8188MACRegFile[] = RTL8188F_PHY_MACREG; - - - pszMACRegFile = sz8188MACRegFile; /* */ /* Config MAC */ /* */ #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile); + rtStatus = phy_ConfigMACWithParaFile(Adapter, PHY_FILE_MAC_REG); if (rtStatus == _FAIL) #endif { @@ -539,76 +536,6 @@ phy_InitBBRFRegisterDefinition( } -#if 0 /* (MP_DRIVER == 1) */ - -/*----------------------------------------------------------------------------- - * Function: phy_ConfigBBWithMpHeaderFile - * - * Overview: Config PHY_REG_MP array - * - * Input: NONE - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 02/04/2010 chiyokolin Modify to new files. - *---------------------------------------------------------------------------*/ -static int -phy_ConfigBBWithMpHeaderFile( - IN PADAPTER Adapter, - IN u1Byte ConfigType) -{ - int i; - u32 *Rtl8192CPHY_REGArray_Table_MP; - u16 PHY_REGArrayMPLen; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - - PHY_REGArrayMPLen = Rtl8188F_PHY_REG_Array_MPLength; - Rtl8192CPHY_REGArray_Table_MP = (u32 *)Rtl8188F_PHY_REG_Array_MP; - - if (ConfigType == BaseBand_Config_PHY_REG) { - for (i = 0; i < PHY_REGArrayMPLen; i = i + 2) { - if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfe) { -#ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(50); -#else - rtw_mdelay_os(50); -#endif - } else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfd) - rtw_mdelay_os(5); - else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfc) - rtw_mdelay_os(1); - else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfb) { -#ifdef CONFIG_LONG_DELAY_ISSUE - rtw_msleep_os(50); -#else - rtw_mdelay_os(50); -#endif - } else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xfa) - rtw_mdelay_os(5); - else if (Rtl8192CPHY_REGArray_Table_MP[i] == 0xf9) - rtw_mdelay_os(1); - PHY_SetBBReg(Adapter, Rtl8192CPHY_REGArray_Table_MP[i], bMaskDWord, Rtl8192CPHY_REGArray_Table_MP[i + 1]); - - /* Add 1us delay between BB/RF register setting. */ - rtw_mdelay_os(1); - - /*RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl8192CPHY_REGArray_Table_MP[%d] is %lx Rtl8192CPHY_REGArray_Table_MP[%d] is %lx\n", i, i+1, Rtl8192CPHY_REGArray_Table_MP[i], Rtl8192CPHY_REGArray_Table_MP[i+1])); */ - } - } else { - /*RT_TRACE(COMP_SEND, DBG_LOUD, ("phy_ConfigBBWithMpHeaderFile(): ConfigType != BaseBand_Config_PHY_REG\n")); */ - } - - return _SUCCESS; -} /* phy_ConfigBBWithMpHeaderFile */ - -#endif /* #if (MP_DRIVER == 1) */ - - static int phy_BB8188f_Config_ParaFile( IN PADAPTER Adapter @@ -616,20 +543,12 @@ phy_BB8188f_Config_ParaFile( { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); int rtStatus = _SUCCESS; - u8 sz8188FBRegFile[] = RTL8188F_PHY_REG; - u8 sz8188AGCTableFile[] = RTL8188F_AGC_TAB; - u8 sz8188FBRegMpFile[] = RTL8188F_PHY_REG_MP; - u8 *pszBBRegFile = NULL, *pszAGCTableFile = NULL, *pszBBRegMpFile = NULL; - - pszBBRegFile = sz8188FBRegFile; - pszAGCTableFile = sz8188AGCTableFile; - pszBBRegMpFile = sz8188FBRegMpFile; /* */ /* 1. Read PHY_REG.TXT BB INIT!! */ /* */ #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (phy_ConfigBBWithParaFile(Adapter, pszBBRegFile, CONFIG_BB_PHY_REG) == _FAIL) + if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_PHY_REG, CONFIG_BB_PHY_REG) == _FAIL) #endif { #ifdef CONFIG_EMBEDDED_FWIMG @@ -649,7 +568,7 @@ phy_BB8188f_Config_ParaFile( /* 1.1 Read PHY_REG_MP.TXT BB INIT!! */ /* */ #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile) == _FAIL) + if (phy_ConfigBBWithMpParaFile(Adapter, PHY_FILE_PHY_REG_MP) == _FAIL) #endif { #ifdef CONFIG_EMBEDDED_FWIMG @@ -669,7 +588,7 @@ phy_BB8188f_Config_ParaFile( /* 2. Read BB AGC table Initialization */ /* */ #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile, CONFIG_BB_AGC_TAB) == _FAIL) + if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_AGC_TAB, CONFIG_BB_AGC_TAB) == _FAIL) #endif { #ifdef CONFIG_EMBEDDED_FWIMG @@ -740,16 +659,6 @@ PHY_BBConfig8188F( return rtStatus; } -void phy_LCK_8188F( - IN PADAPTER Adapter -) -{ - PHY_SetRFReg(Adapter, RF_PATH_A, 0xB0, bRFRegOffsetMask, 0xDFBE0); - PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x8C01); - rtw_mdelay_os(200); - PHY_SetRFReg(Adapter, RF_PATH_A, 0xB0, bRFRegOffsetMask, 0xDFFE0); -} - #if 0 /* Block & Path enable */ #define rOFDMCCKEN_Jaguar 0x808 /* OFDM/CCK block enable */ @@ -798,7 +707,6 @@ PHY_RFConfig8188F( /* */ rtStatus = PHY_RF6052_Config8188F(Adapter); - phy_LCK_8188F(Adapter); /*PHY_BB8188F_Config_1T(Adapter); */ return rtStatus; @@ -1004,13 +912,16 @@ PHY_SetTxPowerLevel8188F( ) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; - pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; + u8 cur_antenna; u8 RFPath = ODM_RF_PATH_A; +#ifdef CONFIG_ANTENNA_DIVERSITY + rtw_hal_get_odm_var(Adapter, HAL_ODM_ANTDIV_SELECT, &cur_antenna, NULL); + if (pHalData->AntDivCfg) /* antenna diversity Enable */ - RFPath = ((pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ODM_RF_PATH_A : ODM_RF_PATH_B); + RFPath = ((cur_antenna == MAIN_ANT) ? ODM_RF_PATH_A : ODM_RF_PATH_B); else /* antenna diversity disable */ +#endif RFPath = pHalData->ant_path; RT_TRACE(_module_hal_init_c_, _drv_info_, ("==>PHY_SetTxPowerLevel8188F()\n")); @@ -1047,7 +958,7 @@ phy_SpurCalibration_8188F( IN u1Byte threshold ) { - u4Byte freq[6] = {0xFCCD, 0xFC4D, 0xFFCD, 0xFF4D, 0xFCCD, 0xFF9A}; /* {chnl 5, 6, 7, 8, 13, 14} */ + u4Byte freq[7] = {0xFCCD, 0xFC4D, 0xFFCD, 0xFF4D, 0xFCCD, 0xFF9A, 0xFDCD}; /* {chnl 5, 6, 7, 8, 13, 14 , 11} */ u1Byte idx = 0; u1Byte b_doNotch = FALSE; u1Byte initial_gain; @@ -1059,6 +970,8 @@ phy_SpurCalibration_8188F( HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); PDM_ODM_T pDM_Odm = &(pHalData->odmpriv); + ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x1F); + ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ /* check threshold */ if (threshold <= 0x0) threshold = 0x16; @@ -1077,6 +990,8 @@ phy_SpurCalibration_8188F( idx = 4; else if (ToChannel == 14) idx = 5; + else if (ToChannel == 11) + idx = 6; else idx = 10; @@ -1092,8 +1007,9 @@ phy_SpurCalibration_8188F( bSW_Ctrl_S1 = ((reg948 & BIT9) == 0x0) ? TRUE : FALSE; /* If wlan at S1 (both HW control & SW control) and current channel=5,6,7,8,13,14 */ - if ((bHW_Ctrl_S1 || bSW_Ctrl_S1) && (idx <= 5)) { + if ((bHW_Ctrl_S1 || bSW_Ctrl_S1) && (idx <= 6)) { initial_gain = (u1Byte)(ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0) & 0x7f); + PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, BIT24, 0); /* Disable CCK block */ ODM_Write_DIG(pDM_Odm, 0x30); PHY_SetBBReg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccf000c0); /* disable 3-wire */ @@ -1106,7 +1022,9 @@ phy_SpurCalibration_8188F( b_doNotch = TRUE; PHY_SetBBReg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, freq[idx]); /* turn off PSD */ + PHY_SetBBReg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccc000c0); /* enable 3-wire */ + PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, BIT24, 1); /* Enable CCK block */ ODM_Write_DIG(pDM_Odm, initial_gain); } @@ -1118,8 +1036,8 @@ phy_SpurCalibration_8188F( switch (wlan_channel) { /*Set notch filter */ case 5: case 13: - ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0xB); - ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0xB); + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x06000000); ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000); ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000); @@ -1127,8 +1045,8 @@ phy_SpurCalibration_8188F( ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */ break; case 6: - ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x4); - ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x4); + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x00000600); ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000); ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000); @@ -1136,8 +1054,8 @@ phy_SpurCalibration_8188F( ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */ break; case 7: - ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x3); - ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x3); + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000); ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000); ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000); @@ -1145,17 +1063,26 @@ phy_SpurCalibration_8188F( ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */ break; case 8: - ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0xA); - ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0xA); + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000); ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000); ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000); ODM_SetBBReg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000380); ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */ break; + case 11: + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT28|BIT27|BIT26|BIT25|BIT24, 0x19); + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); //enable notch filter + ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000); + ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x04000000); + ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000); + ODM_SetBBReg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000); + ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); //enable CSI mask + break; case 14: - ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x5); - ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT28 | BIT27 | BIT26 | BIT25 | BIT24, 0x5); + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); /*enable notch filter */ ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000); ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000); ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000); @@ -1163,14 +1090,14 @@ phy_SpurCalibration_8188F( ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); /*enable CSI mask */ break; default: - ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x0); /*disable notch filter */ + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x0); /*disable notch filter */ ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x0); /*disable CSI mask function */ break; } /*switch(wlan_channel) */ return; } - ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x0); /*disable notch filter */ + // ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x0); /*disable notch filter */ ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x0); /*disable CSI mask */ } @@ -1299,7 +1226,8 @@ phy_PostSetBwMode8188F( 0x483[3:0]=1/2 0x440[22:21]=2'b00 - 0xc84[31:28]=0x2 + 0xc84[31:28]=0x2 (SDIO) + 0xc84[31:28]=0x7 (USB) */ PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT0, 0x1); PHY_SetBBReg(Adapter, rFPGA1_RFMOD, BIT0, 0x1); @@ -1317,8 +1245,6 @@ phy_PostSetBwMode8188F( PHY_SetMacReg(Adapter, REG_DATA_SC_8188F, BIT3 | BIT2 | BIT1 | BIT0, SubChnlNum); /* txsc_20 */ PHY_SetMacReg(Adapter, REG_RRSR_8188F, BIT22 | BIT21, 0x0); /* RRSR_RSC */ - PHY_SetBBReg(Adapter, rOFDM0_XATxAFE, BIT31 | BIT30 | BIT29 | BIT28, 0x2); /* PDTH_BW40/ACPR */ - if (0) DBG_871X("%s: REG_DATA_SC_8188F(%d) nCur40MhzPrimeSC(%d)\n", __func__, SubChnlNum, pHalData->nCur40MhzPrimeSC); break; diff --git a/rtl8188FU/hal/rtl8188f/rtl8188f_rf6052.c b/rtl8188FU/hal/rtl8188f/rtl8188f_rf6052.c index 827c9ba..60c3d44 100755 --- a/rtl8188FU/hal/rtl8188f/rtl8188f_rf6052.c +++ b/rtl8188FU/hal/rtl8188f/rtl8188f_rf6052.c @@ -83,32 +83,48 @@ PHY_RF6052SetBandwidth8188F( RF_A_reg 0x87=0x00065 RF_A_reg 0x1c=0x00000 RF_A_reg 0xDF=0x00140 - RF_A_reg 0x1b=0x00c6c + RF_A_reg 0x1b=0x00c6c (for SDIO) + RF_A_reg 0x1b=0x01c6c (for USB) */ pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | BIT10 | BIT11); PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x18, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); /* RF TRX_BW */ PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x87, bRFRegOffsetMask, 0x00065); /* FILTER BW&RC Corner (ACPR) */ PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1C, bRFRegOffsetMask, 0x00000); /* FILTER BW&RC Corner (ACPR) */ - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0xDF, bRFRegOffsetMask, 0x00140); /* FILTER BW&RC Corner (ACPR) */ - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x00C6C); /* FILTER BW&RC Corner (ACPR) */ + + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0xDF, bRFRegOffsetMask, 0x00140); /* RC Corner */ +#ifdef CONFIG_SDIO_HCI + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x00C6C); /* RC Corner */ +#endif /* CONFIG_SDIO_HCI */ +#ifdef CONFIG_USB_HCI + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x01C6C); /* RC Corner */ +#endif break; case CHANNEL_WIDTH_40: /* RF_A_reg 0x18[11:10]=2'b01 RF_A_reg 0x87=0x00025 - RF_A_reg 0x1c=0x00800 + RF_A_reg 0x1c=0x00800 (for SDIO) + RF_A_reg 0x1c=0x01000 (for USB) RF_A_reg 0xDF=0x00140 - RF_A_reg 0x1b=0x00c6c + RF_A_reg 0x1b=0x00c6c (for SDIO) + RF_A_reg 0x1b=0x01c6c (for USB) */ pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff3ff) | BIT10); PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x18, bRFRegOffsetMask, pHalData->RfRegChnlVal[0]); /* RF TRX_BW */ PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x87, bRFRegOffsetMask, 0x00025); /* FILTER BW&RC Corner (ACPR) */ +#ifdef CONFIG_SDIO_HCI PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1C, bRFRegOffsetMask, 0x00800); /* FILTER BW&RC Corner (ACPR) */ - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0xDF, bRFRegOffsetMask, 0x00140); /* FILTER BW&RC Corner (ACPR) */ - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x00C6C); /* FILTER BW&RC Corner (ACPR) */ + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0xDF, bRFRegOffsetMask, 0x00140); /* RC Corner */ + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x00C6C); /* RC Corner */ +#endif /* CONFIG_SDIO_HCI */ +#ifdef CONFIG_USB_HCI + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1C, bRFRegOffsetMask, 0x01000); /* FILTER BW&RC Corner (ACPR) */ + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0xDF, bRFRegOffsetMask, 0x00140); /* RC Corner */ + PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1B, bRFRegOffsetMask, 0x01C6C); /* RC Corner */ +#endif break; default: @@ -143,15 +159,6 @@ phy_RF6052_Config_ParaFile( int rtStatus = _SUCCESS; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - static char sz8188RadioAFile[] = RTL8188F_PHY_RADIO_A; - static char sz8188RadioBFile[] = RTL8188F_PHY_RADIO_B; - static s1Byte sz8188FTxPwrTrackFile[] = RTL8188F_TXPWR_TRACK; - char *pszRadioAFile, *pszRadioBFile, *pszTxPwrTrackFile; - - pszRadioAFile = sz8188RadioAFile; - pszRadioBFile = sz8188RadioBFile; - pszTxPwrTrackFile = sz8188FTxPwrTrackFile; - /*3//----------------------------------------------------------------- */ /*3// <2> Initialize RF */ /*3//----------------------------------------------------------------- */ @@ -191,7 +198,7 @@ phy_RF6052_Config_ParaFile( switch (eRFPath) { case RF_PATH_A: #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, eRFPath) == _FAIL) + if (PHY_ConfigRFWithParaFile(Adapter, PHY_FILE_RADIO_A, eRFPath) == _FAIL) #endif { #ifdef CONFIG_EMBEDDED_FWIMG @@ -202,7 +209,7 @@ phy_RF6052_Config_ParaFile( break; case RF_PATH_B: #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, eRFPath) == _FAIL) + if (PHY_ConfigRFWithParaFile(Adapter, PHY_FILE_RADIO_B, eRFPath) == _FAIL) #endif { #ifdef CONFIG_EMBEDDED_FWIMG @@ -241,7 +248,7 @@ phy_RF6052_Config_ParaFile( /*3 ----------------------------------------------------------------- */ #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (PHY_ConfigRFWithTxPwrTrackParaFile(Adapter, pszTxPwrTrackFile) == _FAIL) + if (PHY_ConfigRFWithTxPwrTrackParaFile(Adapter, PHY_FILE_TXPWR_TRACK) == _FAIL) #endif { #ifdef CONFIG_EMBEDDED_FWIMG diff --git a/rtl8188FU/hal/rtl8188f/usb/rtl8188fu_xmit.c b/rtl8188FU/hal/rtl8188f/usb/rtl8188fu_xmit.c index db98dab..823c518 100755 --- a/rtl8188FU/hal/rtl8188f/usb/rtl8188fu_xmit.c +++ b/rtl8188FU/hal/rtl8188f/usb/rtl8188fu_xmit.c @@ -438,8 +438,9 @@ s32 rtl8188fu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv pxmitframe->buf_addr = pxmitbuf->pbuf; pxmitbuf->priv_data = pxmitframe; - /*pxmitframe->agg_num = 1; // alloc xmitframe should assign to 1. */ - pxmitframe->pkt_offset = 1; /* first frame of aggregation, reserve offset */ + /* pxmitframe->agg_num = 1; */ /* alloc xmitframe should assign to 1. */ + /* pxmitframe->pkt_offset = 1; */ /* first frame of aggregation, reserve offset */ + pxmitframe->pkt_offset = (PACKET_OFFSET_SZ/8); if (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) { DBG_871X("%s coalesce 1st xmitframe failed\n", __func__); @@ -597,7 +598,8 @@ s32 rtl8188fu_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv #ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX /*3 3. update first frame txdesc */ - if ((pbuf_tail % bulkSize) == 0) { + if ((PACKET_OFFSET_SZ != 0) + && (pbuf_tail % bulkSize) == 0) { /* remove pkt_offset */ pbuf_tail -= PACKET_OFFSET_SZ; pfirstframe->buf_addr += PACKET_OFFSET_SZ; diff --git a/rtl8188FU/hal/rtl8188f/usb/usb_halinit.c b/rtl8188FU/hal/rtl8188f/usb/usb_halinit.c index 7ecafbb..383c3cc 100755 --- a/rtl8188FU/hal/rtl8188f/usb/usb_halinit.c +++ b/rtl8188FU/hal/rtl8188f/usb/usb_halinit.c @@ -225,33 +225,6 @@ static u8 _LLTWrite( } -static u8 _LLTRead( - IN PADAPTER Adapter, - IN u32 address -) -{ - int count = 0; - u32 value = _LLT_INIT_ADDR(address) | _LLT_OP(_LLT_READ_ACCESS); - - rtw_write32(Adapter, REG_LLT_INIT, value); - - /*polling and get value */ - do { - - value = rtw_read32(Adapter, REG_LLT_INIT); - if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)) - return (u8)value; - - if (count > POLLING_LLT_THRESHOLD) { - /*RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling read LLT done at address %d!\n", address)); */ - break; - } - } while (count++); - - return 0xFF; - -} - /*--------------------------------------------------------------- */ /* */ @@ -1006,6 +979,69 @@ rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter) void _ps_open_RF(_adapter *padapter); +#ifdef CONFIG_8188FTV_SOLUTION_D +/* +Write corresponding register of efuse. Indirect Write. +Offset: reg offset. +Value: u8 value +*/ +VOID WriteUSB2PHYReg(PADAPTER Adapter, u8 Offset, u8 Value) +{ + rtw_write8(Adapter, 0xFE41, Value); + rtw_write8(Adapter, 0xFE40, Offset); + rtw_write8(Adapter, 0xFE42, 0x81); +} + +/* +Read corresponding register of efuse. Indirect Read. +Offset: reg offset. +*/ +u1Byte ReadUSB2PHYReg(PADAPTER Adapter, u8 Offset) +{ + u8 value = 0; + rtw_write8(Adapter, 0xFE40, Offset); + rtw_write8(Adapter, 0xFE42, 0x81); + value = rtw_read8(Adapter, 0xFE43); + + return value; +} + +void rtl8188fu_solution_d(PADAPTER Adapter) +{ + u8 reg_val[6] = {0}; + u16 reg0mask = BIT(10) | BIT(11) | BIT(12) | BIT(13); + u16 reg1mask = BIT(0) | BIT(1) | BIT(2) | BIT(3); + + reg_val[0] = PHY_QueryMacReg(Adapter, 0x10, reg0mask); /* efuse 0x3 */ + reg_val[1] = PHY_QueryMacReg(Adapter, 0xC4, reg1mask); /* efuse 0xd */ + reg_val[2] = ReadUSB2PHYReg(Adapter, 0xC1); /* efuse 0x131 */ + reg_val[3] = PHY_QueryMacReg(Adapter, 0x4, BIT(11)); /* efuse 0xa */ + reg_val[4] = ReadUSB2PHYReg(Adapter, 0xD2); /* efuse 0x13a */ + reg_val[5] = ReadUSB2PHYReg(Adapter, 0xD3); /* efuse 0x13b */ + + if(!(reg_val[3] == 0 && reg_val[4] == 0 && reg_val[5] == 0x31)) /* solution "EP" not applied */ + { + if((reg_val[0] == 0xC && reg_val[1] == 0xC && reg_val[2] == 0xAE) /* solution O */ + ||(reg_val[0] == 0xF && reg_val[1] == 0xC && reg_val[2] == 0xAE) /* solution A */ + ||(reg_val[0] == 0xC && reg_val[1] == 0xB && reg_val[2] == 0xAE) /* solution B */ + ||(reg_val[0] == 0xC && reg_val[1] == 0xC && reg_val[2] == 0xBE)) /* solution C */ + { + /* apply solution D */ + PHY_SetMacReg(Adapter, 0x10, reg0mask, 0xF); + PHY_SetMacReg(Adapter, 0xC4, reg1mask, 0x7); + WriteUSB2PHYReg(Adapter, 0xE1, 0xB6); + DBG_871X("%s, Aplly Solution D\n", __func__); + } + else if(reg_val[0] == 0xF && reg_val[1] == 0x7 && reg_val[2] == 0xB6) + DBG_871X("%s, Solution D already apllied\n", __func__); + else + DBG_871X("%s, Unexpected efuse content\n", __func__); + } + else + DBG_871X("%s, Solution EP already applied\n", __func__); +} +#endif + u32 rtl8188fu_hal_init(PADAPTER padapter) { u8 value8 = 0, u1bRegCR; @@ -1187,8 +1223,6 @@ u32 rtl8188fu_hal_init(PADAPTER padapter) } } - rtl8188f_InitializeFirmwareVars(padapter); - if (pwrctrlpriv->reg_rfoff == _TRUE) pwrctrlpriv->rf_pwrstate = rf_off; @@ -1349,6 +1383,7 @@ u32 rtl8188fu_hal_init(PADAPTER padapter) PHY_LCCalibrate_8188F(&pHalData->odmpriv); +#ifdef CONFIG_BT_COEXIST /* Inform WiFi FW that it is the beginning of IQK */ h2cCmdBuf = 1; FillH2CCmd8188F(padapter, H2C_8188F_BT_WLAN_CALIBRATION, 1, &h2cCmdBuf); @@ -1361,19 +1396,21 @@ u32 rtl8188fu_hal_init(PADAPTER padapter) rtw_msleep_os(50); } while (rtw_get_passing_time_ms(start_time) <= 400); -#ifdef CONFIG_BT_COEXIST + rtw_btcoex_IQKNotify(padapter, _TRUE); #endif + restore_iqk_rst = (pwrpriv->bips_processing == _TRUE) ? _TRUE : _FALSE; PHY_IQCalibrate_8188F(padapter, _FALSE, restore_iqk_rst); pHalData->odmpriv.RFCalibrateInfo.bIQKInitialized = _TRUE; + #ifdef CONFIG_BT_COEXIST rtw_btcoex_IQKNotify(padapter, _FALSE); -#endif /* Inform WiFi FW that it is the finish of IQK */ h2cCmdBuf = 0; FillH2CCmd8188F(padapter, H2C_8188F_BT_WLAN_CALIBRATION, 1, &h2cCmdBuf); +#endif ODM_TXPowerTrackingCheck(&pHalData->odmpriv); } @@ -2190,7 +2227,7 @@ InitAdapterVariablesByPROM_8188FU( /*hal_CustomizedBehavior_8188FU(Adapter); */ Hal_EfuseParseKFreeData_8188F(padapter, hwinfo, pHalData->bautoload_fail_flag); - Hal_EfuseParseMacHidden_8188F(padapter, hwinfo, pHalData->bautoload_fail_flag); + hal_read_mac_hidden_rpt(padapter); /* Adapter->bDongle = (PROMContent[EEPROM_EASY_REPLACEMENT] == 1)? 0: 1; */ DBG_8192C("%s(): REPLACEMENT = %x\n", __func__, padapter->bDongle); @@ -2211,6 +2248,10 @@ static void _ReadPROMContent( DBG_8192C("Boot from %s, Autoload %s !\n", (pHalData->EepromOrEfuse ? "EEPROM" : "EFUSE"), (pHalData->bautoload_fail_flag ? "Fail" : "OK")); +#ifdef CONFIG_8188FTV_SOLUTION_D + rtl8188fu_solution_d(Adapter); +#endif + InitAdapterVariablesByPROM_8188FU(Adapter); } @@ -2358,11 +2399,7 @@ GetHalDefVar8188FUsb( *((u8 *)pValue) = (pHalData->AntDivCfg == 0) ? _FALSE : _TRUE; #endif break; - case HAL_DEF_CURRENT_ANTENNA: -#ifdef CONFIG_ANTENNA_DIVERSITY - *((u8 *)pValue) = pHalData->CurAntenna; -#endif - break; + case HAL_DEF_DRVINFO_SZ: *((u32 *)pValue) = DRVINFO_SZ; break; @@ -2370,7 +2407,7 @@ GetHalDefVar8188FUsb( *((u32 *)pValue) = MAX_RECVBUF_SZ; break; case HAL_DEF_RX_PACKET_OFFSET: - *((u32 *)pValue) = RXDESC_SIZE + DRVINFO_SZ; + *((u32 *)pValue) = RXDESC_SIZE + DRVINFO_SZ*8; break; case HW_VAR_MAX_RX_AMPDU_FACTOR: *((HT_CAP_AMPDU_FACTOR *)pValue) = MAX_AMPDU_FACTOR_64K; diff --git a/rtl8188FU/include/Hal8188EPhyCfg.h b/rtl8188FU/include/Hal8188EPhyCfg.h index cbe8dcb..404e1fa 100755 --- a/rtl8188FU/include/Hal8188EPhyCfg.h +++ b/rtl8188FU/include/Hal8188EPhyCfg.h @@ -159,6 +159,10 @@ PHY_SetSwChnlBWMode8188E( IN u8 Offset80
);
+VOID
+PHY_SetRFEReg_8188E(
+ IN PADAPTER Adapter
+);
//
// BB/MAC/RF other monitor API
//
diff --git a/rtl8188FU/include/HalVerDef.h b/rtl8188FU/include/HalVerDef.h index d3df5df..8c361c9 100755 --- a/rtl8188FU/include/HalVerDef.h +++ b/rtl8188FU/include/HalVerDef.h @@ -178,9 +178,11 @@ typedef struct tag_HAL_VERSION #define IS_8723A_A_CUT(version) ((IS_8723_SERIES(version)) ? ( IS_A_CUT(version)?TRUE : FALSE) : FALSE) #define IS_8723A_B_CUT(version) ((IS_8723_SERIES(version)) ? ( IS_B_CUT(version)?TRUE : FALSE) : FALSE) #endif - +#ifdef CONFIG_USB_HCI +#define IS_VENDOR_8188E_I_CUT_SERIES(_Adapter) (FALSE) +#else #define IS_VENDOR_8188E_I_CUT_SERIES(_Adapter) ((IS_8188E(GET_HAL_DATA(_Adapter)->VersionID)) ? ((GET_CVID_CUT_VERSION(GET_HAL_DATA(_Adapter)->VersionID) >= I_CUT_VERSION) ? TRUE : FALSE) : FALSE) - +#endif #define IS_VENDOR_8812A_TEST_CHIP(_Adapter) ((IS_8812_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? FALSE : TRUE) : FALSE) #define IS_VENDOR_8812A_MP_CHIP(_Adapter) ((IS_8812_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((IS_NORMAL_CHIP(GET_HAL_DATA(_Adapter)->VersionID)) ? TRUE : FALSE) : FALSE) #define IS_VENDOR_8812A_C_CUT(_Adapter) ((IS_8812_SERIES(GET_HAL_DATA(_Adapter)->VersionID)) ? ((GET_CVID_CUT_VERSION(GET_HAL_DATA(_Adapter)->VersionID) == C_CUT_VERSION) ? TRUE : FALSE) : FALSE) diff --git a/rtl8188FU/include/autoconf.h b/rtl8188FU/include/autoconf.h index 83f61e2..746a64d 100755 --- a/rtl8188FU/include/autoconf.h +++ b/rtl8188FU/include/autoconf.h @@ -55,6 +55,7 @@ /* #define CONFIG_DRV_ISSUE_PROV_REQ */ /* IOT FOR S2 */ #define CONFIG_SET_SCAN_DENY_TIMER + /*#define SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42*/ /* wpa_supplicant realtek version <= jb42 will be defined this */ #endif #define CONFIG_AP_MODE @@ -81,7 +82,6 @@ /* #define CONFIG_DBG_P2P */ #define CONFIG_P2P_PS - /* #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 @@ -99,7 +99,7 @@ #define CONFIG_TDLS_AUTOSETUP */ #define CONFIG_TDLS_AUTOCHECKALIVE - #define CONFIG_TDLS_CH_SW /* Enable "CONFIG_TDLS_CH_SW" by default, however limit it to only work in wifi logo test mode but not in normal mode currently */ + #define CONFIG_TDLS_CH_SW /* Enable this flag only when we confirm that TDLS CH SW is supported in FW */ #endif /* #define CONFIG_CONCURRENT_MODE */ /* Set from Makefile */ @@ -140,7 +140,7 @@ #define CONFIG_C2H_PACKET_EN -#define CONFIG_RF_GAIN_OFFSET +#define CONFIG_RF_POWER_TRIM #define DISABLE_BB_RF 0 @@ -263,7 +263,7 @@ #endif /* CONFIG_BT_COEXIST */ #ifdef CONFIG_WOWLAN - /* #define CONFIG_GTK_OL */ + #define CONFIG_GTK_OL #endif /* CONFIG_WOWLAN */ #ifdef CONFIG_GPIO_WAKEUP diff --git a/rtl8188FU/include/basic_types.h b/rtl8188FU/include/basic_types.h index 0b75813..4ce0290 100755 --- a/rtl8188FU/include/basic_types.h +++ b/rtl8188FU/include/basic_types.h @@ -271,7 +271,7 @@ (LE_P2BYTE_TO_HOST_2BYTE(__pStart) & (~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen))) #define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ - (LE_P1BYTE_TO_HOST_1BYTE(__pStart) & (~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen))) + (LE_P1BYTE_TO_HOST_1BYTE(__pStart) & ((u8)(~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen)))) /* * Mask subfield (continuous bits in big-endian) of 4-byte value in BE byte oredering diff --git a/rtl8188FU/include/drv_conf.h b/rtl8188FU/include/drv_conf.h index 730ae2c..467862e 100755 --- a/rtl8188FU/include/drv_conf.h +++ b/rtl8188FU/include/drv_conf.h @@ -173,6 +173,17 @@ #define CONFIG_IEEE80211_BAND_5GHZ #endif +#ifndef RTW_DEF_MODULE_REGULATORY_CERT + #define RTW_DEF_MODULE_REGULATORY_CERT 0 +#endif + +#if RTW_DEF_MODULE_REGULATORY_CERT + /* force enable TX power by rate and TX power limit */ + #ifndef CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY + #define CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY + #endif +#endif + /* Mark CONFIG_DEAUTH_BEFORE_CONNECT by Arvin 2015/07/20 If the failure of Wi-Fi connection is due to some irregular disconnection behavior (like unplug dongle, diff --git a/rtl8188FU/include/drv_types.h b/rtl8188FU/include/drv_types.h index a9cf4cc..2efc01f 100755 --- a/rtl8188FU/include/drv_types.h +++ b/rtl8188FU/include/drv_types.h @@ -256,6 +256,7 @@ struct registry_priv u8 wifi_spec;// !turbo_mode u8 special_rf_path; // 0: 2T2R ,1: only turn on path A 1T1R + char alpha2[2]; u8 channel_plan; u8 full_ch_in_p2p_handshake; /* 0: reply only softap channel, 1: reply full channel list*/ #ifdef CONFIG_BT_COEXIST @@ -327,7 +328,7 @@ struct registry_priv u8 RFE_Type; u8 GLNA_Type; u8 check_fw_ps; - u8 RegRfKFreeEnable; + u8 RegPwrTrimEnable; #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE u8 load_phy_file; @@ -377,6 +378,9 @@ struct registry_priv #define REGSTY_IS_BW_2G_SUPPORT(regsty, bw) (REGSTY_BW_2G((regsty)) >= (bw)) #define REGSTY_IS_BW_5G_SUPPORT(regsty, bw) (REGSTY_BW_5G((regsty)) >= (bw)) +#define REGSTY_IS_11AC_ENABLE(regsty) ((regsty)->vht_enable != 0) +#define REGSTY_IS_11AC_AUTO(regsty) ((regsty)->vht_enable == 2) + #ifdef CONFIG_SDIO_HCI #include <drv_types_sdio.h> #define INTF_DATA SDIO_DATA @@ -655,6 +659,7 @@ struct macid_ctl_t { struct macid_bmp if_g[IFACE_ID_MAX]; struct macid_bmp ch_g[2]; /* 2 ch concurrency */ u8 h2c_msr[MACID_NUM_SW_LIMIT]; + struct sta_info *sta[MACID_NUM_SW_LIMIT]; }; struct rf_ctl_t { @@ -700,6 +705,7 @@ struct dvobj_priv _mutex h2c_fwcmd_mutex; _mutex setch_mutex; _mutex setbw_mutex; + _mutex rf_read_reg_mutex; #ifdef CONFIG_SDIO_INDIRECT_ACCESS _mutex sd_indirect_access_mutex; #endif diff --git a/rtl8188FU/include/hal_com.h b/rtl8188FU/include/hal_com.h index 80b4400..206a193 100755 --- a/rtl8188FU/include/hal_com.h +++ b/rtl8188FU/include/hal_com.h @@ -208,6 +208,11 @@ typedef enum _FIRMWARE_SOURCE { FW_SOURCE_HEADER_FILE = 1, //from header file } FIRMWARE_SOURCE, *PFIRMWARE_SOURCE; +typedef enum _CH_SW_USE_CASE{ + CH_SW_USE_CASE_TDLS = 0, + CH_SW_USE_CASE_MCC = 1 +} CH_SW_USE_CASE; + // // Queue Select Value in TxDesc // @@ -246,6 +251,7 @@ void rtw_dump_mac_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_count void rtw_dump_phy_rx_counters(_adapter* padapter,struct dbg_rx_counter *rx_counter); void rtw_reset_mac_rx_counters(_adapter* padapter); void rtw_reset_phy_rx_counters(_adapter* padapter); +void rtw_reset_phy_trx_ok_counters(_adapter *padapter); #ifdef DBG_RX_COUNTER_DUMP #define DUMP_DRV_RX_COUNTER BIT0 @@ -273,6 +279,12 @@ void rtw_hal_config_rftype(PADAPTER padapter); #define BW_CAP_80_80M BIT6 #define BW_CAP_BIT_NUM 7 +#define PROTO_CAP_11B BIT0 +#define PROTO_CAP_11G BIT1 +#define PROTO_CAP_11N BIT2 +#define PROTO_CAP_11AC BIT3 +#define PROTO_CAP_BIT_NUM 4 + #define WL_FUNC_P2P BIT0 #define WL_FUNC_MIRACAST BIT1 #define WL_FUNC_TDLS BIT2 @@ -284,19 +296,22 @@ void dump_hal_spec(void *sel, _adapter *adapter); bool hal_chk_band_cap(_adapter *adapter, u8 cap); bool hal_chk_bw_cap(_adapter *adapter, u8 cap); +bool hal_chk_proto_cap(_adapter *adapter, u8 cap); bool hal_is_band_support(_adapter *adapter, u8 band); bool hal_is_bw_support(_adapter *adapter, u8 bw); +bool hal_is_wireless_mode_support(_adapter *adapter, u8 mode); u8 hal_largest_bw(_adapter *adapter, u8 in_bw); bool hal_chk_wl_func(_adapter *adapter, u8 func); -u8 //return the final channel plan decision -hal_com_config_channel_plan( - IN PADAPTER padapter, - IN u8 hw_channel_plan, //channel plan from HW (efuse/eeprom) - IN u8 sw_channel_plan, //channel plan from SW (registry/module param) - IN u8 def_channel_plan, //channel plan used when the former two is invalid - IN BOOLEAN AutoLoadFail +u8 hal_com_config_channel_plan( + IN PADAPTER padapter, + IN char *hw_alpha2, + IN u8 hw_chplan, + IN char *sw_alpha2, + IN u8 sw_chplan, + IN u8 def_chplan, + IN BOOLEAN AutoLoadFail ); int hal_config_macaddr(_adapter *adapter, bool autoload_fail); @@ -357,11 +372,6 @@ eqNByte( u32 num ); -BOOLEAN -IsHexDigit( - IN char chTmp - ); - u32 MapCharToHexDigit( IN char chTmp @@ -412,7 +422,7 @@ void linked_info_dump(_adapter *padapter,u8 benable); #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA 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); +void rtw_dump_raw_rssi_info(_adapter *padapter, void *sel); #endif #define HWSET_MAX_SIZE 512 @@ -426,9 +436,9 @@ int check_phy_efuse_tx_power_info_valid(PADAPTER padapter); int hal_efuse_macaddr_offset(_adapter *adapter); int Hal_GetPhyEfuseMACAddr(PADAPTER padapter, u8 *mac_addr); -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM void rtw_bb_rf_gain_offset(_adapter *padapter); -#endif //CONFIG_RF_GAIN_OFFSET +#endif /*CONFIG_RF_POWER_TRIM*/ void dm_DynamicUsbTxAgg(_adapter *padapter, u8 from_timer); u8 rtw_hal_busagg_qsel_check(_adapter *padapter,u8 pre_qsel,u8 next_qsel); @@ -454,9 +464,15 @@ struct noise_info #endif void rtw_get_noise(_adapter* padapter); - +u8 rtw_get_current_tx_rate(_adapter *padapter, u8 macid); void rtw_hal_set_fw_rsvd_page(_adapter* adapter, bool finished); +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW +s32 rtw_hal_ch_sw_oper_offload(_adapter *padapter, u8 channel, u8 channel_offset, u16 bwmode); +#endif +#endif + #ifdef CONFIG_GPIO_API u8 rtw_hal_get_gpio(_adapter* adapter, u8 gpio_num); int rtw_hal_set_gpio_output_value(_adapter* adapter, u8 gpio_num, bool isHigh); @@ -465,7 +481,12 @@ int rtw_hal_register_gpio_interrupt(_adapter* adapter, int gpio_num, void(*callb int rtw_hal_disable_gpio_interrupt(_adapter* adapter, int gpio_num); #endif +s8 rtw_hal_ch_sw_iqk_info_search(_adapter* padapter, u8 central_chnl, u8 bw_mode); +void rtw_hal_ch_sw_iqk_info_backup(_adapter* adapter); +void rtw_hal_ch_sw_iqk_info_restore(_adapter* padapter, u8 ch_sw_use_case); + #ifdef CONFIG_GPIO_WAKEUP +void rtw_hal_switch_gpio_wl_ctrl(_adapter *padapter, u8 index, u8 enable); void rtw_hal_set_output_gpio(_adapter *padapter, u8 index, u8 outputval); #endif @@ -515,7 +536,7 @@ static inline u32 rtw_phydm_ability_get(_adapter *adapter) #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE extern char *rtw_phy_file_path; -extern char file_path[PATH_LENGTH_MAX]; +extern char rtw_phy_para_file_path[PATH_LENGTH_MAX]; #define GetLineFromBuffer(buffer) strsep(&buffer, "\r\n") #endif @@ -532,5 +553,10 @@ void rtw_acs_start(_adapter *padapter, bool bStart); void hal_set_crystal_cap(_adapter *adapter, u8 crystal_cap); +#ifdef CONFIG_ANTENNA_DIVERSITY +u8 rtw_hal_antdiv_before_linked(_adapter *padapter); +void rtw_hal_antdiv_rssi_compared(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); +#endif + #endif //__HAL_COMMON_H__ diff --git a/rtl8188FU/include/hal_com_h2c.h b/rtl8188FU/include/hal_com_h2c.h index 38dc04b..681d37a 100755 --- a/rtl8188FU/include/hal_com_h2c.h +++ b/rtl8188FU/include/hal_com_h2c.h @@ -38,6 +38,7 @@ enum h2c_cmd{ H2C_FCS_RSVDPAGE = 0x10, H2C_FCS_INFO = 0x11, H2C_AP_WOW_GPIO_CTRL = 0x13, + H2C_CHNL_SWITCH_OPER_OFFLOAD = 0x1C, //PoweSave Class: 001 H2C_SET_PWR_MODE = 0x20, @@ -201,7 +202,8 @@ enum h2c_cmd{ #define H2C_MSR_ROLE_GC 3 #define H2C_MSR_ROLE_GO 4 #define H2C_MSR_ROLE_TDLS 5 -#define H2C_MSR_ROLE_MAX 6 +#define H2C_MSR_ROLE_ADHOC 6 +#define H2C_MSR_ROLE_MAX 7 extern const char * const _h2c_msr_role_str[]; #define h2c_msr_role_str(role) (((role) >= H2C_MSR_ROLE_MAX) ? _h2c_msr_role_str[H2C_MSR_ROLE_MAX] : _h2c_msr_role_str[(role)]) @@ -311,6 +313,12 @@ s32 rtw_hal_set_FwMediaStatusRpt_range_cmd(_adapter *adapter, bool opmode, bool #define SET_H2CCMD_RSVDPAGE_LOC_P2P_PD_RSP(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) #endif //CONFIG_P2P_WOWLAN +/* CHNL_SWITCH_OPER_OFFLOAD_0x1C */ +#define SET_H2CCMD_CH_SW_OPER_OFFLOAD_CH_NUM(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE(__pH2CCmd, 0, 8, __Value) +#define SET_H2CCMD_CH_SW_OPER_OFFLOAD_BW_MODE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd) + 1, 0, 2, __Value) +#define SET_H2CCMD_CH_SW_OPER_OFFLOAD_BW_40M_SC(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd) + 1, 2, 3, __Value) +#define SET_H2CCMD_CH_SW_OPER_OFFLOAD_BW_80M_SC(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd) + 1, 5, 3, __Value) +#define SET_H2CCMD_CH_SW_OPER_OFFLOAD_RFE_TYPE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd) + 2, 0, 4, __Value) //---------------------------------------------------------------------------------------------------------// //------------------------------------------- Structure --------------------------------------------------// //---------------------------------------------------------------------------------------------------------// diff --git a/rtl8188FU/include/hal_com_led.h b/rtl8188FU/include/hal_com_led.h index 79e62c6..b764b50 100755 --- a/rtl8188FU/include/hal_com_led.h +++ b/rtl8188FU/include/hal_com_led.h @@ -265,7 +265,6 @@ typedef struct _LED_USB{ _timer BlinkTimer; // Timer object for led blinking. _workitem BlinkWorkItem; // Workitem used by BlinkTimer to manipulate H/W to blink LED.' - ATOMIC_T bCancelWorkItem; //check if WorkItem is cancelled } LED_USB, *PLED_USB; typedef struct _LED_USB LED_DATA, *PLED_DATA; diff --git a/rtl8188FU/include/hal_com_phycfg.h b/rtl8188FU/include/hal_com_phycfg.h index a765d6c..f363355 100755 --- a/rtl8188FU/include/hal_com_phycfg.h +++ b/rtl8188FU/include/hal_com_phycfg.h @@ -239,9 +239,9 @@ PHY_SetTxPowerIndex( bool phy_is_tx_power_limit_needed(_adapter *adapter); bool phy_is_tx_power_by_rate_needed(_adapter *adapter); -int phy_load_tx_power_by_rate(_adapter *adapter, const char *hal_file_name, u8 force); -int phy_load_tx_power_limit(_adapter *adapter, const char *hal_file_name, u8 force); -void phy_load_tx_power_ext_info(_adapter *adapter, u8 chk_file, u8 force); +int phy_load_tx_power_by_rate(_adapter *adapter, u8 chk_file); +int phy_load_tx_power_limit(_adapter *adapter, u8 chk_file); +void phy_load_tx_power_ext_info(_adapter *adapter, u8 chk_file); void phy_reload_tx_power_ext_info(_adapter *adapter); void phy_reload_default_tx_power_ext_info(_adapter *adapter); @@ -250,9 +250,27 @@ void dump_target_tx_power(void *sel, _adapter *adapter); void dump_tx_power_by_rate(void *sel, _adapter *adapter); void dump_tx_power_limit(void *sel, _adapter *adapter); -int rtw_is_phy_file_readable(const char *hal_file_name); +int rtw_get_phy_file_path(_adapter *adapter, const char *file_name); #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE +#define MAC_FILE_FW_NIC "FW_NIC.bin" +#define MAC_FILE_FW_WW_IMG "FW_WoWLAN.bin" +#define PHY_FILE_MAC_REG "MAC_REG.txt" + +#define PHY_FILE_AGC_TAB "AGC_TAB.txt" +#define PHY_FILE_PHY_REG "PHY_REG.txt" +#define PHY_FILE_PHY_REG_MP "PHY_REG_MP.txt" +#define PHY_FILE_PHY_REG_PG "PHY_REG_PG.txt" + +#define PHY_FILE_RADIO_A "RadioA.txt" +#define PHY_FILE_RADIO_B "RadioB.txt" +#define PHY_FILE_RADIO_C "RadioC.txt" +#define PHY_FILE_RADIO_D "RadioD.txt" +#define PHY_FILE_TXPWR_TRACK "TxPowerTrack.txt" +#define PHY_FILE_TXPWR_LMT "TXPWR_LMT.txt" + +#define PHY_FILE_WIFI_ANT_ISOLATION "wifi_ant_isolation.txt" + #define MAX_PARA_FILE_BUF_LEN 25600 #define LOAD_MAC_PARA_FILE BIT0 diff --git a/rtl8188FU/include/hal_data.h b/rtl8188FU/include/hal_data.h index bbcc98a..5a41e25 100755 --- a/rtl8188FU/include/hal_data.h +++ b/rtl8188FU/include/hal_data.h @@ -175,6 +175,9 @@ struct auto_chan_sel { #define KFREE_FLAG_ON BIT0 #define KFREE_FLAG_THERMAL_K_ON BIT1 +#define MAX_IQK_INFO_BACKUP_CHNL_NUM 5 +#define MAX_IQK_INFO_BACKUP_REG_NUM 10 + struct kfree_data_t { u8 flag; s8 bb_gain[BB_GAIN_NUM][RF_PATH_MAX]; @@ -189,6 +192,7 @@ struct kfree_data_t { bool kfree_data_is_bb_gain_empty(struct kfree_data_t *data); struct hal_spec_t { + char *ic_name; u8 macid_num; u8 sec_cam_ent_num; @@ -197,10 +201,17 @@ struct hal_spec_t { u8 nss_num; u8 band_cap; /* value of BAND_CAP_XXX */ u8 bw_cap; /* value of BW_CAP_XXX */ + u8 proto_cap; /* value of PROTO_CAP_XXX */ u8 wl_func; /* value of WL_FUNC_XXX */ }; +struct hal_iqk_reg_backup { + u8 central_chnl; + u8 bw_mode; + u32 reg_backup[MAX_RF_PATH][MAX_IQK_INFO_BACKUP_REG_NUM]; +}; + typedef struct hal_com_data { HAL_VERSION VersionID; @@ -284,11 +295,11 @@ typedef struct hal_com_data u8 bTXPowerDataReadFromEEPORM; u8 EEPROMMACAddr[ETH_ALEN]; -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM u8 EEPROMRFGainOffset; u8 EEPROMRFGainVal; struct kfree_data_t kfree_data; -#endif /*CONFIG_RF_GAIN_OFFSET*/ +#endif /*CONFIG_RF_POWER_TRIM*/ #if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8703B) u8 adjuseVoltageVal; @@ -430,13 +441,13 @@ typedef struct hal_com_data u16 RegRRSR; /****** antenna diversity ******/ - u8 CurAntenna; u8 AntDivCfg; u8 AntDetection; u8 TRxAntDivType; u8 ant_path; //for 8723B s0/s1 selection u32 AntennaTxPath; /* Antenna path Tx */ u32 AntennaRxPath; /* Antenna path Rx */ + u8 sw_antdiv_bl_state; /******** PHY DM & DM Section **********/ u8 DM_Type; @@ -618,6 +629,7 @@ typedef struct hal_com_data BOOLEAN bCorrectBCN; #endif + struct hal_iqk_reg_backup iqk_reg_backup[MAX_IQK_INFO_BACKUP_CHNL_NUM]; } HAL_DATA_COMMON, *PHAL_DATA_COMMON; @@ -625,6 +637,7 @@ typedef struct hal_com_data typedef struct hal_com_data HAL_DATA_TYPE, *PHAL_DATA_TYPE; #define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)((__pAdapter)->HalData)) #define GET_HAL_SPEC(__pAdapter) (&(GET_HAL_DATA((__pAdapter))->hal_spec)) +#define GET_ODM(__pAdapter) (&(GET_HAL_DATA((__pAdapter))->odmpriv)) #define GET_HAL_RFPATH_NUM(__pAdapter) (((HAL_DATA_TYPE *)((__pAdapter)->HalData))->NumTotalRFPath ) #define RT_GetInterfaceSelection(_Adapter) (GET_HAL_DATA(_Adapter)->InterfaceSel) diff --git a/rtl8188FU/include/hal_intf.h b/rtl8188FU/include/hal_intf.h index 04fc044..c212796 100755 --- a/rtl8188FU/include/hal_intf.h +++ b/rtl8188FU/include/hal_intf.h @@ -42,6 +42,9 @@ enum _CHIP_TYPE { MAX_CHIP_TYPE }; +extern const u32 _chip_type_to_odm_ic_type[]; +#define chip_type_to_odm_ic_type(chip_type) (((chip_type) >= MAX_CHIP_TYPE) ? _chip_type_to_odm_ic_type[MAX_CHIP_TYPE] : _chip_type_to_odm_ic_type[(chip_type)]) + typedef enum _HAL_HW_TIMER_TYPE { HAL_TIMER_NONE = 0, HAL_TIMER_TXBF = 1, @@ -92,13 +95,9 @@ typedef enum _HW_VARIABLES{ HW_VAR_H2C_FW_JOINBSSRPT, HW_VAR_FWLPS_RF_ON, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, - HW_VAR_TDLS_WRCR, - HW_VAR_TDLS_RS_RCR, HW_VAR_TRIGGER_GPIO_0, HW_VAR_BT_SET_COEXIST, HW_VAR_BT_ISSUE_DELBA, - HW_VAR_CURRENT_ANTENNA, - HW_VAR_ANTENNA_DIVERSITY_SELECT, HW_VAR_SWITCH_EPHY_WoWLAN, HW_VAR_EFUSE_USAGE, HW_VAR_EFUSE_BYTES, @@ -155,12 +154,21 @@ typedef enum _HW_VARIABLES{ HW_VAR_DUMP_MAC_QUEUE_INFO, HW_VAR_ASIX_IOT, HW_VAR_EN_HW_UPDATE_TSF, + HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, + HW_VAR_CH_SW_IQK_INFO_BACKUP, + HW_VAR_CH_SW_IQK_INFO_RESTORE, +#ifdef CONFIG_TDLS + HW_VAR_TDLS_WRCR, + HW_VAR_TDLS_RS_RCR, +#ifdef CONFIG_TDLS_CH_SW + HW_VAR_TDLS_BCN_EARLY_C2H_RPT +#endif +#endif }HW_VARIABLES; typedef enum _HAL_DEF_VARIABLE{ HAL_DEF_UNDERCORATEDSMOOTHEDPWDB, HAL_DEF_IS_SUPPORT_ANT_DIV, - HAL_DEF_CURRENT_ANTENNA, HAL_DEF_DRVINFO_SZ, HAL_DEF_MAX_RECVBUF_SZ, HAL_DEF_RX_PACKET_OFFSET, @@ -208,10 +216,12 @@ typedef enum _HAL_ODM_VARIABLE{ HAL_ODM_DBG_FLAG, HAL_ODM_DBG_LEVEL, HAL_ODM_RX_INFO_DUMP, - #ifdef CONFIG_AUTO_CHNL_SEL_NHM HAL_ODM_AUTO_CHNL_SEL, #endif +#ifdef CONFIG_ANTENNA_DIVERSITY + HAL_ODM_ANTDIV_SELECT +#endif }HAL_ODM_VARIABLE; typedef enum _HAL_INTF_PS_FUNC{ @@ -307,15 +317,8 @@ struct hal_ops { void (*SetBeaconRelatedRegistersHandler)(_adapter *padapter); void (*Add_RateATid)(_adapter *padapter, u64 bitmap, u8 *arg, u8 rssi_level); - - -#ifdef CONFIG_ANTENNA_DIVERSITY - u8 (*AntDivBeforeLinkHandler)(_adapter *padapter); - void (*AntDivCompareHandler)(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); -#endif u8 (*interface_ps_func)(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val); - u32 (*read_bbreg)(_adapter *padapter, u32 RegAddr, u32 BitMask); void (*write_bbreg)(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data); u32 (*read_rfreg)(_adapter *padapter, u8 eRFPath, u32 RegAddr, u32 BitMask); @@ -355,9 +358,9 @@ struct hal_ops { s32 (*fill_h2c_cmd)(PADAPTER, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer); void (*fill_fake_txdesc)(PADAPTER, u8 *pDesc, u32 BufferLen, u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame); - + s32 (*fw_dl)(_adapter *adapter, u8 wowlan); + #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) - void (*hal_set_wowlan_fw)(_adapter *adapter, u8 sleep); void (*clear_interrupt)(_adapter *padapter); #endif u8 (*hal_get_tx_buff_rsvd_page_num)(_adapter *adapter, bool wowlan); @@ -626,11 +629,6 @@ void rtw_hal_dm_watchdog_in_lps(_adapter *padapter); void rtw_hal_set_tx_power_level(_adapter *padapter, u8 channel); void rtw_hal_get_tx_power_level(_adapter *padapter, s32 *powerlevel); -#ifdef CONFIG_ANTENNA_DIVERSITY -u8 rtw_hal_antdiv_before_linked(_adapter *padapter); -void rtw_hal_antdiv_rssi_compared(_adapter *padapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); -#endif - #ifdef CONFIG_HOSTAPD_MLME s32 rtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt); #endif @@ -675,10 +673,10 @@ void rtw_hal_update_hisr_hsisr_ind(_adapter *padapter, u32 flag); #endif void rtw_hal_fw_correct_bcn(_adapter *padapter); +s32 rtw_hal_fw_dl(_adapter *padapter, u8 wowlan); #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) void rtw_hal_clear_interrupt(_adapter *padapter); -void rtw_hal_set_wowlan_fw(_adapter *padapter, u8 sleep); #endif u8 rtw_hal_ops_check(_adapter *padapter); diff --git a/rtl8188FU/include/hal_pg.h b/rtl8188FU/include/hal_pg.h index ded4c5d..ee9a799 100755 --- a/rtl8188FU/include/hal_pg.h +++ b/rtl8188FU/include/hal_pg.h @@ -46,6 +46,8 @@ #define EEPROM_VERSION_88E 0xC4
#define EEPROM_CustomID_88E 0xC5
#define EEPROM_RF_ANTENNA_OPT_88E 0xC9
+#define EEPROM_COUNTRY_CODE_88E 0xCB
+#define EEPROM_RFE_OPTION_8188E 0xCA
// RTL88EE
#define EEPROM_MAC_ADDR_88EE 0xD0
@@ -93,6 +95,7 @@ #define EEPROM_TX_PWR_CALIBRATE_RATE_8192E 0xC8
#define EEPROM_RF_ANTENNA_OPT_8192E 0xC9
#define EEPROM_RFE_OPTION_8192E 0xCA
+#define EEPROM_COUNTRY_CODE_8192E 0xCB
// RTL8192EE
#define EEPROM_MAC_ADDR_8192EE 0xD0
@@ -136,6 +139,7 @@ #define EEPROM_TX_PWR_CALIBRATE_RATE_8812 0xC8
#define EEPROM_RF_ANTENNA_OPT_8812 0xC9
#define EEPROM_RFE_OPTION_8812 0xCA
+#define EEPROM_COUNTRY_CODE_8812 0xCB
// RTL8812AE
#define EEPROM_MAC_ADDR_8812AE 0xD0
@@ -199,6 +203,7 @@ #define EEPROM_TX_BBSWING_5G_8814 0xC7
#define EEPROM_TRX_ANTENNA_OPTION_8814 0xC9
#define EEPROM_RFE_OPTION_8814 0xCA
+#define EEPROM_COUNTRY_CODE_8814 0xCB
//====================================================
// EEPROM/Efuse PG Offset for 8821AE/8821AU/8821AS
@@ -304,6 +309,7 @@ #define EEPROM_TX_PWR_CALIBRATE_RATE_8188F 0xC8
#define EEPROM_RF_ANTENNA_OPT_8188F 0xC9
#define EEPROM_RFE_OPTION_8188F 0xCA
+#define EEPROM_COUNTRY_CODE_8188F 0xCB
#define EEPROM_CUSTOMER_ID_8188F 0x7F
#define EEPROM_SUBCUSTOMER_ID_8188F 0x59
@@ -342,6 +348,7 @@ #define EEPROM_TX_PWR_CALIBRATE_RATE_8723B 0xC8
#define EEPROM_RF_ANTENNA_OPT_8723B 0xC9
#define EEPROM_RFE_OPTION_8723B 0xCA
+#define EEPROM_COUNTRY_CODE_8723B 0xCB
// RTL8723BE
#define EEPROM_MAC_ADDR_8723BE 0xD0
@@ -390,6 +397,7 @@ #define EEPROM_TX_PWR_CALIBRATE_RATE_8703B 0xC8
#define EEPROM_RF_ANTENNA_OPT_8703B 0xC9
#define EEPROM_RFE_OPTION_8703B 0xCA
+#define EEPROM_COUNTRY_CODE_8703B 0xCB
/* MAC Hidden */
#define PPG_MAC_HIDDEN_START_8703B 0xF0
@@ -523,6 +531,7 @@ #define EEPROM_DEFAULT_CHANNEL_PLAN 0x7F
#define EEPROM_DEFAULT_BOARD_OPTION 0x00
#define EEPROM_DEFAULT_RFE_OPTION_8192E 0xFF
+#define EEPROM_DEFAULT_RFE_OPTION_8188E 0xFF
#define EEPROM_DEFAULT_RFE_OPTION 0x04
#define EEPROM_DEFAULT_FEATURE_OPTION 0x00
#define EEPROM_DEFAULT_BT_OPTION 0x10
diff --git a/rtl8188FU/include/mlme_osdep.h b/rtl8188FU/include/mlme_osdep.h index 5380cd4..a740a13 100755 --- a/rtl8188FU/include/mlme_osdep.h +++ b/rtl8188FU/include/mlme_osdep.h @@ -26,7 +26,7 @@ extern int time_after(u32 now, u32 old); #endif extern void rtw_init_mlme_timer(_adapter *padapter); -extern void rtw_os_indicate_disconnect( _adapter *adapter ); +extern void rtw_os_indicate_disconnect(_adapter *adapter, u16 reason, u8 locally_generated); extern void rtw_os_indicate_connect( _adapter *adapter ); void rtw_os_indicate_scan_done( _adapter *padapter, bool aborted); extern void rtw_report_sec_ie(_adapter *adapter,u8 authmode,u8 *sec_ie); diff --git a/rtl8188FU/include/osdep_service.h b/rtl8188FU/include/osdep_service.h index c059711..4423eea 100755 --- a/rtl8188FU/include/osdep_service.h +++ b/rtl8188FU/include/osdep_service.h @@ -258,7 +258,7 @@ extern void rtw_mfree2d(void *pbuf, int h, int w, int size); extern void _rtw_memcpy(void *dec, const void *sour, u32 sz); extern void _rtw_memmove(void *dst, const void *src, u32 sz); -extern int _rtw_memcmp(void *dst, void *src, u32 sz); +extern int _rtw_memcmp(void *dst, const void *src, u32 sz); extern void _rtw_memset(void *pbuf, int c, u32 sz); extern void _rtw_init_listhead(_list *list); @@ -615,6 +615,11 @@ struct rtw_cbuf *rtw_cbuf_alloc(u32 size); void rtw_cbuf_free(struct rtw_cbuf *cbuf); // String handler + +BOOLEAN IsHexDigit(char chTmp); +BOOLEAN is_alpha(char chTmp); +char alpha_to_upper(char c); + /* * Write formatted output to sized buffer */ diff --git a/rtl8188FU/include/osdep_service_linux.h b/rtl8188FU/include/osdep_service_linux.h index a4926e6..288edbf 100755 --- a/rtl8188FU/include/osdep_service_linux.h +++ b/rtl8188FU/include/osdep_service_linux.h @@ -373,11 +373,13 @@ static inline void rtw_netif_stop_queue(struct net_device *pnetdev) #endif
}
-static inline void rtw_merge_string(char *dst, int dst_len, const char *src1, const char *src2)
+static inline int rtw_merge_string(char *dst, int dst_len, const char *src1, const char *src2)
{
int len = 0;
len += snprintf(dst+len, dst_len - len, "%s", src1);
len += snprintf(dst+len, dst_len - len, "%s", src2);
+
+ return len;
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
diff --git a/rtl8188FU/include/rtl8188e_cmd.h b/rtl8188FU/include/rtl8188e_cmd.h index 76e426d..9fc2ad6 100755 --- a/rtl8188FU/include/rtl8188e_cmd.h +++ b/rtl8188FU/include/rtl8188e_cmd.h @@ -163,10 +163,6 @@ int reset_tsf(PADAPTER Adapter, u8 reset_port ); //#define H2C_8188E_RSVDPAGE_LOC_LEN 5 //#define H2C_8188E_AOAC_RSVDPAGE_LOC_LEN 7 -#ifdef CONFIG_WOWLAN -void SetFwRelatedForWoWLAN8188ES(_adapter* padapter, u8 bHostIsGoingtoSleep); -#endif//CONFIG_WOWLAN - //---------------------------------------------------------------------------------------------------------// //---------------------------------- H2C CMD CONTENT --------------------------------------------------// //---------------------------------------------------------------------------------------------------------// diff --git a/rtl8188FU/include/rtl8188e_dm.h b/rtl8188FU/include/rtl8188e_dm.h index eb97de1..d6637a5 100755 --- a/rtl8188FU/include/rtl8188e_dm.h +++ b/rtl8188FU/include/rtl8188e_dm.h @@ -29,9 +29,5 @@ void rtl8188e_HalDmWatchDog(IN PADAPTER Adapter); //void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal); -#ifdef CONFIG_ANTENNA_DIVERSITY -void AntDivCompare8188E(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); -u8 AntDivBeforeLink8188E(PADAPTER Adapter ); -#endif #endif diff --git a/rtl8188FU/include/rtl8188e_hal.h b/rtl8188FU/include/rtl8188e_hal.h index 3dfd97e..41a464a 100755 --- a/rtl8188FU/include/rtl8188e_hal.h +++ b/rtl8188FU/include/rtl8188e_hal.h @@ -278,6 +278,9 @@ void Hal_ReadThermalMeter_88E(PADAPTER Adapter,u8* PROMContent,BOOLEAN Autoload void Hal_EfuseParseXtal_8188E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);
void Hal_EfuseParseBoardType88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);
void Hal_ReadPowerSavingMode88E(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);
+void Hal_ReadPAType_8188E(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);
+void Hal_ReadAmplifierType_8188E(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);
+void Hal_ReadRFEType_8188E(PADAPTER Adapter, u8 *PROMContent, BOOLEAN AutoloadFail);
BOOLEAN HalDetectPwrDownMode88E(PADAPTER Adapter);
@@ -286,9 +289,9 @@ void Hal_DetectWoWMode(PADAPTER pAdapter); #endif //CONFIG_WOWLAN
-#ifdef CONFIG_RF_GAIN_OFFSET
+#ifdef CONFIG_RF_POWER_TRIM
void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);
-#endif //CONFIG_RF_GAIN_OFFSET
+#endif /*CONFIG_RF_POWER_TRIM*/
void rtl8188e_init_default_value(_adapter *adapter);
diff --git a/rtl8188FU/include/rtl8188e_spec.h b/rtl8188FU/include/rtl8188e_spec.h index a678dd9..9bd8fd7 100755 --- a/rtl8188FU/include/rtl8188e_spec.h +++ b/rtl8188FU/include/rtl8188e_spec.h @@ -101,11 +101,11 @@ // 0x0600h ~ 0x07FFh WMAC Configuration
//
//-----------------------------------------------------
-#ifdef CONFIG_RF_GAIN_OFFSET
+#ifdef CONFIG_RF_POWER_TRIM
#define EEPROM_RF_GAIN_OFFSET 0xC1
#define EEPROM_RF_GAIN_VAL 0xF6
#define EEPROM_THERMAL_OFFSET 0xF5
-#endif //CONFIG_RF_GAIN_OFFSET
+#endif /*CONFIG_RF_POWER_TRIM*/
//----------------------------------------------------------------------------
// 88E Driver Initialization Offload REG_FDHM0(Offset 0x88, 8 bits)
//----------------------------------------------------------------------------
@@ -152,6 +152,7 @@ #define NSS_NUM_88E 1
#define BAND_CAP_88E (BAND_CAP_2G)
#define BW_CAP_88E (BW_CAP_20M | BW_CAP_40M)
+#define PROTO_CAP_88E (PROTO_CAP_11B|PROTO_CAP_11G|PROTO_CAP_11N)
//----------------------------------------------------------------------------
// 8192C EEPROM/EFUSE share register definition.
diff --git a/rtl8188FU/include/rtl8188f_cmd.h b/rtl8188FU/include/rtl8188f_cmd.h index ff8e526..66d374d 100755 --- a/rtl8188FU/include/rtl8188f_cmd.h +++ b/rtl8188FU/include/rtl8188f_cmd.h @@ -116,6 +116,7 @@ enum h2c_cmd_8188F{ #define SET_8188F_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value) #define SET_8188F_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) #define SET_8188F_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) +#define SET_8188F_H2CCMD_PWRMODE_PARM_BCN_EARLY_C2H_RPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 2, 1, __Value) #define SET_8188F_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) #define SET_8188F_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value) @@ -199,9 +200,11 @@ void rtl8188f_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state); void CheckFwRsvdPageContent(PADAPTER padapter); -#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) -void SetFwRelatedForWoWLAN8188f(_adapter* padapter, u8 bHostIsGoingtoSleep); -#endif//CONFIG_WOWLAN +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW +void rtl8188f_set_BcnEarly_C2H_Rpt_cmd(PADAPTER padapter, u8 enable); +#endif +#endif #ifdef CONFIG_P2P_WOWLAN void rtl8188f_set_p2p_wowlan_offload_cmd(PADAPTER padapter); diff --git a/rtl8188FU/include/rtl8188f_hal.h b/rtl8188FU/include/rtl8188f_hal.h index acb5996..b7726a9 100755 --- a/rtl8188FU/include/rtl8188f_hal.h +++ b/rtl8188FU/include/rtl8188f_hal.h @@ -36,38 +36,6 @@ #include "rtl8188f_sreset.h" #endif - -//--------------------------------------------------------------------- -// RTL8188F From file -//--------------------------------------------------------------------- - #define RTL8188F_FW_IMG "rtl8188f/FW_NIC.bin" - #define RTL8188F_FW_WW_IMG "rtl8188f/FW_WoWLAN.bin" - #define RTL8188F_PHY_REG "rtl8188f/PHY_REG.txt" - #define RTL8188F_PHY_RADIO_A "rtl8188f/RadioA.txt" - #define RTL8188F_PHY_RADIO_B "rtl8188f/RadioB.txt" - #define RTL8188F_TXPWR_TRACK "rtl8188f/TxPowerTrack.txt" - #define RTL8188F_AGC_TAB "rtl8188f/AGC_TAB.txt" - #define RTL8188F_PHY_MACREG "rtl8188f/MAC_REG.txt" - #define RTL8188F_PHY_REG_PG "rtl8188f/PHY_REG_PG.txt" - #define RTL8188F_PHY_REG_MP "rtl8188f/PHY_REG_MP.txt" - #define RTL8188F_TXPWR_LMT "rtl8188f/TXPWR_LMT.txt" - -//--------------------------------------------------------------------- -// RTL8188F From header -//--------------------------------------------------------------------- - -#if MP_DRIVER == 1 - #define Rtl8188F_FwBTImgArray Rtl8188FFwBTImgArray - #define Rtl8188F_FwBTImgArrayLength Rtl8188FFwBTImgArrayLength - - #define Rtl8188F_FwMPImageArray Rtl8188FFwMPImgArray - #define Rtl8188F_FwMPImgArrayLength Rtl8188FMPImgArrayLength - - #define Rtl8188F_PHY_REG_Array_MP Rtl8188F_PHYREG_Array_MP - #define Rtl8188F_PHY_REG_Array_MPLength Rtl8188F_PHYREG_Array_MPLength -#endif - - #define FW_8188F_SIZE 0x8000 #define FW_8188F_START_ADDRESS 0x1000 #define FW_8188F_END_ADDRESS 0x1FFF //0x5FFF @@ -193,14 +161,14 @@ typedef struct _RT_8188F_FIRMWARE_HDR #include "HalVerDef.h" #include "hal_com.h" -#define EFUSE_OOB_PROTECT_BYTES 15 +#define EFUSE_OOB_PROTECT_BYTES (18 + 1) #define HAL_EFUSE_MEMORY #define HWSET_MAX_SIZE_8188F 512 -#define EFUSE_REAL_CONTENT_LEN_8188F 512 +#define EFUSE_REAL_CONTENT_LEN_8188F 256 #define EFUSE_MAP_LEN_8188F 512 -#define EFUSE_MAX_SECTION_8188F 64 +#define EFUSE_MAX_SECTION_8188F (EFUSE_MAP_LEN_8188F / 8) #define EFUSE_IC_ID_OFFSET 506 //For some inferiority IC purpose. added by Roger, 2009.09.02. #define AVAILABLE_EFUSE_ADDR(addr) (addr < EFUSE_REAL_CONTENT_LEN_8188F) @@ -257,7 +225,6 @@ void Hal_EfuseParseAntennaDiversity_8188F(PADAPTER padapter, u8 *hwinfo, BOOLEAN void Hal_EfuseParseXtal_8188F(PADAPTER pAdapter, u8 *hwinfo, u8 AutoLoadFail); void Hal_EfuseParseThermalMeter_8188F(PADAPTER padapter, u8 *hwinfo, u8 AutoLoadFail); void Hal_EfuseParseKFreeData_8188F(PADAPTER pAdapter, u8 *hwinfo, BOOLEAN AutoLoadFail); -VOID Hal_EfuseParseMacHidden_8188F(PADAPTER pAdapter, u8 *hwinfo, BOOLEAN AutoLoadFail); #if 0 /* Do not need for rtl8188f */ VOID Hal_EfuseParseVoltage_8188F(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail); diff --git a/rtl8188FU/include/rtl8188f_spec.h b/rtl8188FU/include/rtl8188f_spec.h index 52a02b1..4324a53 100755 --- a/rtl8188FU/include/rtl8188f_spec.h +++ b/rtl8188FU/include/rtl8188f_spec.h @@ -297,6 +297,7 @@ #define NSS_NUM_8188F 1 #define BAND_CAP_8188F (BAND_CAP_2G) #define BW_CAP_8188F (BW_CAP_20M | BW_CAP_40M) +#define PROTO_CAP_8188F (PROTO_CAP_11B|PROTO_CAP_11G|PROTO_CAP_11N) #endif /* __RTL8188F_SPEC_H__ */ diff --git a/rtl8188FU/include/rtl8192e_cmd.h b/rtl8188FU/include/rtl8192e_cmd.h index 28bebe3..6704b40 100755 --- a/rtl8188FU/include/rtl8192e_cmd.h +++ b/rtl8188FU/include/rtl8192e_cmd.h @@ -105,6 +105,7 @@ typedef struct _RSVDPAGE_LOC_92E { #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_BCN_EARLY_C2H_RPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 2, 1, __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) @@ -137,14 +138,16 @@ void rtl8192e_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state); void CheckFwRsvdPageContent(PADAPTER padapter); +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW +void rtl8192e_set_BcnEarly_C2H_Rpt_cmd(PADAPTER padapter, u8 enable); +#endif +#endif + #ifdef CONFIG_TSF_RESET_OFFLOAD int reset_tsf(PADAPTER Adapter, u8 reset_port ); #endif // CONFIG_TSF_RESET_OFFLOAD - -#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) -void SetFwRelatedForWoWLAN8192E(_adapter* padapter, u8 bHostIsGoingtoSleep); -#endif /// TX Feedback Content #define USEC_UNIT_FOR_8192E_C2H_TX_RPT_QUEUE_TIME 256 @@ -172,4 +175,4 @@ C2HPacketHandler_8192E( IN u1Byte Length ); -#endif//__RTL8192E_CMD_H__
\ No newline at end of file +#endif//__RTL8192E_CMD_H__ diff --git a/rtl8188FU/include/rtl8192e_dm.h b/rtl8188FU/include/rtl8192e_dm.h index bb4f7a5..677de0c 100755 --- a/rtl8188FU/include/rtl8192e_dm.h +++ b/rtl8188FU/include/rtl8192e_dm.h @@ -30,9 +30,5 @@ void rtl8192e_HalDmWatchDog(IN PADAPTER Adapter); //void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal); -#ifdef CONFIG_ANTENNA_DIVERSITY -void AntDivCompare8192e(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); -u8 AntDivBeforeLink8192e(PADAPTER Adapter ); -#endif #endif diff --git a/rtl8188FU/include/rtl8192e_spec.h b/rtl8188FU/include/rtl8192e_spec.h index 6ecfbeb..d6b63ba 100755 --- a/rtl8188FU/include/rtl8192e_spec.h +++ b/rtl8188FU/include/rtl8192e_spec.h @@ -322,6 +322,7 @@ #define NSS_NUM_8192E 2
#define BAND_CAP_8192E (BAND_CAP_2G)
#define BW_CAP_8192E (BW_CAP_20M | BW_CAP_40M)
+#define PROTO_CAP_8192E (PROTO_CAP_11B|PROTO_CAP_11G|PROTO_CAP_11N)
#endif //__RTL8192E_SPEC_H__
diff --git a/rtl8188FU/include/rtl8703b_cmd.h b/rtl8188FU/include/rtl8703b_cmd.h index 972bed5..663f315 100755 --- a/rtl8188FU/include/rtl8703b_cmd.h +++ b/rtl8188FU/include/rtl8703b_cmd.h @@ -116,6 +116,7 @@ enum h2c_cmd_8703B{ #define SET_8703B_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value) #define SET_8703B_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) #define SET_8703B_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) +#define SET_8703B_H2CCMD_PWRMODE_PARM_BCN_EARLY_C2H_RPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 2, 1, __Value) #define SET_8703B_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) #define SET_8703B_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value) @@ -198,9 +199,11 @@ void rtl8703b_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state); void CheckFwRsvdPageContent(PADAPTER padapter); -#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) -void SetFwRelatedForWoWLAN8703b(_adapter* padapter, u8 bHostIsGoingtoSleep); -#endif//CONFIG_WOWLAN +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW +void rtl8703b_set_BcnEarly_C2H_Rpt_cmd(PADAPTER padapter, u8 enable); +#endif +#endif #ifdef CONFIG_P2P_WOWLAN void rtl8703b_set_p2p_wowlan_offload_cmd(PADAPTER padapter); diff --git a/rtl8188FU/include/rtl8703b_spec.h b/rtl8188FU/include/rtl8703b_spec.h index d83e1e3..29d48a0 100755 --- a/rtl8188FU/include/rtl8703b_spec.h +++ b/rtl8188FU/include/rtl8703b_spec.h @@ -395,14 +395,14 @@ //----------------------------------------------------------------------------
#define BIT_BCN_PORT_SEL BIT5
-#ifdef CONFIG_RF_GAIN_OFFSET
+#ifdef CONFIG_RF_POWER_TRIM
#ifdef CONFIG_RTL8703B
#define EEPROM_RF_GAIN_OFFSET 0xC1
#endif
#define EEPROM_RF_GAIN_VAL 0x1F6
-#endif //CONFIG_RF_GAIN_OFFSET
+#endif /*CONFIG_RF_POWER_TRIM*/
//----------------------------------------------------------------------------
@@ -474,6 +474,7 @@ #define NSS_NUM_8703B 1
#define BAND_CAP_8703B (BAND_CAP_2G)
#define BW_CAP_8703B (BW_CAP_20M | BW_CAP_40M)
+#define PROTO_CAP_8703B (PROTO_CAP_11B|PROTO_CAP_11G|PROTO_CAP_11N)
#endif /* __RTL8703B_SPEC_H__ */
diff --git a/rtl8188FU/include/rtl8723b_cmd.h b/rtl8188FU/include/rtl8723b_cmd.h index aa8c645..5663cb1 100755 --- a/rtl8188FU/include/rtl8723b_cmd.h +++ b/rtl8188FU/include/rtl8723b_cmd.h @@ -116,6 +116,7 @@ enum h2c_cmd_8723B{ #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_BCN_EARLY_C2H_RPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 2, 1, __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) @@ -198,9 +199,11 @@ void rtl8723b_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state); void CheckFwRsvdPageContent(PADAPTER padapter); -#if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) -void SetFwRelatedForWoWLAN8723b(_adapter* padapter, u8 bHostIsGoingtoSleep); -#endif//CONFIG_WOWLAN +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW +void rtl8723b_set_BcnEarly_C2H_Rpt_cmd(PADAPTER padapter, u8 enable); +#endif +#endif #ifdef CONFIG_P2P_WOWLAN void rtl8723b_set_p2p_wowlan_offload_cmd(PADAPTER padapter); diff --git a/rtl8188FU/include/rtl8723b_hal.h b/rtl8188FU/include/rtl8723b_hal.h index 8424308..5e8f9be 100755 --- a/rtl8188FU/include/rtl8723b_hal.h +++ b/rtl8188FU/include/rtl8723b_hal.h @@ -313,9 +313,9 @@ s32 c2h_handler_8723b(PADAPTER padapter, u8 *pC2hEvent); u8 MRateToHwRate8723B(u8 rate);
u8 HwRateToMRate8723B(u8 rate);
-#ifdef CONFIG_RF_GAIN_OFFSET
+#ifdef CONFIG_RF_POWER_TRIM
void Hal_ReadRFGainOffset(PADAPTER pAdapter,u8* hwinfo,BOOLEAN AutoLoadFail);
-#endif //CONFIG_RF_GAIN_OFFSET
+#endif /*CONFIG_RF_POWER_TRIM*/
#ifdef CONFIG_PCI_HCI
BOOLEAN InterruptRecognized8723BE(PADAPTER Adapter);
diff --git a/rtl8188FU/include/rtl8723b_spec.h b/rtl8188FU/include/rtl8723b_spec.h index 63f3059..817d980 100755 --- a/rtl8188FU/include/rtl8723b_spec.h +++ b/rtl8188FU/include/rtl8723b_spec.h @@ -211,14 +211,14 @@ // 0x0600h ~ 0x07FFh WMAC Configuration
//
//-----------------------------------------------------
-#ifdef CONFIG_RF_GAIN_OFFSET
+#ifdef CONFIG_RF_POWER_TRIM
#ifdef CONFIG_RTL8723B
#define EEPROM_RF_GAIN_OFFSET 0xC1
#endif
#define EEPROM_RF_GAIN_VAL 0x1F6
-#endif //CONFIG_RF_GAIN_OFFSET
+#endif /*CONFIG_RF_POWER_TRIM*/
//----------------------------------------------------------------------------
@@ -290,6 +290,7 @@ #define NSS_NUM_8723B 1
#define BAND_CAP_8723B (BAND_CAP_2G)
#define BW_CAP_8723B (BW_CAP_20M | BW_CAP_40M)
+#define PROTO_CAP_8723B (PROTO_CAP_11B|PROTO_CAP_11G|PROTO_CAP_11N)
#endif /* __RTL8723B_SPEC_H__ */
diff --git a/rtl8188FU/include/rtl8812a_cmd.h b/rtl8188FU/include/rtl8812a_cmd.h index e34683b..4fe423d 100755 --- a/rtl8188FU/include/rtl8812a_cmd.h +++ b/rtl8188FU/include/rtl8812a_cmd.h @@ -87,6 +87,7 @@ struct H2C_SS_RFOFF_PARAM{ #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((__pH2CCmd)+2, 0, 8, __Value) #define SET_8812_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) +#define SET_8812_H2CCMD_PWRMODE_PARM_BCN_EARLY_C2H_RPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 2, 1, __Value) #define SET_8812_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) #define SET_8812_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value) @@ -124,14 +125,16 @@ void rtl8812_set_p2p_ps_offload_cmd(PADAPTER padapter, u8 p2p_ps_state); void CheckFwRsvdPageContent(PADAPTER padapter); +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW +void rtl8812_set_BcnEarly_C2H_Rpt_cmd(PADAPTER padapter, u8 enable); +#endif +#endif + #ifdef CONFIG_TSF_RESET_OFFLOAD int reset_tsf(PADAPTER Adapter, u8 reset_port ); #endif // CONFIG_TSF_RESET_OFFLOAD -#ifdef CONFIG_WOWLAN -void SetFwRelatedForWoWLAN8812(_adapter* padapter, u8 bHostIsGoingtoSleep); -#endif//CONFIG_WOWLAN - //------------------------------------ // C2H format //------------------------------------ diff --git a/rtl8188FU/include/rtl8812a_dm.h b/rtl8188FU/include/rtl8812a_dm.h index 3196973..f697e5c 100755 --- a/rtl8188FU/include/rtl8812a_dm.h +++ b/rtl8188FU/include/rtl8812a_dm.h @@ -29,9 +29,5 @@ void rtl8812_HalDmWatchDog(IN PADAPTER Adapter); //void rtl8192c_dm_RF_Saving(IN PADAPTER pAdapter, IN u8 bForceInNormal); -#ifdef CONFIG_ANTENNA_DIVERSITY -void AntDivCompare8812(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); -u8 AntDivBeforeLink8812(PADAPTER Adapter ); -#endif #endif diff --git a/rtl8188FU/include/rtl8812a_spec.h b/rtl8188FU/include/rtl8812a_spec.h index eab6d1c..d0a6233 100755 --- a/rtl8188FU/include/rtl8812a_spec.h +++ b/rtl8188FU/include/rtl8812a_spec.h @@ -266,6 +266,7 @@ #define NSS_NUM_8812A 2
#define BAND_CAP_8812A (BAND_CAP_2G | BAND_CAP_5G)
#define BW_CAP_8812A (BW_CAP_20M | BW_CAP_40M | BW_CAP_80M)
+#define PROTO_CAP_8812A (PROTO_CAP_11B|PROTO_CAP_11G|PROTO_CAP_11N|PROTO_CAP_11AC)
#endif /* __RTL8812A_SPEC_H__ */
diff --git a/rtl8188FU/include/rtl8814a_cmd.h b/rtl8188FU/include/rtl8814a_cmd.h index 6f9cdc2..d86c97b 100755 --- a/rtl8188FU/include/rtl8814a_cmd.h +++ b/rtl8188FU/include/rtl8814a_cmd.h @@ -34,6 +34,7 @@ #define SET_8814A_H2CCMD_PWRMODE_PARM_SMART_PS(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+1, 4, 4, __Value) #define SET_8814A_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+2, 0, 8, __Value) #define SET_8814A_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 0, 8, __Value) +#define SET_8814A_H2CCMD_PWRMODE_PARM_BCN_EARLY_C2H_RPT(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+3, 2, 1, __Value) #define SET_8814A_H2CCMD_PWRMODE_PARM_PWR_STATE(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+4, 0, 8, __Value) #define SET_8814A_H2CCMD_PWRMODE_PARM_BYTE5(__pH2CCmd, __Value) SET_BITS_TO_LE_1BYTE((__pH2CCmd)+5, 0, 8, __Value) @@ -124,6 +125,12 @@ void rtl8814_set_FwPwrMode_cmd(PADAPTER padapter, u8 PSMode); u8 GetTxBufferRsvdPageNum8814(_adapter *padapter, bool wowlan); u8 rtl8814_set_rssi_cmd(_adapter*padapter, u8 *param); +#ifdef CONFIG_TDLS +#ifdef CONFIG_TDLS_CH_SW +void rtl8814_set_BcnEarly_C2H_Rpt_cmd(PADAPTER padapter, u8 enable); +#endif +#endif + void Set_RA_LDPC_8814( struct sta_info *psta, diff --git a/rtl8188FU/include/rtl8814a_dm.h b/rtl8188FU/include/rtl8814a_dm.h index 4883770..f51d93d 100755 --- a/rtl8188FU/include/rtl8814a_dm.h +++ b/rtl8188FU/include/rtl8814a_dm.h @@ -25,10 +25,5 @@ void rtl8814_deinit_dm_priv(IN PADAPTER Adapter); void rtl8814_InitHalDm(IN PADAPTER Adapter); void rtl8814_HalDmWatchDog(IN PADAPTER Adapter); -#ifdef CONFIG_ANTENNA_DIVERSITY -void AntDivCompare8814(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src); -u8 AntDivBeforeLink8814(PADAPTER Adapter ); -#endif //CONFIG_ANTENNA_DIVERSITY - #endif diff --git a/rtl8188FU/include/rtl8814a_spec.h b/rtl8188FU/include/rtl8814a_spec.h index 132ef03..919f78a 100755 --- a/rtl8188FU/include/rtl8814a_spec.h +++ b/rtl8188FU/include/rtl8814a_spec.h @@ -637,5 +637,6 @@ So the following defines for 92C is not entire!!!!!! #define NSS_NUM_8814A 3
#define BAND_CAP_8814A (BAND_CAP_2G | BAND_CAP_5G)
#define BW_CAP_8814A (BW_CAP_20M | BW_CAP_40M | BW_CAP_80M)
+#define PROTO_CAP_8814A (PROTO_CAP_11B|PROTO_CAP_11G|PROTO_CAP_11N|PROTO_CAP_11AC)
#endif //__RTL8814A_SPEC_H__
diff --git a/rtl8188FU/include/rtl8821a_spec.h b/rtl8188FU/include/rtl8821a_spec.h index 10a616b..ce0bac4 100755 --- a/rtl8188FU/include/rtl8821a_spec.h +++ b/rtl8188FU/include/rtl8821a_spec.h @@ -102,6 +102,7 @@ #define NSS_NUM_8821A 1
#define BAND_CAP_8821A (BAND_CAP_2G | BAND_CAP_5G)
#define BW_CAP_8821A (BW_CAP_20M | BW_CAP_40M | BW_CAP_80M)
+#define PROTO_CAP_8821A (PROTO_CAP_11B|PROTO_CAP_11G|PROTO_CAP_11N|PROTO_CAP_11AC)
#endif /* __RTL8821A_SPEC_H__ */
diff --git a/rtl8188FU/include/rtw_cmd.h b/rtl8188FU/include/rtw_cmd.h index 550adb1..3a20368 100755 --- a/rtl8188FU/include/rtw_cmd.h +++ b/rtl8188FU/include/rtw_cmd.h @@ -238,6 +238,7 @@ enum rtw_drvextra_cmd_id DFS_MASTER_WK_CID, SESSION_TRACKER_WK_CID, EN_HW_UPDATE_TSF_WK_CID, + MP_CMD_WK_CID, MAX_WK_CID }; @@ -898,6 +899,14 @@ struct addBaReq_parm u8 addr[ETH_ALEN]; }; +struct addBaRsp_parm { + unsigned int tid; + unsigned int start_seq; + u8 addr[ETH_ALEN]; + u8 status; + u8 size; +}; + /*H2C Handler index: 46 */ struct set_ch_parm { u8 ch; @@ -966,6 +975,7 @@ struct SwitchBandwidth_parm /*H2C Handler index: 59 */ struct SetChannelPlan_param { + const struct country_chplan *country_ent; u8 channel_plan; }; @@ -1057,6 +1067,7 @@ extern u8 rtw_setfwdig_cmd(_adapter*padapter, u8 type); extern u8 rtw_setfwra_cmd(_adapter*padapter, u8 type); extern u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr); +extern u8 rtw_addbarsp_cmd(_adapter *padapter, u8 *addr, u16 tid, u8 status, u8 size, u16 start_seq); // add for CONFIG_IEEE80211W, none 11w also can use extern u8 rtw_reset_securitypriv_cmd(_adapter*padapter); extern u8 rtw_free_assoc_resources_cmd(_adapter *padapter); @@ -1103,10 +1114,15 @@ u8 rtw_btinfo_cmd(PADAPTER padapter, u8 *pbuf, u16 length); u8 rtw_enable_hw_update_tsf_cmd(_adapter *padapter); u8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue); + u8 rtw_set_chplan_cmd(_adapter *adapter, int flags, u8 chplan, u8 swconfig); +u8 rtw_set_country_cmd(_adapter *adapter, int flags, const char *country_code, u8 swconfig); + extern u8 rtw_led_blink_cmd(_adapter*padapter, PVOID pLed); extern u8 rtw_set_csa_cmd(_adapter*padapter, u8 new_ch_no); -extern u8 rtw_tdls_cmd(_adapter*padapter, u8 *addr, u8 option); +extern u8 rtw_tdls_cmd(_adapter *padapter, const u8 *addr, u8 option); + +u8 rtw_mp_cmd(_adapter *adapter, u8 mp_cmd_id, u8 flags); //#ifdef CONFIG_C2H_PACKET_EN extern u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length); @@ -1216,6 +1232,7 @@ enum rtw_h2c_cmd GEN_CMD_CODE(_ChkBMCSleepq), /*63*/ GEN_CMD_CODE(_RunInThreadCMD), /*64*/ + GEN_CMD_CODE(_AddBARsp) , /*65*/ MAX_H2CCMD }; @@ -1303,6 +1320,7 @@ struct _cmd_callback rtw_cmd_callback[] = {GEN_CMD_CODE(_ChkBMCSleepq), NULL}, /*63*/ {GEN_CMD_CODE(_RunInThreadCMD), NULL},/*64*/ + {GEN_CMD_CODE(_AddBARsp), NULL}, /*65*/ }; #endif diff --git a/rtl8188FU/include/rtw_debug.h b/rtl8188FU/include/rtw_debug.h index 5b6779f..2146dd4 100755 --- a/rtl8188FU/include/rtw_debug.h +++ b/rtl8188FU/include/rtw_debug.h @@ -229,7 +229,7 @@ extern void rtl871x_cedbg(const char *fmt, ...); if (sel == RTW_DBGDUMP)\ _DBG_871X_LEVEL(_drv_always_, fmt, ##arg); \ else {\ - if(_seqdump(sel, fmt, ##arg)) /*rtw_warn_on(1)*/; \ + _seqdump(sel, fmt, ##arg); \ } \ }while(0) @@ -239,7 +239,7 @@ extern void rtl871x_cedbg(const char *fmt, ...); if (sel == RTW_DBGDUMP)\ DBG_871X_LEVEL(_drv_always_, fmt, ##arg); \ else {\ - if(_seqdump(sel, fmt, ##arg)) /*rtw_warn_on(1)*/; \ + _seqdump(sel, fmt, ##arg) /*rtw_warn_on(1)*/; \ } \ }while(0) @@ -421,6 +421,8 @@ int proc_get_best_channel(struct seq_file *m, void *v); ssize_t proc_set_best_channel(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); #endif /* CONFIG_FIND_BEST_CHANNEL */ +int proc_get_trx_info_debug(struct seq_file *m, void *v); + int proc_get_rx_signal(struct seq_file *m, void *v); ssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data); int proc_get_hw_status(struct seq_file *m, void *v); diff --git a/rtl8188FU/include/rtw_efuse.h b/rtl8188FU/include/rtw_efuse.h index 43513f2..945ccf7 100755 --- a/rtl8188FU/include/rtw_efuse.h +++ b/rtl8188FU/include/rtw_efuse.h @@ -168,6 +168,8 @@ extern u8 fakeBTEfuseContent[EFUSE_MAX_BT_BANK][EFUSE_MAX_HW_SIZE]; extern u8 fakeBTEfuseInitMap[]; extern u8 fakeBTEfuseModifiedMap[]; /*------------------------Export global variable----------------------------*/ +u8 efuse_bt_GetCurrentSize(PADAPTER padapter, u16 *size); +u16 efuse_bt_GetMaxSize(PADAPTER padapter); u8 efuse_GetCurrentSize(PADAPTER padapter, u16 *size); u16 efuse_GetMaxSize(PADAPTER padapter); @@ -201,6 +203,10 @@ u8 rtw_efuse_file_read(PADAPTER padapter,u8 *filepatch,u8 *buf, u32 len); extern const u8 _mac_hidden_max_bw_to_hal_bw_cap[]; #define mac_hidden_max_bw_to_hal_bw_cap(max_bw) (((max_bw) >= MAC_HIDDEN_MAX_BW_NUM) ? 0 : _mac_hidden_max_bw_to_hal_bw_cap[(max_bw)]) +#define MAC_HIDDEN_PROTOCOL_NUM 4 +extern const u8 _mac_hidden_proto_to_hal_proto_cap[]; +#define mac_hidden_proto_to_hal_proto_cap(proto) (((proto) >= MAC_HIDDEN_PROTOCOL_NUM) ? 0 : _mac_hidden_proto_to_hal_proto_cap[(proto)]) + u8 mac_hidden_wl_func_to_hal_wl_func(u8 func); #ifdef PLATFORM_LINUX diff --git a/rtl8188FU/include/rtw_event.h b/rtl8188FU/include/rtw_event.h index 2fb9503..06b8612 100755 --- a/rtl8188FU/include/rtw_event.h +++ b/rtl8188FU/include/rtw_event.h @@ -66,14 +66,12 @@ It is used in AP/Ad-HoC(M) mode. */ struct stassoc_event { unsigned char macaddr[6]; - unsigned char rsvd[2]; - int cam_id; - }; struct stadel_event { unsigned char macaddr[6]; unsigned char rsvd[2]; //for reason + unsigned char locally_generated; int mac_id; }; diff --git a/rtl8188FU/include/rtw_mlme.h b/rtl8188FU/include/rtw_mlme.h index 94211e9..5b1666a 100755 --- a/rtl8188FU/include/rtw_mlme.h +++ b/rtl8188FU/include/rtw_mlme.h @@ -448,6 +448,7 @@ struct tdls_ch_switch{ u32 cur_time; u8 delay_switch_back; u8 dump_stack; + struct submit_ctx chsw_sctx; }; #endif @@ -524,7 +525,9 @@ struct mlme_priv { u8 *nic_hdl; + #ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42 u8 not_indic_disco; + #endif _list *pscanned; _queue free_bss_pool; _queue scanned_queue; @@ -604,6 +607,7 @@ struct mlme_priv { _timer dynamic_chk_timer; //dynamic/periodic check timer u8 acm_mask; // for wmm acm mask + const struct country_chplan *country_ent; u8 ChannelPlan; RT_SCAN_TYPE scan_mode; // active: 1, passive: 0 @@ -781,6 +785,7 @@ extern void rtw_surveydone_event_callback(_adapter *adapter, u8 *pbuf); extern void rtw_joinbss_event_callback(_adapter *adapter, u8 *pbuf); extern void rtw_stassoc_event_callback(_adapter *adapter, u8 *pbuf); extern void rtw_stadel_event_callback(_adapter *adapter, u8 *pbuf); +void rtw_sta_mstatus_report(_adapter *adapter); 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); @@ -902,7 +907,7 @@ struct wlan_network *_rtw_find_same_network(_queue *scanned_queue, struct wlan_n struct wlan_network *rtw_find_same_network(_queue *scanned_queue, struct wlan_network *network); extern void rtw_free_assoc_resources(_adapter* adapter, int lock_scanned_queue); -extern void rtw_indicate_disconnect(_adapter* adapter); +extern void rtw_indicate_disconnect(_adapter *adapter, u16 reason, u8 locally_generated); extern void rtw_indicate_connect(_adapter* adapter); void rtw_indicate_scan_done( _adapter *padapter, bool aborted); diff --git a/rtl8188FU/include/rtw_mlme_ext.h b/rtl8188FU/include/rtw_mlme_ext.h index 5ea6780..9fdb560 100755 --- a/rtl8188FU/include/rtw_mlme_ext.h +++ b/rtl8188FU/include/rtw_mlme_ext.h @@ -129,6 +129,7 @@ typedef enum _RT_CHANNEL_DOMAIN RTW_CHPLAN_MKK1_MKK1 = 0x27, RTW_CHPLAN_WORLD_KCC1 = 0x28, RTW_CHPLAN_WORLD_FCC2 = 0x29, + RTW_CHPLAN_FCC2_NULL = 0x2A, RTW_CHPLAN_WORLD_FCC3 = 0x30, RTW_CHPLAN_WORLD_FCC4 = 0x31, RTW_CHPLAN_WORLD_FCC5 = 0x32, @@ -159,6 +160,7 @@ typedef enum _RT_CHANNEL_DOMAIN RTW_CHPLAN_FCC1_FCC10 = 0x57, RTW_CHPLAN_MKK2_MKK4 = 0x58, RTW_CHPLAN_WORLD_ETSI14 = 0x59, + RTW_CHPLAN_FCC1_FCC5 = 0x60, RTW_CHPLAN_MAX, RTW_CHPLAN_REALTEK_DEFINE = 0x7F, @@ -174,6 +176,7 @@ typedef enum _RT_CHANNEL_DOMAIN_2G RTW_RD_2G_ETSI2 = 5, /* France */ RTW_RD_2G_GLOBAL = 6, /* Global domain */ RTW_RD_2G_MKK2 = 7, /* Japan */ + RTW_RD_2G_FCC2 = 8, /* US */ RTW_RD_2G_MAX, }RT_CHANNEL_DOMAIN_2G, *PRT_CHANNEL_DOMAIN_2G; @@ -223,9 +226,9 @@ typedef enum _RT_CHANNEL_DOMAIN_5G RTW_RD_5G_MAX, }RT_CHANNEL_DOMAIN_5G, *PRT_CHANNEL_DOMAIN_5G; -#define rtw_is_channel_plan_valid(chplan) ((chplan) < RTW_CHPLAN_MAX || (chplan) == RTW_CHPLAN_REALTEK_DEFINE) -#define rtw_is_legacy_channel_plan(chplan) ((chplan) < 0x20) bool rtw_chplan_is_empty(u8 id); +#define rtw_is_channel_plan_valid(chplan) (((chplan) < RTW_CHPLAN_MAX || (chplan) == RTW_CHPLAN_REALTEK_DEFINE) && !rtw_chplan_is_empty(chplan)) +#define rtw_is_legacy_channel_plan(chplan) ((chplan) < 0x20) typedef struct _RT_CHANNEL_PLAN { @@ -344,6 +347,8 @@ struct ss_res { u16 scan_ch_ms; u8 rx_ampdu_accept; u8 rx_ampdu_size; + u8 igi_scan; + u8 igi_before_scan; /* used for restoring IGI value without enable DIG & FA_CNT */ #ifdef CONFIG_SCAN_BACKOP u8 backop_flags_sta; /* policy for station mode*/ u8 backop_flags_ap; /* policy for ap mode */ @@ -384,27 +389,24 @@ struct ss_res { #ifdef CONFIG_TDLS enum TDLS_option { - TDLS_ESTABLISHED = 1, - TDLS_ISSUE_PTI = 2, - TDLS_CH_SW_RESP = 3, - TDLS_CH_SW = 4, - TDLS_CH_SW_BACK = 5, - TDLS_RS_RCR = 6, - TDLS_TEAR_STA = 7, + TDLS_ESTABLISHED = 1, + TDLS_ISSUE_PTI, + TDLS_CH_SW_RESP, + TDLS_CH_SW_PREPARE, + TDLS_CH_SW_START, + TDLS_CH_SW_TO_OFF_CHNL, + TDLS_CH_SW_TO_BASE_CHNL_UNSOLICITED, + TDLS_CH_SW_TO_BASE_CHNL, + TDLS_CH_SW_END_TO_BASE_CHNL, + TDLS_CH_SW_END, + TDLS_RS_RCR, + TDLS_TEARDOWN_STA, + TDLS_TEARDOWN_STA_LOCALLY, maxTDLS, }; #endif //CONFIG_TDLS -struct FW_Sta_Info -{ - struct sta_info *psta; - u32 status; - u32 rx_pkt; - u32 retry; - NDIS_802_11_RATES_EX SupportedRates; -}; - /* * Usage: * When one iface acted as AP mode and the other iface is STA mode and scanning, @@ -475,7 +477,6 @@ struct mlme_ext_info struct HT_caps_element HT_caps; struct HT_info_element HT_info; WLAN_BSSID_EX network;//join network or bss_network, if in ap mode, it is the same to cur_network.network - struct FW_Sta_Info FW_sta_info[NUM_STA]; }; // The channel information about this channel including joining, scanning, and power constraints. @@ -525,6 +526,8 @@ enum { RTW_CHF_NON_LONG_CAC = BIT5, }; bool rtw_choose_available_chbw(_adapter *adapter, u8 req_bw, u8 *dec_ch, u8 *dec_bw, u8 *dec_offset, u8 d_flags); +void dump_country_chplan(void *sel, const struct country_chplan *ent); +void dump_country_chplan_map(void *sel); void dump_chplan_id_list(void *sel); void dump_chplan_test(void *sel); void dump_chset(void *sel, RT_CHANNEL_INFO *ch_set); @@ -748,8 +751,6 @@ void clear_cam_cache(_adapter *adapter, u8 id); void invalidate_cam_all(_adapter *padapter); void CAM_empty_entry(PADAPTER Adapter, u8 ucIndex); - -int allocate_fw_sta_entry(_adapter *padapter); void flush_all_cam_entry(_adapter *padapter); BOOLEAN IsLegal5GChannel(PADAPTER Adapter, u8 channel); @@ -795,7 +796,7 @@ void update_capinfo(PADAPTER Adapter, u16 updateCap); void update_wireless_mode(_adapter * padapter); void update_tx_basic_rate(_adapter *padapter, u8 modulation); void update_sta_basic_rate(struct sta_info *psta, u8 wireless_mode); -int update_sta_support_rate(_adapter *padapter, u8* pvar_ie, uint var_ie_len, int cam_idx); +int rtw_ies_get_supported_rate(u8 *ies, uint ies_len, u8 *rate_set, u8 *rate_num); //for sta/adhoc mode void update_sta_info(_adapter *padapter, struct sta_info *psta); @@ -805,7 +806,7 @@ unsigned int update_MCS_rate(struct HT_caps_element *pHT_caps); void Update_RA_Entry(_adapter *padapter, struct sta_info *psta); void set_sta_rate(_adapter *padapter, struct sta_info *psta); -unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason); +unsigned int receive_disconnect(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, u8 locally_generated); unsigned char get_highest_rate_idx(u32 mask); int support_short_GI(_adapter *padapter, struct HT_caps_element *pHT_caps, u8 bwmode); @@ -846,11 +847,11 @@ void rtw_macid_ctl_set_h2c_msr(struct macid_ctl_t *macid_ctl, u8 id, u8 h2c_msr) void rtw_macid_ctl_init(struct macid_ctl_t *macid_ctl); void rtw_macid_ctl_deinit(struct macid_ctl_t *macid_ctl); -void report_join_res(_adapter *padapter, int res); +u32 report_join_res(_adapter *padapter, int res); void report_survey_event(_adapter *padapter, union recv_frame *precv_frame); void report_surveydone_event(_adapter *padapter); -void report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, bool enqueue); -void report_add_sta_event(_adapter *padapter, unsigned char* MacAddr, int cam_idx); +u32 report_del_sta_event(_adapter *padapter, unsigned char *MacAddr, unsigned short reason, bool enqueue, u8 locally_generated); +void report_add_sta_event(_adapter *padapter, unsigned char *MacAddr); bool rtw_port_switch_chk(_adapter *adapter); void report_wmm_edca_update(_adapter *padapter); @@ -865,6 +866,7 @@ void update_mgntframe_attrib_addr(_adapter *padapter, struct xmit_frame *pmgntfr void dump_mgntframe(_adapter *padapter, struct xmit_frame *pmgntframe); s32 dump_mgntframe_and_wait(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms); s32 dump_mgntframe_and_wait_ack(_adapter *padapter, struct xmit_frame *pmgntframe); +s32 dump_mgntframe_and_wait_ack_timeout(_adapter *padapter, struct xmit_frame *pmgntframe, int timeout_ms); #ifdef CONFIG_P2P void issue_probersp_p2p(_adapter *padapter, unsigned char *da); @@ -890,6 +892,7 @@ int issue_deauth_ex(_adapter *padapter, u8 *da, unsigned short reason, int try_c void issue_action_spct_ch_switch(_adapter *padapter, u8 *ra, u8 new_ch, u8 ch_offset); void issue_addba_req(_adapter *adapter, unsigned char *ra, u8 tid); void issue_addba_rsp(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size); +u8 issue_addba_rsp_wait_ack(_adapter *adapter, unsigned char *ra, u8 tid, u16 status, u8 size, int try_cnt, int wait_ms); void issue_del_ba(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator); int issue_del_ba_ex(_adapter *adapter, unsigned char *ra, u8 tid, u16 reason, u8 initiator, int try_cnt, int wait_ms); @@ -1037,6 +1040,7 @@ u8 set_stakey_hdl(_adapter *padapter, u8 *pbuf); u8 set_assocsta_hdl(_adapter *padapter, u8 *pbuf); u8 del_assocsta_hdl(_adapter *padapter, u8 *pbuf); u8 add_ba_hdl(_adapter *padapter, unsigned char *pbuf); +u8 add_ba_rsp_hdl(_adapter *padapter, unsigned char *pbuf); u8 mlme_evt_hdl(_adapter *padapter, unsigned char *pbuf); u8 h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf); @@ -1125,6 +1129,7 @@ struct cmd_hdl wlancmds[] = GEN_MLME_EXT_HANDLER(sizeof(struct TDLSoption_param), tdls_hdl) /*62*/ GEN_MLME_EXT_HANDLER(0, chk_bmc_sleepq_hdl) /*63*/ GEN_MLME_EXT_HANDLER(sizeof(struct RunInThread_param), run_in_thread_hdl) /*64*/ + GEN_MLME_EXT_HANDLER(sizeof(struct addBaRsp_parm), add_ba_rsp_hdl) /* 65 */ }; #endif diff --git a/rtl8188FU/include/rtw_mp.h b/rtl8188FU/include/rtw_mp.h index 660aeed..ded281a 100755 --- a/rtl8188FU/include/rtw_mp.h +++ b/rtl8188FU/include/rtw_mp.h @@ -140,6 +140,45 @@ struct mp_tx #define ULONG u32 #define PULONG u32* +typedef struct _RT_PMAC_PKT_INFO { + UCHAR MCS; + UCHAR Nss; + UCHAR Nsts; + UINT N_sym; + UCHAR SIGA2B3; +} RT_PMAC_PKT_INFO, *PRT_PMAC_PKT_INFO; + +typedef struct _RT_PMAC_TX_INFO { + u8 bEnPMacTx:1; /* 0: Disable PMac 1: Enable PMac */ + u8 Mode:3; /* 0: Packet TX 3:Continuous TX */ + u8 Ntx:4; /* 0-7 */ + u8 TX_RATE; /* MPT_RATE_E */ + u8 TX_RATE_HEX; + u8 TX_SC; + u8 bSGI:1; + u8 bSPreamble:1; + u8 bSTBC:1; + u8 bLDPC:1; + u8 NDP_sound:1; + u8 BandWidth:3; /* 0: 20 1:40 2:80Mhz */ + u8 m_STBC; /* bSTBC + 1 */ + USHORT PacketPeriod; + UINT PacketCount; + UINT PacketLength; + u8 PacketPattern; + USHORT SFD; + u8 SignalField; + u8 ServiceField; + USHORT LENGTH; + u8 CRC16[2]; + u8 LSIG[3]; + u8 HT_SIG[6]; + u8 VHT_SIG_A[6]; + u8 VHT_SIG_B[4]; + u8 VHT_SIG_B_CRC; + u8 VHT_Delimiter[4]; + u8 MacAddress[6]; +} RT_PMAC_TX_INFO, *PRT_PMAC_TX_INFO; typedef VOID (*MPT_WORK_ITEM_HANDLER)(IN PVOID Adapter); @@ -244,7 +283,12 @@ typedef struct _MPT_CONTEXT u1Byte btInBuf[100]; ULONG mptOutLen; u1Byte mptOutBuf[100]; - + RT_PMAC_TX_INFO PMacTxInfo; + RT_PMAC_PKT_INFO PMacPktInfo; + u8 HWTxmode; + + BOOLEAN bldpc; + BOOLEAN bstbc; }MPT_CONTEXT, *PMPT_CONTEXT; //#endif @@ -318,6 +362,7 @@ enum { EFUSE_FILE, MP_TX, MP_RX, + MP_HW_TX_MODE, #ifdef CONFIG_WOWLAN MP_WOW_ENABLE, MP_WOW_SET_PATTERN, @@ -349,6 +394,7 @@ struct mp_priv u8 TID; u32 tx_pktcount; u32 pktInterval; + u32 pktLength; struct mp_tx tx; //Rx Section @@ -418,6 +464,7 @@ struct mp_priv BOOLEAN bSetRxBssid; BOOLEAN bTxBufCkFail; BOOLEAN bRTWSmbCfg; + BOOLEAN bloopback; MPT_CONTEXT MptCtx; u8 *TXradomBuffer; @@ -495,6 +542,16 @@ typedef enum _MP_MODE_ { MP_PACKET_RX } MP_MODE; +typedef enum _TEST_MODE { + TEST_NONE , + PACKETS_TX , + PACKETS_RX , + CONTINUOUS_TX , + OFDM_Single_Tone_TX , + CCK_Carrier_Suppression_TX +} TEST_MODE; + + typedef enum _MPT_BANDWIDTH { MPT_BW_20MHZ = 0, MPT_BW_40MHZ_DUPLICATE = 1, @@ -519,7 +576,7 @@ extern u8 mpdatarate[NumRates]; typedef enum _MPT_RATE_INDEX { /* CCK rate. */ - MPT_RATE_1M =0 , /* 0 */ + MPT_RATE_1M = 1 , /* 0 */ MPT_RATE_2M, MPT_RATE_55M, MPT_RATE_11M, /* 3 */ @@ -568,7 +625,7 @@ typedef enum _MPT_RATE_INDEX MPT_RATE_MCS30, // #42 MPT_RATE_MCS31, // #43 /* VHT rate. Total: 20*/ - MPT_RATE_VHT1SS_MCS0,// #44 + MPT_RATE_VHT1SS_MCS0 = 100,/* #44*/ MPT_RATE_VHT1SS_MCS1, // # MPT_RATE_VHT1SS_MCS2, MPT_RATE_VHT1SS_MCS3, @@ -613,6 +670,27 @@ typedef enum _MPT_RATE_INDEX #define MAX_TX_PWR_INDEX_N_MODE 64 // 0x3F +#define MPT_IS_CCK_RATE(_value) (MPT_RATE_1M <= _value && _value <= MPT_RATE_11M) +#define MPT_IS_OFDM_RATE(_value) (MPT_RATE_6M <= _value && _value <= MPT_RATE_54M) +#define MPT_IS_HT_RATE(_value) (MPT_RATE_MCS0 <= _value && _value <= MPT_RATE_MCS31) +#define MPT_IS_HT_1S_RATE(_value) (MPT_RATE_MCS0 <= _value && _value <= MPT_RATE_MCS7) +#define MPT_IS_HT_2S_RATE(_value) (MPT_RATE_MCS8 <= _value && _value <= MPT_RATE_MCS15) +#define MPT_IS_HT_3S_RATE(_value) (MPT_RATE_MCS16 <= _value && _value <= MPT_RATE_MCS23) +#define MPT_IS_HT_4S_RATE(_value) (MPT_RATE_MCS24 <= _value && _value <= MPT_RATE_MCS31) + +#define MPT_IS_VHT_RATE(_value) (MPT_RATE_VHT1SS_MCS0 <= _value && _value <= MPT_RATE_VHT4SS_MCS9) +#define MPT_IS_VHT_1S_RATE(_value) (MPT_RATE_VHT1SS_MCS0 <= _value && _value <= MPT_RATE_VHT1SS_MCS9) +#define MPT_IS_VHT_2S_RATE(_value) (MPT_RATE_VHT2SS_MCS0 <= _value && _value <= MPT_RATE_VHT2SS_MCS9) +#define MPT_IS_VHT_3S_RATE(_value) (MPT_RATE_VHT3SS_MCS0 <= _value && _value <= MPT_RATE_VHT3SS_MCS9) +#define MPT_IS_VHT_4S_RATE(_value) (MPT_RATE_VHT4SS_MCS0 <= _value && _value <= MPT_RATE_VHT4SS_MCS9) + +#define MPT_IS_2SS_RATE(_rate) ((MPT_RATE_MCS8 <= _rate && _rate <= MPT_RATE_MCS15) ||\ + (MPT_RATE_VHT2SS_MCS0 <= _rate && _rate <= MPT_RATE_VHT2SS_MCS9)) +#define MPT_IS_3SS_RATE(_rate) ((MPT_RATE_MCS16 <= _rate && _rate <= MPT_RATE_MCS23) ||\ + (MPT_RATE_VHT3SS_MCS0 <= _rate && _rate <= MPT_RATE_VHT3SS_MCS9)) +#define MPT_IS_4SS_RATE(_rate) ((MPT_RATE_MCS24 <= _rate && _rate <= MPT_RATE_MCS31) ||\ + (MPT_RATE_VHT4SS_MCS0 <= _rate && _rate <= MPT_RATE_VHT4SS_MCS9)) + typedef enum _POWER_MODE_ { POWER_LOW = 0, POWER_NORMAL @@ -657,7 +735,7 @@ typedef enum _MPT_TXPWR_DEF{ MPT_VHT }MPT_TXPWR_DEF; -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM #if defined(CONFIG_RTL8723B) #define REG_RF_BB_GAIN_OFFSET 0x7f @@ -670,8 +748,12 @@ typedef enum _MPT_TXPWR_DEF{ #define RF_GAIN_OFFSET_MASK 0xfffff #endif //CONFIG_RTL8723B -#endif //CONFIG_RF_GAIN_OFFSET +#endif /*CONFIG_RF_POWER_TRIM*/ +#define IS_MPT_HT_RATE(_rate) (_rate >= MPT_RATE_MCS0 && _rate <= MPT_RATE_MCS31) +#define IS_MPT_VHT_RATE(_rate) (_rate >= MPT_RATE_VHT1SS_MCS0 && _rate <= MPT_RATE_VHT4SS_MCS9) +#define IS_MPT_CCK_RATE(_rate) (_rate >= MPT_RATE_1M && _rate <= MPT_RATE_11M) +#define IS_MPT_OFDM_RATE(_rate) (_rate >= MPT_RATE_6M && _rate <= MPT_RATE_54M) //======================================================================= //extern struct mp_xmit_frame *alloc_mp_xmitframe(struct mp_priv *pmp_priv); //extern int free_mp_xmitframe(struct xmit_priv *pxmitpriv, struct mp_xmit_frame *pmp_xmitframe); @@ -738,6 +820,7 @@ void hal_mpt_SetSingleToneTx(PADAPTER pAdapter, u8 bStart); void hal_mpt_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart); void hal_mpt_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart); void hal_mpt_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart); +void mpt_ProSetPMacTx(PADAPTER Adapter); void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter , BOOLEAN bMain); ULONG mpt_ProQueryCalTxPower(PADAPTER pAdapter, u8 RfPath); @@ -745,6 +828,44 @@ void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart); u8 MptToMgntRate(u32 MptRateIdx); u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr); u32 mp_join(PADAPTER padapter, u8 mode); +u32 hal_mpt_query_phytxok(PADAPTER pAdapter); + +void +PMAC_Get_Pkt_Param( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo + ); +void +CCK_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo + ); +void +PMAC_Nsym_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo + ); +void +L_SIG_generator( + UINT N_SYM, /* Max: 750*/ + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo + ); + +void HT_SIG_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo); + +void VHT_SIG_A_generator( + PRT_PMAC_TX_INFO pPMacTxInfo, + PRT_PMAC_PKT_INFO pPMacPktInfo); + +void VHT_SIG_B_generator( + PRT_PMAC_TX_INFO pPMacTxInfo); + +void VHT_Delimiter_generator( + PRT_PMAC_TX_INFO pPMacTxInfo); + int rtw_mp_write_reg(struct net_device *dev, struct iw_request_info *info, @@ -826,7 +947,7 @@ int rtw_mp_phypara(struct net_device *dev, struct iw_point *wrqu, char *extra); int rtw_mp_SetRFPath(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); + struct iw_point *wrqu, char *extra); int rtw_mp_QueryDrv(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); @@ -855,6 +976,10 @@ int rtw_mp_tx(struct net_device *dev, int rtw_mp_rx(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); +int rtw_mp_hwtx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra); +u8 HwRateToMPTRate(u8 rate); #endif //_RTW_MP_H_ diff --git a/rtl8188FU/include/rtw_odm.h b/rtl8188FU/include/rtw_odm.h index 8c0faeb..8375fe1 100755 --- a/rtl8188FU/include/rtw_odm.h +++ b/rtl8188FU/include/rtw_odm.h @@ -34,6 +34,8 @@ void rtw_odm_dbg_level_set(_adapter *adapter, u32 level); void rtw_odm_ability_msg(void *sel, _adapter *adapter); void rtw_odm_ability_set(_adapter *adapter, u32 ability); +void rtw_odm_init_ic_type(_adapter *adapter); + void rtw_odm_adaptivity_config_msg(void *sel, _adapter *adapter); bool rtw_odm_adaptivity_needed(_adapter *adapter); diff --git a/rtl8188FU/include/rtw_recv.h b/rtl8188FU/include/rtw_recv.h index a2d7f9e..498e88a 100755 --- a/rtl8188FU/include/rtw_recv.h +++ b/rtl8188FU/include/rtw_recv.h @@ -103,6 +103,7 @@ struct recv_reorder_ctrl u8 ampdu_size; _queue pending_recvframe_queue; _timer reordering_ctrl_timer; + u8 bReorderWaiting; }; struct stainfo_rxcache { diff --git a/rtl8188FU/include/rtw_rf.h b/rtl8188FU/include/rtw_rf.h index e8e1bf1..d4dd6a2 100755 --- a/rtl8188FU/include/rtw_rf.h +++ b/rtl8188FU/include/rtw_rf.h @@ -207,7 +207,41 @@ int rtw_ch2freq(int chan); int rtw_freq2ch(int freq); bool rtw_chbw_to_freq_range(u8 ch, u8 bw, u8 offset, u32 *hi, u32 *lo); -int rtw_get_chplan_from_country(const char *country_code); +#define RTW_MODULE_RTL8821AE_HMC_M2 BIT0 /* RTL8821AE(HMC+M.2) */ +#define RTW_MODULE_RTL8821AU BIT1 /* RTL8821AU */ +#define RTW_MODULE_RTL8812AENF_NGFF BIT2 /* RTL8812AENF(8812AE+8761)_NGFF */ +#define RTW_MODULE_RTL8812AEBT_HMC BIT3 /* RTL8812AEBT(8812AE+8761)_HMC */ +#define RTW_MODULE_RTL8188EE_HMC_M2 BIT4 /* RTL8188EE(HMC+M.2) */ +#define RTW_MODULE_RTL8723BE_HMC_M2 BIT5 /* RTL8723BE(HMC+M.2) */ +#define RTW_MODULE_RTL8723BS_NGFF1216 BIT6 /* RTL8723BS(NGFF1216) */ +#define RTW_MODULE_RTL8192EEBT_HMC_M2 BIT7 /* RTL8192EEBT(8192EE+8761AU)_(HMC+M.2) */ + +#define IS_ALPHA2_NO_SPECIFIED(_alpha2) ((*((u16 *)(_alpha2))) == 0xFFFF) + +struct country_chplan { + char alpha2[2]; + u8 chplan; +#ifdef CONFIG_80211AC_VHT + u8 en_11ac; +#endif +#if RTW_DEF_MODULE_REGULATORY_CERT + u8 def_module_flags; /* RTW_MODULE_RTLXXX */ +#endif +}; + +#ifdef CONFIG_80211AC_VHT +#define COUNTRY_CHPLAN_EN_11AC(_ent) ((_ent)->en_11ac) +#else +#define COUNTRY_CHPLAN_EN_11AC(_ent) 0 +#endif + +#if RTW_DEF_MODULE_REGULATORY_CERT +#define COUNTRY_CHPLAN_DEF_MODULE_FALGS(_ent) ((_ent)->def_module_flags) +#else +#define COUNTRY_CHPLAN_DEF_MODULE_FALGS(_ent) 0 +#endif + +const struct country_chplan *rtw_get_chplan_from_country(const char *country_code); #define BB_GAIN_2G 0 #ifdef CONFIG_IEEE80211_BAND_5GHZ diff --git a/rtl8188FU/include/rtw_tdls.h b/rtl8188FU/include/rtw_tdls.h index ed54a99..8642e69 100755 --- a/rtl8188FU/include/rtw_tdls.h +++ b/rtl8188FU/include/rtw_tdls.h @@ -35,24 +35,34 @@ /* TDLS Check ALive */
#define TDLS_ALIVE_STATE BIT(20) /* 0x00100000 */ /* Check if peer sta is alived. */
/* TDLS Channel Switch */
-#define TDLS_CH_SWITCH_ON_STATE BIT(16) /* 0x00010000 */
-#define TDLS_PEER_AT_OFF_STATE BIT(17) /* 0x00020000 */ /* Could send pkt on target ch */
-#define TDLS_CH_SW_INITIATOR_STATE BIT(18) /* 0x00040000 */ /* Avoid duplicated or unconditional ch. switch rsp. */
-#define TDLS_WAIT_CH_RSP_STATE BIT(19) /* 0x00080000 */ /* Wait Ch. response as we are TDLS channel switch initiator */
+#define TDLS_CH_SWITCH_PREPARE_STATE BIT(15) /* 0x00008000 */
+#define TDLS_CH_SWITCH_ON_STATE BIT(16) /* 0x00010000 */
+#define TDLS_PEER_AT_OFF_STATE BIT(17) /* 0x00020000 */ /* Could send pkt on target ch */
+#define TDLS_CH_SW_INITIATOR_STATE BIT(18) /* 0x00040000 */ /* Avoid duplicated or unconditional ch. switch rsp. */
+#define TDLS_WAIT_CH_RSP_STATE BIT(19) /* 0x00080000 */ /* Wait Ch. response as we are TDLS channel switch initiator */
-#define TPK_RESEND_COUNT 1800 /*Unit: seconds */
-#define CH_SWITCH_TIME 5
-#define CH_SWITCH_TIMEOUT 20
+#define TDLS_TPK_RESEND_COUNT 86400 /*Unit: seconds */
+#define TDLS_CH_SWITCH_TIME 15
+#define TDLS_CH_SWITCH_TIMEOUT 30
+#define TDLS_CH_SWITCH_OPER_OFFLOAD_TIMEOUT 10
#define TDLS_SIGNAL_THRESH 0x20
#define TDLS_WATCHDOG_PERIOD 10 /* Periodically sending tdls discovery request in TDLS_WATCHDOG_PERIOD * 2 sec */
#define TDLS_HANDSHAKE_TIME 3000
#define TDLS_PTI_TIME 7000
+#define TDLS_CH_SW_STAY_ON_BASE_CHNL_TIMEOUT 20 /* ms */
+#define TDLS_CH_SW_MONITOR_TIMEOUT 2000 /*ms */
+
#define TDLS_MIC_LEN 16
#define WPA_NONCE_LEN 32
#define TDLS_TIMEOUT_LEN 4
+enum TDLS_CH_SW_CHNL{
+ TDLS_CH_SW_BASE_CHNL = 0,
+ TDLS_CH_SW_OFF_CHNL
+};
+
struct wpa_tdls_ftie {
u8 ie_type; /* FTIE */
u8 ie_len;
@@ -92,6 +102,12 @@ static u8 TDLS_SRC[] = { 0x01, 0x01, 0x02, 0x03, 0x04, 0x0c, 0x16, 0x17, 0x18, 0 int check_ap_tdls_prohibited(u8 *pframe, u8 pkt_len);
int check_ap_tdls_ch_switching_prohibited(u8 *pframe, u8 pkt_len);
+
+u8 rtw_tdls_is_setup_allowed(_adapter *padapter);
+#ifdef CONFIG_TDLS_CH_SW
+u8 rtw_tdls_is_chsw_allowed(_adapter *padapter);
+#endif
+
void rtw_reset_tdls_info(_adapter* padapter);
int rtw_init_tdls_info(_adapter* padapter);
void rtw_free_tdls_info(struct tdls_info *ptdlsinfo);
@@ -99,6 +115,14 @@ int issue_nulldata_to_TDLS_peer_STA(_adapter *padapter, unsigned char *da, unsig void rtw_init_tdls_timer(_adapter *padapter, struct sta_info *psta);
void rtw_free_tdls_timer(struct sta_info *psta);
void free_tdls_sta(_adapter *padapter, struct sta_info *ptdls_sta);
+
+#ifdef CONFIG_TDLS_CH_SW
+void rtw_tdls_set_ch_sw_oper_control(_adapter *padapter, u8 enable);
+void rtw_tdls_ch_sw_back_to_base_chnl(_adapter *padapter);
+s32 rtw_tdls_do_ch_sw(_adapter *padapter, struct sta_info *ptdls_sta, u8 chnl_type, u8 channel, u8 channel_offset, u16 bwmode, u16 ch_switch_time);
+void rtw_tdls_chsw_oper_done(_adapter* padapter);
+#endif
+
#ifdef CONFIG_WFD
int issue_tunneled_probe_req(_adapter *padapter);
int issue_tunneled_probe_rsp(_adapter *padapter, union recv_frame *precv_frame);
@@ -111,8 +135,10 @@ int issue_tdls_dis_rsp(_adapter * padapter, struct tdls_txmgmt *ptxmgmt, u8 priv int issue_tdls_teardown(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, u8 wait_ack);
int issue_tdls_peer_traffic_rsp(_adapter *padapter, struct sta_info *psta, struct tdls_txmgmt *ptxmgmt);
int issue_tdls_peer_traffic_indication(_adapter *padapter, struct sta_info *psta);
+#ifdef CONFIG_TDLS_CH_SW
int issue_tdls_ch_switch_req(_adapter *padapter, struct sta_info *ptdls_sta);
int issue_tdls_ch_switch_rsp(_adapter *padapter, struct tdls_txmgmt *ptxmgmt, int wait_ack);
+#endif
sint On_TDLS_Dis_Rsp(_adapter *adapter, union recv_frame *precv_frame);
sint On_TDLS_Setup_Req(_adapter *adapter, union recv_frame *precv_frame);
int On_TDLS_Setup_Rsp(_adapter *adapter, union recv_frame *precv_frame);
diff --git a/rtl8188FU/include/rtw_version.h b/rtl8188FU/include/rtw_version.h index b7314cc..41d5eff 100755 --- a/rtl8188FU/include/rtw_version.h +++ b/rtl8188FU/include/rtw_version.h @@ -1 +1 @@ -#define DRIVERVERSION "v4.3.23_15345.20150930_beta" +#define DRIVERVERSION "v4.3.23.4_19019.20160811" diff --git a/rtl8188FU/include/sta_info.h b/rtl8188FU/include/sta_info.h index 5f26e9e..7cd5e61 100755 --- a/rtl8188FU/include/sta_info.h +++ b/rtl8188FU/include/sta_info.h @@ -242,7 +242,7 @@ struct sta_info { u8 SNonce[32]; u8 ANonce[32]; u32 TDLS_PeerKey_Lifetime; - u16 TPK_count; + u32 TPK_count; _timer TPK_timer; struct TDLS_PeerKey tpk; #ifdef CONFIG_TDLS_CH_SW @@ -251,6 +251,8 @@ struct sta_info { //u8 option; _timer ch_sw_timer; _timer delay_timer; + _timer stay_on_base_chnl_timer; + _timer ch_sw_monitor_timer; #endif _timer handshake_timer; u8 alive_count; @@ -285,13 +287,14 @@ struct sta_info { //AP_Mode: //curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO //sta_info: (AP & STA) CAP/INFO - + + unsigned int expire_to; + #ifdef CONFIG_AP_MODE _list asoc_list; _list auth_list; - - unsigned int expire_to; + unsigned int auth_seq; unsigned int authalg; unsigned char chg_txt[128]; @@ -517,7 +520,8 @@ struct sta_priv { _queue wakeup_q; _adapter *padapter; - + + u32 adhoc_expire_to; #ifdef CONFIG_AP_MODE _list asoc_list; @@ -552,7 +556,7 @@ struct sta_priv { }; -__inline static u32 wifi_mac_hash(u8 *mac) +static inline u32 wifi_mac_hash(const u8 *mac) { u32 x; @@ -577,10 +581,10 @@ extern u32 _rtw_free_sta_priv(struct sta_priv *pstapriv); int rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta); struct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int offset); -extern struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); +extern struct sta_info *rtw_alloc_stainfo(struct sta_priv *pstapriv, const u8 *hwaddr); extern u32 rtw_free_stainfo(_adapter *padapter , struct sta_info *psta); extern void rtw_free_all_stainfo(_adapter *padapter); -extern struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, u8 *hwaddr); +extern struct sta_info *rtw_get_stainfo(struct sta_priv *pstapriv, const u8 *hwaddr); extern u32 rtw_init_bcmc_stainfo(_adapter* padapter); extern struct sta_info* rtw_get_bcmc_stainfo(_adapter* padapter); extern u8 rtw_access_ctrl(_adapter *padapter, u8 *mac_addr); diff --git a/rtl8188FU/os_dep/linux/ioctl_cfg80211.c b/rtl8188FU/os_dep/linux/ioctl_cfg80211.c index 3d1e8b4..6aa374b 100755 --- a/rtl8188FU/os_dep/linux/ioctl_cfg80211.c +++ b/rtl8188FU/os_dep/linux/ioctl_cfg80211.c @@ -828,7 +828,7 @@ check_bss: }
}
-void rtw_cfg80211_indicate_disconnect(_adapter *padapter)
+void rtw_cfg80211_indicate_disconnect(_adapter *padapter, u16 reason, u8 locally_generated)
{
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct wireless_dev *pwdev = padapter->rtw_wdev;
@@ -838,6 +838,11 @@ void rtw_cfg80211_indicate_disconnect(_adapter *padapter) DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
+ /*always replace privated definitions with wifi reserved value 0*/
+ if ((reason == WLAN_REASON_ACTIVE_ROAM) || (reason == WLAN_REASON_JOIN_WRONG_CHANNEL) || (reason == WLAN_REASON_EXPIRATION_CHK)) {
+ reason = 0;
+ }
+
if (pwdev->iftype != NL80211_IFTYPE_STATION
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
&& pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT
@@ -866,15 +871,24 @@ void rtw_cfg80211_indicate_disconnect(_adapter *padapter) }
#endif //CONFIG_P2P
+ #ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42
if (!padapter->mlmepriv.not_indic_disco || padapter->ndev_unregistering) {
+ #else
+ {
+ #endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 11, 0) || defined(COMPAT_KERNEL_RELEASE)
DBG_8192C("pwdev->sme_state(b)=%d\n", pwdev->sme_state);
if(pwdev->sme_state==CFG80211_SME_CONNECTING)
cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0,
WLAN_STATUS_UNSPECIFIED_FAILURE, GFP_ATOMIC/*GFP_KERNEL*/);
- else if(pwdev->sme_state==CFG80211_SME_CONNECTED)
+ else if (pwdev->sme_state == CFG80211_SME_CONNECTED) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))
+ cfg80211_disconnected(padapter->pnetdev, reason, NULL, 0, locally_generated, GFP_ATOMIC);
+#else
cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC);
+#endif
+ }
//else
//DBG_8192C("pwdev->sme_state=%d\n", pwdev->sme_state);
@@ -882,8 +896,13 @@ void rtw_cfg80211_indicate_disconnect(_adapter *padapter) #else
if (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))
+ DBG_871X(FUNC_ADPT_FMT" call cfg80211_disconnected\n", FUNC_ADPT_ARG(padapter));
+ cfg80211_disconnected(padapter->pnetdev, reason, NULL, 0, locally_generated, GFP_ATOMIC);
+#else
DBG_871X(FUNC_ADPT_FMT" call cfg80211_disconnected\n", FUNC_ADPT_ARG(padapter));
cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC);
+#endif
} else {
DBG_871X(FUNC_ADPT_FMT" call cfg80211_connect_result\n", FUNC_ADPT_ARG(padapter));
cfg80211_connect_result(padapter->pnetdev, NULL, NULL, 0, NULL, 0,
@@ -2544,7 +2563,7 @@ if (padapter->registrypriv.mp_mode == 1) }
_status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, survey_times * request->n_channels);
} else {
- _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, NULL, 0);
+ _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, request->n_channels);
}
_exit_critical_bh(&pmlmepriv->lock, &irqL);
@@ -3080,7 +3099,9 @@ static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
+ #ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42
padapter->mlmepriv.not_indic_disco = _TRUE;
+ #endif
old_type = rtw_wdev->iftype;
@@ -3103,7 +3124,9 @@ static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) }
leave_ibss:
+ #ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42
padapter->mlmepriv.not_indic_disco = _FALSE;
+ #endif
return 0;
}
@@ -3127,7 +3150,9 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, struct security_priv *psecuritypriv = &padapter->securitypriv;
_queue *queue = &pmlmepriv->scanned_queue;
+ #ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42
padapter->mlmepriv.not_indic_disco = _TRUE;
+ #endif
DBG_871X("=>"FUNC_NDEV_FMT" - Start to Connection\n", FUNC_NDEV_ARG(ndev));
DBG_871X("privacy=%d, key=%p, key_len=%d, key_idx=%d, auth_type=%d\n",
@@ -3354,7 +3379,9 @@ exit: DBG_8192C("<=%s, ret %d\n",__FUNCTION__, ret);
+ #ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42
padapter->mlmepriv.not_indic_disco = _FALSE;
+ #endif
return ret;
}
@@ -3366,7 +3393,9 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, DBG_871X(FUNC_NDEV_FMT" - Start to Disconnect\n", FUNC_NDEV_ARG(ndev));
+ #ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42
padapter->mlmepriv.not_indic_disco = _TRUE;
+ #endif
rtw_set_to_roam(padapter, 0);
@@ -3375,16 +3404,18 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, rtw_scan_abort(padapter);
LeaveAllPowerSaveMode(padapter);
rtw_disassoc_cmd(padapter, 500, _FALSE);
+ rtw_sta_mstatus_report(padapter);
- DBG_871X("%s...call rtw_indicate_disconnect\n", __FUNCTION__);
-
- rtw_indicate_disconnect(padapter);
+ DBG_871X("%s...call rtw_indicate_disconnect\n", __func__);
rtw_free_assoc_resources(padapter, 1);
+ rtw_indicate_disconnect(padapter, 0, _TRUE);
rtw_pwr_wakeup(padapter);
}
+ #ifdef SUPPLICANT_RTK_VERSION_LOWER_THAN_JB42
padapter->mlmepriv.not_indic_disco = _FALSE;
+ #endif
DBG_871X(FUNC_NDEV_FMT" return 0\n", FUNC_NDEV_ARG(ndev));
return 0;
@@ -3597,7 +3628,7 @@ void rtw_cfg80211_indicate_sta_assoc(_adapter *padapter, u8 *pmgmt_frame, uint f else // WIFI_REASSOCREQ
ie_offset = _REASOCREQ_IE_OFFSET_;
- sinfo.filled = 0;
+ memset(&sinfo, 0, sizeof(sinfo));
sinfo.filled = STATION_INFO_ASSOC_REQ_IES;
sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset;
sinfo.assoc_req_ies_len = frame_len - WLAN_HDR_A3_LEN - ie_offset;
@@ -3709,7 +3740,7 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_de u16 frame_ctl;
unsigned char src_mac_addr[6];
unsigned char dst_mac_addr[6];
- struct ieee80211_hdr *dot11_hdr;
+ struct rtw_ieee80211_hdr *dot11_hdr;
struct ieee80211_radiotap_header *rtap_hdr;
_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
@@ -3738,16 +3769,16 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct net_de /* Skip the ratio tap header */
skb_pull(skb, rtap_len);
- dot11_hdr = (struct ieee80211_hdr *)skb->data;
- frame_ctl = le16_to_cpu(dot11_hdr->frame_control);
+ dot11_hdr = (struct rtw_ieee80211_hdr *)skb->data;
+ frame_ctl = le16_to_cpu(dot11_hdr->frame_ctl);
/* Check if the QoS bit is set */
if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) {
/* Check if this ia a Wireless Distribution System (WDS) frame
* which has 4 MAC addresses
*/
- if (dot11_hdr->frame_control & 0x0080)
+ if (dot11_hdr->frame_ctl & 0x0080)
qos_len = 2;
- if ((dot11_hdr->frame_control & 0x0300) == 0x0300)
+ if ((dot11_hdr->frame_ctl & 0x0300) == 0x0300)
dot11_hdr_len += 6;
memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr));
@@ -4276,9 +4307,9 @@ static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev DBG_871X(FUNC_NDEV_FMT"\n", FUNC_NDEV_ARG(ndev));
#ifdef CONFIG_TDLS
- psta = rtw_get_stainfo(pstapriv, mac);
+ psta = rtw_get_stainfo(pstapriv, (u8 *)mac);
if (psta == NULL) {
- psta = rtw_alloc_stainfo(pstapriv, mac);
+ psta = rtw_alloc_stainfo(pstapriv, (u8 *)mac);
if (psta ==NULL) {
DBG_871X("[%s] Alloc station for "MAC_FMT" fail\n", __FUNCTION__, MAC_ARG(mac));
ret =-EOPNOTSUPP;
@@ -5661,10 +5692,20 @@ exit: #if defined(CONFIG_TDLS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))
static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy,
struct net_device *ndev,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0))
+ const u8 *peer,
+#else
u8 *peer,
+#endif
u8 action_code,
u8 dialog_token,
u16 status_code,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))
+ u32 peer_capability,
+#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0))
+ bool initiator,
+#endif
const u8 *buf,
size_t len)
{
@@ -5707,7 +5748,7 @@ static int cfg80211_rtw_tdls_mgmt(struct wiphy *wiphy, int i=0;
for(;i < len; i++)
printk("%02x ", *(txmgmt.buf+i));
- DBG_871X("len:%d\n", txmgmt.len);
+ DBG_871X("len:%d\n", (u32)txmgmt.len);
}
#endif
@@ -5742,7 +5783,11 @@ discard: static int cfg80211_rtw_tdls_oper(struct wiphy *wiphy,
struct net_device *ndev,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0))
+ const u8 *peer,
+#else
u8 *peer,
+#endif
enum nl80211_tdls_operation oper)
{
_adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
@@ -5799,7 +5844,7 @@ static int cfg80211_rtw_tdls_oper(struct wiphy *wiphy, break;
case NL80211_TDLS_ENABLE_LINK:
DBG_871X(FUNC_NDEV_FMT", NL80211_TDLS_ENABLE_LINK;mac:"MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(peer));
- ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), peer);
+ ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), (u8 *)peer);
if (ptdls_sta != NULL) {
ptdlsinfo->link_established = _TRUE;
ptdls_sta->tdls_sta_state |= TDLS_LINKED_STATE;
@@ -5809,9 +5854,9 @@ static int cfg80211_rtw_tdls_oper(struct wiphy *wiphy, break;
case NL80211_TDLS_DISABLE_LINK:
DBG_871X(FUNC_NDEV_FMT", NL80211_TDLS_DISABLE_LINK;mac:"MAC_FMT"\n", FUNC_NDEV_ARG(ndev), MAC_ARG(peer));
- ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), peer);
+ ptdls_sta = rtw_get_stainfo(&(padapter->stapriv), (u8 *)peer);
if (ptdls_sta != NULL) {
- rtw_tdls_cmd(padapter, peer, TDLS_TEAR_STA );
+ rtw_tdls_cmd(padapter, (u8 *)peer, TDLS_TEARDOWN_STA_LOCALLY);
}
break;
}
@@ -6033,16 +6078,15 @@ static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, char *bu #ifdef CONFIG_DEBUG_CFG80211
//printk("config_method in wpsie of probe_resp = 0x%x\n", be16_to_cpu(*puconfig_method));
#endif
-
- //if(check_fwstate(pmlmepriv, WIFI_AP_STATE) != _TRUE)
+
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) || defined(COMPAT_KERNEL_RELEASE)
- if(wdev->iftype != NL80211_IFTYPE_P2P_GO) //for WIFI-DIRECT LOGO 4.2.2, AUTO GO can't set PUSH_BUTTON flags
- {
+ /* for WIFI-DIRECT LOGO 4.2.2, AUTO GO can't set PUSH_BUTTON flags */
+ if (wdev->iftype == NL80211_IFTYPE_P2P_GO) {
uconfig_method = WPS_CM_PUSH_BUTTON;
- uconfig_method = cpu_to_be16( uconfig_method );
-
- *puconfig_method |= uconfig_method;
- }
+ uconfig_method = cpu_to_be16(uconfig_method);
+
+ *puconfig_method &= ~uconfig_method;
+ }
#endif
}
@@ -6727,7 +6771,13 @@ void rtw_wdev_unregister(struct wireless_dev *wdev) rtw_cfg80211_indicate_scan_done(adapter, _TRUE);
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE)
+ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))
+ if (wdev->current_bss) {
+ u8 locally_generated = 1;
+ DBG_871X(FUNC_ADPT_FMT" clear current_bss by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter));
+ cfg80211_disconnected(adapter->pnetdev, 0, NULL, 0, locally_generated, GFP_ATOMIC);
+ }
+ #elif ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0))) || defined(COMPAT_KERNEL_RELEASE)
if (wdev->current_bss) {
DBG_871X(FUNC_ADPT_FMT" clear current_bss by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter));
cfg80211_disconnected(adapter->pnetdev, 0, NULL, 0, GFP_ATOMIC);
diff --git a/rtl8188FU/os_dep/linux/ioctl_cfg80211.h b/rtl8188FU/os_dep/linux/ioctl_cfg80211.h index 9b483c6..6e6f88d 100755 --- a/rtl8188FU/os_dep/linux/ioctl_cfg80211.h +++ b/rtl8188FU/os_dep/linux/ioctl_cfg80211.h @@ -152,7 +152,7 @@ struct cfg80211_bss *rtw_cfg80211_inform_bss(_adapter *padapter, struct wlan_net int rtw_cfg80211_check_bss(_adapter *padapter);
void rtw_cfg80211_ibss_indicate_connect(_adapter *padapter);
void rtw_cfg80211_indicate_connect(_adapter *padapter);
-void rtw_cfg80211_indicate_disconnect(_adapter *padapter);
+void rtw_cfg80211_indicate_disconnect(_adapter *padapter, u16 reason, u8 locally_generated);
void rtw_cfg80211_indicate_scan_done(_adapter *adapter, bool aborted);
u32 rtw_cfg80211_wait_scan_req_empty(_adapter *adapter, u32 timeout_ms);
diff --git a/rtl8188FU/os_dep/linux/ioctl_linux.c b/rtl8188FU/os_dep/linux/ioctl_linux.c index 38cc38d..1e63df2 100755 --- a/rtl8188FU/os_dep/linux/ioctl_linux.c +++ b/rtl8188FU/os_dep/linux/ioctl_linux.c @@ -3831,7 +3831,7 @@ static int rtw_wx_set_auth(struct net_device *dev, LeaveAllPowerSaveMode(padapter); rtw_disassoc_cmd(padapter, 500, _FALSE); DBG_871X("%s...call rtw_indicate_disconnect\n ",__FUNCTION__); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_free_assoc_resources(padapter, 1); } #endif @@ -7455,7 +7455,7 @@ static int rtw_dbg_port(struct net_device *dev, break; case 0x7a: receive_disconnect(padapter, pmlmeinfo->network.MacAddress - , WLAN_REASON_EXPIRATION_CHK); + , WLAN_REASON_EXPIRATION_CHK, _FALSE); break; case 0x7F: switch(minor_cmd) @@ -7706,9 +7706,8 @@ static int rtw_dbg_port(struct net_device *dev, case 0x13: //set ampdu_enable { struct registry_priv *pregpriv = &padapter->registrypriv; - // 0: disable, 0x1:enable (but wifi_spec should be 0), 0x2: force enable (don't care wifi_spec) - if( pregpriv && extra_arg < 3 ) - { + /* 0: disable, 0x1:enable */ + if (pregpriv && extra_arg < 2) { pregpriv->ampdu_enable= extra_arg; DBG_871X("set ampdu_enable=%d\n",pregpriv->ampdu_enable); } @@ -9534,7 +9533,7 @@ static bool rtw_wowlan_parser_pattern_cmd(u8 *input, char *pattern, { char *cp = NULL, *end = NULL; size_t len = 0; - int pos = 0, temp = 0, mask_pos = 0, res = 0; + int pos = 0, mask_pos = 0, res = 0; u8 member[2] = {0}; cp = strchr(input, '='); @@ -9561,16 +9560,16 @@ static bool rtw_wowlan_parser_pattern_cmd(u8 *input, char *pattern, strcmp(input, "--") == 0)) { /* skip this byte and leave mask bit unset */ } else { + u8 hex; strncpy(member, input, len); if (!rtw_check_pattern_valid(member, sizeof(member))) { DBG_871X("%s:[ERROR] pattern is invalid!!\n", __func__); goto error; } - res = sscanf(member, "%02x", &temp); - if (temp < 0 || temp > 256) - goto error; - pattern[pos] = temp; + + res = sscanf(member, "%02hhx", &hex); + pattern[pos] = hex; mask_pos = pos / 8; if (bit_mask) bit_mask[mask_pos] |= 1 << (pos % 8); @@ -9653,11 +9652,9 @@ static int rtw_wowlan_set_pattern(struct net_device *dev, &pwrpriv->patterns[index].len, pwrpriv->patterns[index].mask); - if (ret) { + if (ret == _TRUE) { pwrpriv->wowlan_pattern_idx++; pwrpriv->wowlan_pattern = _TRUE; - } else { - goto _rtw_wowlan_set_pattern_exit; } } } else if (strncmp(input, "clean", 5) == 0) { @@ -9776,7 +9773,7 @@ static int rtw_mp_efuse_get(struct net_device *dev, u8 *rawdata = NULL; char *pch, *ptmp, *token, *tmp[3]={0x00,0x00,0x00}; u16 i=0, j=0, mapLen=0, addr=0, cnts=0; - u16 max_available_size=0, raw_cursize=0, raw_maxsize=0; + u16 max_available_len = 0, raw_cursize = 0, raw_maxsize = 0; int err; #ifdef CONFIG_IOL u8 org_fw_iol = padapter->registrypriv.fw_iol;// 0:Disable, 1:enable, 2:by usb speed @@ -9914,8 +9911,8 @@ static int rtw_mp_efuse_get(struct net_device *dev, } DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts); - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN , (PVOID)&max_available_size, _FALSE); - if ((addr+ cnts) > max_available_size) + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN , (PVOID)&max_available_len, _FALSE); + if ((addr + cnts) > max_available_len) { DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts); err = -EINVAL; @@ -10010,8 +10007,8 @@ static int rtw_mp_efuse_get(struct net_device *dev, addr = hal_efuse_macaddr_offset(padapter); cnts = 6; - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - if ((addr + cnts) > max_available_size) { + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE); + if ((addr + cnts) > max_available_len) { DBG_871X("%s: addr(0x%02x)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts); err = -EFAULT; goto exit; @@ -10073,9 +10070,8 @@ static int rtw_mp_efuse_get(struct net_device *dev, cnts = 4; - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - if ((addr + cnts) > max_available_size) - { + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE); + if ((addr + cnts) > max_available_len) { DBG_871X("%s: addr(0x%02x)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts); err = -EFAULT; goto exit; @@ -10100,15 +10096,16 @@ static int rtw_mp_efuse_get(struct net_device *dev, } } // DBG_871X("}\n"); - } - else if (strcmp(tmp[0], "ableraw") == 0) - { - efuse_GetCurrentSize(padapter,&raw_cursize); - raw_maxsize = efuse_GetMaxSize(padapter); - sprintf(extra, "[available raw size]= %d bytes", raw_maxsize-raw_cursize); - } - else if (strcmp(tmp[0], "btfmap") == 0) - { + } else if (strcmp(tmp[0], "ableraw") == 0) { + efuse_GetCurrentSize(padapter, &raw_cursize); + raw_maxsize = efuse_GetMaxSize(padapter); + sprintf(extra, "[available raw size]= %d bytes\n", raw_maxsize - raw_cursize); + } else if (strcmp(tmp[0], "btableraw") == 0) { + efuse_bt_GetCurrentSize(padapter, &raw_cursize); + raw_maxsize = efuse_bt_GetMaxSize(padapter); + sprintf(extra, "[available raw size]= %d bytes\n", raw_maxsize - raw_cursize); + } else if (strcmp(tmp[0], "btfmap") == 0) { + BTEfuse_PowerSwitch(padapter,1,_TRUE); mapLen = EFUSE_BT_MAX_MAP_LEN; @@ -10197,9 +10194,8 @@ static int rtw_mp_efuse_get(struct net_device *dev, } DBG_871X("%s: cnts=%d\n", __FUNCTION__, cnts); - EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - if ((addr + cnts) > max_available_size) - { + EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE); + if ((addr + cnts) > max_available_len) { DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts); err = -EFAULT; goto exit; @@ -10387,6 +10383,7 @@ static int rtw_mp_efuse_set(struct net_device *dev, struct pwrctrl_priv *pwrctrlpriv ; PHAL_DATA_TYPE pHalData; PEFUSE_HAL pEfuseHal; + struct hal_ops *pHalFunc; u8 ips_mode = IPS_NUM; // init invalid value u8 lps_mode = PS_MODE_NUM; // init invalid value @@ -10396,7 +10393,7 @@ static int rtw_mp_efuse_set(struct net_device *dev, u8 *ShadowMapWiFi = NULL; u8 *setrawdata = NULL; char *pch, *ptmp, *token, *tmp[3]={0x00,0x00,0x00}; - u16 addr=0xFF, cnts=0, BTStatus=0 , max_available_size=0; + u16 addr = 0xFF, cnts = 0, BTStatus = 0 , max_available_len = 0; int err; wrqu = (struct iw_point*)wdata; @@ -10404,6 +10401,8 @@ static int rtw_mp_efuse_set(struct net_device *dev, pwrctrlpriv = adapter_to_pwrctl(padapter); pHalData = GET_HAL_DATA(padapter); pEfuseHal = &pHalData->EfuseHal; + pHalFunc = &padapter->HalFunc; + err = 0; if (copy_from_user(extra, wrqu->pointer, wrqu->length)) @@ -10501,14 +10500,10 @@ static int rtw_mp_efuse_set(struct net_device *dev, { setdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]); } -#ifndef CONFIG_RTL8188E - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); -#else - //Change to check TYPE_EFUSE_MAP_LEN ,beacuse 8188E raw 256,logic map over 256. - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_size, _FALSE); -#endif - if ((addr+cnts) > max_available_size) - { + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE); + + if ((addr + cnts) > max_available_len) { DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts); err = -EFAULT; goto exit; @@ -10623,14 +10618,10 @@ static int rtw_mp_efuse_set(struct net_device *dev, { setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+1]); } -#ifndef CONFIG_RTL8188E - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); -#else - //Change to check TYPE_EFUSE_MAP_LEN ,beacuse 8188E raw 256,logic map over 256. - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_size, _FALSE); -#endif - if ((addr+cnts) > max_available_size) - { + + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE); + + if ((addr + cnts) > max_available_len) { DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts); err = -EFAULT; goto exit; @@ -10706,9 +10697,8 @@ static int rtw_mp_efuse_set(struct net_device *dev, setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk+1]); } - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - if ((addr+cnts) > max_available_size) - { + EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE); + if ((addr + cnts) > max_available_len) { DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts); err = -EFAULT; goto exit; @@ -10782,9 +10772,8 @@ static int rtw_mp_efuse_set(struct net_device *dev, setdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk+1]); } - EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - if ((addr+cnts) > max_available_size) - { + EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_EFUSE_MAP_LEN, (PVOID)&max_available_len, _FALSE); + if ((addr + cnts) > max_available_len) { DBG_871X("%s: addr(0x%X)+cnts(%d) parameter error!\n", __FUNCTION__, addr, cnts); err = -EFAULT; goto exit; @@ -10881,13 +10870,6 @@ static int rtw_mp_efuse_set(struct net_device *dev, rtw_read8(padapter, EFUSE_CTRL); _rtw_memcpy(pEfuseHal->BTEfuseModifiedMap, pEfuseHal->fakeBTEfuseModifiedMap, EFUSE_BT_MAX_MAP_LEN); - - EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - if (max_available_size < 1) - { - err = -EFAULT; - goto exit; - } if (rtw_BT_efuse_map_write(padapter, 0x00, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeBTEfuseModifiedMap) == _FAIL) { @@ -10958,12 +10940,6 @@ static int rtw_mp_efuse_set(struct net_device *dev, } else if (strcmp(tmp[0], "wlfk2map") == 0) { - EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - if (max_available_size < 1) - { - err = -EFAULT; - goto exit; - } if (rtw_efuse_map_write(padapter, 0x00, EFUSE_MAP_SIZE, pEfuseHal->fakeEfuseModifiedMap) == _FAIL) { DBG_871X("%s: rtw_efuse_map_write fakeEfuseModifiedMap error!\n", __FUNCTION__); @@ -11024,6 +11000,25 @@ static int rtw_mp_efuse_set(struct net_device *dev, } _rtw_memset(extra, '\0', strlen(extra)); sprintf(extra, "wlwfake OK\n"); + } else if(strcmp(tmp[0], "update") == 0) { + DBG_871X("To Use new eFuse map\n"); + /*step read efuse/eeprom data and get mac_addr*/ + rtw_hal_read_chip_info(padapter); + /* set mac addr*/ + rtw_macaddr_cfg(adapter_mac_addr(padapter), get_hal_mac_addr(padapter)); + _rtw_memcpy(padapter->pnetdev->dev_addr, get_hal_mac_addr(padapter), ETH_ALEN); /* set mac addr to net_device */ + +#ifdef CONFIG_P2P + rtw_init_wifidirect_addrs(padapter, adapter_mac_addr(padapter), adapter_mac_addr(padapter)); +#endif + rtw_hal_set_hwreg(padapter, HW_VAR_MAC_ADDR, adapter_mac_addr(padapter)); /* set mac addr to mac register */ + /*pHalFunc->hal_deinit(padapter);*/ + if (pHalFunc->hal_init(padapter) == _FAIL) { + err = -EINVAL; + goto exit; + } + _rtw_memset(extra, '\0', strlen(extra)); + sprintf(extra, "eFuse Update OK\n"); } exit: @@ -11224,29 +11219,6 @@ static int rtw_mp_set(struct net_device *dev, switch(subcmd) { - case MP_START: - DBG_871X("set case mp_start \n"); - rtw_mp_start (dev,info,wrqu,extra); - break; - - case MP_STOP: - DBG_871X("set case mp_stop \n"); - rtw_mp_stop (dev,info,wrqu,extra); - break; - - case MP_BANDWIDTH: - DBG_871X("set case mp_bandwidth \n"); - rtw_mp_bandwidth (dev,info,wrqu,extra); - break; - - case MP_RESET_STATS: - DBG_871X("set case MP_RESET_STATS \n"); - rtw_mp_reset_stats (dev,info,wrqu,extra); - break; - case MP_SetRFPathSwh: - DBG_871X("set MP_SetRFPathSwitch \n"); - rtw_mp_SetRFPath (dev,info,wdata,extra); - break; case CTA_TEST: DBG_871X("set CTA_TEST\n"); rtw_cta_test_start (dev, info, wdata, extra); @@ -11310,6 +11282,31 @@ static int rtw_mp_get(struct net_device *dev, } switch (subcmd) { + case MP_START: + DBG_871X("set case mp_start \n"); + rtw_mp_start (dev,info,wrqu,extra); + break; + + case MP_STOP: + DBG_871X("set case mp_stop \n"); + rtw_mp_stop (dev,info,wrqu,extra); + break; + + case MP_BANDWIDTH: + DBG_871X("set case mp_bandwidth \n"); + rtw_mp_bandwidth (dev,info,wrqu,extra); + break; + + case MP_RESET_STATS: + DBG_871X("set case MP_RESET_STATS \n"); + rtw_mp_reset_stats (dev,info,wrqu,extra); + break; + + case MP_SetRFPathSwh: + DBG_871X("set MP_SetRFPathSwitch \n"); + rtw_mp_SetRFPath (dev,info,wrqu,extra); + break; + case WRITE_REG: rtw_mp_write_reg(dev, info, wrqu, extra); break; @@ -11432,6 +11429,10 @@ static int rtw_mp_get(struct net_device *dev, DBG_871X("mp_get MP_RX\n"); rtw_mp_rx(dev, info, wdata, extra); break; + case MP_HW_TX_MODE: + DBG_871X("mp_get MP_HW_TX_MODE\n"); + rtw_mp_hwtx(dev, info, wdata, extra); + break; #if defined(CONFIG_RTL8723B) case MP_SetBT: DBG_871X("set MP_SetBT\n"); @@ -11684,6 +11685,7 @@ static int rtw_tdls_ch_switch(struct net_device *dev, union iwreq_data *wrqu, char *extra) { int ret = 0; + u8 tmp; #ifdef CONFIG_TDLS #ifdef CONFIG_TDLS_CH_SW @@ -11691,12 +11693,13 @@ static int rtw_tdls_ch_switch(struct net_device *dev, struct tdls_ch_switch *pchsw_info = &padapter->tdlsinfo.chsw_info; u8 i, j; struct sta_info *ptdls_sta = NULL; + u8 take_care_iqk; DBG_8192C( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); - if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE) + if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) { - DBG_871X("Can't do TDLS channel switch since ch_switch_prohibited = _TRUE\n"); + DBG_871X("TDLS channel switch is not allowed\n"); return ret; } @@ -11717,6 +11720,22 @@ static int rtw_tdls_ch_switch(struct net_device *dev, DBG_871X( "TDLS peer not found\n"); } + rtw_pm_set_lps(padapter, PS_MODE_ACTIVE); + + rtw_hal_get_hwreg(padapter, HW_VAR_CH_SW_NEED_TO_TAKE_CARE_IQK_INFO, &take_care_iqk); + if (take_care_iqk == _TRUE) { + u8 central_chnl; + u8 bw_mode; + + bw_mode = (pchsw_info->ch_offset) ? CHANNEL_WIDTH_40 : CHANNEL_WIDTH_20; + central_chnl = rtw_get_center_ch(pchsw_info->off_ch_num, bw_mode, pchsw_info->ch_offset); + if (rtw_hal_ch_sw_iqk_info_search(padapter, central_chnl, bw_mode) >= 0) + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_START); + else + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_PREPARE); + } + else + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_START); //issue_tdls_ch_switch_req(padapter, ptdls_sta); /* DBG_871X("issue tdls ch switch req\n"); */ @@ -11746,9 +11765,9 @@ static int rtw_tdls_ch_switch_off(struct net_device *dev, DBG_871X( "[%s] %s %d\n", __FUNCTION__, extra, wrqu->data.length -1 ); - if (padapter->tdlsinfo.ch_switch_prohibited == _TRUE) + if (rtw_tdls_is_chsw_allowed(padapter) == _FALSE) { - DBG_871X("Can't do TDLS channel switch since ch_switch_prohibited = _TRUE\n"); + DBG_871X("TDLS channel switch is not allowed\n"); return ret; } @@ -11758,23 +11777,24 @@ static int rtw_tdls_ch_switch_off(struct net_device *dev, ptdls_sta = rtw_get_stainfo(&padapter->stapriv, mac_addr); } - if (padapter->mlmeextpriv.cur_channel != rtw_get_oper_ch(padapter)) { - SelectChannel(padapter, padapter->mlmeextpriv.cur_channel); - } + if (ptdls_sta == NULL) + return ret; + + rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_CH_SW_END_TO_BASE_CHNL); pchsw_info->ch_sw_state &= ~(TDLS_CH_SW_INITIATOR_STATE | TDLS_CH_SWITCH_ON_STATE | TDLS_PEER_AT_OFF_STATE); - ATOMIC_SET(&pchsw_info->chsw_on, _FALSE); _rtw_memset(pchsw_info->addr, 0x00, ETH_ALEN); - if (ptdls_sta != NULL) { - ptdls_sta->ch_switch_time = 0; - ptdls_sta->ch_switch_timeout = 0; - _cancel_timer_ex(&ptdls_sta->ch_sw_timer); - _cancel_timer_ex(&ptdls_sta->delay_timer); - } + ptdls_sta->ch_switch_time = 0; + ptdls_sta->ch_switch_timeout = 0; + _cancel_timer_ex(&ptdls_sta->ch_sw_timer); + _cancel_timer_ex(&ptdls_sta->delay_timer); + _cancel_timer_ex(&ptdls_sta->stay_on_base_chnl_timer); + _cancel_timer_ex(&ptdls_sta->ch_sw_monitor_timer); + rtw_pm_set_lps(padapter, PS_MODE_MAX); #endif /* CONFIG_TDLS_CH_SW */ #endif /* CONFIG_TDLS */ @@ -11843,7 +11863,20 @@ static int rtw_tdls_ch_offset(struct net_device *dev, DBG_8192C("[%s] ch_offset:%s\n", __FUNCTION__, extra); extra[ wrqu->data.length ] = 0x00; - ptdlsinfo->chsw_info.ch_offset = rtw_atoi( extra ); + switch (rtw_atoi(extra)) + { + case SCA: + ptdlsinfo->chsw_info.ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; + break; + + case SCB: + ptdlsinfo->chsw_info.ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; + break; + + default: + ptdlsinfo->chsw_info.ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; + break; + } return ret; @@ -13221,13 +13254,13 @@ static const struct iw_priv_args rtw_private_args[] = { { SIOCIWFIRSTPRIV + 0x0E, IW_PRIV_TYPE_CHAR | 1024, 0 , ""}, //set { SIOCIWFIRSTPRIV + 0x0F, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , ""},//get /* --- sub-ioctls definitions --- */ - { MP_START , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_start" }, //set + { MP_START , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_start" }, //set { MP_PHYPARA, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_phypara" },//get - { MP_STOP , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_stop" }, //set + { MP_STOP , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_stop" }, //set { MP_CHANNEL , IW_PRIV_TYPE_CHAR | 1024 , IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_channel" },//get - { MP_BANDWIDTH , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_bandwidth"}, //set + { MP_BANDWIDTH , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_bandwidth"}, //set { MP_RATE , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rate" },//get - { MP_RESET_STATS , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_reset_stats"}, + { MP_RESET_STATS , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_reset_stats"}, { MP_QUERY , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK , "mp_query"}, //get { READ_REG , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "read_reg" }, { MP_RATE , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rate" }, @@ -13244,10 +13277,10 @@ static const struct iw_priv_args rtw_private_args[] = { { MP_THER , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_ther"}, { EFUSE_SET, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_set" }, { EFUSE_GET, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_get" }, - { MP_PWRTRK , IW_PRIV_TYPE_CHAR | 1024, 0, "mp_pwrtrk"}, + { MP_PWRTRK , IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_pwrtrk"}, { MP_QueryDrvStats, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_drvquery" }, { MP_IOCTL, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_ioctl"}, // mp_ioctl - { MP_SetRFPathSwh, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_setrfpath" }, + { MP_SetRFPathSwh, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_setrfpath" }, { MP_PwrCtlDM, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_pwrctldm" }, { MP_GET_TXPOWER_INX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_get_txpower" }, { MP_GETVER, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_priv_ver" }, @@ -13256,6 +13289,7 @@ static const struct iw_priv_args rtw_private_args[] = { { EFUSE_FILE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "efuse_file" }, { MP_TX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_tx" }, { MP_RX, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_rx" }, + { MP_HW_TX_MODE, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_hxtx" }, #if defined(CONFIG_RTL8723B) { MP_SetBT, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "mp_setbt" }, { MP_DISABLE_BT_COEXIST, IW_PRIV_TYPE_CHAR | 1024, 0, "mp_disa_btcoex"}, diff --git a/rtl8188FU/os_dep/linux/ioctl_mp.c b/rtl8188FU/os_dep/linux/ioctl_mp.c index 2e62bbf..a399795 100755 --- a/rtl8188FU/os_dep/linux/ioctl_mp.c +++ b/rtl8188FU/os_dep/linux/ioctl_mp.c @@ -364,6 +364,7 @@ int rtw_mp_start(struct net_device *dev, struct iw_request_info *info, struct iw_point *wrqu, char *extra) { + int ret = 0; u8 val8; PADAPTER padapter = rtw_netdev_priv(dev); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); @@ -372,45 +373,15 @@ int rtw_mp_start(struct net_device *dev, rtw_pm_set_ips(padapter, IPS_NONE); LeaveAllPowerSaveMode(padapter); - if (padapter->registrypriv.mp_mode == 0) { - rtw_hal_deinit(padapter); - padapter->registrypriv.mp_mode = 1; - #ifdef CONFIG_RF_GAIN_OFFSET - if (!IS_HARDWARE_TYPE_8814A(padapter)) - padapter->registrypriv.RegRfKFreeEnable = 1; - rtw_hal_read_chip_info(padapter); - #endif /*CONFIG_RF_GAIN_OFFSET*/ - rtw_hal_init(padapter); - } - - if (padapter->registrypriv.mp_mode == 0) - return -EPERM; - - if (padapter->mppriv.mode == MP_OFF) { - if (mp_start_test(padapter) == _FAIL) - return -EPERM; - padapter->mppriv.mode = MP_ON; - MPT_PwrCtlDM(padapter, 0); - } - 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 -#ifdef CONFIG_FOR_RTL8723BS_VQ0 - rtw_write32(padapter, 0x765, 0x0000); - rtw_write32(padapter, 0x948, 0x0280); -#endif - rtw_write8(padapter, 0x66, 0x27); /*Open BT uart Log*/ - rtw_write8(padapter, 0xc50, 0x20); /*for RX init Gain*/ -#endif - ODM_Write_DIG(&pHalData->odmpriv, 0x20); + if (rtw_mp_cmd(padapter, MP_START, RTW_CMDF_WAIT_ACK) != _SUCCESS) + ret = -EPERM; + - return 0; + _rtw_memset(extra, 0, wrqu->length); + sprintf(extra, "mp_start %s\n", ret == 0 ? "ok" : "fail"); + wrqu->length = strlen(extra); + + return ret; } @@ -419,23 +390,18 @@ int rtw_mp_stop(struct net_device *dev, struct iw_request_info *info, struct iw_point *wrqu, char *extra) { + int ret = 0; PADAPTER padapter = rtw_netdev_priv(dev); struct hal_ops *pHalFunc = &padapter->HalFunc; - if (padapter->registrypriv.mp_mode == 1) { - - MPT_DeInitAdapter(padapter); - pHalFunc->hal_deinit(padapter); - padapter->registrypriv.mp_mode = 0; - pHalFunc->hal_init(padapter); - } + if (rtw_mp_cmd(padapter, MP_STOP, RTW_CMDF_WAIT_ACK) != _SUCCESS) + ret = -EPERM; - if (padapter->mppriv.mode != MP_OFF) { - mp_stop_test(padapter); - padapter->mppriv.mode = MP_OFF; - } + _rtw_memset(extra, 0, wrqu->length); + sprintf(extra, "mp_stop %s\n", ret == 0 ? "ok" : "fail"); + wrqu->length = strlen(extra); - return 0; + return ret; } @@ -452,14 +418,16 @@ int rtw_mp_rate(struct net_device *dev, return -EFAULT; rate = rtw_mpRateParseFunc(padapter, input); + padapter->mppriv.rateidx = rate; if (rate == 0 && strcmp(input, "1M") != 0) { rate = rtw_atoi(input); - if (rate <= 0x7f) + padapter->mppriv.rateidx = MRateToHwRate(rate); + /*if (rate <= 0x7f) rate = wifirate2_ratetbl_inx((u8)rate); else if (rate < 0xC8) - rate = (rate - 0x80 + MPT_RATE_MCS0); - /*HT rate 0x80(MCS0) ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159 + rate = (rate - 0x79 + MPT_RATE_MCS0); + HT rate 0x80(MCS0) ~ 0x8F(MCS15) ~ 0x9F(MCS31) 128~159 VHT1SS~2SS rate 0xA0 (VHT1SS_MCS0 44) ~ 0xB3 (VHT2SS_MCS9 #63) 160~179 VHT rate 0xB4 (VHT3SS_MCS0 64) ~ 0xC7 (VHT2SS_MCS9 #83) 180~199 else @@ -469,14 +437,13 @@ int rtw_mp_rate(struct net_device *dev, } _rtw_memset(extra, 0, wrqu->length); - sprintf(extra, "Set data rate to %s index %d" , input, rate); - DBG_871X("%s: %s rate index=%d\n", __func__, input, rate); + sprintf(extra, "Set data rate to %s index %d" , input, padapter->mppriv.rateidx); + DBG_871X("%s: %s rate index=%d\n", __func__, input, padapter->mppriv.rateidx); - if (rate >= MPT_RATE_LAST) + if (padapter->mppriv.rateidx >= DESC_RATEVHTSS4MCS9) return -EINVAL; - padapter->mppriv.rateidx = rate; - pMptCtx->MptRateIndex = rate; + pMptCtx->MptRateIndex = HwRateToMPTRate(padapter->mppriv.rateidx); SetDataRate(padapter); wrqu->length = strlen(extra); @@ -519,8 +486,12 @@ int rtw_mp_bandwidth(struct net_device *dev, int cur_ch_offset; PADAPTER padapter = rtw_netdev_priv(dev); HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + u8 input[wrqu->length]; + + if (copy_from_user(input, wrqu->pointer, wrqu->length)) + return -EFAULT; - if (sscanf(extra, "40M=%d,shortGI=%d", &bandwidth, &sg) > 0) + if (sscanf(input, "40M=%d,shortGI=%d", &bandwidth, &sg) > 0) DBG_871X("%s: bw=%d sg=%d\n", __func__, bandwidth , sg); if (bandwidth == 1) @@ -530,11 +501,14 @@ int rtw_mp_bandwidth(struct net_device *dev, padapter->mppriv.bandwidth = (u8)bandwidth; padapter->mppriv.preamble = sg; + _rtw_memset(extra, 0, wrqu->length); + sprintf(extra, "Change BW %d to BW %d\n", pHalData->CurrentChannelBW , bandwidth); SetBandwidth(padapter); pHalData->CurrentChannelBW = bandwidth; /*cur_ch_offset = rtw_get_offset_by_ch(padapter->mppriv.channel);*/ /*set_channel_bwmode(padapter, padapter->mppriv.channel, cur_ch_offset, bandwidth);*/ + wrqu->length = strlen(extra); return 0; } @@ -741,7 +715,13 @@ int rtw_mp_ctx(struct net_device *dev, return -EFAULT; DBG_871X("%s: in=%s\n", __func__, extra); - +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->adapter_type == SECONDARY_ADAPTER) { + sprintf(extra, "Error: MP mode can't support Virtual Adapter, Please to use main Adapter.\n"); + wrqu->length = strlen(extra); + return 0; + } +#endif countPkTx = strncmp(extra, "count=", 5); /* strncmp TRUE is 0*/ cotuTx = strncmp(extra, "background", 20); CarrSprTx = strncmp(extra, "background,cs", 20); @@ -783,8 +763,10 @@ int rtw_mp_ctx(struct net_device *dev, bStartTest = 0; /* To set Stop*/ pmp_priv->tx.stop = 1; sprintf(extra, "Stop continuous Tx"); + ODM_Write_DIG(&pHalData->odmpriv, 0x20); } else { bStartTest = 1; + ODM_Write_DIG(&pHalData->odmpriv, 0x7f); if (pmp_priv->mode != MP_ON) { if (pmp_priv->tx.stop != 1) { DBG_871X("%s: MP_MODE != ON %d\n", __func__, pmp_priv->mode); @@ -859,7 +841,7 @@ int rtw_mp_arx(struct net_device *dev, struct iw_point *wrqu, char *extra) { int bStartRx = 0, bStopRx = 0, bQueryPhy = 0, bQueryMac = 0, bSetBssid = 0; - int bmac_filter = 0, bfilter_init = 0, bmon = 0, bSmpCfg = 0; + int bmac_filter = 0, bfilter_init = 0, bmon = 0, bSmpCfg = 0, bloopbk = 0; u8 input[wrqu->length]; char *pch, *ptmp, *token, *tmp[2] = {0x00, 0x00}; u32 i = 0, ii = 0, jj = 0, kk = 0, cnts = 0, ret; @@ -871,7 +853,13 @@ int rtw_mp_arx(struct net_device *dev, return -EFAULT; DBG_871X("%s: %s\n", __func__, input); - +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->adapter_type == SECONDARY_ADAPTER) { + sprintf(extra, "Error: MP mode can't support Virtual Adapter, Please to use main Adapter.\n"); + wrqu->length = strlen(extra); + return 0; + } +#endif bStartRx = (strncmp(input, "start", 5) == 0) ? 1 : 0; /* strncmp TRUE is 0*/ bStopRx = (strncmp(input, "stop", 5) == 0) ? 1 : 0; /* strncmp TRUE is 0*/ bQueryPhy = (strncmp(input, "phy", 3) == 0) ? 1 : 0; /* strncmp TRUE is 0*/ @@ -881,6 +869,7 @@ int rtw_mp_arx(struct net_device *dev, bmac_filter = (strncmp(input, "accept_mac", 10) == 0) ? 1 : 0; bmon = (strncmp(input, "mon=", 4) == 0) ? 1 : 0; bSmpCfg = (strncmp(input , "smpcfg=" , 7) == 0) ? 1 : 0; + pmppriv->bloopback = (strncmp(input, "loopbk", 6) == 0) ? 1 : 0; /* strncmp TRUE is 0*/ if (bSetBssid == 1) { pch = input; @@ -979,6 +968,14 @@ int rtw_mp_arx(struct net_device *dev, } } + if (pmppriv->bloopback == _TRUE) { + sprintf(extra , "Enter MAC LoopBack mode\n"); + _rtw_write32(padapter, 0x100, 0xB0106FF); + DBG_871X("0x100 :0x%x" , _rtw_read32(padapter, 0x100)); + _rtw_write16(padapter, 0x608, 0x30c); + DBG_871X("0x100 :0x%x" , _rtw_read32(padapter, 0x608)); + } + wrqu->length = strlen(extra) + 1; return 0; @@ -991,8 +988,14 @@ int rtw_mp_trx_query(struct net_device *dev, { u32 txok, txfail, rxok, rxfail, rxfilterout; PADAPTER padapter = rtw_netdev_priv(dev); + PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx); + RT_PMAC_TX_INFO PMacTxInfo = pMptCtx->PMacTxInfo; + + if (PMacTxInfo.bEnPMacTx == TRUE) + txok = hal_mpt_query_phytxok(padapter); + else + txok = padapter->mppriv.tx.sended; - txok = padapter->mppriv.tx.sended; txfail = 0; rxok = padapter->mppriv.rx_pktcount; rxfail = padapter->mppriv.rx_crcerrpktcount; @@ -1144,6 +1147,10 @@ int rtw_mp_reset_stats(struct net_device *dev, rtw_reset_phy_rx_counters(padapter); rtw_reset_mac_rx_counters(padapter); + _rtw_memset(extra, 0, wrqu->length); + sprintf(extra, "mp_reset_stats ok\n"); + wrqu->length = strlen(extra); + return 0; } @@ -1204,27 +1211,34 @@ int rtw_mp_phypara(struct net_device *dev, int rtw_mp_SetRFPath(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) + struct iw_point *wrqu, char *extra) { PADAPTER padapter = rtw_netdev_priv(dev); - char input[wrqu->data.length]; + char input[wrqu->length]; int bMain = 1, bTurnoff = 1; - if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) - return -EFAULT; DBG_871X("%s:iwpriv in=%s\n", __func__, input); + if (copy_from_user(input, wrqu->pointer, wrqu->length)) + return -EFAULT; + bMain = strncmp(input, "1", 2); /* strncmp TRUE is 0*/ bTurnoff = strncmp(input, "0", 3); /* strncmp TRUE is 0*/ + _rtw_memset(extra, 0, wrqu->length); + if (bMain == 0) { MP_PHY_SetRFPathSwitch(padapter, _TRUE); DBG_871X("%s:PHY_SetRFPathSwitch=TRUE\n", __func__); + sprintf(extra, "mp_setrfpath Main\n"); } else if (bTurnoff == 0) { MP_PHY_SetRFPathSwitch(padapter, _FALSE); DBG_871X("%s:PHY_SetRFPathSwitch=FALSE\n", __func__); + sprintf(extra, "mp_setrfpath Aux\n"); } + wrqu->length = strlen(extra); + return 0; } @@ -1344,7 +1358,7 @@ int rtw_mp_mon(struct net_device *dev, /*rtw_disassoc_cmd(padapter, 0, _TRUE);*/ if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { rtw_disassoc_cmd(padapter, 500, _TRUE); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); /*rtw_free_assoc_resources(padapter, 1);*/ } rtw_pm_set_ips(padapter, IPS_NORMAL); @@ -1388,7 +1402,7 @@ int rtw_mp_pretx_proc(PADAPTER padapter, u8 bStartTest, char *extra) break; case MP_CARRIER_SUPPRISSION_TX: if (bStartTest != 0) { - if (pmp_priv->rateidx <= MPT_RATE_11M) + if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_11M) sprintf(extra, "%s\nStart continuous DA=ffffffffffff len=1500\n infinite=yes.", extra); else sprintf(extra, "%s\nSpecify carrier suppression but not CCK rate", extra); @@ -1444,14 +1458,22 @@ int rtw_mp_tx(struct net_device *dev, HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mp_priv *pmp_priv = &padapter->mppriv; PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx); + struct registry_priv *pregistrypriv = &padapter->registrypriv; u32 bandwidth = 0, sg = 0, channel = 6, txpower = 40, rate = 108, ant = 0, txmode = 1, count = 0; - u8 i = 0, j = 0, bStartTest = 1, status = 0; + u8 i = 0, j = 0, bStartTest = 1, status = 0, Idx = 0, tmpU1B = 0; u16 antenna = 0; if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; DBG_871X("extra = %s\n", extra); +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->adapter_type == SECONDARY_ADAPTER) { + sprintf(extra, "Error: MP mode can't support Virtual Adapter, Please to use main Adapter.\n"); + wrqu->data.length = strlen(extra); + return 0; + } +#endif if (strncmp(extra, "stop", 3) == 0) { bStartTest = 0; /* To set Stop*/ @@ -1465,7 +1487,7 @@ int rtw_mp_tx(struct net_device *dev, DBG_871X("Got Count=%d]\n", count); pmp_priv->tx.count = count; return 0; - } else if (strncmp(extra, "setting", 5) == 0) { + } else if (strncmp(extra, "setting", 7) == 0) { _rtw_memset(extra, 0, wrqu->data.length); sprintf(extra, "Current Setting :\n Channel:%d", pmp_priv->channel); sprintf(extra, "%s\n Bandwidth:%d", extra, pmp_priv->bandwidth); @@ -1476,6 +1498,136 @@ int rtw_mp_tx(struct net_device *dev, sprintf(extra, "%s\n MP Mode:%d", extra, pmp_priv->mode); wrqu->data.length = strlen(extra); return 0; +#ifdef CONFIG_MP_VHT_HW_TX_MODE + } else if (strncmp(extra, "pmact", 5) == 0) { + if (strncmp(extra, "pmact=", 6) == 0) { + _rtw_memset(&pMptCtx->PMacTxInfo, 0, sizeof(pMptCtx->PMacTxInfo)); + if (strncmp(extra, "pmact=start", 11) == 0) { + pMptCtx->PMacTxInfo.bEnPMacTx = _TRUE; + sprintf(extra, "Set PMac Tx Mode start\n"); + } else { + pMptCtx->PMacTxInfo.bEnPMacTx = _FALSE; + sprintf(extra, "Set PMac Tx Mode Stop\n"); + } + if (pMptCtx->bldpc == TRUE) + pMptCtx->PMacTxInfo.bLDPC = _TRUE; + + if (pMptCtx->bstbc == TRUE) + pMptCtx->PMacTxInfo.bSTBC = _TRUE; + + pMptCtx->PMacTxInfo.bSPreamble = pmp_priv->preamble; + pMptCtx->PMacTxInfo.bSGI = pmp_priv->preamble; + pMptCtx->PMacTxInfo.BandWidth = pmp_priv->bandwidth; + pMptCtx->PMacTxInfo.TX_RATE = HwRateToMPTRate(pmp_priv->rateidx); + + pMptCtx->PMacTxInfo.Mode = pMptCtx->HWTxmode; + + pMptCtx->PMacTxInfo.NDP_sound = FALSE;/*(Adapter.PacketType == NDP_PKT)?TRUE:FALSE;*/ + + if (padapter->mppriv.pktInterval == 0) + pMptCtx->PMacTxInfo.PacketPeriod = 100; + else + pMptCtx->PMacTxInfo.PacketPeriod = padapter->mppriv.pktInterval; + + if (padapter->mppriv.pktLength < 1000) + pMptCtx->PMacTxInfo.PacketLength = 1000; + else + pMptCtx->PMacTxInfo.PacketLength = padapter->mppriv.pktLength; + + pMptCtx->PMacTxInfo.PacketPattern = rtw_random32() % 0xFF; + + if (padapter->mppriv.tx_pktcount != 0) + pMptCtx->PMacTxInfo.PacketCount = padapter->mppriv.tx_pktcount; + + pMptCtx->PMacTxInfo.Ntx = 0; + for (Idx = 16; Idx < 20; Idx++) { + tmpU1B = (padapter->mppriv.antenna_tx >> Idx) & 1; + if (tmpU1B) + pMptCtx->PMacTxInfo.Ntx++; + } + + _rtw_memset(pMptCtx->PMacTxInfo.MacAddress, 0xFF, ETH_ALEN); + + PMAC_Get_Pkt_Param(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo); + + if (MPT_IS_CCK_RATE(pMptCtx->PMacTxInfo.TX_RATE)) { + + CCK_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo); + } else { + PMAC_Nsym_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo); + /* 24 BIT*/ + L_SIG_generator(pMptCtx->PMacPktInfo.N_sym, &pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo); + } + /* 48BIT*/ + if (MPT_IS_HT_RATE(pMptCtx->PMacTxInfo.TX_RATE)) + HT_SIG_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo); + else if (MPT_IS_VHT_RATE(pMptCtx->PMacTxInfo.TX_RATE)) { + /* 48BIT*/ + VHT_SIG_A_generator(&pMptCtx->PMacTxInfo, &pMptCtx->PMacPktInfo); + + /* 26/27/29 BIT & CRC 8 BIT*/ + VHT_SIG_B_generator(&pMptCtx->PMacTxInfo); + + /* 32 BIT*/ + VHT_Delimiter_generator(&pMptCtx->PMacTxInfo); + } + + mpt_ProSetPMacTx(padapter); + + } else if (strncmp(extra, "pmact,mode=", 11) == 0) { + int txmode = 0; + + if (sscanf(extra, "pmact,mode=%d", &txmode) > 0) { + if (txmode == 1) { + pMptCtx->HWTxmode = CONTINUOUS_TX; + sprintf(extra, "\t Config HW Tx mode = CONTINUOUS_TX\n"); + } else if (txmode == 2) { + pMptCtx->HWTxmode = OFDM_Single_Tone_TX; + sprintf(extra, "\t Config HW Tx mode = OFDM_Single_Tone_TX\n"); + } else { + pMptCtx->HWTxmode = PACKETS_TX; + sprintf(extra, "\t Config HW Tx mode = PACKETS_TX\n"); + } + } else { + pMptCtx->HWTxmode = PACKETS_TX; + sprintf(extra, "\t Config HW Tx mode=\n 0 = PACKETS_TX\n 1 = CONTINUOUS_TX\n 2 = OFDM_Single_Tone_TX"); + } + } else if (strncmp(extra, "pmact,", 6) == 0) { + int PacketPeriod = 0, PacketLength = 0, PacketCout = 0; + int bldpc = 0, bstbc = 0; + + if (sscanf(extra, "pmact,period=%d", &PacketPeriod) > 0) { + padapter->mppriv.pktInterval = PacketPeriod; + DBG_871X("PacketPeriod=%d\n", padapter->mppriv.pktInterval); + sprintf(extra, "PacketPeriod [1~255]= %d\n", padapter->mppriv.pktInterval); + + } else if (sscanf(extra, "pmact,length=%d", &PacketLength) > 0) { + padapter->mppriv.pktLength = PacketLength; + DBG_871X("PacketPeriod=%d\n", padapter->mppriv.pktLength); + sprintf(extra, "PacketLength[~65535]=%d\n", padapter->mppriv.pktLength); + + } else if (sscanf(extra, "pmact,count=%d", &PacketCout) > 0) { + padapter->mppriv.tx_pktcount = PacketCout; + DBG_871X("Packet Cout =%d\n", padapter->mppriv.tx_pktcount); + sprintf(extra, "Packet Cout =%d\n", padapter->mppriv.tx_pktcount); + + } else if (sscanf(extra, "pmact,ldpc=%d", &bldpc) > 0) { + pMptCtx->bldpc = bldpc; + DBG_871X("Set LDPC =%d\n", pMptCtx->bldpc); + sprintf(extra, "Set LDPC =%d\n", pMptCtx->bldpc); + + } else if (sscanf(extra, "pmact,stbc=%d", &bstbc) > 0) { + pMptCtx->bstbc = bstbc; + DBG_871X("Set STBC =%d\n", pMptCtx->bstbc); + sprintf(extra, "Set STBC =%d\n", pMptCtx->bstbc); + } else + sprintf(extra, "\n period={1~255}\n length={1000~65535}\n count={0~}\n ldpc={0/1}\n stbc={0/1}"); + + } + + wrqu->data.length = strlen(extra); + return 0; +#endif } else { if (sscanf(extra, "ch=%d,bw=%d,rate=%d,pwr=%d,ant=%d,tx=%d", &channel, &bandwidth, &rate, &txpower, &ant, &txmode) < 6) { @@ -1633,6 +1785,14 @@ int rtw_mp_rx(struct net_device *dev, if (copy_from_user(extra, wrqu->data.pointer, wrqu->data.length)) return -EFAULT; +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->adapter_type == SECONDARY_ADAPTER) { + sprintf(extra, "Error: MP mode can't support Virtual Adapter, Please to use main Adapter.\n"); + wrqu->data.length = strlen(extra); + return 0; + } +#endif + if (strncmp(extra, "stop", 4) == 0) { _rtw_memset(extra, 0, wrqu->data.length); SetPacketRx(padapter, bStartRx, _FALSE); @@ -1730,6 +1890,33 @@ int rtw_mp_rx(struct net_device *dev, } +int rtw_mp_hwtx(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + PADAPTER padapter = rtw_netdev_priv(dev); + HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); + struct mp_priv *pmp_priv = &padapter->mppriv; + PMPT_CONTEXT pMptCtx = &(padapter->mppriv.MptCtx); + +#if defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8821B) || defined(CONFIG_RTL8822B) + u8 input[wrqu->data.length]; + + if (copy_from_user(input, wrqu->data.pointer, wrqu->data.length)) + return -EFAULT; + + _rtw_memset(&pMptCtx->PMacTxInfo, 0, sizeof(RT_PMAC_TX_INFO)); + _rtw_memcpy((void *)&pMptCtx->PMacTxInfo, (void *)input, sizeof(RT_PMAC_TX_INFO)); + + mpt_ProSetPMacTx(padapter); + sprintf(extra, "Set PMac Tx Mode start\n"); + + wrqu->data.length = strlen(extra); +#endif + return 0; + +} + int rtw_efuse_mask_file(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) diff --git a/rtl8188FU/os_dep/linux/mlme_linux.c b/rtl8188FU/os_dep/linux/mlme_linux.c index dd52afa..c3edb3a 100755 --- a/rtl8188FU/os_dep/linux/mlme_linux.c +++ b/rtl8188FU/os_dep/linux/mlme_linux.c @@ -253,7 +253,7 @@ void rtw_reset_securitypriv( _adapter *adapter ) DBG_871X(FUNC_ADPT_FMT" - End to Disconnect\n", FUNC_ADPT_ARG(adapter)); } -void rtw_os_indicate_disconnect( _adapter *adapter ) +void rtw_os_indicate_disconnect(_adapter *adapter, u16 reason, u8 locally_generated) { //RT_PMKID_LIST backupPMKIDList[ NUM_PMKID_CACHE ]; @@ -262,7 +262,7 @@ _func_enter_; netif_carrier_off(adapter->pnetdev); // Do it first for tx broadcast pkt after disconnection issue! #ifdef CONFIG_IOCTL_CFG80211 - rtw_cfg80211_indicate_disconnect(adapter); + rtw_cfg80211_indicate_disconnect(adapter, reason, locally_generated); #endif //CONFIG_IOCTL_CFG80211 rtw_indicate_wx_disassoc_event(adapter); diff --git a/rtl8188FU/os_dep/linux/os_intfs.c b/rtl8188FU/os_dep/linux/os_intfs.c index d3ddbe0..7bfd28e 100755 --- a/rtl8188FU/os_dep/linux/os_intfs.c +++ b/rtl8188FU/os_dep/linux/os_intfs.c @@ -100,9 +100,9 @@ int rtw_uapsd_acbe_en = 0; int rtw_uapsd_acvi_en = 0; int rtw_uapsd_acvo_en = 0; #ifdef CONFIG_RTL8814A -int rtw_rfkfree_enable = 2; /* disable kfree */ +int rtw_pwrtrim_enable = 2; /* disable kfree , rename to power trim disable */ #else -int rtw_rfkfree_enable = 0; /* Default Enalbe kfree by efuse config */ +int rtw_pwrtrim_enable = 0; /* Default Enalbe power trim by efuse config */ #endif #ifdef CONFIG_80211N_HT int rtw_ht_enable = 1; @@ -110,7 +110,7 @@ int rtw_ht_enable = 1; // 2.4G use bit 0 ~ 3, 5G use bit 4 ~ 7 // 0x21 means enable 2.4G 40MHz & 5G 80MHz int rtw_bw_mode = 0x21; -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_ampdu_enable = 1;//for enable tx_ampdu ,// 0: disable, 0x1:enable 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 . There is an IOT issu with DLINK DIR-629 when the flag turn on // Short GI support Bit Map @@ -150,7 +150,14 @@ int rtw_wifi_spec = 0; int rtw_special_rf_path = 0; //0: 2T2R ,1: only turn on path A 1T1R +char rtw_country_unspecified[] = {0xFF, 0xFF, 0x00}; +char *rtw_country_code = rtw_country_unspecified; +module_param(rtw_country_code, charp, 0644); +MODULE_PARM_DESC(rtw_country_code, "The default country code (in alpha2)"); + int rtw_channel_plan = RTW_CHPLAN_MAX; +module_param(rtw_channel_plan, int, 0644); +MODULE_PARM_DESC(rtw_channel_plan, "The default chplan ID when rtw_alpha2 is not specified or valid"); /*if concurrent softap + p2p(GO) is needed, this param lets p2p response full channel list. But Softap must be SHUT DOWN once P2P decide to set up connection and become a GO.*/ @@ -249,9 +256,8 @@ int rtw_ext_iface_num = 1;//primary/secondary iface is excluded module_param(rtw_ext_iface_num, int, 0644); #endif //CONFIG_MULTI_VIR_IFACES -module_param(rtw_rfkfree_enable, int, 0644); +module_param(rtw_pwrtrim_enable, int, 0644); module_param(rtw_initmac, charp, 0644); -module_param(rtw_channel_plan, int, 0644); module_param(rtw_special_rf_path, int, 0644); module_param(rtw_chip_version, int, 0644); module_param(rtw_rfintfs, int, 0644); @@ -407,10 +413,6 @@ uint rtw_FileMaskEfuse = 0; module_param(rtw_FileMaskEfuse, uint, 0644); MODULE_PARM_DESC(rtw_FileMaskEfuse, "default drv Mask Efuse value:0"); -uint rtw_kfree = 0; -module_param(rtw_kfree, uint, 0644); -MODULE_PARM_DESC(rtw_kfree, "default kfree config value:0"); - uint rtw_pll_ref_clk_sel = CONFIG_RTW_PLL_REF_CLK_SEL; module_param(rtw_pll_ref_clk_sel, uint, 0644); MODULE_PARM_DESC(rtw_pll_ref_clk_sel, "force pll_ref_clk_sel, 0xF:use autoload value"); @@ -604,7 +606,7 @@ _func_enter_; registry_par->uapsd_acvi_en = (u8)rtw_uapsd_acvi_en; registry_par->uapsd_acvo_en = (u8)rtw_uapsd_acvo_en; - registry_par->RegRfKFreeEnable = (u8)rtw_rfkfree_enable; + registry_par->RegPwrTrimEnable = (u8)rtw_pwrtrim_enable; #ifdef CONFIG_80211N_HT registry_par->ht_enable = (u8)rtw_ht_enable; @@ -636,6 +638,16 @@ _func_enter_; registry_par->wifi_spec = (u8)rtw_wifi_spec; + if (strlen(rtw_country_code) != 2 + || is_alpha(rtw_country_code[0]) == _FALSE + || is_alpha(rtw_country_code[1]) == _FALSE + ) { + if (rtw_country_code != rtw_country_unspecified) + DBG_871X_LEVEL(_drv_err_, "%s discard rtw_country_code not in alpha2\n", __func__); + _rtw_memset(registry_par->alpha2, 0xFF, 2); + } else + _rtw_memcpy(registry_par->alpha2, rtw_country_code, 2); + registry_par->channel_plan = (u8)rtw_channel_plan; registry_par->special_rf_path = (u8)rtw_special_rf_path; @@ -917,7 +929,13 @@ static int rtw_ndev_notifier_call(struct notifier_block * nb, unsigned long stat struct net_device *dev = ptr; #endif + if (dev == NULL) + return NOTIFY_DONE; + #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,29)) + if (dev->netdev_ops == NULL) + return NOTIFY_DONE; + if (dev->netdev_ops->ndo_do_ioctl == NULL) return NOTIFY_DONE; @@ -1502,6 +1520,7 @@ struct dvobj_priv *devobj_init(void) _rtw_mutex_init(&pdvobj->h2c_fwcmd_mutex); _rtw_mutex_init(&pdvobj->setch_mutex); _rtw_mutex_init(&pdvobj->setbw_mutex); + _rtw_mutex_init(&pdvobj->rf_read_reg_mutex); #ifdef CONFIG_SDIO_INDIRECT_ACCESS _rtw_mutex_init(&pdvobj->sd_indirect_access_mutex); #endif @@ -1532,6 +1551,7 @@ void devobj_deinit(struct dvobj_priv *pdvobj) _rtw_mutex_free(&pdvobj->h2c_fwcmd_mutex); _rtw_mutex_free(&pdvobj->setch_mutex); _rtw_mutex_free(&pdvobj->setbw_mutex); + _rtw_mutex_free(&pdvobj->rf_read_reg_mutex); #ifdef CONFIG_SDIO_INDIRECT_ACCESS _rtw_mutex_free(&pdvobj->sd_indirect_access_mutex); #endif @@ -1708,8 +1728,9 @@ _func_enter_; #endif rtw_hal_dm_init(padapter); +#ifdef CONFIG_SW_LED rtw_hal_sw_led_init(padapter); - +#endif #ifdef DBG_CONFIG_ERROR_DETECT rtw_hal_sreset_init(padapter); #endif @@ -2104,7 +2125,6 @@ void rtw_drv_stop_vir_if(_adapter *padapter) pnetdev = padapter->pnetdev; - rtw_cancel_all_timer(padapter); if (padapter->bup == _TRUE) { @@ -2122,6 +2142,9 @@ void rtw_drv_stop_vir_if(_adapter *padapter) padapter->bup = _FALSE; } + + /* cancel timer after thread stop */ + rtw_cancel_all_timer(padapter); } void rtw_drv_free_vir_if(_adapter *padapter) @@ -2447,7 +2470,6 @@ void rtw_drv_if2_stop(_adapter *if2) if (padapter == NULL) return; - rtw_cancel_all_timer(padapter); if (padapter->bup == _TRUE) { #ifdef CONFIG_XMIT_ACK @@ -2464,6 +2486,9 @@ void rtw_drv_if2_stop(_adapter *if2) padapter->bup = _FALSE; } + + /* cancel timer after thread stop */ + rtw_cancel_all_timer(padapter); } #endif //end of CONFIG_CONCURRENT_MODE @@ -2964,7 +2989,7 @@ static int netdev_close(struct net_device *pnetdev) LeaveAllPowerSaveMode(padapter); rtw_disassoc_cmd(padapter, 500, _FALSE); //s2-2. indicate disconnect to os - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); //s2-3. rtw_free_assoc_resources(padapter, 1); //s2-4. @@ -3432,7 +3457,9 @@ void rtw_dev_unload(PADAPTER padapter) RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("%s: bup==_FALSE\n",__FUNCTION__)); DBG_871X("%s: bup==_FALSE\n",__FUNCTION__); } - + + /* cancel timer after thread stop */ + rtw_cancel_all_timer(padapter); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("-%s\n",__FUNCTION__)); } @@ -3467,7 +3494,7 @@ int rtw_suspend_free_assoc_resource(_adapter *padapter) { rtw_disassoc_cmd(padapter, 0, _FALSE); //s2-2. indicate disconnect to os - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); } #ifdef CONFIG_AP_MODE else if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) @@ -3494,7 +3521,7 @@ int rtw_suspend_free_assoc_resource(_adapter *padapter) if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) { DBG_871X_LEVEL(_drv_always_, "%s: fw_under_linking\n", __FUNCTION__); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); } DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter)); @@ -4065,7 +4092,7 @@ _func_enter_; DBG_871X("%s: disconnect reason: %02x\n", __func__, pwrpriv->wowlan_wake_reason); - rtw_indicate_disconnect(padapter); + rtw_indicate_disconnect(padapter, 0, _FALSE); rtw_sta_media_status_rpt(padapter, rtw_get_stainfo(&padapter->stapriv, @@ -4091,10 +4118,15 @@ _func_enter_; } if (pwrpriv->wowlan_wake_reason == RX_PNOWakeUp) { -#ifdef CONFIG_IOCTL_CFG80211 - cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, - GFP_ATOMIC); +#ifdef CONFIG_IOCTL_CFG80211 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)) + u8 locally_generated = 1; + + cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, locally_generated, GFP_ATOMIC); +#else + cfg80211_disconnected(padapter->pnetdev, 0, NULL, 0, GFP_ATOMIC); #endif +#endif /* CONFIG_IOCTL_CFG80211 */ rtw_lock_ext_suspend_timeout(10000); } @@ -4111,14 +4143,14 @@ _func_enter_; pwrpriv->wowlan_mode =_FALSE; // Power On LED - rtw_hal_sw_led_init(padapter); +#ifdef CONFIG_SW_LED if(pwrpriv->wowlan_wake_reason == Rx_DisAssoc || pwrpriv->wowlan_wake_reason == Rx_DeAuth || pwrpriv->wowlan_wake_reason == FWDecisionDisconnect) rtw_led_control(padapter, LED_CTL_NO_LINK); else rtw_led_control(padapter, LED_CTL_LINK); - +#endif //clean driver side wake up reason. pwrpriv->wowlan_wake_reason = 0; @@ -4255,8 +4287,9 @@ _func_enter_; pwrpriv->wowlan_wake_reason = 0; // Power On LED - rtw_hal_sw_led_init(padapter); +#ifdef CONFIG_SW_LED rtw_led_control(padapter, LED_CTL_LINK); +#endif exit: DBG_871X("<== "FUNC_ADPT_FMT" exit....\n", FUNC_ADPT_ARG(padapter)); _func_exit_; diff --git a/rtl8188FU/os_dep/linux/rtw_proc.c b/rtl8188FU/os_dep/linux/rtw_proc.c index cee446f..dffb383 100755 --- a/rtl8188FU/os_dep/linux/rtw_proc.c +++ b/rtl8188FU/os_dep/linux/rtw_proc.c @@ -146,6 +146,12 @@ static int proc_get_mstat(struct seq_file *m, void *v) } #endif /* DBG_MEM_ALLOC */ +static int proc_get_country_chplan_map(struct seq_file *m, void *v) +{ + dump_country_chplan_map(m); + return 0; +} + static int proc_get_chplan_id_list(struct seq_file *m, void *v) { dump_chplan_id_list(m); @@ -169,6 +175,7 @@ const struct rtw_proc_hdl drv_proc_hdls [] = { #ifdef DBG_MEM_ALLOC {"mstat", proc_get_mstat, NULL}, #endif /* DBG_MEM_ALLOC */ + {"country_chplan_map", proc_get_country_chplan_map, NULL}, {"chplan_id_list", proc_get_chplan_id_list, NULL}, {"chplan_test", proc_get_chplan_test, NULL}, }; @@ -403,6 +410,45 @@ static ssize_t proc_set_gpio(struct file *file, const char __user *buffer, size_ return count; } #endif +static int proc_get_current_tx_rate(struct seq_file *m, void *v) +{ + + struct net_device *dev = m->private; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); + struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); + u8 i; + u8 null_addr[ETH_ALEN] = {0}; + u8 *macaddr; + u8 current_rate_id = 0; + + DBG_871X_SEL_NL(m, "%-5s %-4s %-17s %-7s\n" + , "macid", "if_g", "macaddr", "tx_rate"); + + for (i = 0; i < macid_ctl->num; i++) { + if (rtw_macid_is_used(macid_ctl, i) || macid_ctl->h2c_msr[i]) { + if (macid_ctl->sta[i]) + macaddr = macid_ctl->sta[i]->hwaddr; + else + macaddr = null_addr; + current_rate_id = rtw_get_current_tx_rate(adapter, i); + if (!rtw_macid_is_bmc(macid_ctl, i)) { + DBG_871X_SEL_NL(m, "%5u %4u "MAC_FMT" %s\n" + , i + , rtw_macid_get_if_g(macid_ctl, i) + , MAC_ARG(macaddr) + , HDATA_RATE(current_rate_id) + ); + } + + + } + } + + +return 0; + +} static int proc_get_linked_info_dump(struct seq_file *m, void *v) @@ -415,6 +461,7 @@ static int proc_get_linked_info_dump(struct seq_file *m, void *v) return 0; } + static ssize_t proc_set_linked_info_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) { struct net_device *dev = data; @@ -512,14 +559,9 @@ static ssize_t proc_set_chan_plan(struct file *file, const char __user *buffer, } if (buffer && !copy_from_user(tmp, buffer, count)) { - int num = sscanf(tmp, "%hhx", &chan_plan); - - if (num != 1) { - DBG_871X("invalid read_reg parameter!\n"); + if (num != 1) return count; - } - } rtw_set_channel_plan(padapter, chan_plan); @@ -527,6 +569,48 @@ static ssize_t proc_set_chan_plan(struct file *file, const char __user *buffer, return count; } +static int proc_get_country_code(struct seq_file *m, void *v) +{ + struct net_device *dev = m->private; + _adapter *adapter = (_adapter *)rtw_netdev_priv(dev); + + if (adapter->mlmepriv.country_ent) + dump_country_chplan(m, adapter->mlmepriv.country_ent); + else + DBG_871X_SEL_NL(m, "unspecified\n"); + + return 0; +} + +static ssize_t proc_set_country_code(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); + char tmp[32]; + char alpha2[2]; + int num; + + if (count < 1) + return -EFAULT; + + if (count > sizeof(tmp)) { + rtw_warn_on(1); + return -EFAULT; + } + + if (!buffer || copy_from_user(tmp, buffer, count)) + goto exit; + + num = sscanf(tmp, "%c%c", &alpha2[0], &alpha2[1]); + if (num != 2) + return count; + + rtw_set_country(padapter, alpha2); + +exit: + return count; +} + #ifdef CONFIG_DFS_MASTER ssize_t proc_set_update_non_ocp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) { @@ -651,6 +735,8 @@ static int proc_get_macid_info(struct seq_file *m, void *v) struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); u8 i; + u8 null_addr[ETH_ALEN] = {0}; + u8 *macaddr; DBG_871X_SEL_NL(m, "max_num:%u\n", macid_ctl->num); DBG_871X_SEL_NL(m, "\n"); @@ -659,21 +745,27 @@ static int proc_get_macid_info(struct seq_file *m, void *v) dump_macid_map(m, &macid_ctl->used, macid_ctl->num); DBG_871X_SEL_NL(m, "\n"); - DBG_871X_SEL_NL(m, "%-3s %-3s %-4s %-4s %s" + DBG_871X_SEL_NL(m, "%-3s %-3s %-4s %-4s %-17s %s" "\n" - , "id", "bmc", "if_g", "ch_g", "status" + , "id", "bmc", "if_g", "ch_g", "macaddr", "status" ); for (i=0;i<macid_ctl->num;i++) { if (rtw_macid_is_used(macid_ctl, i) || macid_ctl->h2c_msr[i] ) { - DBG_871X_SEL_NL(m, "%3u %3u %4d %4d "H2C_MSR_FMT" %s" + if (macid_ctl->sta[i]) + macaddr = macid_ctl->sta[i]->hwaddr; + else + macaddr = null_addr; + + DBG_871X_SEL_NL(m, "%3u %3u %4d %4d "MAC_FMT" "H2C_MSR_FMT" %s" "\n" , i , rtw_macid_is_bmc(macid_ctl, i) , rtw_macid_get_if_g(macid_ctl, i) , rtw_macid_get_ch_g(macid_ctl, i) + , MAC_ARG(macaddr) , H2C_MSR_ARG(&macid_ctl->h2c_msr[i]) , rtw_macid_is_used(macid_ctl, i) ? "" : "[unused]" ); @@ -858,7 +950,9 @@ static ssize_t proc_set_tx_power_ext_info(struct file *file, const char __user * if (num < 1) return count; + #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE phy_free_filebuf_mask(adapter, LOAD_BB_PG_PARA_FILE | LOAD_RF_TXPWR_LMT_PARA_FILE); + #endif rtw_ps_deny(adapter, PS_DENY_IOCTL); LeaveAllPowerSaveModeDirect(adapter); @@ -874,7 +968,7 @@ static ssize_t proc_set_tx_power_ext_info(struct file *file, const char __user * return count; } -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM static int proc_get_kfree_flag(struct seq_file *m, void *v) { struct net_device *dev = m->private; @@ -1073,7 +1167,7 @@ static ssize_t proc_set_tx_gain_offset(struct file *file, const char __user *buf return count; } -#endif /* CONFIG_RF_GAIN_OFFSET */ +#endif /* CONFIG_RF_POWER_TRIM */ #ifdef CONFIG_BT_COEXIST ssize_t proc_set_btinfo_evt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) @@ -1126,7 +1220,7 @@ static u8 *btreg_type[] = { "le" }; -static int btreg_parse_str(char *input, u8 *type, u16 *addr, u16 *val) +static int btreg_parse_str(char const *input, u8 *type, u16 *addr, u16 *val) { u32 num; u8 str[80] = {0}; @@ -1261,6 +1355,8 @@ ssize_t proc_set_btreg_read(struct file *file, const char __user *buffer, size_t err = -EFAULT; goto exit; } + /* [Coverity] sure tmp end with '\0'(string terminal) */ + tmp[sizeof(tmp) - 1] = 0; err = btreg_parse_str(tmp, &btreg_read_type, &btreg_read_addr, NULL); if (err) @@ -1505,8 +1601,9 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = { #if defined(DBG_CONFIG_ERROR_DETECT) {"sreset", proc_get_sreset, proc_set_sreset}, #endif /* DBG_CONFIG_ERROR_DETECT */ + {"trx_info_debug", proc_get_trx_info_debug, NULL}, {"linked_info_dump",proc_get_linked_info_dump,proc_set_linked_info_dump}, - + {"current_tx_rate", proc_get_current_tx_rate, NULL}, #ifdef CONFIG_GPIO_API {"gpio_info",proc_get_gpio,proc_set_gpio}, {"gpio_set_output_value",proc_get_dummy,proc_set_gpio_output_value}, @@ -1530,7 +1627,8 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = { #ifdef CONFIG_P2P_WOWLAN {"p2p_wowlan_info", proc_get_p2p_wowlan_info, NULL}, #endif - {"chan_plan",proc_get_chan_plan,proc_set_chan_plan}, + {"country_code", proc_get_country_code, proc_set_country_code}, + {"chan_plan", proc_get_chan_plan, proc_set_chan_plan}, #ifdef CONFIG_DFS_MASTER {"dfs_master_test_case", proc_get_dfs_master_test_case, proc_set_dfs_master_test_case}, {"update_non_ocp", proc_get_dummy, proc_set_update_non_ocp}, @@ -1546,7 +1644,7 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = { {"tx_power_by_rate", proc_get_tx_power_by_rate, NULL}, {"tx_power_limit", proc_get_tx_power_limit, NULL}, {"tx_power_ext_info", proc_get_tx_power_ext_info, proc_set_tx_power_ext_info}, -#ifdef CONFIG_RF_GAIN_OFFSET +#ifdef CONFIG_RF_POWER_TRIM {"tx_gain_offset", proc_get_dummy, proc_set_tx_gain_offset}, {"kfree_flag", proc_get_kfree_flag, proc_set_kfree_flag}, {"kfree_bb_gain", proc_get_kfree_bb_gain, proc_set_kfree_bb_gain}, @@ -1564,7 +1662,7 @@ const struct rtw_proc_hdl adapter_proc_hdls [] = { {"acs", proc_get_best_chan, proc_set_acs}, #endif #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER - {"rtkm_info", proc_get_rtkm_info, NULL} + {"rtkm_info", proc_get_rtkm_info, NULL}, #endif {"efuse_map", proc_get_efuse_map, NULL}, #ifdef CONFIG_IEEE80211W diff --git a/rtl8188FU/os_dep/linux/usb_intf.c b/rtl8188FU/os_dep/linux/usb_intf.c index 274735d..78c03c3 100755 --- a/rtl8188FU/os_dep/linux/usb_intf.c +++ b/rtl8188FU/os_dep/linux/usb_intf.c @@ -840,7 +840,7 @@ int rtw_hw_suspend(_adapter *padapter ) _clr_fwstate_(pmlmepriv, _FW_LINKED); rtw_led_control(padapter, LED_CTL_NO_LINK); - rtw_os_indicate_disconnect(padapter); + rtw_os_indicate_disconnect(padapter, 0, _FALSE); #ifdef CONFIG_LPS //donnot enqueue cmd @@ -1378,8 +1378,6 @@ static void rtw_usb_if1_deinit(_adapter *if1) #endif #endif - rtw_cancel_all_timer(if1); - #ifdef CONFIG_WOWLAN pwrctl->wowlan_mode=_FALSE; #endif //CONFIG_WOWLAN @@ -1556,6 +1554,9 @@ _func_enter_; LeaveAllPowerSaveMode(padapter); } rtw_set_drv_stopped(padapter); /*for stop thread*/ + + /* stop cmd thread */ + rtw_stop_cmd_thread(padapter); #ifdef CONFIG_CONCURRENT_MODE #ifdef CONFIG_MULTI_VIR_IFACES rtw_drv_stop_vir_ifaces(dvobj); diff --git a/rtl8188FU/os_dep/osdep_service.c b/rtl8188FU/os_dep/osdep_service.c index ef9d022..447d026 100755 --- a/rtl8188FU/os_dep/osdep_service.c +++ b/rtl8188FU/os_dep/osdep_service.c @@ -830,7 +830,7 @@ inline void _rtw_memmove(void *dst, const void *src, u32 sz) #endif } -int _rtw_memcmp(void *dst, void *src, u32 sz) +int _rtw_memcmp(void *dst, const void *src, u32 sz) { #if defined (PLATFORM_LINUX)|| defined (PLATFORM_FREEBSD) @@ -1901,12 +1901,20 @@ static int closeFile(struct file *fp) static int readFile(struct file *fp,char *buf,int len) { int rlen=0, sum=0; - - if (!fp->f_op || !fp->f_op->read) + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) + if (!(fp->f_mode & FMODE_CAN_READ)) +#else + if (!fp->f_op || !fp->f_op->read) +#endif return -EPERM; while(sum<len) { - rlen=fp->f_op->read(fp,buf+sum,len-sum, &fp->f_pos); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) + rlen = __vfs_read(fp, buf+sum, len-sum, &fp->f_pos); +#else + rlen = fp->f_op->read(fp, buf+sum, len-sum, &fp->f_pos); +#endif if(rlen>0) sum+=rlen; else if(0 != rlen) @@ -2486,3 +2494,41 @@ void rtw_cbuf_free(struct rtw_cbuf *cbuf) rtw_mfree((u8*)cbuf, sizeof(*cbuf) + sizeof(void*)*cbuf->size); } +/** +* IsHexDigit - +* +* Return TRUE if chTmp is represent for hex digit +* FALSE otherwise. +*/ +inline BOOLEAN IsHexDigit(char chTmp) +{ + if ((chTmp >= '0' && chTmp <= '9') || + (chTmp >= 'a' && chTmp <= 'f') || + (chTmp >= 'A' && chTmp <= 'F')) + return _TRUE; + else + return _FALSE; +} + +/** +* is_alpha - +* +* Return TRUE if chTmp is represent for alphabet +* FALSE otherwise. +*/ +inline BOOLEAN is_alpha(char chTmp) +{ + if ((chTmp >= 'a' && chTmp <= 'z') || + (chTmp >= 'A' && chTmp <= 'Z')) + return _TRUE; + else + return _FALSE; +} + +inline char alpha_to_upper(char c) +{ + if ((c >= 'a' && c <= 'z')) + c = 'A' + (c - 'a'); + return c; +} + |